본문 바로가기

Spring/jpa

[spring data jpa] - 프로젝트 셋팅, 맵핑

 

스프링 부트 스타터 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