본문 바로가기

공부 자료/Spring

[Spring + JPA] JPA Entity 매핑 (feat. Entity 만들기)

JPA를 이용한 Entity 만들기

 

 

 

Spring JPA에서는 구현체인 Hibernate가 옵션 설정을 통해 Entity 코드를 스캔해 스키마와 테이블을 자동으로 생성해주는데,

스키마와 테이블이 생성될 수 있도록 Entity를 만들어보고자 한다.

 

* JPA와 Hibernate, Entity에 대한 기본적인 내용들은 아래 블로그를 참고하면 된다.

https://kcode-recording.tistory.com/245

 

[05장.3] 1. JPA와 Hibernate, Entity

JPA(Java Persistance API)란? : 자바에서 사용하는 표준 ORM : 자바에서 관계형 데이터베이스를 사용하는 방식을 정의한 인터페이스 JPA는 인터페이스이기 때문에 실제 사용을 위해 ORM 프레임워크가 필

kcode-recording.tistory.com

 

 


[ Hibernate 옵션 설정]

 

이는 build.gradle 파일에 설정해주면 되는데, 

jpa.hibernate.ddl-auto : (옵션) 을 이용하면 된다. 옵션은 아래와 같다.

* 옵션에는 자동 생성을 어떻게 해 줄 것인지에 대한 선택이다. 

 

 

create

: 기본 테이블 삭제 후 다시 생성(DROP + CREATE)

: 초기 개발 시 적용

 

create-drop

: create와 동일하지만 drop이 종료 시점에 진행됨

: 초기 개발 또는 테스트 진행 시 적용

 

update

: 변경된 부분만 반영 (ALTER)

:테스트 시 적용

 

validate

: 엔티티와 테이블이 정상적으로 매핑되었는지 확인하며, 설정은 변경하지 않음

: 테스트 또는 운영시 적용함

 

none

: DDL 문장을 자동 생성 및 실행하지 않음

: 운영 시 적용

 

 

초기에 개발을 해야하거나, 테스트 중 데이터가 유지될 필요가 없는 경우에는

빌드를 할 때마다 테이블을 생성하고 삭제해도 되지만

운영을 할 경우에는 유지를 해야 하기 때문에

자신의 개발 상황에 맞게 스키마가 생성될 수 옵션을 선택하면 된다.

 

또한, ddl-auto의 경우에는 개발 및 테스트 시에 적용할 수 있지만, 운영 서버에서의 사용은 권장하지 않고,

실무에서는 DBA와 상의 하거나 DBA가 쿼리문을 작성 후 실행한다.

 


 

[Entity 만들기]

 

 

엔티티를 만들 때 쓰이는 애너테이션을 보면서 엔티티를 단계별로 만들어 나가고자 한다.

예시는 Member 엔티티를 만들어 볼 예정이다.

 


 

객체와 테이블 매핑

 

1. @Entity

@Entity란?

- JPA가 관리하는 것으로 엔티티 애너테이션

- 테이블과 매핑

 

속성

- name 

: JPA에서 사용할 엔티티 이름 지정

: 기본값은 클래스 이름이다

 

주의점

- JPA가 엔티티 객체를 생성할 경우 기본 생성자를 사용하기 때문에 기본 생성자(Public or Private)는 필수

- final, enum, interface, inner 클래스에서 사용 불가

 

@Entity
public class User{ // 엔티티 클래스로 지정

}

 

 


 

2. @Table

@Table이란?

- 엔티티와 매핑할 테이블 지정

- 기본적으로 엔티티 이름을 테이블 이름으로 사용

 

속성

- name 

: 매핑할 테이블 이름 지정

: 기본값은 엔티티 이름 사용

 

- catagory

:  catalog 기능이 있는 DB에서 catalog 매핑

* catalog란? : DB의 개체들에 대한 정의를 담는 메타데이터들로 구성된 DB 인스턴스

 

- schema

: schema 기능이 있는 DB에서 schema 매핑

