| 옵션 | 설명 |
|---|---|
create | 애플리케이션 실행 시 매핑된 테이블을 삭제 후 재생성. 기존 데이터 모두 삭제됨 |
create-drop | create와 동일하지만, 애플리케이션 종료 시 테이블도 삭제 |
none | 하이버네이트가 DDL 작업에 관여하지 않음 |
update ⭐ | 실행 시 엔티티와 테이블을 비교하여 컬럼 변경 사항만 반영. 기존 데이터 유지 ※ 컬럼 삭제는 직접 수행해야 함 |
validate | 실행 시 엔티티와 테이블 구조가 같은지 검증. 다르면 실행 불가 |
JPA는 트랜잭션 기반으로 동작하며, 영속성 컨텍스트를 통해 엔티티를 관리한다.
EntityManager가 이 영역을 관리하며, .persist()를 통해 엔티티를 등록할 수 있음
flush() 실행 → DB에 실제 SQL 반영commit 완료 시 DB에 최종 반영| 상태 | 설명 |
|---|---|
| 영속 | 영속성 컨텍스트에 저장된 상태. 변경 시 트랜잭션 종료 시점에 반영됨 |
| 준영속(detached) | 컨텍스트에서 분리된 상태. setter를 호출해도 update SQL이 나가지 않음 |
| 비영속(transient) | 엔티티 객체만 생성된 상태. persist 호출 전 단계 |
| 삭제(removed) | 컨텍스트 및 DB에서 삭제된 상태 |
Repository 인터페이스 기반으로 구현USER
| 필드 | 설명 |
|---|---|
| ID(PK) | 회원 번호 |
| 이메일 | |
| 비밀번호 | 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; // 작성자
}
| 종류 | 설명 |
|---|---|
| 단방향 | 한 객체만 다른 객체를 참조 |
| 양방향 | 양쪽이 서로를 참조. 객체 그래프 탐색 가능하나 관리 주의 필요 |
| 관계 | 의미 |
|---|---|
| 1:N | 한 명의 회원 → 여러 게시물 |
| N:1 | 여러 게시글 → 하나의 작성자 |
| 1:1 | 하나의 엔티티와 하나만 연결 |
| N:N | 양쪽이 여러 개씩 연결 → 실제 구현 시 1:N + N:1로 풀어냄 |
항상 다(N) 쪽에 외래키 존재
양방향 관계일 경우
둘 중 한 엔티티가 연관관계의 주인이 되며, 주인이 FK를 관리한다
JPA에서는 주인 아닌 쪽은 읽기 전용 역할을 하게 된다
ddlAuto는 개발 단계에서 유용하지만 운영 환경에서는 주의 필요JPA = 객체 중심 + 연관관계 기반 설계 + 영속성 관리 + SQL 절감