[본 포스팅은 자바 ORM 표준 JPA 프로그래밍 기본 편을 기반으로 작성하였습니다.]
자바 ORM 표준 JPA 프로그래밍 - 기본편 - 인프런 | 강의
JPA를 처음 접하거나, 실무에서 JPA를 사용하지만 기본 이론이 부족하신 분들이 JPA의 기본 이론을 탄탄하게 학습해서 초보자도 실무에서 자신있게 JPA를 사용할 수 있습니다., - 강의 소개 | 인프런
www.inflearn.com
JPA에서 가장 중요한 일은 엔티티와 테이블을 정확하게 매핑하는 것이다.
따라서 매핑 어노테이션을 숙지해야 한다.
- 객체와 테이블 매핑: @Entity, @Table
- 필드와 칼럼 매핑: @Column
- 기본 키 매핑: @Id
- 연관관계 매핑: @ManyToOne, @JoinColumn
필드와 칼럼 매핑
- @Entitiy
- @Entity가 붙은 클래스는 JPA가 관리, 엔티티라 한다.
- JPA를 사용해서 테이블과 매핑할 클래스는 @Entity 필수
* 주의
- 기본 생성자 필수(파라미터가 없는 public 또는 protected 생성자)
- final 클래스, enum, interface, inner 클래스 사용 X
- 저장할 필드에 final 사용 X
- @Table
- @Table은 엔티티와 매핑할 테이블 지정
속성 기능 기본값 name 매핑할 테이블 이름 엔티티 이름을 사용 catalog 데이터베이스 catalog 매핑 schema 데이터베이스 schema 매핑 uniqueConstraints(DDL) DDL 생성 시에 유니크 제약 조건 생성
- @Column
- @Column은 객체 필드와 테이블 칼럼을 매핑
속성 설명 기본값 name 필드와 매핑할 테이블의 칼럼 이름
ex) @Column(name="name") - DB 테이블의 칼럼 이름은 name이다.객체의 필드 이름 insertable,
updatable칼럼이 등록 또는 변경이 일어났을 때 그걸 등록 또는 변경을 할 것인지 여부 TRUE nullable(DDL) null 값의 허용 여부를 설정한다.
false로 설정하면 DDL 생성 시에 not null 제약조건이 붙는다.TRUE unique(DDL) @Table의 uniqueConstraints와 같지만 한 칼럼에 간단히 유니크 제약조건을 걸 때 사용한다. FALSE columnDefinition(DDL) 데이터베이스 칼럼 정보를 직접 줄 수 있다.
ex) varchar(100) default ‘EMPTY'필드의 자바 타입과 방언 정보를 사용 length(DDL) 문자 길이 제약조건, String 타입에만 사용한다. 255 precision,
scale(DDL)BigDecimal 타입에서 사용한다(BigInteger도 사용할 수 있다).
precision은 소수점을 포함한 전체 자릿수를, scale은 소수의 자릿수다.
참고로 double, float 타입에는 적용되지 않는다.
아주 큰 숫자나 정밀한 소수를 다루어야 할 때만 사용한다.precision=19,
scale=2
- @Temporal
- @Temporal은 날짜 타입을 매핑
참고: LocalDate, LocalDateTime을 사용할 때는 생략 가능(최신 하이버네이트 지원)
속성 설명 value • TemporalType.DATE: 날짜, 데이터베이스 date 타입과 매핑
(예: 2013–10–11)
• TemporalType.TIME: 시간, 데이터베이스 time 타입과 매핑
(예: 11:11:11)
• TemporalType.TIMESTAMP: 날짜와 시간, 데이터베이스 timestamp 타입과 매핑
(예: 2013–10–11 11:11:11)
- @Enumerated
- @Enumerated은 enum 타입과 매핑, 기본적으로 DB에 저장될 때 ENUM 순서에 따라 숫자로 표기됨
주의) 사용할 때 문자열로 저장해주는 EnumType.STRING으로 속성을 줘야 한다.
그렇지 않으면 Enum의 순서가 바뀌었을 때 같이 동기화되어 바뀌지 않아 오류 발생
속성 설명 기본값 value • EnumType.ORDINAL: enum 순서를 데이터베이스에 저장
• EnumType.STRING: enum 이름을 데이터베이스에 저장EnumType.ORDINAL
- @Lob
- @Lob은 BLOB, CLOB 매핑으로 긴 문자열이 들어갈 때 사용
- @Lob에는 지정할 수 있는 속성이 없다.
- 매핑하는 필드 타입이 문자면 CLOB 매핑, 나머지는 BLOB 매핑
- CLOB: String, char[], java.sql.CLOB
- BLOB: byte[], java.sql. BLOB
- @Transient
- @Transient는 특정 필드를 칼럼에 매핑하지 않는다.(매핑 무시)
즉, 메모리에서만 사용하고 DB에는 따로 넣고 싶지 않을 때 사용.
- 데이터베이스에 저장 X, 조회 X
- 주로 메모리상에서만 임시로 어떤 값을 보관하고 싶을 때 사용
- @Transient private Integer temp;
기본 키 매핑
- @Id
- 기본 키로 사용할 칼럼에 붙임
- @GeneratedValue
- 기본 키를 자동 생성할 시의 전략
속성 설명 IDENTITY 기본 키 생성을 데이터베이스에 위임
예) MySQL의 AUTO_ INCREMENTSEQUENCE 데이터베이스 시퀀스는 유일한 값을 순서대로 생성하는 특별한 데이터베이스 오브젝트
(클래스 위에 @SequenceGenerator 필요)
예) 오라클 시퀀스TABLE 키 생성 전용 테이블을 하나 만들어서 데이터베이스 시퀀스를 흉내 내는 전략
(테이블 위에 @TableGenerator 필요)
- 장점: 모든 데이터베이스에 적용 가능
- 단점: 성능AUTO 방언에 따라 자동 지정, 기본값
데이터베이스 스키마 자동 생성 - 속성
JPA에서 편리한 속성 중 하나가 테이블을 자동을 해준다.
Gradle: spring.jpa.hibernate.ddl-auto
Maven: hibernate.hbm2ddl.auto
create: 기존 테이블 삭제 후 다시 생성(DROP + CREATE)
create-drop: create와 같으나 종료 시점에 테이블 DROP
update: 변경 분만 반영(운영 DB에는 사용하면 안 됨 ex: ALTER, DROP은 안 됨)
validate: 엔티티와 테이블이 정상 매핑되었는지만 확인
none: 사용하지 않음
주의)
- 운영 장비에는 절대 create, create-drop, update 사용하면 안 된다.
- 개발 초기 단계는 create 또는 update
- 테스트 서버는 update 또는 validate
- 스테이징 운영 서버는 validate 또는 none
'JAVA > JPA' 카테고리의 다른 글
[JPA] 스프링 데이터 JPA 페이징과 정렬 (feat. DTO를 사용해야 하는 이유) (0) | 2023.01.02 |
---|---|
[JPA/JPQL] 페치 조인(fetch join)이란? 특징과 한계 - 엔티티 페치 조인, 컬렉션 페치 조인, DISTINCT로 중복 제거 (0) | 2022.12.29 |
[JPA] @MappedSuperclass로 공통 칼럼 상속받기 (0) | 2022.12.23 |
[JPA] 상속관계 전략과 매핑 (코드 예시) (0) | 2022.12.23 |
[JPA] 다대일(N:1), 일대다(1:N), 일대일(1:1) 연관관계 매핑 (코드 예시) (0) | 2022.12.23 |
[본 포스팅은 자바 ORM 표준 JPA 프로그래밍 기본 편을 기반으로 작성하였습니다.]
자바 ORM 표준 JPA 프로그래밍 - 기본편 - 인프런 | 강의
JPA를 처음 접하거나, 실무에서 JPA를 사용하지만 기본 이론이 부족하신 분들이 JPA의 기본 이론을 탄탄하게 학습해서 초보자도 실무에서 자신있게 JPA를 사용할 수 있습니다., - 강의 소개 | 인프런
www.inflearn.com
JPA에서 가장 중요한 일은 엔티티와 테이블을 정확하게 매핑하는 것이다.
따라서 매핑 어노테이션을 숙지해야 한다.
- 객체와 테이블 매핑: @Entity, @Table
- 필드와 칼럼 매핑: @Column
- 기본 키 매핑: @Id
- 연관관계 매핑: @ManyToOne, @JoinColumn
필드와 칼럼 매핑
- @Entitiy
- @Entity가 붙은 클래스는 JPA가 관리, 엔티티라 한다.
- JPA를 사용해서 테이블과 매핑할 클래스는 @Entity 필수
* 주의
- 기본 생성자 필수(파라미터가 없는 public 또는 protected 생성자)
- final 클래스, enum, interface, inner 클래스 사용 X
- 저장할 필드에 final 사용 X
- @Table
- @Table은 엔티티와 매핑할 테이블 지정
속성 기능 기본값 name 매핑할 테이블 이름 엔티티 이름을 사용 catalog 데이터베이스 catalog 매핑 schema 데이터베이스 schema 매핑 uniqueConstraints(DDL) DDL 생성 시에 유니크 제약 조건 생성
- @Column
- @Column은 객체 필드와 테이블 칼럼을 매핑
속성 설명 기본값 name 필드와 매핑할 테이블의 칼럼 이름
ex) @Column(name="name") - DB 테이블의 칼럼 이름은 name이다.객체의 필드 이름 insertable,
updatable칼럼이 등록 또는 변경이 일어났을 때 그걸 등록 또는 변경을 할 것인지 여부 TRUE nullable(DDL) null 값의 허용 여부를 설정한다.
false로 설정하면 DDL 생성 시에 not null 제약조건이 붙는다.TRUE unique(DDL) @Table의 uniqueConstraints와 같지만 한 칼럼에 간단히 유니크 제약조건을 걸 때 사용한다. FALSE columnDefinition(DDL) 데이터베이스 칼럼 정보를 직접 줄 수 있다.
ex) varchar(100) default ‘EMPTY'필드의 자바 타입과 방언 정보를 사용 length(DDL) 문자 길이 제약조건, String 타입에만 사용한다. 255 precision,
scale(DDL)BigDecimal 타입에서 사용한다(BigInteger도 사용할 수 있다).
precision은 소수점을 포함한 전체 자릿수를, scale은 소수의 자릿수다.
참고로 double, float 타입에는 적용되지 않는다.
아주 큰 숫자나 정밀한 소수를 다루어야 할 때만 사용한다.precision=19,
scale=2
- @Temporal
- @Temporal은 날짜 타입을 매핑
참고: LocalDate, LocalDateTime을 사용할 때는 생략 가능(최신 하이버네이트 지원)
속성 설명 value • TemporalType.DATE: 날짜, 데이터베이스 date 타입과 매핑
(예: 2013–10–11)
• TemporalType.TIME: 시간, 데이터베이스 time 타입과 매핑
(예: 11:11:11)
• TemporalType.TIMESTAMP: 날짜와 시간, 데이터베이스 timestamp 타입과 매핑
(예: 2013–10–11 11:11:11)
- @Enumerated
- @Enumerated은 enum 타입과 매핑, 기본적으로 DB에 저장될 때 ENUM 순서에 따라 숫자로 표기됨
주의) 사용할 때 문자열로 저장해주는 EnumType.STRING으로 속성을 줘야 한다.
그렇지 않으면 Enum의 순서가 바뀌었을 때 같이 동기화되어 바뀌지 않아 오류 발생
속성 설명 기본값 value • EnumType.ORDINAL: enum 순서를 데이터베이스에 저장
• EnumType.STRING: enum 이름을 데이터베이스에 저장EnumType.ORDINAL
- @Lob
- @Lob은 BLOB, CLOB 매핑으로 긴 문자열이 들어갈 때 사용
- @Lob에는 지정할 수 있는 속성이 없다.
- 매핑하는 필드 타입이 문자면 CLOB 매핑, 나머지는 BLOB 매핑
- CLOB: String, char[], java.sql.CLOB
- BLOB: byte[], java.sql. BLOB
- @Transient
- @Transient는 특정 필드를 칼럼에 매핑하지 않는다.(매핑 무시)
즉, 메모리에서만 사용하고 DB에는 따로 넣고 싶지 않을 때 사용.
- 데이터베이스에 저장 X, 조회 X
- 주로 메모리상에서만 임시로 어떤 값을 보관하고 싶을 때 사용
- @Transient private Integer temp;
기본 키 매핑
- @Id
- 기본 키로 사용할 칼럼에 붙임
- @GeneratedValue
- 기본 키를 자동 생성할 시의 전략
속성 설명 IDENTITY 기본 키 생성을 데이터베이스에 위임
예) MySQL의 AUTO_ INCREMENTSEQUENCE 데이터베이스 시퀀스는 유일한 값을 순서대로 생성하는 특별한 데이터베이스 오브젝트
(클래스 위에 @SequenceGenerator 필요)
예) 오라클 시퀀스TABLE 키 생성 전용 테이블을 하나 만들어서 데이터베이스 시퀀스를 흉내 내는 전략
(테이블 위에 @TableGenerator 필요)
- 장점: 모든 데이터베이스에 적용 가능
- 단점: 성능AUTO 방언에 따라 자동 지정, 기본값
데이터베이스 스키마 자동 생성 - 속성
JPA에서 편리한 속성 중 하나가 테이블을 자동을 해준다.
Gradle: spring.jpa.hibernate.ddl-auto
Maven: hibernate.hbm2ddl.auto
create: 기존 테이블 삭제 후 다시 생성(DROP + CREATE)
create-drop: create와 같으나 종료 시점에 테이블 DROP
update: 변경 분만 반영(운영 DB에는 사용하면 안 됨 ex: ALTER, DROP은 안 됨)
validate: 엔티티와 테이블이 정상 매핑되었는지만 확인
none: 사용하지 않음
주의)
- 운영 장비에는 절대 create, create-drop, update 사용하면 안 된다.
- 개발 초기 단계는 create 또는 update
- 테스트 서버는 update 또는 validate
- 스테이징 운영 서버는 validate 또는 none
'JAVA > JPA' 카테고리의 다른 글
[JPA] 스프링 데이터 JPA 페이징과 정렬 (feat. DTO를 사용해야 하는 이유) (0) | 2023.01.02 |
---|---|
[JPA/JPQL] 페치 조인(fetch join)이란? 특징과 한계 - 엔티티 페치 조인, 컬렉션 페치 조인, DISTINCT로 중복 제거 (0) | 2022.12.29 |
[JPA] @MappedSuperclass로 공통 칼럼 상속받기 (0) | 2022.12.23 |
[JPA] 상속관계 전략과 매핑 (코드 예시) (0) | 2022.12.23 |
[JPA] 다대일(N:1), 일대다(1:N), 일대일(1:1) 연관관계 매핑 (코드 예시) (0) | 2022.12.23 |