본문 바로가기

JAVA14

자바 디자인 패턴 토비의 스프링을 읽으면서 스프링에 다양한 디자인 패턴이 적용된 것을 보고 공부를 시작했다. 토비 선생님이 주신 디자인 패턴 학습 방법에 대한 교훈을 최대한 지키려고 했다. 패턴에서 가장 중요한 것은 각 패턴의 핵심이 담긴 목적 또는 의도다. 패턴을 적용할 상황, 해결해야 할 문제, 솔루션의 구조와 각 요소의 역할과 함께 핵심 의도가 무엇인지를 기억해둬야 한다. 새로운 패턴을 접할 때마다 이 패턴이 해결하려고 하는 문제 상황은 무엇이며, 패턴을 적용했을 때 어떤 효과를 볼 수 있는지에 집중했다. 구현은 이 목적을 달성할 수만 있다면 개발자의 책임이라고 하길래, 구현에 너무 얽매여있지 않으려고 했다. 그래도 코드는 다 따라쳤다. 손에 익어야 나중에 필요할 때 사용할 수 있을 것 같고, 이해도 더 잘 된다. .. 2024. 1. 18.
자바와 JUnit 테스트 만들기 팀원과 리팩토링 목표로 테스트 코드 꼼꼼하게 쓰기를 잡아서, 테스트 관련 책을 읽어보았다. 원래 기대했던 것은 단위 테스트를 작성하는 논리나 접근법이었는데, 3장에서 테스트 코드를 깔끔하게 만들기 위해 애플리케이션 코드의 구조를 개선하는 것을 보고 많은 것을 느꼈다. 사실 애플리케이션 협력 안에서 다형성이 필요하지 않은 부분은 굳이 인터페이스를 두지 않았는데, 테스트 코드를 다형적인 기능으로 포함시키면 설계를 유연하게 만드는 계기가 될 수 있다는 것을 보고 설계 개선에 대한 새로운 시각을 얻을 수 있었다. 안정적이고 쉽게 변경할 수 있는 코드를 위해 단위 테스트 자동화는 필수! 자바와 JUnit 테스트 만들기 | Notion Built with Notion, the all-in-one connected .. 2024. 1. 18.
실습으로 배우는 선착순 이벤트 시스템 분산 락에 이은 두번째 시리즈! 트래픽이 극단적으로 많은 상황에서 안정적인 시스템을 만드는 내용이다. 이전 강의에서는 동시에 접근하지 못하도록 분산 락을 구현했는데, 이번에는 데이터베이스 서버 접근의 동시성을 의도적으로 낮춰서 병목을 줄이고, 처리량을 늘리는 방법을 알아보았다. 데이터베이스 서버와 처리 서버 사이의 의존성을 의도적으로 낮추기 위해 카프카를 도입하고, 요구사항 특성 상 쿠폰의 중복 발급을 위해 Redis Set을 사용한 점이 인상적이다. 레디스는 정말 여러모로 활용할 기능이 많은 것 같다. 이래서 현업에서 레디스를 많이 쓰는구나..! 실습으로 배우는 선착순 이벤트 시스템 | Notion Built with Notion, the all-in-one connected workspace with.. 2024. 1. 18.
재고시스템으로 알아보는 동시성 이슈 해결방법 눈여겨보다 인프런 할인 때 지른 강의. 트래픽이 많은 현업에서는 언어 수준의 동기화나 싱글 스레드 기반의 레디스를 많이 사용한다고 하던데, 마침 이 강의에서 간단한 요구사항과 함께 구현을 개선해나가는 과정을 소개해주셔서 도움이 되었다. 분산 환경에서의 락을 위해 레디스를 사용하는데, 자바에서 제공하는 구현체 중 Redisson이 락 획득 실패 시 재시도를 기본으로 제공하기 때문에 개발자 입장에서 사용하기 더 편하다는 팁을 얻었다. 외부 시스템에 의존하는 로직의 테스트는 어떻게 작성하는게 좋을지 아직도 의문이다. 재고시스템으로 알아보는 동시성 이슈 해결방법 | Notion Built with Notion, the all-in-one connected workspace with publishing capab.. 2024. 1. 18.
Item 32. 제네릭과 가변인수를 함께 쓸 때는 신중하라 ☁️ 가변인수와 제네릭은 궁합이 좋지 않다. 가변인수 기능은 내부적으로 배열을 사용하는데, 배열과 제네릭의 타입 규칙이 달라서 타입 안전하지 않다. (다만 제네릭 배열과 달리 제네릭 가변인수는 실무에서 매우 유용하게 사용되므로 제네릭 가변인수의 사용을 허용했다.) 제네릭 가변인수를 사용할 때는 배열에 값을 저장하거나 배열 참조를 외부에 노출해서는 안된다. 두 조건을 만족한다면 타입 안전한 것이므로 @SafeVarags을 사용해 경고를 무시한다. 혹은 가변인수 대신 List를 사용한다. Item 28. 제네릭과 배열 제네릭과 배열은 매우 다른 타입 규칙이 적용된다. 배열 : 공변이므로 컴파일타임에 안전하지 않지만, 실체화되므로 런타임에는 안전하다. 제네릭 : 공변이 아니므로 컴파일타임에 안전하고, 실체화되.. 2023. 7. 11.
Item27. 비검사 경고를 제거하라 요약 비검사 경고는 런타임에 ClassCastException을 일으킬 수 있는 잠재적 가능성을 뜻하므로, 가능한 모든 비검사 경고를 제거해야한다. 비검사 경고를 없앨 방법을 찾지 못한다면, 그 코드가 타입 안전함을 증명하고 가능한 범위를 좁혀서 @java.lang.SuppressWarnings("unchecked") 애노테이션으로 경고를 숨겨라. 그리고 경고를 숨기기로 한 근거를 주석으로 남겨라. 비검사 경고의 제거 비검사(unchecked) 경고는 컴파일러가 타입 안정성을 확인하는데 필요한 정보가 충분하지 않을 때 발생시키는 경고이다. 모든 비검사 경고는 런타임에 ClassCastException을 일으킬 수 있는 잠재적 가능성을 뜻하므로, 가능한 모든 비검사 경고를 제거해야한다. 대부분의 비검사 경.. 2023. 7. 11.