[스프링부트 #12] JPA의 핵심 기술과 개념 체계도

도경원's avatar
Aug 23, 2025
[스프링부트 #12] JPA의 핵심 기술과 개념 체계도

1. 객체와 관계형 데이터베이스의 불일치 해결

핵심 개념: ORM(Object-Relational Mapping)
자바의 객체 모델과 RDB의 테이블 모델 간 불일치를 해결하기 위한 기술.
이 개념 자체가 JPA의 존재 이유이자 근본 철학이다.
핵심 기술
  • @Entity, @Id, @Table 등 엔티티 클래스 매핑
  • @Column, @GeneratedValue 등 필드 속성 매핑
  • @Embedded, @Embeddable 등 내장 타입 활용

2. 연관관계 매핑

핵심 개념: 객체는 참조, DB는 외래키
객체는 user.getTeam() 같은 참조를 사용하지만,
RDB는 user.team_id 같은 외래 키로 관계를 표현한다.
핵심 기술
  • @ManyToOne, @OneToMany, @OneToOne, @ManyToMany
  • @JoinColumn, mappedBy 등 양방향/단방향 매핑 설정
  • Cascade, orphanRemoval 등 연관 객체 생명주기 관리

3. 영속성 컨텍스트 (Persistence Context)

핵심 개념: JPA의 심장, 1차 캐시 + 엔티티 상태 관리
em.persist()를 호출해도 즉시 DB에 반영되지 않고,
먼저 영속성 컨텍스트에 저장된다.
트랜잭션 안에서는 동일성(==)이 보장된다.
핵심 기술
  • 1차 캐시: 중복 조회 방지
  • 변경 감지(Dirty Checking): setter 호출만으로도 UPDATE 쿼리 자동 발생
  • 쓰기 지연: SQL 저장 후 flush() 시점에 전송

4. JPQL / Criteria / QueryDSL

핵심 개념: 엔티티 객체를 기준으로 하는 쿼리 언어
JPQL은 테이블이 아닌 엔티티를 기준으로 작성하며,
DB 벤더 종속성이 줄고 유지보수성이 높다.
핵심 기술
  • select e from Entity e where e.field = :value
  • join fetch, group by, order by 등 SQL 유사 문법 지원
  • CriteriaBuilder, QueryDSL 등으로 타입 안정성 확보 가능

5. 트랜잭션 & 상태 추적

핵심 개념: 변경 감지(Dirty Checking) + 자동 Flush
@Transactional 메서드 안에서 엔티티 상태가 변경되면,
트랜잭션 커밋 시 자동으로 UPDATE 쿼리가 실행된다.
핵심 기술
  • @Transactional, flush(), clear()
  • em.merge(), em.detach(), em.remove() 등 상태 전이 메서드

6. Fetch 전략 (지연 vs 즉시 로딩)

핵심 개념: 언제 연관 엔티티를 가져올 것인가
즉시로딩은 쿼리 한 번에 연관 객체까지 모두 가져오지만 비효율적일 수 있고,
지연로딩은 실제 사용 시점에 추가 쿼리로 조회한다.
핵심 기술
  • fetch = FetchType.LAZY (지연 로딩, 기본 권장 설정)
  • fetch join을 통한 성능 최적화
  • EntityGraph로 쿼리 성능 조정 가능

7. 스프링 데이터 JPA 연계

핵심 개념: JPA + 스프링의 생산성 극대화
Repository 인터페이스만 작성하면 구현체가 자동 생성되며,
쿼리 메서드 이름만으로도 조회가 가능하다.
핵심 기술
  • JpaRepository<T, ID> 상속
  • findByUsername(), existsByEmail() 등 메서드 네이밍 기반 쿼리
  • @Query, @Modifying, @EntityGraph 등 추가 쿼리 커스터마이징
 
Share article

Gyeongwon's blog