엔티티 맵핑

Shaun·2021년 8월 25일
1

JPA

목록 보기
7/31

엔티티 기본맵핑에 대해 자세히 알아보자

내가 몰랐던 내용이나 좀더 중요한 내용을 중점으로 정리를 했다.

데이터베이스 스키마

  • 이기능을 처음 봣을때 와 진짜 편하다 라는 생각에 마구 남발 했던 기억이난다. 그래서 협업을 할떄도 그냥 올려놓고 쓰면 되는거 아닌가 하면서 올려놨지만 누군가가 지워 놨던 흔적을보고 왜 이 편한걸 지우지??? 이런생각이 들었다. 그 해 답은 여기에 있다
  • 자동생성으로 생선된 DDL은 개발 장비에서만 사용한다.

  • 쭉보면 create 같은건 정말 위험한 명령어이다.. 수정/삭제를 프로그램이 자동으로 할수 없게 따로 분리시키는게 좋을것 같다.(아예 안쓰던가)

  • create , create-drop , update 는 운영장비에는 절대로 사용하면 안된다!

@Enurmated

  • enumerated 에는 STRING 과 ORDINAL(default) 이 있다.

  • STRINGenum 이름을 데이터베이스에 저장하고 ORDINALenum 순서를 데이터베이스에 저장

  • STRING 을 쓰자 왜냐하면 ORDINAL로 해버리면 옜날 데이터 까지 순서가 그대로여서 새로 넣은 데이터와 순서가 꼬여버린다.

[ A(0) B(1) ] -> 데이터추가 [C(0) A(0) B(1) ]

기본키 맵핑

@Generated

  • 총 4가지 strategy가 있다.

  • AUTO/IDENTITY/SEQUENCE/TABLE

  • Auto = db 방언에 따라 자동지정
  • IDENTITY = 데이터베이스에 위임한다. (데이터베이스가 알아서 하게)
  • SEQUENCE = DB시퀀스 오브젝트사용, ORACLE @SequenceGenerator 필요하다
  • TABLE = 키생성용 테이블 사용 @TableGenerator 필요하다

IDENTITY

  • JPA 는 트랜잭션 커밋 시점에 INSERT SQL 쿼리문 날려 실행한다
  • Persist() 시점에는 영속선 컨텍스트에 넣는다.

BUT!

  • AUTO-INCREMENT 는 DB에 쿼리문을 날려야 ID값을 알수있다. -> ID값이 있어야 persist() 를 해서 영속성컨텍스트에 넣을수 있기 때문에 persist() 하는 즉시 INSERT SQL 쿼리문이 날라가 실행 된다. 그래야 id값을 알고 영속성 컨텍스트에 넣을수 있기 때문!!!

  • 영속성 컨텍스트에 넣을려면 id값 필요!

SEQUENCE

  • persist()를 해서 영속성 컨텍스트에 넣을떄는 pk값이 필요한데 sequence는 db에서 pk값을 가져와야하므로 쿼리를 날려 먼저 가져온다.

  • commit 하기전에는 db에 쿼리를 날리는게 아니므로 그전까지는 영속성 컨텍스트에 있다.

  • allocationSize() 는 쉽게말해 한번에 키값을 많이가져와 메모리상에 올려두고 사용하는 방식이다. (한번에 많이부르고 왔다갔다를 최소화 하는 방법)

-> 이걸 쓰는 이유는 persist를 한뒤 pk값이 없으면 DB에 쿼리문을 날리고 다시가져오고 Commit 해서 db에 적용하고..... 가 너무 비효율적이라 한번에 pk값을 떙겨쓰는것이다.

-> sequence는 키값을 얻으려 db에 쿼리문을 보내 얻어온뒤 persist로 컨텍스트에 넣고 commit으로 db에 넣는다. 이런 과정이 반복되면 성능 저하를 유발한다. 이떄 allocationSize() 를 사용한다.

  • 영속성 컨텍스트에 넣기위해 pk값이 필요하다 그래서 identity 는persist 시점에 insert쿼리문이 날라가지만 sequence는 위에 방식으로 모아놨다가 한방에 commit으로 db에 쿼리문을 날릴수 있다.

TABLE

  • AutoIncrement or sequence 둘중 하나 선택해야 하지만 이건 둘다 적용 가능하다

  • 하지만 sequence 처럼 최적화가 되지 않은 상태라 성능이 좀 떨어진다는 문제가 있다.

  • 이 방법은 잘 사용되지 않는다..참고만 하자

profile
호주쉐프에서 개발자까지..

0개의 댓글