엔티티를 매핑할 때는 애너테이션을 이용하여 각 요소들을 매핑한다.
@Entity, @Table@Column@Id@ManyToOne, @JoinColumn @Entity가 붙은 클래스는 JPA가 관리하는 엔티티라고 한다.final class, enum, interface, inner클래스에서는 사용하지 않는다.final 사용하지 않는다.
속성 기능 기본값 name 매핑할 테이블이름 엔티티 이름을 사용한다. catalog DB의 catalog 매핑 schema DB의 schema 매핑 uniqueConstraints(DDL) DDL생성 시에 유니크 제약 조건 생성
데이터베이스 스키마 자동 생성
- DDL을 애플리케이션 실행 시점에 (다음 표와 같은 옵션으로)테이블 자동 생성한다.
- 테이블에서 객체 중심으로 작업을 처리를 하기 위해 데이터베이스 방언을 활용해서 데이터베이스에 맞는 적정 DDL를 생성한다.
- 이렇게 생성된 DDL은 개발 장비에서만 사용 (운영에서 사용해서는 안된다)
- 생성된 DDL은 운영서버에서는 사용하지 않거나, 적절히 다듬은 후 사용한다.
- 운영 장비에는 절대 create, create-drop, update 사용하면 안된다.
- 개발 초기 단계 : create 또는 update,
- 테스트 서버 단계 : update 또는 validate,
- 스테이징과 운영서버 단계 : validate 또는 none를 사용한다.
DDL생성 기능
제약조건 추가
- 회원이름은 필수, 10자 추가 제한 조건일 때,
@Column(nullable=false, length=10)unique제약 조건 추가 조건 일 때,
@Table(uniqueConstraints = {@UniqueConstraint(name="NAME_AGE_UNIQUE", columnNames{"NAME","AGE"})})- DDL 생성기능은 DDL을 자동 생성할 때만 사용되고, JPA의 실행로직에는 영향을 주지 않는다.
@TableGenerator이 필요객체를 테이블에 맞춰 데이터 중심으로 모델링하면 협력관계를 만들 수 때문에,
(테이블은 외래키로 조인을 사용해서 연관된 테이블을 찾고, 객체는 참조를 사용해서 연관된 객체를 찾는 테이블과 객체 사이에 차이)
따라서, 객체지향 모델링 방식으로 연관관계를 표현한다.
가급적 단방향 연관관계로 처리하되, 필요에 따라서는 양방향 연관관계 매핑을 추가한다.
연관관계 주인
- 외래키가 있는 객체가 연관관계의 "주인"이다.
- 테이블에서는 FK만 잘 걸려 있으면, 양방향으로 이동할 수 있다.
- 객체의 양방향 관계는 양방향이 아니라, 서로 다른 단방향 관계가 2개이다.
🧨 문제점!!
연관관계에 있는 엔티티 둘 중 하나로 외래키를 관리해야 하는데,
그러나, 수정을 할 때에 어느 쪽의 테이블을 수정해야 하는 지에 대한 이슈가 발생
🧨 양방향 연관관계시, 주의사항 🧨
- 순수 객체 상태를 고려해서 항상 양쪽에 값을 설정하자!
- 연관관계 편의 메서드를 생성하자!
- 양방향 매핑시에 무한 루프를 조심하자!
(toString() 메서드, lombok에서의 toString, ..)
따라서, 연관관계 편의 메서드를 생성한다.
- 연관관계 객체 둘 중에 하나만 넣자,
만약 둘 다 넣으면, 무한루프가 걸리는 경우가 있다.
임베디드 타입이란, 사전적 정의로 내장 타입이란 뜻으로 새로운 값 타입을 직접 정의할 수 있다.
@Embeddable : 값 타입을 정의하는 곳에 표시@Embedded : 값 타입을 사용하는 곳에 표시@Embedded나, @Embeddable 둘 중에 하나만 써도 기능은 된지만, 둘 다 넣는 것을 권장한다.한 엔티티에서 같은 값 타입을 사용하면 컬럼명이 중복되기 때문에, @AttributeOverrides, @AttributeOverride를 사용해서 컬럼명 속성을 재정의한다.
@Embedded
@AttributeOverrides({
@AttributeOverride(name = "city", column = @Column(name="WORK_CITY")),
@AttributeOverride(name = "street", column = @Column(name="WORK_STREET")),
@AttributeOverride(name = "zipcode", column = @Column(name="WORK_ZIPCODE")),
})
private Address workAddress;
특정 엔티티에 대한 특정한 작업을 수행하면, 관련된 엔티티에도 동일한 작업을 수행한다는 의미이다.
cascade = CascadeType.ALL : "모든 cascade 를 적용한다."JPA에서 CascadeType.ALL은 엔티티 관계를 정의하는데 사용되는 옵션 중 하나로, 이 옵션은 부모 엔티티의 변경사항이 자식 엔티티에 모두 전파되도록 지정한다.