springframework/Spring Data JPA

JPA 실행하고 적용하기

Jungsoomin :) 2020. 11. 9. 00:21

필요의존

  • jdbc 구현체와 Spring-Data-Jpa
<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
            <groupId>org.postgresql</groupId>
            <artifactId>postgresql</artifactId>
</dependency>

application.properties

#최소한의 데이터 소스 설정
spring.datasource.url=jdbc:postgresql://localhost:1235/datajpa
spring.datasource.username=postgres
spring.datasource.password=postgres

spring.jpa.open-in-view=true

# 자동 쿼리 생성 , validate 는 검증. create 는 언제나 드랍하고 새로만듬. create-drop 실행 시 생성 종료시 드랍. update 변경 시에만 변경 점 적용
spring.jpa.hibernate.ddl-auto=validate
spring.jpa.generate-ddl=false

# show sql
spring.jpa.show-sql=true

도메인 클래스 생성

  1. @Entity : 해당 클래스가 데이터 베이스에 영속화 될 엔티티 객체임을 명시
  2. @id : 해당 필드가 엔티티 식별 값임을 의미
  3. @GenerateValue : 자동 증가 값 정의
  4. @Column : 해당 멤버 변수가 엔티티 컬럼임을 명시, 사실상 생략되어있음

* 엔티티 클래스는 자바 빈 스펙을 따른다.

@Entity
public class Account {

    @Id
    @GeneratedValue
    private Long id;

    @Column
    private String username;

    @Column
    private String password;

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Account account = (Account) o;
        return id.equals(account.id);
    }

    @Override
    public int hashCode() {
        return Objects.hash(id);
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}

하이버네이트 자동 설정

  1. 스프링 부트의 HibernateJpaAutoConfiguration 사용
  2. HibernateJpaConfiguration 실행
  3. HibernateJpaConfiguration JpaBaseConfiguration 의 하위클래스
  4. JpaBaseConfiguration EntityManagerFactoryBuilder 가 등록
  5. EntityManagerFactoryBean 생성
  6. EntityManager 을 주입받아 사용할 수 있게 됨

 

EntityManager 는 JPA의 핵심 객체다.

  • @PersistenceContext 로 주입받아 사용한다.
@Component
@Transactional
public class JpaRunner implements ApplicationRunner {

    @PersistenceContext
    private EntityManager entityManager;
    @Override
    public void run(ApplicationArguments args) throws Exception {
        Account account = new Account();
        account.setUsername("Jungsoomin");
        account.setPassword("jpa");

//        Session session = entityManager.unwrap(Session.class);

//        session.save(account);

       entityManager.persist(account);
    }
}

 

 

Hibernate 의 핵심 객체는 Session 이다.

  • 하이버 네이트는 JPA 구현체이므로 사용 가능하다.
@Component
@Transactional
public class JpaRunner implements ApplicationRunner {

    @PersistenceContext
    private EntityManager entityManager;
    @Override
    public void run(ApplicationArguments args) throws Exception {
        Account account = new Account();
        account.setUsername("Jungsoomin");
        account.setPassword("jpa");

        Session session = entityManager.unwrap(Session.class);

        session.save(account);

//       entityManager.persist(account);
    }
}

 

 

spring.jpa.hibernate.ddl.auto=update

  • 멤버변수 추가시 컬럼을 새로 만들어 주나 좋은 것이 아님
  • 나중에 멤버변수를 삭제해도 컬럼이 사라지지않음
  • 멤버변수의 이름을 바꾸더라도 새로운 컬럼을 만들며 컬렴명을 바꾸지 않는다.
  • 그러므로 flyway 같은 DB 마이그레이션 툴이 필요하다.

 

'springframework > Spring Data JPA' 카테고리의 다른 글

관계 맵핑, 1 : N  (0) 2020.11.13
Value 타입 맵핑  (0) 2020.11.13
엔티티타입 맵핑  (0) 2020.11.13
ORM 패러다임 불일치  (0) 2020.11.08
JPA 개요  (0) 2020.11.08