IT'S DO
728x90

객체와 테이블 매핑 : @Entity, @Table

기본 키 맵핑 : @Id

필드와 컬럼 매핑 : @Column

연관관계 매핑 : @ManyToOne, @JoinColumn

 
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
32
33
34
35
36
37
38
39
40
41
42
43
@Entity
// name과 age Column에 unique 제약조건 추가
@Table(name="MEMBER", uniqueConstraints = {@UniqueConstraint(
        name = "NAME_AGE_UNIQUE",
        columnNames = {"NAME""AGE"} )})
public class Member {
 
    // 기본키 매핑
    @Id
    @Column(name = "ID")
    private String id;
 
    // not null, varchar(10)
    @Column(name = "NAME", nullable = falselength = 10)
    private String username;
 
    private Integer age;
 
    // Java의 enum 사용
    @Enumerated(EnumType.STRING)
    private RoleType roleType;
 
    // Java의 날짜 타입
    @Temporal(TemporalType.TIMESTAMP)
    private Date createdDate;
 
    @Temporal(TemporalType.TIMESTAMP)
    private Date lastModifiedDate;
 
    // CLOB, BLOC 타입 매핑
    @Lob
    private String description;
 
    @Transient
    private String temp;
 
 
    //Getter, Setter
}
 
public enum RoleType {
    ADMIN, USER
}
cs

 


|| @Entity


 

- 테이블과의 매핑

 

- @Entity가 붙은 클래스는 JPA가 관리하는 것으로, 엔티티라고 불림

 

> 속성Name : JPA에서 사용할 엔티티 이름을 지정.

       보통 기본값인 클래스 이름을 사용


> 주의사항- 기본 생성자는 필수 (JPA가 엔티티 객체 생성 시 기본 생성자를 사용)- final 클래스, enum, interface, inner class 에는 사용할 수 없음

 

- 저장할 필드에 final 사용 불가

 


|| @Table


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

 

- 생략 시 매핑한 엔티티 일므을 테이블 이름으로 사용
> 속성 Name : 매핑할 테이블 이름 (default. 엔티티 이름 사용)

Catalog : catalog 기능이 있는 DB에서 catalog 를 매핑 (default. DB 명)

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

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

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

 

|| 데이터베이스 스키마 자동 생성


 

- JPA는 데이터베이스 스키마를 자동으로 생성하는 기능을 지원- 클래스의 매핑 정보와 데이터베이스 방언을 사용하여 데이터베이스 스키마 생성 

애플리케이션 실행 시점에 데이터베이스 테이블을 자동으로 생성


- 스키마 자동 생성 기능 사용을 위해 persistence.xml에 속성 추가
1
<property name="hibernate.hbm2ddl.auto" value="create" />
cs

hibernate.hbm2ddl.auto 속성
create : 기존 테이블을 삭제하고 새로 생성(DROP + CREATE)
create-drop : CREATE 속성에 추가로 애플리케이션을 종료할 때 생성한 DDL을 제거  (DROP + CREATE + DROP)
update : DB 테이블과 엔티티 매핑 정보를 비교해서 변경 사항만 수정
validate : DB 테이블과 엔티티 매핑정보를 비교해서 차이가 있으면 경고를 남기고 애플리케이션을 실행하지 않음.DDL을 수행하지 않음
none : 자동 생성 기능을 사용하지 않음
 
> 주의사항- 개발 초기 단계는 create 또는 update
- 초기화 상태로 자동화된 테스트를 진행하는 개발자 환경과 CI서버는 create 또는 create-drop
- 테스트 서버는 update 또는 validate
- 스테이징과 운영 서버는 validate 또는 none

 

** 테이블 명이나 컬럼 명이 생략되면 자바의 카멜 표기법을 테이블의 언더스코어 표기법으로 매핑하는 방법

Before.
1
2
@Column(name="role_type")
private RoleType roleType;
cs

 

|| 기본 키 매핑


 

- 영속성 컨텍스트는 엔티티를 식별자 값으로 구분하므로 엔티티를 영속 상태로 만들기 위해 식별자 값이 반드시 필요
@GeneratedValue<기본 키 생성 전략>- 직접 할당 : 기본 키를 애플리케이션에 직접 할당

ㄴ em.persist()를 호출하기 전 애플리케이션에서 직접 식별자 값을 할당해야 함. 식별자 값이 없을 경우 예러 발생

 

영속성 컨텍스트란

