분류 전체보기

Spring

[JPA]연관관계 - 일대일 관계

JPA 1:1(일대일) 관계 일대일 관계는 주 테이블혹은 대상 테이블 중에 외래 키를 넣을 테이블 선택이 가능하다. 일대일 관계에서는 반대도 일대일 관계가 된다. 다대일 관계에서는 다(N)에 해당하는 곳이 외래 키를 가지고 있지만(연관관계의 주인) 일대일 관계에서는 주 테이블이나 대상 테이블에 외래 키를 둘 수 있어서 선택 해야 한다. 일대일 관계에서는 외래 키를 주 테이블에 둘지, 대상 테이블에 둘지에 따라 약간의 차이가 있다. 1. 주 테이블에 외래 키가 있는 경우 주 테이블에 외래 키를 둘 경우, 주 테이블에 매핑되는 주 객체에도 객체 참조를 두는 구조를 만들게 된다. 일대일 단방향 주 테이블 Parent에 단방향 일대일 관계에 해당하는 Child 객체필드를 만든후, @OneToOne 어노테이션 선..

Spring

[JPA] 연관관계 조회 방식별(Fetch, Lazy) 성능 차이 테스트

개요 N+1 문제와 해결 방법 JPA를 이용해 별도의 옵션 없이 엔티티를 조회할 경우, 엔티티에 연결되어 있는 연관관계들이 함께 조회된다. 함께 조회되는 시점에 부모 엔티티를 조회 하는 쿼리(1) + 연결되어 있는 연관관계 엔티티들에 대한 조회 쿼리(N)가 DB 요청으로 날아가게 된다. 예를들어 4개의 연관관계를 가지고 있는 엔티티 100개를 조회할 경우 100 + 400, 총 500회의 조회 쿼리가 날아가게 됨으로 성능에 큰 영향을 미치게된다. 이런 문제는 완벽하지는 않으나 Fetch Join, Entity Graph, Batch_Size를 통해 해결 할 수 있다. 보통 연관관계 엔티티들에 대해 FetchType을 통해 연관관계 엔티티를 즉시 조회(Eager)할지, 지연 조회(Lazy)할 지 정할 수 ..

Spring

[Spring] MapStruct 사용 주의 사항

DTO Entity 변환을 위해 자주 사용하는 MapStruct를 사용하며 겪은 주의 사항들을 정리 1. MapStruct는 Getter, Setter, Builder 기반으로 동작 MapStruct가 클래스간 매핑 코드를 만들때 타겟 클래스의 Getter, Setter를 기반으로 코드를 생성한다. 다만 MapStruct 사용을 위해 클래스에 Setter를 만드는것이 꺼림칙 하다면, Builder로 대체할 수 있다ㅡ. 2. Spring에서 Mapper 생성시 @Mapper 옵션으로 componentModel = "spring" 선언으로 해당 Mapper가 Bean으로 등록될 수 있도록 해야 동작한다. @Mapper(componentModel = "spring") public interface Member..

Spring

[Spring] Redis Template과 Redis Repository 특징과 장단점

Redis는 뛰어난 성능과 유연성을 제공하는 인메모리 데이터베이스로, 다양한 애플리케이션에서 필수적으로 사용됩니다. 하지만 Spring 환경에서 Redis를 다룰 때는 두 가지 접근 방식인 RedisTemplate과 Redis Repository 중 하나를 선택해야 합니다.어떤 선택이 더 적합할까요? 이는 프로젝트의 요구사항과 Redis를 활용하는 방식에 따라 달라질 수 있습니다. RedisTemplate은 저수준 API로 세밀한 제어와 유연성을 제공하지만, 복잡한 작업과 설정이 필요합니다. 반면, Redis Repository는 고수준의 추상화를 통해 간단하고 직관적인 개발 경험을 제공하지만, 제한된 유연성과 고급 기능 부족이라는 단점이 있습니다.이번 글에서는 RedisTemplate과 Redis Re..

Etc.

[IntelliJ] IntelliJ Build, Gradle Build 차이점

