Spring boot JPA 12/02

jjade·2025년 12월 2일

Hibernate ddlAuto 옵션 · 영속성 컨텍스트 · 연관관계 매핑 정리

Hibernate ddlAuto 옵션

옵션설명
create애플리케이션 실행 시 매핑된 테이블을 삭제 후 재생성. 기존 데이터 모두 삭제됨
create-dropcreate와 동일하지만, 애플리케이션 종료 시 테이블도 삭제
none하이버네이트가 DDL 작업에 관여하지 않음
update실행 시 엔티티와 테이블을 비교하여 컬럼 변경 사항만 반영. 기존 데이터 유지
※ 컬럼 삭제는 직접 수행해야 함
validate실행 시 엔티티와 테이블 구조가 같은지 검증. 다르면 실행 불가

영속성 컨텍스트(PersistenceContext)

JPA는 트랜잭션 기반으로 동작하며, 영속성 컨텍스트를 통해 엔티티를 관리한다.
EntityManager가 이 영역을 관리하며, .persist()를 통해 엔티티를 등록할 수 있음

동작 흐름

  1. 엔티티를 영속성 컨텍스트로 로딩
  2. 1차 캐시에 저장 → 영속 상태
  3. 변경 쿼리를 쓰기 지연 저장소에 보관
  4. 트랜잭션 종료 시 flush() 실행 → DB에 실제 SQL 반영
  5. commit 완료 시 DB에 최종 반영

엔티티의 4가지 상태

상태설명
영속영속성 컨텍스트에 저장된 상태. 변경 시 트랜잭션 종료 시점에 반영됨
준영속(detached)컨텍스트에서 분리된 상태. setter를 호출해도 update SQL이 나가지 않음
비영속(transient)엔티티 객체만 생성된 상태. persist 호출 전 단계
삭제(removed)컨텍스트 및 DB에서 삭제된 상태

Repository

  • 애플리케이션과 DB 사이에서 데이터를 읽고 쓰는 역할을 담당하는 계층
  • Spring Data JPA에서는 Repository 인터페이스 기반으로 구현

연관관계 매핑(Relation Mapping)

테이블 구조

USER

필드설명
ID(PK)회원 번호
이메일email
비밀번호password
이름name
나이age

BOARD

필드설명
ID(PK)게시글 번호
제목boardTitle
내용boardContent
작성자(FK)USER.ID 참조

객체 구조

public class User {
    private Long id;
    private String userEmail;
    private String userPassword;
    private String userName;
    private Integer userAge;
}

public class Board {
    private Long id;
    private String boardTitle;
    private String boardContent;
    private User user; // 작성자
}

연관관계와 방향성

방향(Direction)

  • 객체는 참조를 통해 관계를 표현하기 때문에, DB와 달리 방향 개념이 존재함
종류설명
단방향한 객체만 다른 객체를 참조
양방향양쪽이 서로를 참조. 객체 그래프 탐색 가능하나 관리 주의 필요

다중성(Multiplicity)

관계의미
1:N한 명의 회원 → 여러 게시물
N:1여러 게시글 → 하나의 작성자
1:1하나의 엔티티와 하나만 연결
N:N양쪽이 여러 개씩 연결 → 실제 구현 시 1:N + N:1로 풀어냄

항상 다(N) 쪽에 외래키 존재


연관관계의 주인

양방향 관계일 경우
둘 중 한 엔티티가 연관관계의 주인이 되며, 주인이 FK를 관리한다

JPA에서는 주인 아닌 쪽은 읽기 전용 역할을 하게 된다


핵심 정리

  • ddlAuto는 개발 단계에서 유용하지만 운영 환경에서는 주의 필요
  • 영속성 컨텍스트는 JPA의 기반 메커니즘으로 엔티티 상태를 관리
  • 연관관계 매핑은 테이블 구조를 객체 중심으로 해석해 반영하는 과정
  • JPA는 객체지향 코드와 관계형 DB 간의 간극을 줄여 유지보수성을 높여줌
JPA = 객체 중심 + 연관관계 기반 설계 + 영속성 관리 + SQL 절감
profile
끊임없는 에너지를 공유하는 핫스팟 같은 개발자 최준서입니다!

0개의 댓글