이 저장소는 JPA의 실무 활용에 필요한 핵심 개념을 실습하며 익히기 위한 스터디입니다.
엔티티 간 연관관계 매핑, 순환 참조 문제 해결, 성능 최적화(N+1 문제 해결) 등을 직접 구현하며 학습합니다.
각 실습 주제마다 별도 브랜치를 기준으로 개별 브랜치를 파서 실습합니다.
- 형식:
{문제 브랜치명}-{이름}
예시:fix-circular-reference-with-dtos-홍길동
,fix-N+1-issue-김싸피
- 실습 브랜치는 반드시
main
이 아닌 주제 브랜치에서 파생 - 실습 완료 후 PR (Pull Request)은 해당 주제 브랜치로 보낼 것
- 목표: 양방향 연관관계에서 발생하는 Jackson 순환 참조 문제 이해 및 해결
- 발생 오류 예시:
ByteBuddyInterceptor
직렬화 실패InvalidDefinitionException
예외
- 학습 포인트:
- @JsonManagedReference / @JsonBackReference
- @JsonIgnore
- DTO로 해결하는 방식
- Hibernate 프록시 객체 직렬화 대응
실습 브랜치 예시: fix-circular-reference-with-dtos-홍길동
- 목표: 어노테이션 방식으로 순환 참조 해결해보기
- 방법:
- ClassRoom → Student:
@JsonManagedReference
- Student → ClassRoom:
@JsonBackReference
- ClassRoom → Student:
- 한계: 복잡한 구조에서는 유연성 부족
- 학습 포인트:
- 어노테이션 방식의 장단점 이해
- API 응답의 제약 확인
실습 브랜치 예시: fix-circular-reference-홍길동
- 목표: 엔티티를 직접 노출하지 않고 DTO를 통해 순환 참조 회피
- 학습 포인트:
- Entity → DTO 변환 로직 구현
- 필요한 필드만 포함한 응답 생성
- 유지보수성과 확장성 확보
실습 브랜치 예시: fix-circular-reference-with-dtos-홍길동
- 목표: 연관관계를 단방향으로 설정하여 순환 참조 자체를 없애기
- 학습 포인트:
- 설계 단순화
- 유지보수성 향상
- 연관관계 주인 설정 이해
실습 브랜치 예시: fix-circular-reference-with-Unidirectional-홍길동
브랜치:
fix-N+1-issue
- 목표: JPA에서의 N+1 문제 발생 조건과 해결 방법 학습
- 해결 방법:
- Fetch Join 사용
- EntityGraph 활용
- Batch Size 설정
- 테스트 실행 방법 제공:
./gradlew test --tests "com.example.jpapractice.JpaNPlusOneTest.testNPlusOneSolution"
- LAZY 로딩의 위험성
- SQL 쿼리 로그 분석
- 성능 튜닝 실습