인텔리제이를 사용하며 빌드 혹은 테스트 코드를 실행할 때 속도가 많이 느린 경우가 있다. 이럴 때마다 인터넷에서는 인텔리제이의 빌드 혹은 테스트 옵션을 default로 되어 있는 Gradle 대신 IntelliJ로 바꿔서 사용하라는 조언을 많이 볼 수 있다. 이 두개의 차이는 무엇일까? 하는 고민이 생기는 찰나 해당 옵션중 Run tests using을 Gradle로 두고 테스트 실행시 테스트가 간헐적으로 실패하는 경우가 확인 되었다. Gradle 옵션과 IntelliJ 옵션의 차이 결과적으로 Run tests using 옵션을 IntelliJ로 두고 테스트 실행시 순서가 보장된 테스트 환경에서 작성된 테스트 코드들은 모두 통과했지만 Gradle 환경에서 실행시 테스트 순서가 빌드시점마다 변경 되기때문에..

Review

통합회원(Integrated Member) 프로젝트 오픈 회고

프로젝트의 시작이전 스타트업에서 근무할 당시 경영난을 못이기고 결국 권고사직을 받은 후2023년 올해 2월 한샘으로 이직하게 되었다.회원 도메인을 담당하는 팀으로 배치받게 되었고, 6개월동안 진행중이던 프로젝트에 바로 합류하게 되었다.토스가 사일로(Silo)단위로 팀을 꾸려 프로젝트가 진행되듯, 한샘또한 도메인별로 하나의 팀을 이뤄 프로젝트를 진행하게 된다.한샘에는 PI(아직도 무슨 약자인지 모르겠다.)라는 역할이 존재하여, 일반적으로 기획자가 프론트 전반에 대해 설계를 담당 한다면 PI는 백엔드 전반에 걸쳐 설계를 진행해주고 있었다.기획자 1명, PI 1명, 백엔드 4명으로 이뤄진 팀으로 첫 프로젝트를 시작 하게 되었다.생각보다 복잡한 회원 구조한샘은 온라인을 중요시 여기지 않는 제조업 기반의 회사에서..

Etc.

[IntelliJ] Invalidate Caches And Restart

문제 재택근무를 시작하면서 집에서 회사 Github Repo를 가져오니, 특정 엔티티들을 찾을 수 없다는 오류가 빗발치는 상황을 확인함. 처음에는 패키지가 잘못 되었는지, 이전 PR 머지에서 잘못된 부분이 있는지 한참을 헤맸으나 선임분의 지혜(?)로 인텔리제이의 캐시를 삭제하고 재부팅 했을때 해결 된다는 내용을 듣고 해결함. 해결 IntelliJ - File - Invalidate Caches 를 통해 캐시 삭제를 진행할 수 있다. 인텔리제이 2022.03 버전 기준 위의 Invalidate Cache를 선택하게 되면 아래와같이 옵션을 선택할 수 있으며 Invalidate and Restart를 클릭함으로 최종적으로 캐시가 정리된다. 뭐든 안될때는 가장 기본적인 껏다 켜보는, 재부팅이 최고라는걸 다시 한..

Spring

[JPA]Spring Data JPA 시작

개요 MyBatis로 개발을 하던 중 요즘 많은 곳에서 JPA를 사용한다는 이야기를 접하게 되었다. 결과적으로 MyBatis와 달리 생산성이 어마무시하게 늘어나는 걸 보고 본격적으로 공부하고 정리해보게 되었다. 목차 1. JPA란? 2. JPA 사용 목적 3. SpringData JPA를 이용한 간단한 CRUD JPA란? JPA는 자바 진영의 ORM 기술 표준이다. 아주 오래전 EJB를 사용하던 때 한 회사원이 EJB의 복잡성과 어려움에 견디지 못하고 퇴근하고 Hibernate를 만들었고 이걸 접한 JAVA에서 Hibernate 담당자들을 데려와 여러 개발자와 함께 JPA 표준을 만들었다는 이야기가 있다. 중요한건 JPA는 하나의 명세일뿐 JPA를 기반으로 Hibernate, OpenJPA, Eclips..

turtleDev
'분류 전체보기' 카테고리의 글 목록 (6 Page)