코드 사용된 코드는 이곳에서 확인할 수 있습니다. ApplicationEventPublisher를 이용하기 스프링부트는 ApplicationEventPublisher 객체를 자동으로 스프링빈으로 등록해준다. 이 객체를 이용하면 객체 간의 의존 관계를 줄이는 방향으로 코드를 작성할 수 있다. 의존성이 약해지면서 상대적으로 문맥 파악이 어려워진다는 단점이 있지만 불필요하게 강하게 결합한 객체들을 분리해 줄 수 있어서 좋을 때도 있다. @RestController @Slf4j @RequiredArgsConstructor public class MyController { private final ApplicationEventPublisher eventPublisher; @GetMapping("/event") p..
아이템 70. 복구할 수 있는 상황에는 검사 예외를, 프로그래밍 오류에는 런타임 예외를 사용하라. 체크 예외 : 복구할 수 있는 상황일 때 던져라. 언체크 예외 : 복구할 수 없는 상황일 때 던져라. 언체크 예외를 구현할 때는 반드시 RuntimeException 클래스를 상속해서 만들어라. 복구 가능한 상황인지 잘 모르겠으면, 언체크 예외를 던져라 필요하다면 예외 클래스에 도우미 메서드를 추가해서 복구를 손쉽게 할 수 있도록 하는게 좋을 수 있음. 몇 초 후에 재시도 해야한다는 메세지가 있다면, 그 메세지를 예외에 넣는다. 그리고 사용자에서 이 값을 간단히 get() 메서드를 이용해서 사용해 볼 수도 있다. 체크 예외 vs 언체크 예외 자바에서는 크게 두 가지 타입의 예외가 존재한다. 체크 예외 : 예..
아이템 71. 필요없는 체크 예외 사용은 피하라 체크 예외는 복구 가능한 상황을 알려서 이 API를 사용하는 개발자가 복구를 시도하도록 강제함. 복구 불가능한 예외라면 비검사 예외를 던져서 사용하기 편리한 API를 제공 해야 함. 복구 가능한지 명확하지 않다면 비검사 예외를 던져라. 검사 예외가 추가되면 다음 문제가 발생함. try ~ catch를 사용해야 함. Stream에서 사용할 수 없음. 검사 예외를 회피하는 방법 Optional 반환하기 → 단점은 예외 정보가 없음. 검사 예외를 던지는 메서드를 2개로 쪼개서, 상태 검사로 분기 처리하기 → 멀티 쓰레드 환경에서 상태검사 동기화가 필요함. 체크 예외를 던지면 사용하기 어려운 API가 됨. 메서드에서 체크 예외를 던지면, 이 메서드를 사용하는 클라..
쓰레드 모델 아래같은 쓰레드 모델이 존재한다. 여기서 자바는 (b) Pure kernel-level 쓰레드 모델을 사용하고 있다. JDK의 구현마다 다르겠지만, 내가 테스트 해본 OpenJDK 17, 21에서 쓰레드풀 사이즈가 증가하는만큼 OS 쓰레드 개수가 증가하기 때문에 유절 레벨 쓰레드 - 커널 레벨 쓰레드는 One To One으로 Binding 된다고 이해했다. 쓰레드는 스케쥴링을 관리하는 주체가 유저 / 커널이냐에 따라 유저 레벨 쓰레드와 커널 레벨 쓰레드가 존재한다. 위의 쓰레드 모델을 살펴보면 다음과 같다. (a) Pure user-level : 커널은 프로세스가 CPU를 사용할 수 있도록 스케쥴링 해줌. 프로세스 내부의 유저 레벨 쓰레드의 스케쥴링은 프로세스 라이브러리에서 처리함. 프로세스..
아이템 62. 다른 타입이 적절하다면 문자열 사용을 피하라. 다른 타입이 적절하면, 문자열 대신 새로운 타입을 만들어라. 문자열은 정말로 문자열을 표현할 때만 사용해라 문자열은 다른 값 타입을 대신하기에 적절하지 않음. 문자열은 열거 타입을 대신하기에 적합하지 않음. 문자열은 혼합 타입을 대신하기에 적합하지 않음. 문자열은 권한을 표현하기에 적합하지 않음. 문자열은 문자열인 경우에만 사용해라. 자바에서는 문자열을 잘 지원해준다. 그래서 사람들은 애매할 때는 문자열을 이용해서 표현을 할 때가 많다. 하지만 입력받을 데이터가 진짜 '문자열'을 의미할 때만 문자열을 사용해야하고 그렇지 않다면 적절한 다른 타입을 사용해야만 한다. 받은 데이터가 수치형 → int, float, BigInteger 등 적당한 수치..