엔티티와 테이블 간의 매핑
@Entity 어노테이션을 붙여 JPA 관리 대상 엔티티로 지정
@Entity(name = "USERS)
@Table(name = "USERS)
public class Member{
@Id
private Long memberId;
}
@Table은 옵션이지만 @Entity와 @Id는 필수
테이블의 기본값은 클래스 명이지만, 변경하고 싶다면 name = "원하는클래스명" 으로 변경 가능
@Entity (name = ) 엔티티와 테이블 명 모두 변경@Table (name = ) 테이블 명만 변경파라미터가 없는 기본 생성자는 필수로 추가
클래스 명으로 테이블 명을 사용하는 것을 권장하지만 아래의 경우 테이블 명 변경이 필요
기본키 매핑
@GeneratedValue 에 strategy 애트리뷰트 값을 지정하여 사용
| 키 생성 전략 | 할당 방법 | 특징 |
|---|---|---|
| @Id | 직접 할당 | 애플리케이션에서 직접 할당 휴먼 에러 주의 |
| IDENTITY | 자동 생성 | 키 생성 방법을 DB에 위임em.persist()시점에 쿼리 수행 |
| SEQUENCE | 자동 생성 | 데이터베이스 오브젝트 사용em.persist() 시점에 키 조회 후 할당 |
| TABLE | 자동 생성 | 키 생성 전용 테이블 생성 모든 데이터베이스에 적용 가능 성능 안좋음 |
| AUTO | 자동 생성 | 사용하는 데이터베이스에 따라 자동으로 선택 데이터베이스 변경에 따른 코드 수정 없음 초기, 프로토 타입 개발에 적용 |
필드와 컬럼 간의 매핑
@Column을 통해 필드와 컬럼을 매핑할 수 있다.
| 속성 | default | 특징 | 비고 |
|---|---|---|---|
| name | "" | 컬럼의 이름을 설정 | 생략하면 클래스 필드의 이름으로 생성됨 |
| length | 255 | 컬럼의 길이를 제한 | 비밀번호와 같이 자리수 제한이 있는 경우 사용 |
| nullable | true | 컬럼에 null을 허용할지 여부 | 자바 원시 타입 필드의 경우 false를 설정하는 것이 좋음 |
| updateable | true | 컬럼 데이터를 수정할 수 있는지 여부 | 고유한 값인 경우 수정 불가능하게 만드는 것이 좋음 |
| unique | false | 해당 컬럼이 고유한 값인지 여부 | ID와 같이 고유한 값인 경우 고유한 값으로 지정하는 것이 좋음 |
ORDINAL : enum의 순서를 나타내는 숫자를 테이블에 저장
STRING : enum의 이름을 테이블에 저장
EnumType.String을 사용하는 것을 권장하는데, EnumType.ORDINAL의 경우 기존 정의되어 있는 enum 사이에, 새로운 enum이 추가되면 정의되어 있던 순서들이 일치하지 않는 문제가 발생하기 때문
java.util.Date, java.util.Calendar 타입으로의 매핑을 위해사용
LocalDate, LocalDateTime 타입의 경우 생략 가능
엔티티 클래스의 예외
엔티티 클래스에서 발생하는 예외는 모두 API 계층까지 전파되므로 별도의 ExceptionHandler를 구성한 클래스나 advice를 통해 예외를 catch 할 수 있다.