기존의 application properties파일을 삭제한 후 main/resource/application.yml파일을 추가하여 다음 세팅을 한다.
spring:
datasource:
url: jdbc:h2:tcp://localhost/~/jpashop;
username: sa
password:
driver-class-name: org.h2.Driver
jpa:
hibernate:
ddl-auto: create # or update
properties:
hibernate:
# show_sql: true 운영 환경에서는 system.out.으로 찍으면 안됨
format_sql: true
logging:
level:
org.hibernate.SQL: debug
org.hibernate.type: trace
<aside>
⚠️ 본 강의의 url: jdbc:h2:tcp://localhost/~/jpashop;MVCC=TRUE는 H2 버전 1.4.2부터 기본값으로 변경되었으므로 생략한다. 적을 경우 에러가 발생한다.
</aside>
jpa:
hibernate:
ddl-auto: create # or update
위 yaml문법은 띄어쓰기 2칸으로 계층을 인식하는 특징이 있다. 이를 준수하지 않으면 코드가 인식되지 않거나 오류가 발생할 수 있다.spring.jpa.hibernate.ddl-auto: create와 같다.
이 옵션은 애플리케이션 실행 시점에 drop table 후 다시 create하는 기능이다.
<aside> ⚠️ 참고: 모든 로그 출력은 가급적 로거를 통해 남겨야 한다. show_sql: 옵션은 System.out 에 Hibernate 실행 SQL을 남긴다. org.hibernate.SQL : 옵션은 logger를 통해 Hibernate 실행 SQL을 남긴다.
</aside>
package jpabook.jpashop;
import lombok.Getter;
import lombok.Setter;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
@Entity
@Getter @Setter
public class Member {
@Id @GeneratedValue
private Long id;
private String username;
}
package jpabook.jpashop;
import org.springframework.stereotype.Repository;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
@Repository
public class MemberRepository {
@PersistenceContext
private EntityManager em;
public Long save(Member member){
em.persist(member);
return member.getId();
}
public Member find(Long id){
return em.find(Member.class, id);
}
}
package jpabook.jpashop;
import org.assertj.core.api.Assertions;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.annotation.Rollback;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.transaction.annotation.Transactional;
@RunWith(SpringRunner.class)
@SpringBootTest
public class MemberRepositoryTest {
@Autowired MemberRepository memberRepository;
@Test
@Transactional //이게 없으면 트랜잭션이 생기지 않는다. 테스트에 있으면 롤백까지 시킨다.
@Rollback(value = false) //이걸 붙이면 롤백을 명시적으로 하지 않는다.
public void testMember() throws Exception {
//given
Member member = new Member();
member.setUsername("memberA");
//when
Long savedId = memberRepository.save(member);
Member findMember = memberRepository.find(savedId);
//then
Assertions.assertThat(findMember.getId()).isEqualTo(member.getId());
Assertions.assertThat(findMember.getUsername()).isEqualTo(member.getUsername());
Assertions.assertThat(findMember).isEqualTo(member);
System.out.println("findMember == member : " + (findMember == member));
}
}
<aside> ⚠️
주의: @Test는 JUnit4를 사용하면 org.junit.Test를 사용해야 한다. JUnit5버전은 그에 맞게 바꿔야 한다.
</aside>
오류: 테스트를 실행했는데 다음과 같이 테스트를 찾을 수 없는 오류가 발생하는 경우
No tests found for given includes: [jpabook.jpashop.MemberRepositoryTest] (filter.includeTestsMatching) 해결: 스프링 부트 2.1.x 버전을 사용하지 않고, 2.2.x 이상 버전을 사용하면 Junit5가 설치된다. 이때는 build.gradle 마지막에 다음 내용을 추가하면 테스트를 인식할 수 있다. Junit5 부터는 build.gradle 에 다음 내용을 추가해야 테스트가 인식된다
build.gradle 마지막에 추가
test {
userJUnitPlatform()
}
스프링 부트를 통해 복잡한 설정이 모두 자동화되었다. persistence.xml도 없고 LocalContainerEntityManagerFactoryBean도 없다. 스프링 부트를 통한 추가 설정은 스프링 부트 매뉴얼을 참고하고, 스프링 부트를 사용하지 않고 순수 스프링과 JPA 설정 방법은 자바 ORM 표준 JPA 프로그래밍 책을 참고하자.