squence의 경우, identity와 아주 약간의 방식 차이가 있는데, 바로 sequence 값을 별도로 얻어와서 직접 넣어준다는 점이다.
sequence 값을 얻어오는 과정 자체는 identity와 동일하다.
이러한 방식 차이 덕분에, sequence는 한번에 많이 증가시킨 후, 증가시킨 범위 내에서는 추가적인 통신 없이 키를 생성할 수 있다는 장점(쓰는데가 있을까..)이 있다.
table의 경우 sequence와 유사하고 최적화 방식(한번에 많이 증가)도 동일하지만, key를 select하고 증가시킨 후 update하는 기간 기간동안 row level lock이 걸리기 때문에, 오버헤드가 너무 심합니다.(물론 insert가 적으면 무슨 짓을 해도 괜찮습니다)
@Column
객체의 필드를 테이블 컬럼에 매핑하는 구문으로서, 여러가지 옵션이 있지만 name(매핑할 컬럼명), insertable, updatable, table을 제외하고는 전부 다 DDL 전용 옵션(물론 참고 정도는 가능지만, 실무에서 과연 누가 관리하려고 할까..?)이다.
책에서는 insertable, updateable이 잘 쓰이지 않는다고 나오는데, 개인적으로는 해당 부분에 대한 제약을 강하게 원하고 있었어서, 저자와 생각이 약간 다르다.
컬럼 타입을 좀 더 세밀하게 설정할 수 있는 @Enumerated(ENUM), @Temporal(Date), @Lob(대량 데이터), @Transient(제외), @Access(JPA 접근 방식) 애노테이션들도 존재한다.
@Entity
JPA에서 관리할 영속 객체의 클래스를 지정하는 것이다.
name으로 이름(패키지 무관 유일한 식별자)를 지정할 수 있으며, 생략하면 클래스 명이 이름이 된다.
기본 생성자 필수, final 클래스 아닐것 등등 프록시 패턴과 리플렉션을 사용하는 케이스들과 동일한 제약을 지니고 있다.
@Table
위의 엔티티와 매핑될 테이블을 지정한다.
name으로 테이블 명을 지정할 수 있으며, 생략하면 Entity 명이 테이블 명이 된다.
그 외에 catalog와 schema를 지정할 수 있는데, 데이터베이스마다 의미가 다른 개념입니다. (공통적으로 네임스페이스의 역할을 수행하긴 합니다.)
예를 들어 mysql에서는 schema, catalog가 database와 동일한 의미입니다. 반면에 h2에서는 catalog는 database와 동일하지만, schema는 database 내부에 여러개 생성할 수 있는 다른 단위입니다.
아래는 주로 사용되는 DB 별 schema와 catalog 차이를 정리해둔 글입니다. https://stackoverflow.com/questions/7942520/relationship-between-catalog-schema-user-and-database-instance/7944489#7944489
마지막으로 uniqueConstraints를 통해 유니크 제약조건을 걸 수 있는데, DDL 만들기 기능을 활성화 해야 동작합니다.(Runtime 체크 아님)
기본 키 매핑
기본 키는 @Id 를 사용해서 실제 컬럼과 객체의 필드를 매핑하는데, pk를 별도로 생성해서 넘겨주는 방식은 일반적으로 잘 사용되지 않는다.
보통은 identity, squence, table 세가지 기능 중 하나를 사용하는데, identity와 sequence는 데이터베이스 별로 사용 방식이 약간 다른 것 뿐이고, 내부적인 동작은 동일하다고 봐도 무방하다.
identity의 내부적인 동작은 https://github.com/beadss/jpa-study/issues/4를 참고
squence의 경우, identity와 아주 약간의 방식 차이가 있는데, 바로 sequence 값을 별도로 얻어와서 직접 넣어준다는 점이다. sequence 값을 얻어오는 과정 자체는 identity와 동일하다.
이러한 방식 차이 덕분에, sequence는 한번에 많이 증가시킨 후, 증가시킨 범위 내에서는 추가적인 통신 없이 키를 생성할 수 있다는 장점(쓰는데가 있을까..)이 있다.
table의 경우 sequence와 유사하고 최적화 방식(한번에 많이 증가)도 동일하지만, key를 select하고 증가시킨 후 update하는 기간 기간동안 row level lock이 걸리기 때문에, 오버헤드가 너무 심합니다.(물론 insert가 적으면 무슨 짓을 해도 괜찮습니다)
아래는 table 방식과 sequence 방식의 성능 차이입니다.
https://vladmihalcea.com/why-you-should-never-use-the-table-identifier-generator-with-jpa-and-hibernate/
일반 컬럼 매핑
@Column 객체의 필드를 테이블 컬럼에 매핑하는 구문으로서, 여러가지 옵션이 있지만 name(매핑할 컬럼명), insertable, updatable, table을 제외하고는 전부 다 DDL 전용 옵션(물론 참고 정도는 가능지만, 실무에서 과연 누가 관리하려고 할까..?)이다. 책에서는 insertable, updateable이 잘 쓰이지 않는다고 나오는데, 개인적으로는 해당 부분에 대한 제약을 강하게 원하고 있었어서, 저자와 생각이 약간 다르다.
컬럼 타입을 좀 더 세밀하게 설정할 수 있는 @Enumerated(ENUM), @Temporal(Date), @Lob(대량 데이터), @Transient(제외), @Access(JPA 접근 방식) 애노테이션들도 존재한다.