* schema란? : DB에서 자료의 구조, 자료의 표현법, 자료간의 관계를 형식 언어로 정의한 구조로, DB 설계에 대한 계획을 정함

 

- uniqueconstraints

: DDL 생성 시 유니크 제약 조건들 만듦

: 2개 이상의 복합 유니크 제약 조건을 만들 수 있음

: 스키마 자동 생성 기능을 사용해 DDL을 만들때에만 사용

 

@Entity
@Table(name="Member") // 2. Member 테이블과 매핑
public class User{ // 1. 엔티티 클래스로 지정

}

 


 

기본 키 매핑

 

영속성 컨텍스트는 엔티티를 식별자 값으로 구분하기 때문에,

엔티티를 영속 상태로 만들기 위해 식별자 값이 반드시 필요하다.

* 영속성 컨텍스트의 기본 내용은 아래 블로그를 참고하면 된다.

https://kcode-recording.tistory.com/246

 

[05장.3] 2. 영속성 컨텍스트

영속성 컨텍스트란? : 엔티티 매니저가 엔티티를 저장하는 공간 : JPA의 중요한 특징 중 하나로, 엔티티를 관리하는 가상의 공간 : 데이터베이스에서 효과적으로 데이터를 가져오고, 엔티티를 편

kcode-recording.tistory.com

 

 

3. @Id

 

@Id란?

- 해당 필드가 해당 Entity의 기본 키(Primary Key)가 될 것임을 지정

- 기본 키 직접 할당 전략

: 엔티티 영속화 하기 전 애플리케이션에서 기본 키를 직접 할당

: 식별자 값 없이 저장 시 예외 발생

 

적용 가능 타입

- Java Primitive type(기본형)

- Java Wrapper type

- String

- java.util.Date

- java.sql.Date

- java.math.BigDecinal

- java.math.BigInteger

 

* 코드는 4. @GeneratedValue에서 참고


 

4. @GeneratedValue

@GeneratedValue란?

- 대리 키를 사용하는 방법

- 기본 키 자동 생성 전략

 

속성

- strategy

: 기본 키의 생성 전략을 설명

 

생략 전략(GeneratedValue) 종류

- IDENTITY

: 키본 키 생성을 DB에 위임

: Auto-Increment 생성 전략

 

- SEQUENCE

: DB의 특별한 오브젝트 시퀀스를 사용해 기본키를 생성

: 유일한 값을 순서대로 생상하는 오브젝트

: @SequenceGenerator를 통해 생성

 

- Table

: 데이터베이스에 키 생성 전용 테이블을 만들고 이를 사용해 기본키 생성

 

- AUTO

: JPA 구현체가 자동으로 생성 전략을 결정

 

 

@Entity
@NoArgsConstructor(access = AccessType.PROTECT) // 기본 생성자 생성 >> 엔티티 생성을 위한 기본 생성자 필수
@Table(name="Member") // 2. Member 테이블과 매핑
public class User{ // 1. 엔티티 클래스로 지정

	@Id // 3. 기본키 지정
    @GeneratedValue(strategy = GeneratedValue.IDENTITY) // 4. 기본키 생성 전략 설정
    private Long memberId; // 멤버 아이디
}

 

 


 

필드와 칼럼 매핑

 

5. @Column

@Column이란?

- 객체 필드를 테이블 칼럼에 매핑

- 속성 중 name, nullable이 주로 사용

 

속성

- name

: 필드와 매핑할 테이블 칼럼 이름을 지정

: 기본값은 객체의 필드 이름 사용

 

- nullable

: null 값의 허용 여부를 설정

: false 설정 시 DDL 생성 시 NOT NULL 제약조건이 추가됨

: 기본값 true

 

- unique

: 한 칼럼에 유니크 제약 조건을 설정

 

- columnDefinition

: 칼럼 정보를 직접 줌

: 기본값은 필드의 Java 타입과 방언의 정보를 사용해 적절한 칼럼 생성

 

