-자바 orm표준 jpa프로그래밍을 읽고 정리한 내용입니다.
jpa를 사용해 db의 table과 매핑할 클래스는 @Entity를 붙여야 한다.
Entity적용 시 주의점
- 기본 생성자가 필수적으로 있어야함
-인자가 있는 생성자만을 정의하고 기본 생성자는 정의하지 않는 일은 없어야 한다
jpa는 엔티티 객체를 기본 생성자를 이용해 생성하므로 생성자가 반드시 있어야 한다. 자바는 생성자가 하나도 정의되어 있지 않으면 기본 생성자를 자동으로 생성하지만, 생성자를 하나 이상 만들었다면 자동생성 하지 않기에 기본 생성자도 직접 만들어야 한다.- final클래스,enum,interface,inner클래스에는 사용불가
- 저장할 필드에 final 사용 불가
-> 위의 이유 때문에 entity클래스에 @NoArgsConstructor를 붙이고 있었다는 걸 알았다.
엔티티와 매핑할 테이블을 지정한다. table의 name을 지정하지 않으면 엔티티의 이름을 테이블의 이름으로 사용한다.
-> 사용하는 DB에서 대소문자를 구별하는지의 여부를 체크해야 할 때도 있을 듯 하다.sql이나 DB에서는 대소문자를 구별하지 않는 경우가 많지만 jpql,java는 대소문자를 구별한다.
-@Column
두 개 이상의 단어를 사용한 이름을 사용할 떄, 데이터베이스의 칼럼은 관행상(member_name)과 같이 언더스코어를 사용한다. 떄문에 db의 칼럼 이름을 설정할 경우 name에 언더스코어를 사용한 이름을 설정도록 하자.
@Column(name="role_type")
String roleType;
JPA는 엔티티 클래스의 매핑정보를 통해 스키마를 자동생성하는 기능을 지원한다. application.properties 에 spring.jpa.hibernate.ddl-auto=create 속성을 추가하면 프로젝트를 실행할 때 테이블이 자동 생성되는 것을 확인할 수 있다.
-> ddl-auto-create는 테이블을 처음 생성할 때, 매핑이 어떻게 되는지 학습할 때 좋은 방법이지만 기존 테이블이 자동으로 삭제,재생성 되기에 상용/운영 환경에서는 위험이 큰 방법이다. 실제 업무에서는 validate/none옵션으로 설정하고 테이블의 변경사항이 있을 경우 직접 코딩으로 반영하는게 안정적인 방법일 것이다.
JPA의 기본 키 매핑전략
board.setId(0202);
처럼직접 키 값을 할당
Mysql,PostgreSQL,DB2 등에서는 AUTO_INCREMENT로 기본 키를 자동 생성해준다. ID컬럼을 비워둔 채로 DB에 값을 저장하면 DB가 순서대로 KEY값을 자동할당한다.
->IDENTITY전략은 DB에 데이터를 INSERT한 후에야 키값을 알 수 있기에 DB를 2번 조회한다. statement.getGeneratedKeys()를 이용하면 db를 1번 조회하는 방식으로 최적화를 할 수 있다.
*트랜잭션 구현의 유리함을 위해 쿼리의 실행을 지연시키는 쓰기 지연이라는 것이 있다. 그런데 entity가 영속 상태가 되기위해서는 entity의 키(식별자)가 필요하기에 쿼리를 지연시킬 수 없다. 때문에 Identity전략에서는 쓰기 지연을 지원하지 않는다.
DB 시퀀스는 유일한 값을 순서대로 생성하는 DB오브젝트인데 이를 이용해 키를 생성할 수 있다. SEQUENCE 전략에서는 DB시퀀스에서 식별자를 조회해 엔티티에 할당 후 영속성 컨텍스트에 저장한다. 이후 트랜잭션이 커밋되었을 떄 엔티티를 실제 DB에 저장한다.
->SEQUENCE전략은 DB시퀀스에 1번,DB에 엔티티를 저장할 떄 1번으로
DB와2번 통시한다. 이 통신 횟수를 줄이기 위해 AllocationSize만큼 시퀀스를 메모리에 저장해놓고 그 범위안에서는 메모리에서 할당하는 방식이다. 기본 allocationSize는 50인데,51번쨰의 데이터를 저장할 떄에는 시퀀스가 100으로 늘어나 쓰지않게 될 공간을 할당할 수도 있지만 db와 매번 2번씩 통신하지 않기에 insert의 시간은 줄어드는 트레이드 오프가 있다.
데이터베이스마다 기본키를 만드는 전략이 다를 수 있다.AUTO전략은 선택한 데이터베이스 방언에 따라 자동으로 위의 identity,sequence,table중 한 개의 전략을 선택한다.