엔티티 매핑
엔티티를 매핑할 때 사용하는 어노테이션들을 살펴보자
객체와 테이블 매핑
@Entity
JPA에게 관리를 맡기기 위해서는 클래스에 @Entity 어노테이션을 붙여줘야한다.
주의할 점은 다음과 같다.
- 기본 생성자 필수 (Lombok의 @NoArgsConstructor 를 사용하면 자동으로 기본 생성자를 생성해준다)
- final 클래스, enum, interface, inner 클래스 사용 X
- 저장할 필드에 final 사용 X
@Table
엔티티와 매핑할 테이블을 지정해준다.
기본값은 엔티티 이름을 사용한다.
속성으로는 name, catalog, schema, uniqueConstraints(DDL)이 있다.
필드와 컬럼 매핑
@Column
@Enumerated
자바 enum 타입을 매핑할 때 사용한다.
@Temporal
날짜 타입(java.util.Date, java.util.Calendar)을 매핑할 때 사용한다.
@Lob
가변길이를 갖는 큰 데이터를 저장하는데 사용한다.
데이터베이스 BLOB, CLOB 타입과 매핑된다.
매핑하는 필드 타입이 문자면 CLOB이 자동으로 매핑되고, 나머지는 BLOB이 매핑된다.
@Transient
필드 매핑을 제외하는 어노테이션이다.
데이터베이스에 저장, 조회를 하지 않는다.
주로 메모리상에서만 임시로 어떤 값을 보관하고 싶을 때 사용한다.
기본 키 매핑
@Id
@Id는 필수로 사용해야한다.
@GeneratedValue
기본 키 자동 생성을 위해 @GeneratedValue 어노테이션을 붙일 수 있는데
key 자동 생성에 대한 4가지 전략이 있다.
IDENTITY 전략
- 기본 키 생성을 데이터베이스에 위임
- 주로 MySQL, PostgreSQL, SQL Server, DB2에서 사용
@Entity
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
SEQUENCE 전략
- 데이터베이스 시퀀스 오브젝트 사용
- Oracle에서 주로 사용
- @SequenceGenerator 필요
@Entity
@SequenceGenerator(
name = “MEMBER_SEQ_GENERATOR",
sequenceName=“MEMBER_SEQ",//매핑할 데이터베이스 시퀀스 이름
initialValue = 1, allocationSize = 1)
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "MEMBER_SEQ_GENERATOR")
private Long id;
TABLE 전략
- 키 생성용 테이블 사용
- 모든 DB에서 사용
- @TalbeGenerator 필요
create table MY_SEQUENCES (
sequence_name varchar(255) not null,
next_val bigint,
primary key ( sequence_name )
)
@Entity
@TableGenerator(
name = "MEMBER_SEQ_GENERATOR",
table = "MY_SEQUENCES",
pkColumnValue = “MEMBER_SEQ", allocationSize = 1)
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.TABLE,generator = "MEMBER_SEQ_GENERATOR")
private Long id;
AUTO 전략
- 방언에 따라 자동 지정
- 기본값
연관관계 매핑
연관관계 매핑시는 다음 3가지를 고려하며 매핑을 해야한다.
- 단방향, 양방향
- 연관관계의 주인
- 다중성
하나씩 살펴보자
단방향, 양방향
- 테이블
- 외래 키 하나로 양쪽 조인이 가능하다. → 방향을 나눌 필요가 X
- 객체한쪽만 참조하면 단방향, 양쪽이 서로 참조하면 양방향이다.
- 참조용 필드가 있는 쪽으로만 참조가 가능하다.
양방향을 무분별하게 설정하다 보면 객체가 복잡해지는 경우가 많으니 조심히 설계하자
연관관계의 주인
둘중 테이블의 외래 키를 관리할 곳을 지정해야 한다.
연관관계의 주인은 외래 키를 관리하고 Insert, update 권한을 갖는다.
주인의 반대편은 외래 키에 영향을 주지 않고, 단순 조회만 가능하다.
주인이 아닌 객체는 mappedBy 속성을 통해 주인을 지정해줘야한다!
다중성
다대일(N:1) - @ManyToOne
- 가장 많이 사용하는 연관관계
- 외래 키가 있는 쪽이 연관관계의 주인
일대다(1:N) - @OneToMany
- 다(N) 쪽에 외래 키가 있지만, 1이 연관관계의 주인
- 객체와 테이블의 차이 때문에 반대편 테이블의 외래 키를 관리하는 특이한 구조
- @JoinColumn을 꼭 사용해야 함. 그렇지 않으면 조인 테이블 방식을 사용함
- 관리 주체가 외래키를 가지고 있지 않으므로 지양하고, 다대일 양방향을 사용하자!
일대일 - @OneToOne
- 외래 키가 있는 곳이 연관관계의 주인
다대다 - @ManyToMany
- @JoinTable로 연결 테이블 지정
- 실무에서 사용X
'Back-end > Java&Spring' 카테고리의 다른 글
Spring Boot - 외부 설정 파일과 프로필 관리 (2) | 2024.10.09 |
---|---|
Spring Boot - 핵심 기능 (0) | 2024.10.02 |
Spring JPA (2) - JPA 동작 과정 (4) | 2024.09.24 |
Spring JPA (1) - JPA 이해 (0) | 2024.09.23 |
Spring JDBC (4) - 예외 처리 (2) | 2024.09.12 |