development 19

[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

@RequestBody와 Spring의 MessageConverter (Feat. Xss Prevent Filter)

Message Converter에 관한 문제상황 및 해결 방법에 대해 개략적인 내용을 정리한다.프로젝트에 보안을 강화하기 위해 naver에서 제공하는 lucy-xss를 적용하였으나, lucy-xss filter는 form-data 형태의 데이터를 치환하는 데 그 목적이 있다 보니 json 형태의 데이터가 정상적으로 처리되지 않는 문제가 발생하였다.구글을 여기저기 뒤져보니 Objectmapper를 커스텀한 후 Message Converter 객체를 새로 생성하여 매핑시켜주어 별도의 라이브러리 없이 특수문자 치환을 적용할 수 있는 방법이 있었는데, 이 방식은 Request Body에 대한 치환은 가능하지만 Response에 대한 처리는 할 수 없다는 문제가 있었다.https://jojoldu.tistory...

development/spring 2024.09.09