본문 바로가기

📗 JPA6

MapStruct! JPA Entity 매핑 간 주의해서 사용하자 최근 비상 결제 모드를 개발 및 배포하며, 참으로 어이 없는 작은 코딩 관련 이슈로 인해 데이터에 이상이 있었다. 바로, MapStruct 얘 때문인데.. 한번 나열해보겠다. (항상 생각하는 거지만, 코드 단 한줄의 파급효과가 엄청 나다.) MapStruct 란?Java Bean 유형 간 매핑 구현을 도와주는 코드 생성기컴파일 타임에 코드 생성 및 런타임에서 안정성 보장순수 Java code 를 호출하므로 다른 매핑 라이브러리보다 속도가 빠르다. (Reflection 을 사용하지 않기 때문)Annotation Processor 를 이용하여 매핑 방식에 편리함을 제공 사용 예시JAVA@Mapper public interface UserMapper { UserMapper INSTANCE = Mappers.g.. 2024. 3. 24.
JPA 집계함수 sum 은 long 을 반환한다. 최근 대량의 데이터들을 집계하여 조회하는 API 프로젝트를 진행 중에, Spring Data JPA 와 Querydsl 을 이용하여 쿼리를 작성하고 있었다. 오늘, sum 집계 함수 때문에, java object 로 매핑이 안되는 문제가 있었는데, 그 이유와 해결과정을 설명해보겠다. 기존 쿼리 @Query( """ select new service.dto.PaymentTotalSumDTO( sum(sub.totalAmount) as totalAmount, sum(sub.discount) as discount, sum(sub.usedPoint) as usedPoint ) from (select tpd.totalAmount as totalAmount, tpd.discount as discount, tpd.u.. 2023. 7. 26.
[Spring Data JPA] JPA Enum 필드에 관한 문제 참나. 오늘 5시간 날렸다. Pagination 쿼리를 날리는 API에서 계속 500 에러가 나서 계속 붙잡고 있었다. 빨래 땜에 집에 왔지만 불굴의 의지로 해결해보리라 다짐하고 1시간만에 문제를 발견했다 증말. 문제점 결론부터 말하면 서버 DB에 잘못된 데이터가 들어가서였다. 문제는 JPA Enum 필드가 @Enumerated(EnumType.STRING) ㅣ이 아니라, Ordinal로 들어가 발생한 문제다. 지정한 Enum 상수는 총 4개 이며, ordinal의 범위는 0~3 이다. 4 이상의 숫자는 있어서는 안될 데이터다. 그래서 계속 이런 에러가 발생했다. java.lang.ArrayIndexOutOfBoundsException: Index 5 out of bounds for length 4 쿼리.. 2023. 2. 21.
[Spring Data JPA] 한방 쿼리의 효능 (feat : JPQL) 백엔드 개발의 기본 소양인 SQL을 작성하는 실력은 뛰어날 수록 더할 나위 없다. 실제로 대규모 트래픽이 발생하는 서비스에서는 이 성능을 매우 중요시 하는데, 일반적인 환경에서는 DB 조회적 측면에서 큰 성능 개선을 이끌 수 있으므로, 가장 기본이 되는 개선 방안이라고들 한다. SQL을 공부하고, JPA 를 공부하며 항상 빠질 수 없는 얘기, 성능 최적화. 항상 고민하다가 개선을 할 수 있는 기회가 주어졌고, 공부한 내용을 바탕으로 내 생각과 결과를 정리해보겠다. DB ERD Model opnions entity를 paging 처리해서 여러 개를 뽑아야 하는 상황. 주어진 중요 파라미터는 user_id 뿐이다. 1. 보통 같으면 Document Entity를 먼저 조회한 후, opinions 를 페이징 .. 2023. 2. 1.
[Spring Data JPA] Transaction 없이 읽기 회사에 입사해서 코드를 살펴보던 중에 분명히 jpa entity 객체의 읽기 과정 중, 분명히 트랜잭션 처리가 필요한 코드가 보였다. 이를테면 Spring Security 인증을 거치고 Security Context Holder 에 저장된 UserPrinciple 객체 @Target(AnnotationTarget.VALUE_PARAMETER) @Retention(AnnotationRetention.RUNTIME) @AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : user") annotation class CurrentUser(val require: Boolean = true) 이러한 애노테이션을 흔히들 전역적으로 Api 에서.. 2023. 1. 30.
JPA 개념 정리 JPA 책을 이제 막 다 읽었다. ORM을 처음 공부한다는 생각에 긴장이 많이 됐지만, DB 공부도 하고, 객체지향에 대한 공부를 충분히 한 상태여서 그런지 생각보다 기존에 읽었던 real mysql, 토비의 스프링 3.1보다 잘 읽혔다. 기존에 database layer는 Mybatis 프레임워크를 이용해 구현했지만, 이는 문제가 있었다. SQL 중심의 개발이 되는 것이다. 앞으로 할 일이 많이 남았으므로, JPA로의 리팩터링을 슬슬 시작해보자. JPA Java Persistence API 자바 진영의 ORM 표준 기술 ORM Object Relational Mapping 객체와 관계형 데이터를 매핑 데이터를 객체에 저장할 수 있다. Hibernate 가장 많이 사용되는 ORM 프레임워크 JPA 인터페.. 2022. 7. 15.
반응형