DB 테이블 ~ 엔티티 클래스 간의 매핑 작업
: JPA를 이용해 DB 테이블과 상호 작용(데이터 저장, 수정, 조회, 삭제) 하기 위해
가장 먼저 해야할 작업
엔티티 클래스 ~ DB 테이블 단일 테이블 간의 매핑 작업
1) 객체 ~ 테이블 간 매핑
2) 기본키 매핑
3) 필드(멤버 변수) ~ 컬럼 간 매핑
4) 엔티티 간의 연관 관계 매핑 (🔥)
엔티티 ~ 테이블 간의 매핑
@Entity : 엔티티 클래스 ~ 테이블 매핑
붙이면 JPA 관리 대상 엔티티가 된다.
ex) @Entity(name = "SOMETHING")
엔티티 이름 설정 가능, 미설정시 클래스이름 = 엔티티이름
@Id : 테이블의 기본키 컬럼에 매핑
@Table : 테이블 이름 설정 가능
ex) @Table(name = "SOMETHING")
추가하지 않을 경우 클래스이름 = 테이블이름
* 주로 테이블 이름이 클래스 이름과 달라야 할 경우에 추가!
@Entity, @Id 애너테이션 - 필수 & 함께 사용됨!
@Table - 옵션
파라미터가 없는 기본 생성자는 필수로 추가한다.
기본키 매핑
@Id 추가한 필드 = 기본 키 컬럼
JPA 에서는 기본키 생성 방식(전략)에 따라 달라진다!
1. 기본키 직접 할당 : 애플리케이션 코드 상 기본키 직접 할당
2. 기본키 자동 생성
- IDENTITY : 기본키 생성을 db에 위임 (db의 AUTO_INCREMENT)
- SEQUENCE : db에서 제공하는 시퀀스 활용
- TABLE : 별도의 키 생성 테이블 사용
기본키 직접 할당 전략
@NoArgsConstructor
@Getter
@Entity
public class Member {
@Id //기본키 직접 할당
private Long memberId;
...
}
@Id 애너테이션을 추가한다!
IDENTITY 전략
: db에서 기본키를 대신 생성해준다
@NoArgsConstructor
@Getter
@Entity
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY) //IDENTITY 전략
private Long memberId;
public Member(Long memberId) {
this.memberId = memberId;
}
}
@GeneratedValue 애너테이션의 strategy 애트리뷰트 값을
GenerationType.IDENTITY 로 지정해준다!
SEQUENCE 전략
: DB에서 제공하는 시퀀스를 활용한다
package com.codestates.entity_mapping.single_mapping.id.sequence;
@NoArgsConstructor
@Getter
@Entity
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE) //시퀀스 전략
private Long memberId;
public Member(Long memberId) {
this.memberId = memberId;
}
}
@GeneratedValue 애너테이션의 strategy 애트리뷰트 값을
GenerationType.SEQUENCE 로 지정해준다!
AUTO 전략
@GeneratedValue 애너테이션의 strategy 애트리뷰트 값을
GenerationType.AUTO 로 지정해준다!
- db의 Dialect 에 따라서 적절한 전략을 자동으로 선택해줌
* Dialect? : 표준 SQL 등이 아닌 특정 db에 특화된 고유한 기능
엔티티 필드(멤버 변수)와 컬럼 간의 매핑
package com.codestates.entity_mapping.single_mapping.column;
@NoArgsConstructor
@Getter
@Entity
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long memberId;
//필드 ~ 컬럼 매핑
@Column(nullable = false, updatable = false, unique = true)
private String email;
...
...
public Member(String email) {
this.email = email;
}
}
@Column 없고 필드만 정의 되어있으면
JPA는 필드 ~ 테이블 컬럼과 매핑되는 필드라고 간주함!
애트리뷰트 값도 디폴트 값이 모두 적용된다.
@Column 에서 지정할 수 있는 애트리뷰트들
nullable : 컬럼에 null 값을 허용할지 여부
(default = true)
* null - 필드 데이터 타입이 객체 타입일 경우에만 적용
(원시타입 : int, long... 은 불가)
updatable : 컬럼 데이터를 수정할수 있는지 여부
(default = true)
unique : 하나의 컬럼에 유니크 제약 조건 설정
(default = false)
* 고유한 값이여야 하는 경우 (unique = true) 로 준다.
length : 컬럼에 저장할 수 있는 문자 길이 지정
(default = 255)
@Temporal : 시간 및 날짜 매핑 위한 필드
ex) java.util.Date, java.util.Calendar...
* LocalDateTime - @Temporal 생략 가능!
(컬럼의 TIMESTAMP 타입과 매핑됨)
@Transient : 테이블 컬럼과 매핑하지 않겠다는 의미
db에 저장, 조회시 매핑되지 않음
주로 임시 데이터를 메모리에서 사용하기 위한 용도로 사용
@Enumerated : enum 타입과 매핑 시 사용함
- EnumType.ORDINAL : enum 의 순서 나타내는 숫자를 테이블에 저장
- EnumType.STRING : enum 의 이름을 테이블에 저장
* ORDINAL 의 경우 추후 enum 추가가 된다면 순서가 엉켜버리므로
STRING 이 권장된다!
엔티티 ~ 테이블 매핑 권장 사용 방법
클래스 이름 중복 등 특별 이유가 없으면
@Entity , @Id 애너테이션만 추가한다.
(+ @Table 로 테이블명 지정 가능)
기본키 생성 전략 - IDENTITY / SEQUENCE
: db 지원 AUTO_INCREMENT, SEQUENCE 사용 가능하도록
@Column 정보 명시적 지정? - 테이블 설계 파악에 쉽다
엔티티 클래스 필드 타입이 원시타입일 경우 (ex) int, long ...)
최소한 nullabe = false 설정하기
@Enumerated - STRING 권장
'Spring > JPA' 카테고리의 다른 글
[JPA] JPA(Java Persistence API)란? (0) | 2022.11.01 |
---|
댓글