티스토리 뷰
엔티티 매핑 소개
- 객체와 테이블 매핑 : @Entity, @Table
- 필드와 컬럼 매핑 : @Column
- 기본 키 매핑 : @Id
- 연관관계 매핑 : @ManyToOne, @JoinColumn
@Entity
- @Entity 가 붙은 클래스는 JPA가 관리하는 클래스이자 엔티티이자
- 기본 생성자 필수
- final, enum, interface, inner 클래스는 엔티티 클래스로 사용할 수 없음
- 저장할 필드에 final을 사용할 수 없음
- name 속성 : JPA에 사용할 엔티티 이름을 지정
@Table
- @Table은 엔티티와 매핑할 테이블을 지정할 수 있다
데이터베이스 스키마 자동 생성
- DDL 을 애플리케이션 실행 시점에 자동 생성
- 테이블 중심 -> 객체 중심
- 데이터베이스 방언을 활용해서 데이터베이스에 맞는 적절한 DDL을 생성해준다
- 운영 장비에는 절대 create, create-drop, update 사용하면 안된다
- 개발 초기 단계에는 create 또는 update
- 테스트 서버는 update 또는 validate
- 스테이징과 운영 서버는 validate 또는 none
필드와 컬럼 매핑
@Entity
public class Member {
@Id
private Long id;
@Column(name = "name")
private String username;
@Enumerated(EnumType.STRING)
private RoleType roleType;
@Temporal(TemporalType.TIMESTAMP)
private Date createdDate;
@Lob
private String description;
}
- Column name 속성을 사용하면 컬럼명을 직접 지정해줄 수 있다
- 큰 콘텐트를 넣고 싶으면 @Lob를 사용하면 된다
- Enum 타입을 사용하고 싶으면 @Enumerated를 사용하면 된다
- 매핑 어노테이션은 다음과 같다
어노테이션 | 설명 |
@Column | 컬럼 매핑 |
@Temporal | 날짜 타입 매핑 |
@Enumerated | enum 타입 매핑 |
@Lob | blob, clob 매핑 |
@Transient | 특정 필드를 컬럼에 매핑시키고 싶지 않을 때 사용 |
- Column 의 속성은 다음과 같다
속성 | 설명 | 기본값 |
name | 필드와 매핑할 테이블의 컬럼 이름 | 객체의 필드 이름 |
insertable updatable |
등록, 변경 가능 여부 컬럼을 수정했을 때 데이터베이스에 등록, 변경 허용을 할지말지 결정하는 속성 |
TRUE |
nullable(DDL) | null 값의 허용 여부를 설정한다. false 로 설정하면 DDL 생성 시에 not null 제약조건이 붙는다. | |
unique(DDL) | @Table의 uniqueConstraints와 같지만 한 컬럼에 간단히 유니크 제약조건을 걸 때 사용 | |
columnDefinition(DDL) | 데이터베이스 컬럼 정보를 직접 줄 수 있다 ex) varchar(100) default 'EMPTY' |
|
length(DDL) | 문자 길이 제약조건, String 타입에만 사용한다 | 255 |
precision, scale (DDL) |
BigDecimal 타입에서 사용한다 precision은 소수점을 포함한 전체 자릿수를, scale은 소수점 자리수다. double, float 타입에는 적용되지 않는다 정밀한 소수를 다루어야 할 때만 사용한다 |
precision = 19 |
- @Enumerated 속성은 다음과 같음
속성 | 설명 | 기본값 |
value | EnumType.ORIGINAL - enum 순서를 데이터베이스에 저장 EnumYupe.STRING - enum 이름을 데이터베이스에 저장 |
EnumType.ORIGINAL |
- @Temporal 속성은 다음과 같음
Temporal 은 보통 날짜타입을 매핑할 때 사용하고 LocalDate, LocalDateTime을 사용할 때는 생략이 가능함
속성 | 설명 | 기본값 |
value | TemporalType.DATE : 날짜, 데이터베이스 date 타입과 매핑 (ex - 2023-10-11) TemporalType.TIME : 시간, 데이터베이스 time 타입과 매핑 (ex - 11:11:11) TemporalType.TIMESTAMP : 날짜와 시간, 데이터베이스 timestamp 타입과 매핑 ( ex - 2023-10-11 11:11:11) |
- @Lob 은 데이터베이스의 BLOB, CLOB 타입과 매핑
CLOB : String, char[], java.sql.CLOB
BLOB : byte[], java.sql.BLOB
기본 키 매핑
- @Id : ID 직접 할당
- @GeneratedValue : 자동생성
1. IDENTITY : MYSQL
2. SEQUENCE : 데이터베이스 시퀀스 오브젝트 사용, ORACLE, @SequenceGenerator 필요
3. Table : 키 생성용 테이블 사용, 모든 DB에서 사용, @TableGenerator 필요
4. AUTO : 방언에 따라 자동 지정
IDENTITY 전략
- 기본 키 생성을 데이터베이스에 위임
- 주로 MySQL, PostgreSQL, SQL Server, DB2 에서 사용
- JPA 는 보통 트랜잭션 커밋 시점에 INSERT SQL 을 실행
- AUTO_INVREMENT 데이터베이스에 INSERT SQL을 실행한 후 ID 값을 알 수 있음
- IDENTITY 전략은 em.persist() 시점에 즉시 INSERT SQL을 실행하고 DB에서 식별자를 조회할 수 있음
SEQUENCE 전략
- 데이터베이스 시퀀스는 유일한 값을 순서대로 생성하는 특별한 데이터베이스 오브젝트
- 오라클, PostgreSQL, DB2, H2 데이터베이스에서 사용
TABLE 전략
- 키 생성 전용 테이블을 하나 만들어서 데이터베이스 시퀀스를 흉내내는 전략으로 모든 데이터베이스에 적용 가능하지만 성능이 좋지 못함
권장하는 식별자 전략
- 기본 키 제약 조건 : null 아님, 유일해야 함, 변하면 안됨
- 권장 : Long형, 대체키, 키 생성 전략 사용
'JPA' 카테고리의 다른 글
[JPA] 실전예제 1~2 (0) | 2023.07.29 |
---|---|
[JPA] 기본키 매핑 (0) | 2023.07.29 |
[JPA] 영속성 컨텍스트 장점 (0) | 2023.07.09 |
[JPA] 영속성 컨텍스트 (0) | 2023.07.09 |
- Total
- Today
- Yesterday
- 람다식
- 트랜잭션
- 네이버클라우드
- CodeDeploy
- OS
- db
- Travis CI
- AWS
- Java
- SpringGraphQL
- TCP
- ORA-27125
- JPA
- ci/cd
- 트랜잭션격리성
- 운영체제
- 인덱스
- EC2
- 기술면접
- nginx
- Til
- SpringSecurity
- N+1
- 프로그래머스
- Oracle
- 파일업로드설정
- graphql
- level0
- spring
- ddl-auto
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | |
7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | 30 | 31 |