Develop

34일차_Spring-JPA(영속성 컨텍스트, Entity 연관관계 매핑, N+1문제, CRUD), Spring-data(JPA 설정 및 사용, QueryDSL 사용준비) 본문

백엔드/KDT_Programmers

34일차_Spring-JPA(영속성 컨텍스트, Entity 연관관계 매핑, N+1문제, CRUD), Spring-data(JPA 설정 및 사용, QueryDSL 사용준비)

230801 2025. 4. 21. 02:51

안녕하세요 .ᐟ

 

오늘은 4/18(금), 데브코스  34일차 (7주 5일차) 입니다.

 

오늘은 스프링 JPA와 영속성컨텍스트, Entity, 연관관계매핑과 N+1 문제, Spring DATA에서 JPA를 사용하기위한 준비를 학습했습니다.

 


Spring JPA : 개념

  • ORM(Object relation mapping) : OOP 객체와 관계형 데이터베이스의 데이터를 연결하는 기술
  • JPA : 자바 진영의 ORM 표준 인터페이스

 

JPA를 왜 사용하는가? 

  • SQL 중심 개발 -> 객체 중심 개발로 전환
  • 쿼리를 작성하지않으므로 생산성 향상, 유지보수성 향상
  • 캐시레이어가 추가되어 성능을 최적화할 여지가 높음
  • 어떤 데이터베이스를 사용하든 동일한 방식으로 사용가능

 

영속성 컨텍스트 (PersistenceContext)

  • Entity를 영구히 저장하는 환경으로, EntityManager 를 사용해 관리할 Entity를 보관하고 관리

 

Entity 상태

  • 비영속 상태
    • Entity 를 처음 만들었을 때 상태 (EntityManager가 관리하고 있지 않음)
  • 영속 상태
    • EntityManager 가 관리하는 Entity (1차 캐시, dirty-check 등의 관리)
  • 준영속 상태
    • EntityManager 에 의해 관리되고 있었으나, 관리 대상이 아니게 된 상태

 

 

Entity 연관관계 매핑 (단방향 & 양방향)

  • 양방향 매핑
    • 서로참조하고 있기 때문에 어디서든 참조 가능
      • 연관관계의 주인이 누군지 모르기 때문에 지정해줘야 외래키가 잡힘 
    • @JoinColumn : 연관관계의 주인쪽에 설정
    • mappedBy : 주인이 아닌쪽에 설정
    • cascade 옵션 : 연관 엔티티도 함께 저장/삭제 가능
  • 단방향 매핑
    • 참조용 필드가 있는 객체에서만 다른 객체 참조 가능
    • mappedBy 필요 없음
    • 한쪽만 연관관계 가짐 (구현 간단, 조회 제한 있음)

 

 

N + 1 문제

  • N개의 Entity 조회할 때 해당 Entity와 연관관계인 Entity 식별자로 조회하여 쿼리가 N+1개 생성되는 문제
  • 해결 방법
    • @Query + fetch join
      • findAllWithFetchJoin()
    • @EntityGraph
      • findAllWithEntityGraph()
    • @NamedEntityGraph
      • 미리 정의된 그래프 사용: findAllWithNamedEntityGraph()

 

JPA CRUD

1. 전역에 EntityManagerFactory 생성

2. 지역에 EntityManager 생성

3. 트랜잭션 관리객체 생성 및 트랜잭션 시작

4. 영속성 컨텍스트에 Entity 등록

5. Entity 식별자를 사용해 Entity를 가져옴 (Entity 변경 시 더티체크 후 커밋시점에 DB에 반영)

6. 데이터베이스에서 Entity 삭제

7. 트랜잭션 커밋 (쿼리 생성)

8. 영속성 컨텍스트 종료

 


Spring Data : JPA 설정 및 사용

  • Spring Data : JPA 를 더 쉽고 편하게 다루기 위한 모듈
    • JPA 를 한단계 더 추상화 시킨 Repository 인터페이스를 제공함
    • Repository 인터페이스 규칙대로 메소드 선언 시, Spring 이 메소드 이름에 적합한 쿼리를 작성하는 구현체를 만들어 Bean 으로 등록해줌

 

 

  • JpaRepository 상속
    • 기본 메서드 제공: findById(), findAll(), count(), existsById()
    • 메서드 이름만으로 자동 쿼리 생성 (And, Or, Like, In, OrderBy 등 조합 가능)
  • application.properties 설정
spring.sql.init.mode=always     # SQL 초기화 전략
spring.jpa.hibernate.ddl-auto=update  # DDL 동작 설정 (create, update, none 등)

 

 

 

  • QueryDSL 사용 이유 & 준비
    • http://querydsl.com/
    • JPA 메서드 이름이 길어질 때 가독성 ↓
    • QueryDSL은 타입 안정성 + 자유도 높은 조건 조립 가능
  • 의존성 추가 (pom.xml)
<dependency>
  <groupId>com.querydsl</groupId>
  <artifactId>querydsl-jpa</artifactId>
  <version>5.0.0</version>
  <classifier>jakarta</classifier>
</dependency>
<dependency>
  <groupId>com.querydsl</groupId>
  <artifactId>querydsl-apt</artifactId>
  <version>5.0.0</version>
  <classifier>jakarta</classifier>
</dependency>

 

 

오늘도 고생하셨습니다  .ᐟ