학습 목표
- JPA 엔티티에 대한 매핑을 할 수 있다.
JPA를 이용해서 데이터베이스의 테이블과 상호작용(저장, 수정, 조회, 삭제) 하기 위해 제일 먼저 해야 되는 작업은 바로 데이터베이스의 테이블과 엔티티 클래스 간의 매핑 작업이다.
엔티티 매핑 작업은 크게 객체와 테이블 간의 매핑, 기본키 매핑, 필드와 컬럼 간의 매핑, 엔티티 간의 연관관계 매핑 등으로 나뉜다.
엔티티와 테이블 간의 매핑
@Entitiy 매핑 애너테이션을 이용해 엔티티 클래스와 테이블을 매핑하는것으로 JPA관리 대상 엔티티가 된다.
@Table 애너테이션은 테이블의 이름을 설정할 수 있고, 기본값은 클래스 이름을 테이블 이름으로 사용한다, 주로 테이블 이름이 클래스 이름과 달라야할 경우 추가한다.
@Table 애너테이션은 옵션이지만 @Entity , @Id 애너테이션은 필수이다. (@Entity와 @Id는 함께 사용)
기본키 매핑
데이터베이스의 테이블에 기본키 설정은 필수이다 JPA에서는 기본적으로 @Id 에너테이션을 추가한 피드가 기본 키 컬럼이 되는데 , JPA에서는 이러한 기본 키를 어떤 방식으로 생성해 줄지에 대한 다양한 전략을 지원한다.
JPA에서 지원하는 기본키 생성 전략은 (
-기본키 직접 할당(애플리케이션 코드상에 기본키를 직접 할당해주는 방식)
-기본키 자동생성
1. IDENTITY
-기본키 생성을 데이터베이스에 위임하는 전략
-데이터베이스에서 기본키를 생성해주는 대표적인 방식은 MySQL의 AUTO_INCREMENT 기능을 통해 자동 증가 숫자를 기본키로 사용하는 방식
2.SEQUENCE
-데이터베이스에서 제공하는 시퀀스를 사용해서 기본키로 생성하는 전략
3.TABLE
-별도의 키 생성 테이블을 사용하는 전략
기본키 직접 할당 전략 @Id 애너테이션만 추가하면 기본적으로 기본키 직접 할당 전략이 적용됨.
IDENTITY전략 @GeneratedValue(strategy = GenerationType.IDENTITY) 지정
SEQUENCE 전략 @GeneratedValue(strategy = GenerationType.SEQUENCE)를 지정[시퀀스 값을 조회하는 것을 볼 수 있음]
AUTO 전략 @GeneratedValue(strategy = GenerationType.AUTO)를 지정 [JPA가 데이터베이스의 Dialect에 따라서 적절한 전략을 자동으로 선택]
필드(멤버 변수)와 칼럼 간의 매핑
@Column 애너테이션은 필드와 컬럼을 매핑해주는 애너테이션이다. 그런데 만약 @Column 애너테이션이 없고 필드만 정의되어 있다면 JPA는 기본적으로 이 필드가 테이블의 칼럼과 매핑되는 필드라고 간주한다. 또 @Column 애너테이션에 사용되는 애트리뷰트의 값은 디폴트 값이 모두 적용된다.
- nullable
컬럼에 null 값을 허용할지 여부를 지정 , 디폴트 값은 true 이다.[email주소는 일반적으로 회원정보에서 ID로 많이 사용되며, 없어선 안될 정보이므로 nullable 값을 false로 지정]
- updatable
컬럼 데이터를 수정할 수 있는지 여부를 지정한다 디폴트 값은 true이다. [email 주소가 사용자 ID역할을 하면 한번 등록 후 수정이 불가능하도록 하기 위해서 updatable값을 false로 지정]
- unique
하나의 컬럼에 unique 제약 조건을 설정한다. 디폴트 값은 false이다. [email경우 고유한 값이 여야 하므로 unique값을 true로 지정]
@Column 애너테이션이 생략되었거나 애트리뷰트가 기본값을 사용할 경우 주의사항
@Column애너테이션이 생략된 경우 기본적으로 nullable = true이다. 그런데 필드의 데이터 타입이 int, long 같은 java의 원시 타입이면 null값을 입력할 수 없다 null은 객체 타입일경우에만 적용된다. 따라서 Java의 원시 타입 필드에서 @Column애너테이션이 없거나 @Column 애너테이션이 있지만 애트리뷰트를 생략한 경우, 최소한 nullalbe = false로 설정하는 것이 에러를 미연에 방지하는 길이다.
엔티티와 테이블 매핑 권장 사용 방법
- 클래스 이름 중복 등의 특별한 이유가 없다면 @Entity와 @Id 애너테이션만 추가합니다.
- 만일 엔티티 클래스가 테이블 스키마 명세의 역할을 하길 바란다면 @Table 애너테이션에 테이블명을 지정해줄 수 있습니다.
- 기본키 생성 전략은 데이터베이스에서 지원해주는 AUTO_INCREMENT 또는 SEQUENCE를 이용할 수 있도록 IDENTITY 또는 SEQUENCE 전략을 사용하는 것이 좋습니다.
- @Column 정보를 명시적으로 모두 지정하는 것은 번거롭긴 하지만 다른 누군가가 엔티티 클래스 코드를 확인하더라도 테이블 설계가 어떤 식으로 되어 있는지 한눈에 알 수 있다는 장점이 있습니다.
- 엔티티 클래스 필드 타입이 Java의 원시 타입일 경우, @Column 애너테이션을 생략하지 말고, 최소한 nullable=false 설정을 하는게 좋습니다.
- @Enumerated 애너테이션을 사용할 때 EnumType.ORDINAL 을 사용할 경우, enum의 순서가 뒤바뀔 가능성도 있으므로 처음부터 EnumType.ORDINAL 대신에 EnumType.STRING 을 사용하는 것이 좋습니다.
Point
- @Entity 애너테이션을 클래스 레벨에 추가하면 JPA의 관리대상 엔티티가 된다.
- @Table 애너테이션은 엔티티와 매핑할 테이블을 지정한다.
- @Entity 애너테이션과 @Id 애너테이션은 필수로 추가해야 한다.
- JPA는 IDENTITY, SEQUENCE, TABLE, AUTO 전략 같은 다양한 기본키 생성 전략을 지원한다.
- IDENTITY 전략
- 기본키 생성을 데이터베이스에 위임하는 전략이다.
- SEQUENCE 전략
- 데이터베이스에서 제공하는 시퀀스를 사용해서 기본키를 생성하는 전략이다.
- TABLE 전략
- 별도의 키 생성 테이블을 사용하는 전략이다.
- AUTO 전략
- JPA가 데이터베이스의 Dialect에 따라서 적절한 전략을 자동으로 선택한다.
- IDENTITY 전략
- Java의 원시 타입 필드에서 @Column 애너테이션이 없거나 @Column 애너테이션이 있지만 애트리뷰트를 생략한 경우, 최소한 nullable=false는 설정하는 것이 에러를 미연에 방지하는 길이다.
- java.util.Date, java.util.Calendar 타입으로 매핑하기 위해서는 @Temporal 애너테이션을 추가해야 하지만 LocalDate, LocalDateTime 타입일 경우, @Temporal 애너테이션은 생략 가능하다.
- @Transient 애너테이션을 필드에 추가하면 JPA가 테이블 컬럼과 매핑하지 않겠다는 의미로 인식한다.
- 테이블에 이미 저장되어 있는 enum 순서 번호와 enum에 정의되어 있는 순서가 일치하지 않게 되는 문제가 발생하지 않도록 EnumType.STRING을 사용하는 것이 좋다.
'TIL' 카테고리의 다른 글
[Spring MVC][DTO] (0) | 2022.11.03 |
---|---|
[Java][Interface] (1) | 2022.11.02 |
[Spring][JPA][Persistence Context] (0) | 2022.11.01 |
[SpringMVC][Rest Client] (0) | 2022.10.31 |
[SpringMVC][HTTP헤더] (0) | 2022.10.30 |