본문 바로가기

JPA9

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.
[회고] 클린 아키텍처 책 스터디 및 미니 프로젝트를 마치며 최근 신입 개발자로의 여정을 시작하기 위해 채용 연계형 인턴십, 신입 공채를 보고 확인하며 서류 지원을 하고 있다. 여전히 할 일은 산더미지만, 조금 더 시간을 효율적으로 써가며 발전하고 싶기에 읽고 싶었던 책을 가지고 스터디를 하면 어떨까라는 생각을 했었다. 마침 같은 여정 길에 올라있는 친구가 떠올랐고, 제안을 수락하여 만들면서 배우는 클린 아키텍처라는 책을 가지고 2주 간의 스터디를 마쳤다. 이 책을 읽고 소프트웨어의 설계적 고민에 한층 더 깊이 빠지게 됨과 동시에 새로운 세상으로의 발을 디딘 느낌이 들었다. 설계 내용은 평소에 가장 많이 고민했던 부분인지라 책이 이해가 잘 되었었고, 애매했던 부분을 2회독, 다른 관점으로 읽어보려 3 회독하며 완독을 했다. 주관적이지만 개발 공부를 하며 드는 생각.. 2022. 11. 20.
DB 수정 & jpa 세팅 프로젝트의 전반적인 리팩터링을 다시 시작하며, 기존 mybatis를 이용했던 것을 그대로 옮겨왔다. 하지만 SQL Mapper를 이용한 설계 특성상 객체 지향적인 코드의 작성이 어려웠고, 또 기존 DB 설계의 문제도 있다는 것을 알게 되었다. DB의 전반적인 수정과 더불어, JPA를 이용해 다시 리팩터링을 해보기로 결정을 내렸다. 그 수정과정과 JPA 세팅 방법을 나열해보겠다. https://github.com/GroovyArea/My-ChickenBreast-Shop GitHub - GroovyArea/My-ChickenBreast-Shop: shop api with spring boot shop api with spring boot . Contribute to GroovyArea/My-ChickenB.. 2022. 8. 8.
코드 리팩토링 [1] 지난 1주일간 기존 프로젝트의 리팩터링을 위해 새로운 저장소를 생성했다. 아키텍처 부분 설계를 거의 2, 3일은 한 것 같다. 아직 수정이 필요하겠지만, 항상 고민해보자. 기존 프로젝트는 multi module로 진행했지만, 완벽한 멀티 모듈 프로젝트 이진 않았다. 모놀리틱으로 갈지, MSA를 고려해 모듈간 분리를 할지가 계속 고민된다.. 확장성을 위해 모듈, 패키지간 의존성 분리를 틈틈이 고려해봐야겠다. 기존 작성 코드를 옮기며 조금 더 클린한 객체지향적인 코드로 리뷰어님의 피드백을 통해 수정해나갔다. 많이 알고 있었다고 생각한 부분에서도 헛점이 있었고, 전혀 알지 못했던 디테일한 부분도 알아나가는 중이다. 인증 및 인가 부분은 기존 프로젝트에서는 손수 구현했지만, 이번에는 Spring Security.. 2022. 8. 3.
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.
반응형