DevBoi

[JPA] Entity Mapping, Table Managing 본문

Develop/[JPA]

[JPA] Entity Mapping, Table Managing

HiSmith 2021. 7. 28. 23:02
반응형

1. 객체, 테이블 매핑

@Entity 

@Entity,가 붙으면, JPA에서 관리를 하는 클래스, 객체가 된다.

대부분 디폴트로,  객체이름과 테이블이름은 동일하게 따라가지만,

 

이런식으로 Table name을 붙이면, 해당 테이블이름으로 생성 및 관리가 된다.

밑에는 재부팅 후에, 확인된 내용이다.

현재는 테이블이 없어서, 한번 create ddl이 나갔고, 그 이후에는 재 기동 에도 create ddl이 나가지 않는다.

 

 

 

 

이렇게, 되는이유는 바로 이렇게 설정을 했기 떄문이다.

 

update, create 등등이 있는데, create 는 재기동 될때마다, 새롭게 생성된다.

기존에 테이블이 있으면 drop , create를 하고

update로 설정하게 되면  없는 대상들만, 혹은 신규 컬럼만 새롭게 update한다.

(당연한 소리 ㅋㅋ)

이외에도 vailidate, none 등등이 있는데, 단순 검사를 하거나, 아예 실행하지 않는 방법이 있다.

운영에서는,, none이나 vailidate만 해야될 것같다.

 

create에 대한, 문이나, drop에 대한건 방언에 따라, 연결된 DB tool에 따라서

다르게 문법이 나간다.

 

다음에는, 컬럼 별로 제어를 하는 법을 알아보자,

 

 이런식으로 별도 컬럼의 제약조건을 true로 주고, 해당 컬럼에 대한 길이를 20으로

제한 두고 한번 재기동해보자

 

우선 옵션을 Create 로 변경하고, 재기동을 하면, 기존에 있는것들은 Drop 하고, 다시 create를 하는데,

이렇게 제약조건을 알아서 추가해준다.

@Column(name ="변경하고싶은 컬럼이름")

 

이런식으로 하면, Table의 name을 붙이는 것처럼 별도관리를 하게된다.

 

추가로 컬럼의 속성에는 아래와 같은 것들이 있다.

@Enumerated -> 

@Enumerated(EnumType.String)

@Temporal(TemporalType.TIMTESTAMP)

@Lob

 

 

@Lob 는 알다싶이 많은 데이터를 처리할때 필요한 컬럼 속성이다. 대부분, 무슨 글의 주제나 그런것들에 사용된다.

@Temporal 에는 java 타입과 db타입을 맞춰서 저장해주는 것이다. 위와 같이 Timestamp로하게되면 시+분+초 이런형식으로 저장된다.

 

추가로, 이렇게 Entity 객체에서도, DB랑은 무관한, 즉 캐시에서만 쓰거나 단순 어플리케이션단에서만 

쓸 컬럼이 생길수도있다. 이런경우에는

해당 케이스로 사용하게 되면 DB에서는 생성 되지 않는다.

 

그 외 의 주요 매핑 정리

* insertable,updateable -> 이건 변경이나 삽입이 가능에 대한 속성을 지정해준다.

* nullable -> 기본이 True, false로 하게될 경우 Not null 제약 조건 붙는다.

* columDefinition -> 문구가 그대로 ddl문에 들어간다. 즉 데이터 베이스에 제약조건 직접 치는 것과 동일하다

* precision, scale -> 아주 큰 숫자나 소수점 일때 사용

 

@Enum 타입에서는 , 두가지 속성이 있는데, ordinary, string이 있는데,

ordinary는 int타입으로 들어가는데, 이것은 enum 타입에서, 정의된 순서대로 값이 들어간다.

이렇게 되는경우, 기존 데이터 + 변경된 enum순서라고 하면 아주 큰일난다.

 

그래서 앵간하면 무조건 string으로 설정 하는것이 좋다.

 

* 기본키 관련 설정 

@Id, 라고하면, PK이지만, 사용자가 직접 설정해주어야 한다.

예를 들면, 직접 set을 해서, DB에 넣어야 하는데,

자동할당 방법이 있다.

@GeneratedValue(strategy = GenerateionType.auto)

@GeneratedValue(strategy = GenerateionType.sequence)

@GeneratedValue(strategy = GenerateionType.Identity)

 

 

 

 

 

 

 

 

이런식으로 post_name만 생성했는데, post_id 가 자동으로 1로 들어가게 된다.

이런식으로 id 에 자동 생성으로 설정 할수 있다.

 

해당 Entity 에 시퀀스 생성자를 설정할수도 있다.

이런식으로, 시퀀스가 생성된다.

추가로, 해당 상세 내용을 설정할수있는데, 

기본값은, 재기동했을때 자동생성 50기준으로 증가가된다.

 

(특이 포인트로 알아두어야 하는 점이 있다)

대부분에 Entity는 트랜잭션의 commit 시점에 db에 날아가게 된다.

해당 Entity의 Id는 시퀀스로 잡혀있기때문고,identity로 설정되어있기때문에,

모아서 insert가 되는것이 아니라, 즉 트랜잭션 단위가 아니라

persist 시점에 db에 쿼리를 호출하게 된다.

 

자, 그러면 기본 50이 아니라 1씩, 그리고 초기값을 주게 되면?

 

이렇게 저장이 된다.

사용자가 모르는 사용자의 고유pk를 저장할때 이런 방식으로 사용하게 된다면 편하다.

 

그런데, Identity 방식이 아니라 시퀀스 방식에 대한 사용을 하게 되면, 버퍼처리가 가능하다.

즉, 시퀀스를 사용하게되면, 직접 persist 시점에 insert를 날리는게 아니라

 

미리 시퀀스에 대한 select 를 해오고, 다음 걸 가지고 와서, 체크를 한다.

 

 

구동 시점에, 총 4개의 post를 persist한다고 가정해보자,

이 경우에 시퀀스를 총 4번 호출할까?

아니다. dummy한번(init 이 1이기때문에) 그리고, 50이기때문에 한번 그리고

시퀀스를 50개를 메모리에 올려놓기때문에 더이상은 호출하지 않는다. 50개를 다 쓰면, 추가로 가져와야 하기 때문에 메모리에 접근해서 추가로 가져온다. 이때는 한번더 select 가 돈다.

 

 

시퀀스가 성공적으로 생성되었다.

재기동하게 되면, 51번째 부터 생성이 된다. 이 이유는, 50개씩 메모리에 올려놓기때문에, 50개를 한번 사용한 것으로 가정하기 때문에, 다음 시퀀스는 51부터이다.

 

미리 할당 받고, 사용하고, 다 쓰면 다시 call해서 할당 받는 방식이라고 생각하면 된다.

 

반응형

'Develop > [JPA]' 카테고리의 다른 글

JPA 관련 h2연동  (0) 2021.08.17
[JPA] 연관관계 매핑  (0) 2021.07.30
[JPA] JPA 영속 컨텍스트  (0) 2021.07.26
[JPA] 기초 CRUD 사용 해보자  (0) 2021.07.23
[JPA] JPA 기초 개념공부  (0) 2021.07.23