Web

Web

[Spring] Mapstruct Mapper Custom with Qualifier, @DecoratedWith

다양한 요구사항이 생길 수 있기 때문에 단순한 매핑만으로 DTO ↔ Entity 변환이 힘들 수 있다. 그럴 때 Mapper 클래스를 Custom 하여 사용해보자. Mapper 사용방법2023.07.08 - [Web] - [Spring] MapStruct 사용하기 대상의 속성 매핑 커스텀하기 with qualifiedByNamequalifedByName 은 대상의 속성을 매핑하기 위한 @Mapping 의 속성으로, 사용자가 정의한 매핑 방법을 @Named 어노테이션으로 이름으로 지정하여 사용할 수 있다. 이를 통해 복잡한 데이터 구조를 변환하거나 기본 매핑만으로 부족한 경우 사용자가 정의한 매핑 방법을 선택할 수 있게 한다.  간단한 예제로 사용자의 생년월일을 나이로 변환하는 작업을 해보자. ( 다른 필..

Web

[Spring] Logback MDC 로 애플리케이션 로깅하기

사이드 프로젝트 중 버그가 생긴 경우 그에 대한 요청/응답 값을 추적하던 중에 MDC 를 사용하면 좋을 것 같다는 생각이 들었다. MDC (Mapped Diagnostic Context) 란 Logback, Log4j2 등에서 지원하는 기능으로 로깅 메시지에 컨텍스트 정보를 저장할 수 있고 로깅 중에 스레드별로 특정 정보를 저장하고 관리하는 메커니즘을 말한다. 주요 이점 - 특정 사용자, 세션, 요청 등의 ID를 로그에 포함시켜 모니터링을 용이하게 한다. - 사용자 및 요청 정보를 로그에 포함시켜 감사 및 보안 모니터링을 강화할 수 있다. - 다중 스레드 환경에서 발생하는 요청을 효과적으로 관리하고 구분할 수 있다. 동작 방식 MDC 는 각 스레드에 대한 데이터 저장소를 Map 형태로 제공한다. 그렇기 ..

Web

[JPA] deleteAll() 과 deleteAllInBatch()

테스트 코드 관련 강의를 보다가 deleteAllInBatch() 에 대해서 알게 되었다. 해서 기존에 사용하고 있던 deleteAll() 과의 차이점을 정리해보려한다. deleteAll() 과 deleteAllInBatch() User 데이터를 10개 추가해두고 deleteAll() 과 deleteAllInBatch() 를 사용했을 때 각각을 비교해보자. ( UserRepository 는 JPARepository 를 상속받고 있다. ) deleteAll() deleteAll() 은 CrudRepository 내 정의 되어있는 기능으로 모든 엔티티를 삭제할 때 사용한다. 쿼리를 통해 확인한 내부 동작은 아래와 같다. 1. 작업을 수행하기 전 엔티티를 영속성 컨텍스트로 로드하기위해 select 쿼리를 실행..

Web

[JPA] @ColumnDefault 이해하기

엔티티의 특정 필드에 @ColumnDefault 를 이용하여 Default 값을 'N' 으로 설정하였는데 null 값으로 저장되는 이슈가 발생하였다. 해결방법에 대해 정리해보자. @ColumnDefault 동작 @ColumnDefault는 Hibernate 에서 제공하는 Annotation 으로, Entity 의 필드에 대해 데이터베이스 기본 값을 정할 때 사용한다. 예를 들어 isDeleted 라는 필드가 있고 기본 값을 'N' 으로 설정하고 싶을 땐 아래와 같이 설정하면 된다. @ColumnDefault("'N'") // default N private String isDeleted; 그런데 이렇게 설정하고 테스트를 해보면 기대했던 N 값이 아닌 null 값임을 확인할 수 있다. - Test Code..

Web

[Spring] Soft Delete with JPA

사이드 프로젝트 진행 중에 특정 데이터에 대해 Soft Delete 를 적용해달라는 요청을 받았었다. Soft Delete 란? 데이터를 영구적으로 삭제하지 않고 데이터가 삭제된 것처럼 처리하는 방법이다. 이렇게하면 데이터를 복구할 때 유용하며 Soft Delete 를 구현할 때는 데이터 항목에 isDeleted 등의 필드를 추가하여 삭제된 것처럼 처리한다. 예를 들어, Soft Delete 가 아닌 Hard Delete ( 물리적 삭제 ) 상태라면 user_id 가 1인 사용자를 삭제하는 경우 데이터베이스에서 해당 사용자의 레코드를 완전히 제거하게 된다. 반대로 Soft Delete 를 사용하였을 때는 아래의 is_deleted 필드가 'N' 에서 'Y' 로 바꿔 사용자가 삭제된 것처럼 처리하게 된다...

Web

[Spring] QueryDsl 로 동적 쿼리 짜기 with JPA

JPARepository 에서 제공하는 메서드로 해결이 안되는 경우 동적 쿼리를 짜야한다. 간단하게는 native query 로 해결할 수 있는데 개발자가 실수를 한 경우에 이는 컴파일 시점이 아닌 런타임 시점에서 고객이 그 메서드를 호출하는 행위를 한 경우에만 오류를 확인할 수 있게 된다. 이를 해결하기 위해 QueryDSL 을 적용해보자. QueryDSL 설정 1. spring boot 3.x QueryDSL 의존성 주입 ( Gradle 기준 ) // QueryDSL implementation "com.querydsl:querydsl-jpa:5.0.0:jakarta" annotationProcessor "com.querydsl:querydsl-apt:5.0.0:jakarta" annotationPro..

Web

[JPA] 양방향 순환 참조

JPA 양방향 관계를 설정하고 테스트하다가 Controller 단에서 아래 예외가 발생하였다. 찾아보니 JSON 직렬화 하는 과정에서 무한 참조로인해 생긴 예외로 원인과 해결방안에 대해 정리해보려한다. java.lang.IllegalStateException: Cannot call sendError() after the response has been committed .. java.lang.StackOverflowError: null .. ~[jackson-databind-2.15.3.jar:2.15.3] JPA 양방향 순환 참조 어떤 상황이었는지 간단하게 시나리오를 구현해보자. User 와 Notice 엔티티가 있고 1:N 양방향 관계이다. - User public class User { @Id @G..

Web

[Spring] 예외 코드 Enum 으로 관리하기

지난번 사이드 프로젝트를 할 때 커스텀한 예외 클래스를 따로 개별적으로 관리하여 한 눈에 보기 힘들고 중복되는 코드가 많아 가독성이 떨어진다는 느낌을 받았다. 그래서 이번에는 enum 으로 예외 코드를 관리해보기로 하였다. 자바의 Enum 타입이란 ? 공식 문서에 따르면 자바에서 Enum 타입은 고정된 상수들의 집합을 나타내는 특별한 데이터 타입으로, 변수는 미리 정의된 값들 중 하나와 같아야 한다. 또한, 상수들은 쉼표로 구분되며 대문자로 표기한다. public enum Day { SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY } 또한 상수에 대한 의미있는 값을 미리 부여하여 활용할 수 있는데, 이렇게 하면 Enum 상수가 단순한 식별자..

limnj
'Web' 카테고리의 글 목록