본문 바로가기
Spring/JPA

[JPA] 엔티티 매핑 (객체~테이블 매핑 / 기본키 매핑 / 필드 ~ 컬럼 매핑)

by jungha_k 2022. 11. 1.

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

댓글