스프링 데이터 JPA-02.세팅 및 엔티티, Value 타입 맵핑


JPA 프로그래밍 1. 프로젝트 세팅

데이터베이스 실행

  • PostgreSQL 도커 컨테이너 재사용
  • docker start postgres_boot

스프링 부트

  • 스프링 부트 v2.*
  • 스프링 프레임워크 v5.*

스프링 부트 스타터 JPA

  • JPA 프로그래밍에 필요한 의존성 추가
    • JPA v2.*
    • Hibernate v5.*
  • 자동 설정: HibernateJpaAutoConfiguration
    • 컨테이너가 관리하는 EntityManager (프록시) 빈 설정
    • PlatformTransactionManager 빈 설정

JDBC 설정

spring.datasource.url=jdbc:postgresql://localhost:5432/springdata
spring.datasource.username=jaeuk
spring.datasource.password=pass

# drop - create
spring.jpa.hibernate.ddl-auto=create
# sql show
spring.jpa.show-sql=true
# sql show할 때 포멧 (보 기편하게)
spring.jpa.properties.hibernate.format_sql=true
#warning 제거
spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation=true 

JPA 프로그래밍 2. 엔티티 맵핑

@Entity

  • “엔티티”는 객체 세상에서 부르는 이름.
  • 보통 클래스와 같은 이름을 사용하기 때문에 값을 변경하지 않음.
  • 엔티티의 이름은 JQL에서 쓰임.

@Table

  • “릴레이션” 세상에서 부르는 이름.
  • @Entity의 이름이 기본값.
  • 테이블의 이름은 SQL에서 쓰임.

@Id

  • 엔티티의 주키를 맵핑할 때 사용.
  • 자바의 모든 primitive 타입과 그 랩퍼 타입을 사용할 수 있음
  • Date랑 BigDecimal, BigInteger도 사용 가능.
  • 복합키를 만드는 맵핑하는 방법도 존재(추후 다룸)

@GeneratedValue

  • 주키의 생성 방법을 맵핑하는 애노테이션
  • 생성 전략과 생성기를 설정할 수 있다.
  • 기본 전략은 AUTO: 사용하는 DB에 따라 적절한 전략 선택
  • TABLE, SEQUENCE, IDENTITY 중 하나.

@Column

  • unique
  • nullable
  • length
  • columnDefinition

@Temporal

  • 현재 JPA 2.1까지는 Date와 Calendar만 지원.
  • 이후부터 자바8에서 등장한 새로운 시간타입 지원

@Transient

  • 컬럼으로 맵핑하고 싶지 않은 멤버 변수에 사용. (객체에서만 사용)

JPA 프로그래밍 3. Value 타입 맵핑

Value 타입 종류

  • 기본 타입 (String, Date, Boolean, …)
  • Composite Value 타입
  • Collection Value 타입
  • 기본 타입의 콜렉션
  • 컴포짓 타입의 콜렉션

Composite Value 타입 맵핑

  • @Embeddable
  • @Embedded
  • @AttributeOverrides
  • @AttributeOverride

예시

@Embeddable
public class Address {

    private String street;

    private String city;
@Entity //(name = "myAccount") // 미설정시 클래스 이름, 객체 안에서 사용되는 이름
//@Table(name = "account") // 미설정시 엔티티 네임과 동일
public class Account {

    @Id
    @GeneratedValue // 자동으로 생성되는 값, 리포지터리 통해 저장할때 자동으로 생성된 값을 씀
    private Long id;

    private String username;

    private String password;

    @Embedded
    @AttributeOverrides({
            @AttributeOverride(name = "street", column = @Column(name = "home_street") ),
            @AttributeOverride(name = "city", column = @Column(name = "home_city") )
    })
    private Address homeAddress;
...
    create table account (
       id int8 not null,
        active boolean not null,
        home_city varchar(255), 
        home_street varchar(255),
        city varchar(255),
        street varchar(255),
        password varchar(255),
        username varchar(255),
        primary key (id)
    )





© 2019. by jaeuk