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를 만들면 될 것이다.
'공부 자료 > Spring' 카테고리의 다른 글
[Spring+JPA] EAGER, LAZY 무슨 차이야? (0) | 2023.11.27 |
---|---|
[JPA] N:1, 1:N, 1:1, M:N 연관관계 매핑 (단방향/양방향 연관관계) (1) | 2023.11.27 |
[Spring] @AllArgsConstructor, @NoArgsConstructor를 지양하자? (0) | 2023.11.21 |
[Spring] @CreatedDate&@LastModifiedDate vs @CreationTimeStamp&@UpdateTimeStamp, 둘은 뭐가 다를까? (1) | 2023.11.21 |
[Spring JPA] 페이징 Pageable, Page, Slice / 페이지 나누기 (2) | 2023.11.21 |