=> 객체와 테이블 사이의 관계와 속성을 지정할 수 있도록 매핑하는 것이다.
=>관련된 어노테이션을 사용하여 테이블과 클래스, 필드와 속성등을 매핑 가능하다.
해당 어노테이션이 붙은 클래스는 JPA에 관리되어지며 엔티티라고 한다. JPA를 사용하기 위해선 필수적으로 사용해야한다. (*기본 생성자 필수)
엔티티와 매핑할 테이블을 지정한다. name 속성을 통해 매핑할 테이블 이름을 지정 할 수있다. ex) 엔티티 이름을 Order이라고 한다면 Oracle에선 order by 예약어와 중복되어 테이블 명으로 설정 할 수 없기때문에 변경 해야함.
해당 필드를 기본 키로 매핑한다. (직접 할당 하는 방식)
해당 필드를 기본 키로 매핑한다. (자동 생성 하는 방식, @Id 와 같이 사용)
strategy 속성을 이용하여 생성되는 타입을 정할 수 있다. default 값은 Auto이며 sql 방언에 따라 자동 지정된다.
필드와 컬럼의 매핑 속성을 지정한다. 컬럼 이름이나 변경 여부, null 여부, unique, 길이 등의 제약조건을 설정할 수 있다.
자바의 enum 타입을 매핑할 때 사용한다.
속성타입으로 ORDINAL과 STRING이 있는데 꼭 STRING을 사용하길 권장한다. ORDINAL은 enum 순서를 DB에 저장하고 STRING은 이름으로 값을 저장하는데 enum 타입이 변경 되었을 시 ORDINAL은 순서로 저장하기 때문에 데이터가 꼬일 수 있다.
날짜 타입을 매핑 할 때 사용한다. 속성 타입으로 DATE(날짜), TIME(시간), TIMESTAMP(날짜와 시간) 등 이 있다.
Date 객체를 쓴 이유는 하이버네이트가 최신버전이라면 LocalDate나 LocalDateTime 객체를 사용 시 해당 어노테이션을 생략 할 수있다.
데이터베이스의 BLOB, CLOB 타입과 매핑할 때 사용한다. (속성은 없으며 문자타입은 CLOB이고 나머지는 BLOB이다.)
CLOB: String, char[] / BLOB: byte[]
*JPA는 기존의 테이블 중심 설계에서 객체 중심의 설계로 !!!! ****
DataBase 스키마 자동생성은
create : 기존 테이블 삭제 후 다시 생성(DROP 후 CREATE)
create-drop : create와 같으나 종료 시점에 모든 테이블 DROP
update : 변경분만 반영
validate : 엔티티와 테이블이 정상 매핑되었는지만 확인
none : 사용 안함
운영서버에는 create, create-drop, update는 사용하지 않을것을 권장한다.
위에서 간단히 엔터티 연관관계에 대해서 알아보았는데 이 부분에서 더 자세히 알아보자.
연관관계에는 방향이 세가지가 있다.
방향 : 단방향, 양방향 (객체 참조)
연관 관계의 주인 : 양방향일 때, 연관 관계에서 관리 주체
다중성 : 다대일(N:1), 일대다(1:N), 일대일(1:1), 다대다(N:M)
데이터베이스의 테이블은 외래 키 하나로 양쪽 테이블 조인이 가능하다.
=> DB는 방향을 나눌 필요가 없음
BUT 객체는 참조용 필드가 있는 개체만 다른 객체를 참조한다.
"결국 양방향관계가 아닌 객체가 단방향 참조를 각각 가지게 되어 양방향 처럼"
그래서 우리는 개발시에 어떠한 연관 관계를 가질지 택해야한다.
_기본적으로 단방향 매핑으로 하고 나중에 역방향으로 객체 탐색이 꼭 필요하다고 느낄 때 추가하는 것으로 잡아야한다.
두 객체(A, B)가 양방향 관계, 단방향 관계 2개(A→B, B→A)를 맺을 때, 연관 관계의 주인을 지정.
연관 관계의 주인을 지정 하는 것은 두 단방향 관계(A→B, B→A)중, 제어의 권한(외래 키를 비롯한 테이블 레코드를 저장, 수정, 삭제 처리)을 갖는 실질적인 관계가 어떤 것인지 JPA에게 알려준다고 생각해야한다.
연관 관계의 주인은 연관 관계를 갖는 두 객체 사이에서 조회, 저장, 수정, 삭제를 할 수 있지만, 연관 관계의 주인이 아니면 조회만 가능
연관 관계의 주인이 아닌 객체에서 mappedBy 속성을 사용해서 주인을 지정해줘야합니다.
TIP : 외래 키가 있는 곳을 연관 관계의 주인으로 정함. 무조건.
_
DB에서 외래키가 있는 테이블을 수정할때 주인만 변경하는 것이 맞기는 하지만... 실질적으로 둘다 변경해야함...
두 참조를 사용하는 객체는 데이터 동기화가 필요하다.
_
이후 이어서 다음 포스팅에 다중성을 포스팅하겟다.