스프링 부트 스타터 jpa 에는 하이버네이트 v5와 jpa v2 의존성이 있다.
Jpa 기반으로 쓸 수 도 있고 하이버네이트 기반으로 쓸수도있지만,
우리는 둘 다 직접적으로 쓸 수 없다.
우리는 스프링 데이터 jpa 를 사용하는경우가 대부분이다.
spring-boot-starter-data-jpa 의존성이 추가 되었을때
가장 핵심적인게
db 커넥션 풀도 설정이 된다.
어떤 db 에 붙는지 커넥션 정보를 줘야한다
로 url 과 인증정보를 입력하면 된다.
그리고 하이버네이트 정보가 필요하다
ddl-auto=create 를 주면
어플리케이션 구동 때마다 새로운 스키마를 생성한다.
개발할 땐 저렇게 쓰는게 좋고,
실제로는 validate 를 줘서 쓰는게 좋다.
새로 만들지 않고 검증만 하는것,
이제 객체를 만들어보자
@Entity
도메인 클래스를 만들고 매핑을 해준다.
@Id 주키에 매핑이 되고
@GenereatedValue 는 autoIncrement 다
@Entity 를 붙이기만 하면
기본적으로 username과 password는 자동으로 생성된다.
@Column이 자동으로 붙여진다.
jpa 핵심인 entityManagerFactoryBuilder 가 등록되어있고
가 등록되어있어서 우리는 Entity 를 쓸 수 있는것이다.
Jpa 에 사용되는 모든 빈들이 자동으로 등록된다.
entityManager가 jpa 가장 핵심적인 부분이라 할 수 있다.
이 클래스가 jpa 핵심
반드시 entityManager는 한 트랜잭션에서 일어나야한다.
@Transactional 을 클래스에 붙이던지
메서드에만 붙일 수도 있다.
이 entityManager 를 이용하면 하이버네이트도 사용가능하다.
하이버네이트의 핵심적인 api 는 세션이다.
entityManager.unwrap(Session.class);
로 세션을 꺼내서 세션으로 저장을 할 수 가 있다.
엔티티 맵핑
@Entity 를 쓰면서 @Table도 생략된것
기본적으로는 클래스 이름이 테이블과 맵핑 되지만,
name을 명시적으로 줄 수 도 있다.
Entity 의 이름은 JQL 에서 쓰인다.
@Table 은
릴레이션에서 쓰이는것
@Entity 의 이름이 기본값이 된다.
테이블 이름은 SQL 에서 쓰인다.
@Temporal
날짜 데이터를 맵핑 할 수 있다.
jpa 2.2 부터는 localDatetime 제공해준다
그전은
Temporal 은 date 와 Calendar 만 제공함
@Transient
컬럼으로 맵핑 하지 않는다.
Value 타입 맵핑
이런 얘들이 전부 value 타입들이다
Composite Value 타입과
Collection Value 타입이 있다.
Composite 큰 타입의 value 타입이라 할 수 있다.
Entity 의 종속적인 타입을 value 타입이라 할 수 있다.
@Embeddable 을 이용해 만들 수 있다.
엔티티에서는 @Embedded 를 붙여 사용하면 된다.
value 타입 필드의 컬럼이 생성된걸 볼 수 있다.
만약 여러개를 쓰고 컬럼을 바꾸고 싶을땐
AttributeOverride 를 이용할 수 있다.
관계 맵핑
1대다 관계 설정을 봐보자
스터디 테이블도 만들어서 두개의 엔티티를 연결해보자
오직 꼭 두 엔티티의 관계를 정의 할 수 있다.
이렇게 해서 데이터를 넣고 세이브를 했다고 가정하면
테이블의 pk를 참조하는 FK 를 만들어서 테이블에 갖고 있게 된다.
스터디에 pk 가 들어가있다.
끝쪽을 보자 끝이 Many 로 보면 컬렉션 타입
OneToMany 는 기본적으로 조인 테이블로 만들어진다.
account_studies 가 만들어진다.
만약 양방향으로 연결을 하고 싶다면
FK 를 가지고 있는 @ManyToOne 쪽이 우선 주인이다.
따라서 주인이 아닌 OneToManty 에서 mappedBy로 관계를 맺고 있는 필드를 설정해야 한다.
관계는 주인에서 데이터를 넣어줘야한다
만약 위처럼 주인이 아닌곳(OneToMany)에서 데이터를 주입시키면
account 에 아무것도 없고
study 테이블 데이터에 맵핑을 해야 하는데
스터디 테이블에 데이터가 없다
그래서 맵핑이 되지 않는다.
위처럼 주인으로 맵핑해줘야 한다.
사실 저 account 는 옵셔널. 해도되고 안해도 된다.
'Spring > jpa' 카테고리의 다른 글
[spring data jpa] jpa query (0) | 2020.12.17 |
---|---|
[spring data jpa] Entity 상태 , Cascade (0) | 2020.12.16 |
[spring data jpa] - ORM 패러다임 불일치 (0) | 2020.12.16 |
[spring data jpa] - ORM (0) | 2020.12.16 |
spring data jpa - 관계형 데이터베이스 (0) | 2020.12.16 |