: 엔티티를 영구 저장하는 환경, 논리적인 개념
: 애플리케이션 - DB 사이에서 객체를 보관하는 가상의 DB 역할 (→ 플러시 시점에 DB에 반영)

엔티티매니저로 영속성 컨텍스트에 접근 (J2SE에서는 1:1관계로 생각, SpringBoot는 N:1)
이걸 쓰는 이유? 버퍼링이나 캐싱을 위해서 사용한다!

 

 

- 자동 생성 : 대리 키 사용 방식

* IDENTITY : 기본 키 생성을 데이터베이스에 위임 (= AUTO_INCREMENT)

1
2
3
4
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name = "ID")
private Long id;
cs

- Statement.getGeneratedKeys() 를 사용해서 데이터를 저장함과 동시에 생성된 기본 키 값을 얻어 올 수 있음.


* SEQUENCE : 데이터베이스 시퀀스를 사용해서 기본 키를 할당,    데이터베이스 시퀀스에서 식별자 값을 획득한 후 영속성 컨텍스트에 저장   유일한 값을 순서대로 생성(오라클, PostgreSQL, DB2, H2)
* TABLE : 키 생성 테이블을 사용키 생성 전용 테이블 하나를 만들고 여기에 이름과 값으로 사용할 컬럼을 만들어

데이터베이스 시퀀스를 흉내내는 전략. 테이블을 사용하므로 모든 데이터베이스에 적용 가능


AUTO : 선택한 데이터베이스 방언에 따라 방식을 자동으로 선택(Default)

  Ex) 오라클 DB 선택 시 SEQUENCE, MySQL DB 선택 시 IDENTITY 사용


** 키 생성 전략 사용 시 persistence.xml 에 아래 속성 추가

 

1
<property name="hibernate.id.new_generator_mappings" value="true" />
cs
 

 

|| @Column


 

객체 필드를 테이블 컬럼에 매핑속성 중 name, nullable이 주로 사용되고 나머지는 잘 사용되지 않음

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@Column(nullable = false)
private Strin data;
 
@Column(unique = true)
private Strin data;
 
@Column(columnDefinition = "varchar(100) default 'EMPTY'")
private Strin data;
 
@Column(length = 400)
private Strin data;
 
@Column(precision = 10, scale = 2)
private BigDecimal data;
cs


> 속성name : 필드와 매핑할 테이블 컬럼 이름 (default. 객체의 필드 이름)nullable (DDL) : null 값의 허용 여부 설정, false 설정 시 not null (default. true)   @Column 사용 시 nullable = false 로 설정하는 것이 안전unique (DDL) : @Table 의 uniqueConstraints와 같지만 한 컬럼에 간단히 유니크 제약조건을 적용columnDefinition (DDL) : 데이터베이스 컬럼 정보를 직접 줄 수 있음, default 값 설정   (default. 필드의 자바 타입과 방언 정보를 사용해 적절한 컬럼 타입을 생성)length (DDL) : 문자 길이 제약조건, String 타입에만 사용 (default. 255)percision, scale (DDL) : BigDecimal, BigInteger 타입에서 사용. 아주 큰 숫자나 정밀한 소수를 다룰 때만 사용(default. precision = 19, scale = 2)

 

 

|| @Enumerated


 

자바의 enum 타입을 매핑할 때 사용
> 속성value : EnumType.ORDINAL : enum 순서를 데이터베이스에 저장

 EnumType.STRING : enum 이름을 데이터베이스에 저장

 (default. EnumType.ORDINAL)

 

 

|| @Temporal


 

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

1
2
3
4
5
6
7
8
@Temporal(TemporalType.DATE)
private Date date; // 날짜
 
@Temporal(TemporalType.TIME)
private Date date; // 시간
 
@Temporal(TemporalType.TIMESTAMP)
private Date date; // 날짜와 시간
cs


> 속성value : TemporalType.DATE : 날짜, 데이터베이스 data 타입과 매핑 (2020-12-18) 

TemporalType.TIME : 시간, 데이터베이스 time 타입과 매핑 (23:36:33)

 TemporalType.TIMESTAMP : 날짜와 시간, 데이터베이스 timestamp 타입과 매핑 (2020-12-18 23:36:33)

 (default. TemporalType은 필수로 지정)

 

@Temporal 을 생략하면 자바의 Date와 가장 유사한 timestamp로 정의

 

 

|| @Lob


 

데이터베이스 BLOB, CLOB 타입과 매핑

 

> 속성

지정 속성이 없음

대신 매핑하는 필드 타입이 문자면 CLOB로 나머지는 BLOB로 매핑

 

 

