필요의존
- 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
도메인 클래스 생성
- @Entity : 해당 클래스가 데이터 베이스에 영속화 될 엔티티 객체임을 명시
- @id : 해당 필드가 엔티티 식별 값임을 의미
- @GenerateValue : 자동 증가 값 정의
- @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;
}
}
하이버네이트 자동 설정
- 스프링 부트의 HibernateJpaAutoConfiguration 사용
- HibernateJpaConfiguration 실행
- HibernateJpaConfiguration 은 JpaBaseConfiguration 의 하위클래스
- JpaBaseConfiguration 의 EntityManagerFactoryBuilder 가 등록
- EntityManagerFactoryBean 생성
- 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 |