JPA를 실무에 도입하면 많은 개발자가 가장 먼저 마주하는 성능 문제 중 하나가 N+1 문제입니다. 간단한 데이터 조회 쿼리처럼 보이지만, 실제 서비스 환경에서는 심각한 성능 저하로 이어질 수 있습니다. N+1 문제의 발생 원인부터 실전 해결책인 Fetch Join과 @EntityGraph를 활용하는 을 정리했습니다. 1. N+1 문제란 무엇인가?간단히 말해, 1번의 조회 쿼리(N) 이후에 관련된 엔티티를 조회하기 위한 추가 쿼리(+N)가 발생하는 문제입니다. 예를 들어 게시글(Post) 리스트를 조회하고, 각 게시글의 댓글(Comment) 리스트를 같이 가져오려고 할 때 다음과 같은 쿼리 구조가 됩니다.List posts = postRepository.findAll();for (Post post : ..
JPA를 사용하는 백엔드 개발자라면 누구나 한 번쯤은 예상치 못한 쿼리 폭발 또는 무한 참조를 경험했을 겁니다. 대부분의 원인은 연관관계 설정 시 Fetch 전략을 정확히 이해하지 못한 데서 비롯됩니다.FetchType.LAZY와 FetchType.EAGER의 동작 방식, 각각의 장단점, 그리고 실무에서 언제 어떤 전략을 써야 하는지를 예제를 통해 알아보겠습니다. 1. Fetch 전략이란?JPA에서 연관된 엔티티를 언제 로딩할지 결정하는 정책을 Fetch 전략이라 부릅니다. 크게 두 가지 방식이 있습니다:Lazy Loading (지연 로딩): 연관된 엔티티를 실제로 사용할 때 쿼리를 실행Eager Loading (즉시 로딩): 엔티티를 조회할 때 연관된 엔티티도 함께 조회 2. 기본 전략: 단방향 vs..
Spring Data JPA를 쓰다 보면, 엔티티 간 관계 설정은 피할 수 없는 주제입니다. 잘못 설계하면 성능 문제부터 N+1, 무한 루프, 삭제 오류 등 여러 문제가 발생하죠1:N, N:M 연관관계의 개념과 설정법, 그리고 Cascade 옵션의 의미와 주의할 점까지 실무 위주로 정리합니다. 1. 연관관계의 기본 개념JPA는 객체지향적인 데이터 모델을 추구합니다. 이를 위해 @OneToMany, @ManyToOne, @ManyToMany 같은 어노테이션을 사용해 엔티티 간 관계를 정의합니다.1:N: 하나의 부모가 여러 자식을 가짐 (ex. 하나의 게시글에 여러 댓글)N:1: 여러 자식이 하나의 부모를 참조함 (ex. 여러 댓글이 하나의 게시글을 참조)N:M: 양쪽 다 다수 관계 (ex. 사용자와 역할 ..
Spring Data JPA는 메서드 이름만으로도 간단한 쿼리를 자동 생성해주지만, 복잡한 조건이나 조인을 처리하려면 JPQL(Java Persistence Query Language)과 @Query 어노테이션이 필요합니다. JPQL 작성법과 @Query 사용 방법을 정리해보겠습니다. 1. JPQL이란?JPQL은 SQL과 비슷하지만, 엔티티(Entity)를 대상으로 동작한다는 점이 다릅니다. 즉, SELECT u FROM User u처럼 테이블이 아닌 엔티티 클래스 이름을 기준으로 작성합니다.JPQL vs SQLJPQLSQLSELECT u FROM User u WHERE u.age > 20SELECT * FROM users WHERE age > 20엔티티 기준테이블 기준 2. @Query 어노테이션 기본..
Spring Data JPA를 사용하면 반복적인 CRUD SQL을 직접 작성하지 않아도 됩니다. 핵심은 바로 Repository 인터페이스에서 메서드 이름만으로 쿼리를 자동 생성해주는 기능입니다. JpaRepository를 확장하여 쿼리를 작성하는 방법과 실무에서 자주 쓰는 메서드 예시, 그리고 주의할 점까지 정리합니다. 1. 기본 구조@Repositorypublic interface UserRepository extends JpaRepository { // 메서드 이름 기반 쿼리 Optional findByEmail(String email); List findAllByAgeGreaterThan(int age);}Spring Data JPA는 findBy, existsBy, cou..
Spring Data JPA를 사용하기 위해서는 도메인 객체를 엔티티(Entity)로 선언하고, 그에 맞는 기본 키(PK)를 설정하는 것이 필수입니다. @Entity, @Id, @GeneratedValue의 역할과 활용 방법을 구체적으로 설명합니다. 1. @Entity – 자바 클래스를 테이블로 매핑@Entity는 해당 클래스가 JPA에서 관리하는 엔티티 객체임을 선언하는 어노테이션입니다. Spring Boot 프로젝트에서는 이 어노테이션만 붙이면 DB 테이블과 자동 매핑이 가능합니다.예시:@Entitypublic class User { @Id private Long id; private String name;}주의사항:기본 생성자(public User() {})가 반드시 있어야 합니다...