전체 글 28

[Java] Design-Pattern Singleton

Java, Spring Framework (Spring Boot) 기반의 개발을 진행할 때 유용하게 사용할 수 있는 디자인 패턴에 대해 정리할 것이다.첫 시작은 대망의 싱글톤 패턴이다. 스프링은 Ioc 컨테이너에서 관리하는 객체를 싱글톤으로 관리한다. 뿐만 아니라, 환경 설정을 할 때 사용하는 @Configuration 어노테이션이 붙은 클래스 역시 Spring CGlib Proxy 방식을 적용하여 싱글톤으로 관리한다. 도대체 싱글톤이 무엇이고, 왜 스프링은 시키지도 않은 싱글톤 방식을 Default로 적용하는걸까? 우선 싱글톤이 무엇인지 정리한 후 왜, 그리고 어떻게 사용하는지 순차적으로 살펴보자. 싱글톤이란 무엇인가?  특정 클래스에 대해 객체(인스턴스)를 단 한 개만 생성하여 관리하는 것을 의미한다..

[Log] Logback 기반의 Slf4j 로그 추상화 설정

Reflection과 Spring Aop를 활용한 공통 로그 처리를 정리하려다 보니 새로 만든 프로젝트에 로그 추상화 설정이 되어 있지 않은 것을 알게 되었다. 선행 작업으로 Logback 기반의 로그 처리 기능을 추가할 것이다.설정에 앞서 기본 개념을 조금 정리하자면,JPA가 자바 표준 ORM Interface이고, Hibernate는 구현체이듯 로그 처리에 있어 Slf4j는 표준 인터페이스 명세이고, Logback은 다양한 구현체 중 하나라고 이해하면 된다.스프링부트에서 Logback 설정을 하려고 찾아보니 부트 Starter Dependency에 이미 logback 및 Slf4j 와 관련된 라이브러리가 추가되어 있었다.Maven Repository에서 Logback Classic ModuleLogb..

development/spring 2024.09.16

[Java] Stream - GroupingBy, FlatMap

Java 8 부터 도입된 Stream의 고급 활용인 GroupingBy와 FlatMap에 대해 정리한다.그에 앞서, Stream은 중간연산과 최종연산으로 구성되는데, Stream의 코드 흐름이 어떻게 진행되는지 간단히 살펴보겠다.public class StreamPractice { public static void main(String[] args) { List myList = new ArrayList(); myList.add("hello"); myList.add("world"); myList.add("!!!"); myList.stream() .filter(x -> { Syst..

development/java 2024.09.15

Trouble Shooting - Spring Quartz Clustering

스프링 환경에서 배치 프로젝트를 구성하며 겪은 트러블슈팅 경험에 대해 정리하고자 한다. 스프링 쿼츠를 자주 사용해본 사람이라면 별 거 아닌 내용이겠지만, 나를 포함하여 경험이 없는 사람은 원인을 파악하기 쉽지 않은 내용이란 생각이 든다. (원인을 찾기가 너무너무 힘들었다...)개발 환경스프링배치스프링쿼츠 (Cron Trigger 기반의 스케줄링)Spring Boot 3.2.x문제 상황은 다음과 같았다.1. 최초에 배치 Job을 개발한 후 서버에 배포하여 스케줄을 등록해놓았는데, Step Reader에서 Sql Syntax Error가 발생하였다. 테스트를 위해 Where조건에 주석을 --로 처리하였는데, xml에서 파싱을 하지 못해 오류가 난 것이다.2. 로컬에서 수정 및 테스트를 완료한 후 재배포를 하..

development/spring 2024.09.12

@Transactional 전파속성 주의사항

스프링에서 제공하는 트랜잭션 추상화를 위한 선언적 트랜잭션 @Transactional은 다음과 같은 전파 속성을 갖는다.REQUIRED(TransactionDefinition.PROPAGATION_REQUIRED)SUPPORTS(TransactionDefinition.PROPAGATION_SUPPORTS)MANDATORY(TransactionDefinition.PROPAGATION_MANDATORY)REQUIRES_NEW(TransactionDefinition.PROPAGATION_REQUIRES_NEW)NOT_SUPPORTED(TransactionDefinition.PROPAGATION_NOT_SUPPORTED)NEVER(TransactionDefinition.PROPAGATION_NEVER)NESTE..

development/spring 2024.09.10