|| @Transient


 

이 필드는 매핑하지 않음

데이터베이스에 저장하지 않고 조회하지도 않음

객체에 임시로 어떤 값을 보관하고 싶을 때 사용

 

 

|| @Access


 

JPA가 엔티티 데이터에 접근하는 방식을 지정

 

- 필드 접근 : AccessType.FIELD 로 지정

  필드에 직접 접근 (private도 접근 가능)

- 프로퍼티 접근: AccessType.PROPERTY 로 지정

 접근자 Getter를 사용

 

 

 

출처: https://data-make.tistory.com/610 [Data Makes Our Future:티스토리]

 

 

@OrderBy

는 query의 order by 속성과 동일하게 가짐.

@OrderBy는 데이터베이스의 Query 구문의 Order by 구문과 동일한 효과를 가진다.

@OrderBy("fieldname [ASC | DESC] ") 형식으로 사용된다.

 

 

 

@JsonIgnoreProperties

 

@@JsonIgnoreProperties 어노테이션에 지정되어
JSON 직렬, 역직렬화에 담기지 않을것 입니다.
만약 Book 클래스 내에
BookId와 같은 다른 필드가 존재하고,
@JsonIgnore 어노테이션이 적용 되었다면

BooK 클래스의 모든 필드값은 JSON에 담기지 않을 것 입니다.

이 말은 즉 @JsonIgnore, @JsonIgnoreProperties은 JSON 직렬, 역직렬화를 무시할때 사용 됩니다.

@JsonIgnoreProperties 어노테이션은
allowGetters, allowSetters, ignoreUnknown, value 속성을 가지고 있습니다.

영어 원문의 설명이 너무길어 요약만 하겠습니다.

@JsonIgnoreProperties
(
value={"bookName","bookCategory"}, allowGetters=true
)

는 특정 필드가 직렬화는 허용하지만 역직렬화는 허용하지 않게 해주는 어노테이션입니다.

@JsonIgnoreProperties
(
value={"bookName","bookCategory"}, allowSettersa=true
)

는 allowGetters와 반대로 역직렬화는 허용하나 직렬화는 허용하지 않게 해주는 어노테이션 입니다.

@JsonIgnoreProperties(ignoreUnknown = true)
현재 진행중인 프로젝트에서 사용되고 있으며
아마 가장 많이 쓰이는 어노테이션이라 생각되는 속성 입니다.

@JsonIgnoreProperties(ignoreUnknown = true)를 사용하게 되면 역직렬화,
JSON 데이터가 가진 프로퍼티 중에
자바 class의 vo 프로퍼티에 값이 없는경우
에러를 던지지 않고 무시됩니다.

 

직렬화 역직렬화의 개념

예를 들면 json의 직렬화는 기본적으로 직렬화는 바이트 형태로 바꾸는 것이라고 보면 될 것 같습니다. JavaScript를 통해서 이해해보도록 하겠습니다.

hello라는 객체를 선언했습니다. 이 객체는 JavaScript  내에서는 잘 쓰일 수 있지만 다른 곳에서는 사용되기 어렵습니다. 그래서 직렬화를 해주어야 합니다. 

var hello = { a: "hello" } console.log(hello)/{a:"hello"} console.log(hello.a); //hello

hello라는 객체를 선언했습니다. 이 객체는 JavaScript  내에서는 잘 쓰일 수 있지만 다른 곳에서는 사용되기 어렵습니다. 그래서 직렬화를 해주어야 합니다. 

var stringHello = JSON.stringify(hello);
console.log(stringHello); //{"a":"hello"}
 
 
역직렬화란 
console.log(typeof hello); //object
console.log(typeof stringHello) //string

이렇게 타입을 검사해보면 차이를 확실히 알 수 있습니다. 

역직렬화는 어떻게 하는가?

직렬화한 파일을 다시 역직렬화(deserialization)해서 JavaScript의 객체 형태로 만들 수도 있습니다. 그때 사용되는 것이 parse 메소드입니다. 

var deserializeHello= JSON.parse(stringHello);
console.log(deserializaeHello); //{a:"hello"}
console.log(typeof deserializeHello); //object

 

 

https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=magnking&logNo=221156324082 

 

직렬화(serialization)란?

직렬화라는 단어가 저에게는 참 어려웠습니다. 그래서 직렬화에 대해서 약간 알게 된 부분을 공유하려고 합...

blog.naver.com

 

profile

IT'S DO

@멋진놈

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!