2025년 11월 6일 목요일 (109일차)

Jeonghoon·2025년 11월 6일

jeonghoon's Study

목록 보기
112/128

☕ JPA 영속성 & 엔티티 관계 정리


🧩 [ JPA (Java Persistence API) ]

🔒 [ 영속성 (Persistence) ]

  • Java 객체와 데이터베이스 데이터를 연결하는 개념
  • 영속성 컨텍스트에 포함된 객체는 DB와 동기화된다.
상태설명
영속 상태Java 객체가 영속성 컨텍스트에 포함되어 DB 데이터와 연결된 상태
비영속 상태Java 객체가 영속성 컨텍스트에 포함되지 않아 DB와 연동되지 않음
준영속 상태영속성이 일시적으로 해제된 상태 (detach 등으로 관리 중단)

💡 영속 중이라면, Java 객체의 데이터를 수정하면 DB 데이터도 자동으로 수정된다.


🔗 [ 엔티티 관계 (Entity Relationship) ]


🔹 [ 단방향 연결 (Unidirectional) ]

  • 하위 엔티티가 상위 엔티티를 참조하는 관계
  • N : 1 (ManyToOne) 구조 — 여러 개의 FK가 하나의 PK를 참조한다.

📘 설정 방법

@ManyToOne
@JoinColumn(name = "FK_필드명")
private ParentEntity parent;

⚙️ [ ManyToOne 제약 조건 옵션 ]

🧩 cascade (연쇄 작업 설정)
옵션설명
CascadeType.ALL부모의 삭제/수정/저장 시, 자식도 동일하게 처리
CascadeType.PERSIST부모 저장 시, 자식도 함께 저장
CascadeType.MERGE부모 수정 시, 자식도 함께 수정
CascadeType.REMOVE부모 삭제 시, 자식도 함께 삭제
CascadeType.REFRESH부모 재조회 시, 자식도 함께 재조회
CascadeType.DETACH부모 영속 해제 시, 자식도 함께 영속 해제
⚙️ fetch (조회 전략)
옵션설명
FetchType.EAGER부모 엔티티를 조회할 때, 자식 엔티티를 즉시 조회
🔹 기본값 (ManyToOne 기본값은 EAGER)
⚠ 초기 로딩이 느려질 수 있으며, 불필요한 데이터까지 가져올 위험 존재
FetchType.LAZY부모 엔티티 조회 시, 자식 엔티티는 지연 조회 (필요 시 로드)
🔹 성능 최적화 가능
🔹 참조엔티티.getXXX() 호출 시 실제 DB 조회 진행

⚙️ 권장: 실제 서비스에서는 대부분 fetch = FetchType.LAZY 사용


🔸 [ 양방향 연결 (Bidirectional) ]

  • 상위 엔티티가 하위 엔티티를 참조하는 구조
  • 1 : N (OneToMany) 관계 — 하나의 PK가 여러 FK를 참조한다.

📘 설정 방법

@OneToMany(mappedBy = "parent")
@ToString.Exclude       // 순환 참조 방지
@Builder.Default        // 빌더 패턴 시 초기 리스트 생성
private List<ChildEntity> childList = new ArrayList<>();

⚙️ [ OneToMany 제약 조건 옵션 ]

옵션설명
mappedBy상대 엔티티에서 참조하고 있는 변수명을 지정 (FK 보유 측)

💡 주의: 양방향 연결에서는 mappedBy가 없는 쪽이 FK를 소유하는 주인(Entity Owner) 이 된다.


🧾 요약

항목설명
영속성Java 객체와 DB 데이터를 동기화하는 상태 관리 메커니즘
🔗 단방향 연결하위(Entity)가 상위(Entity)를 참조 (@ManyToOne)
🔄 양방향 연결상위(Entity)가 하위(Entity)를 참조 (@OneToMany(mappedBy=""))
⚙️ Cascade 옵션부모 조작 시 자식의 연쇄 처리 설정
🧠 Fetch 전략EAGER: 즉시 로딩 / LAZY: 지연 로딩 (성능 최적화용)

0개의 댓글