오늘은 테이블과 객체 매핑, 컬럼 스키마 매핑에 대해 배워보자.
우선 테이블 객체 매핑이다.
@Entity 어노테이션이 붙은 클래스만 JPA는 Entity로서 관리 하게 됨. 이 어노테이션이 붙지 않는 데이터는 JPA관리 밖.
이중 중요하게 다뤘던 매핑 전략에 대해 정리해보자.
@Id
@GeneratedValue
Entity의 Primary Key값을 설정할 때 사용한다.이 어노테이션을 달아주면 코드단에서 Id값을 넣어주지 않으면 알아서 Id를 넣어준다.
이때 세가지 전략이 존재함
IDENTITY, SEQUENCE , TABLE
[IDENTITY]
이 전략은 현재 연결된 DB의 ID 생성 전략을 따르는 것. MySQL은 AutoIncrement임. 따라서 자동으로 1씩 증가시켜줌
Oracle이나 H2는 아마 다른 전략이였는데 기억이 나지 않음.. 근데 Oracle도 AutoIncrement같은 느낌으로 사용됨.
이걸 사용할 때 문제가 되는 경우는 이거임.
ID를 코드단에서 넣어주지 않기 때문에 코드단에서 flush 하기전에 id를 모르는데?? 임
이를 해결하기 위해서 IDENTITY 전략으로 Entity를 영속성 컨텍스트에 넣는 순간(persist())로 영속성 관리에 들어가는 순간 쿼리가 나감. 따라서 flush를 하지 않아도 쿼리가 나간다.
이건 IDENTITY 전략에서만 적용됨. 다른 전략은 코드단에서 ID값을 알고 있기 때문에 flush를 한순간 쿼리가 나감.
[SEQUENCE]
시퀀스 전략은 ID를 저장하는 다른 자료를 하나 추가하는 것.
따라서 이는 코드단에서 이미 ID값을 알 수 있다. 이 전략을 사용하면 테이블이 생성될때 시퀀스도 같이 생성됨.
이때 persist()로 들어가면 ID값을 얻어옴. 아직 flush()는 안됨! persist()에 들어가면 ID값이 들어감.
flush 되는 순간 Insert쿼리가 날라감.
이렇다면 나중에 Insert 쿼리가 많이 날라가야 된다면 시퀀스를 사용하면 쿼리 숫자를 줄일 수 있겠다. IDENTITY는 persist()에 들어가자마자 바로 쿼리가 날라가니까!
아직 이 개념이 잘 잡히진 않았는데