- length

: String 타입의 문자 길이에 제약 조건 설정

: 기본값 255

 

@Entity
@NoArgsConstructor(access = AccessType.PROTECT)
@Table(name="Member") // 2. Member 테이블과 매핑
public class User{ // 1. 엔티티 클래스로 지정

	@Id // 3. 기본키 지정
    @GeneratedValue(strategy = GeneratedValue.IDENTITY) // 4. 기본키 생성 전략 설정
    private Long memberId; // 멤버 아이디
    
    // 5. 칼럼 작성 및 속성 설정
    @Column(name="jumin", nullable=false, unique=true)
    private String juminNum; // 주민번호
    
    @Column(columnDefinition = "1")
    private Long date; // 가입 일자
    
    ... 기타 칼럼들
}

 

 


 

6. @Enumerated

 

@Enumerated란?

- Java의 enum 타입을 매핑할 때 사용

-추후 @Convert를 이용해 애넘을 관리할 수 있음

 

속성

- value

: EnumType.ORDINAL - enum 순서를 DB에 저장 (기본값)

: EnumType.STRING - enum 이름을 DB에 저장

 

// enum 생성
enum Social {
	NAVER, KAKO, GOOGLE;
}

 

@Entity
@NoArgsConstructor(access = AccessType.PROTECT)
@Table(name="Member") // 2. Member 테이블과 매핑
public class User{ // 1. 엔티티 클래스로 지정

	@Id // 3. 기본키 지정
    @GeneratedValue(strategy = GeneratedValue.IDENTITY) // 4. 기본키 생성 전략 설정
    private Long memberId; // 멤버 아이디
    
    // 5. 칼럼 작성 및 속성 설정
    @Column(name="jumin", nullable=false, unique=true)
    private String juminNum; // 주민번호
    
    @Column(columnDefinition = "1")
    private Long date; // 가입 일자
    
    // 6. 애넘 칼럼
    @Enumerated(EnumType.STRING)
    private Social social; // 에넘 칼럼
    
    ... 기타 칼럼들
}

 

 


 7. @Temporal

 

@Temporal이란?

- 날짜 타입(java.util.Date, java.util.Calandar)을 매핑할 때 사용

 

속성

- value

: TemporalType.DATE - 날짜, DB data 타입과 매핑

: TemporalType.TIME - 시간, DB time 타입과 매핑

: TemporalType.TIMESTAMP - 날짜와 시간. DB timestamp 타입과 매핑

: 기본값은 없으며 위의 속성을 필수 지정해야 하며, 만약 생략 시 timestamp로 지정해줌

 

 

@Entity
@NoArgsConstructor(access = AccessType.PROTECT)
@Table(name="Member") // 2. Member 테이블과 매핑
public class User{ // 1. 엔티티 클래스로 지정

	@Id // 3. 기본키 지정
    @GeneratedValue(strategy = GeneratedValue.IDENTITY) // 4. 기본키 생성 전략 설정
    private Long memberId; // 멤버 아이디
    
    // 5. 칼럼 작성 및 속성 설정
    @Column(name="jumin", nullable=false, unique=true)
    private String juminNum; // 주민번호
    
    @Column(columnDefinition = "1")
    private Long date; // 가입 일자
    
    // 6. 애넘 칼럼
    @Enumerated(EnumType.STRING)
    private Social social; // 에넘 칼럼
    
    // 7. 날짜 타입 매핑
    @Temporal(TemporalType.TIMESTAMP)
    private Date createdAt; // 생성 시간
    
    ... 기타 칼럼들
}

 


 

JPA를 이용해 Entity를 만드는 방법을 알아보았는데, 이게 완성은 아니다. 

만약 Entity로부터 필요한 기능이 있다면 @Getter 등 다른 애너테이션을 사용할 수 있다.

그렇기에 개발자가 사용하고자 하는 기능에 따라 다양한 JPA의 기능들을 사용하여 Entity를 만들면 될 것이다.