@Autowired 동작 원리를 제대로 이해하지 못하면, 분명히 @Autowired를 붙였는데 NullPointerException이 발생하거나, 같은 타입의 Bean이 두 개일 때 NoUniqueBeanDefinitionException으로 서버가 뜨지 않거나, 테스트에서는 잘 되는데 운영에서만 순환 참조 에러가 터지는 당혹스러운 상황을 경험하게 됩니다. “그냥 @Autowired 붙이면 알아서 주입되는 거 아닌가요?”라는 생각은 필드 주입의 테스트 불가 함정, Setter 주입의 불변성 위반, 생성자 주입 없이 발생하는 순환 […]
@Transactional 전파 레벨을 정확히 이해하지 못하면, 분명히 @Transactional을 붙였는데 롤백이 안 되거나, 반대로 롤백되면 안 되는 로그 저장까지 같이 롤백되는 장애를 겪게 됩니다. “그냥 서비스 메서드에 @Transactional 달면 되는 거 아닌가요?”라고 생각하는 순간, 자기 호출(Self-Invocation) 함정에 빠지거나, REQUIRES_NEW를 잘못 써서 교착 상태(Deadlock)를 만들거나, readOnly = true를 붙였는데 오히려 성능이 나빠지는 상황이 생깁니다. 이 글에서는 Spring […]
Spring Batch 설계를 제대로 이해하지 못하면, 수백만 건 데이터를 처리하다 중간에 터진 배치가 처음부터 다시 돌면서 이미 처리된 데이터를 또 처리하거나, 오류 한 건 때문에 전체 작업이 롤백되어 새벽 내내 재실행을 반복하는 지옥을 경험하게 됩니다. Spring Batch는 “그냥 for 루프를 스케줄러로 돌리면 되지 않나?”라는 생각을 완전히 뒤집는 엔터프라이즈급 배치 프레임워크입니다. 청크(Chunk) 기반 처리, 재시작(Restart), Skip·Retry […]
스프링부트 애노테이션을 제대로 이해하지 못하면, 코드는 돌아가는데 왜 돌아가는지 모르는 상태가 됩니다. 매일 쓰는 @RestController, @Autowired, @Transactional… 문서 없이 그냥 복붙하고 계시진 않으신가요? 스프링부트는 애노테이션 기반 프로그래밍이 핵심이기 때문에, 각 애노테이션이 무엇을 해주는지, 언제 써야 하는지, 어떤 실수를 하면 안 되는지를 제대로 알아야 실무에서 진짜 실력을 발휘할 수 있습니다. 이 글에서는 실무에서 가장 빈번하게 등장하는 […]