JPA와 DB 설정, 동작 확인
H2 DB 설치 및 JPA DB 환경설정
(1) H2 설치 및 설정
-> http://h2database.com/html/main.html 에서 설치
-> 설치후 h2콘솔에서 JDBC URL에서
-> Generic H2 (Embedded)로 설정한 이름을 붙여 실행
ex) jdbc:h2:~/jpashop
-> Generic H2 (Server)로 설정하고 나온대로 실행
ex) jdbc:h2:tcp://localhost/~/jpashop
(2) JPA와 DB 환경설정
application.yml 만들기
yml은 YAML ain't Markup Language의 약자라고 하는데, 최근 스프링이나 쿠버 네티스의 '설정파일' 저장양식으로 많이 쓰인다고한다.
resources의 경로에 application.yml 파일을 만든다.
코드
spring:
datasource:
url: jdbc:h2:tcp://localhost/~/jpashop
username: sa
password:
driver-class-name: org.h2.Driver
jpa:
hibernate:
ddl-auto: create
properties:
hibernate:
# show_sql: true
format_sql: true
logging:
level:
org.hibernate.SQL: debug
org.hibernate.type: trace
원래 JPA 시간에 배웠던 Persistence의 역할을 대체한다고 생각하면 된다.
첨부해서 이번에 만들 application.yml과 비교해서 보면 좋을듯 하다.
Persistence
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.2"
xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_2.xsd">
<persistence-unit name="hello">
<properties>
<!-- 필수 속성 -->
<property name="javax.persistence.jdbc.driver" value="org.h2.Driver"/>
<property name="javax.persistence.jdbc.user" value="sa"/>
<property name="javax.persistence.jdbc.password" value=""/>
<property name="javax.persistence.jdbc.url" value="jdbc:h2:tcp://localhost/~/jpql"/>
<property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/>
<!-- 옵션 -->
<property name="hibernate.show_sql" value="true"/>
<property name="hibernate.format_sql" value="true"/>
<property name="hibernate.use_sql_comments" value="true"/>
<property name="hibernate.hbm2ddl.auto" value="create" />
</properties>
</persistence-unit>
</persistence>
엔티티 생성 및 동작 확인
Member 엔티티 생성
코드
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;
}
MemberRepository 생성
코드
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(); // Id정도를 리턴하면 조회하기도 확인하기도 편함
}
public Member find(Long id){
return em.find(Member.class , id);
}
}
- @Repository
일종의 Component로, DB 연동과 관련있는 컴포넌트 어노테이션이다.
DB와 연결되어 있고 컨테이너의 스캔 대상이 되고, 엔티티를 저장, 조회, 수정 등의 기능을 한다.
(DAO class에 주로 붙여지는 어노테이션 인것 같다) - @PersistenceContext
스프링부트를 쓰기 때문에 스프링 컨테이너 위에서 모든것을 처리해야 하는데, 이 어노테이션이 있으면 스프링 부트가 EntityManager를 알아서 삽입해준다.
비교 (SpringBoot를 사용하지 않고 Persistence, EntityManagerFactory, EntityManager, EntityTransaction 호출)
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello"); EntityManager em = emf.createEntityManager(); EntityTransaction tx = em.getTransaction(); tx.begin();
- save, find 메소드는 JPA에서 배웠던 persist, find 함수를 사용해서 만들었음. save 이후 Id 리턴하는 디테일 확인
Test 파일 만들고 실행하기(MemberRepositoryTest)
=> 단축키 !! 기억 !! MemberRepository에서 커서가 있는 상태에서
Ctrl + Shift + t 를 누르면 자동으로 src.test.java.jpabook.jpashop 경로에 MemberRepositoryTest 파일을 생성해 줄 수 있도록 도와준다.
코드
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 javax.transaction.Transactional;
@RunWith(SpringRunner.class)
@SpringBootTest
public class MemberRepositoryTest {
@Autowired
MemberRepository memberRepository;
@Test
@Transactional
@Rollback(false)
public void testMember() throws Exception {
// given
Member member = new Member();
member.setUsername("memberA");
// when
Long saveId = memberRepository.save(member);
Member findMember = memberRepository.find(member.getId());
// 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));
}
}
- @RunWith(SpringRunner.class)
JUnit 프레임워크의 테스트 실행을 위해 사용되는 애노테이션이다. JUnit5에서는 필요 없다고 한다.
이렇게 JUnit용 테스트 컨텍스트 프레임워크 확장 클래스를 지정해주면 JUnit이 테스트를 진행하는 중에 테스트가 사용할 애플리케이션 컨텍스트를 만들과 관리하는 작업을 진행해준다. 고 한다. -from 토비의 스프링 3.1 - @SpringBootTest
스프링 부트에서 제공하는 통합테스트 어노테이션이다. 다른 기능 검증을 위한 단위 테스트 어노테이션 (@WebMvcTest, @DataJpaTest, @JsonTest 등)들 을 모두 종합한, 실제 운영 환경에서처럼 테스트가 가능하게 한다. - @Transactional
DB 변화가 존재하고 알려주고 트렌젝션을 알아서 관리해준다. - @Autowired
MemberRepository가 의존 자동 주입되도록 @Autowired 어노테이션을 붙여준다. - @Test
Test 관련 어노테이션 - @Rollback(false)
Test파일은 원래 Create되었다가 실행이 끝나면 다 Rollback시켜서 DB상에서 데이터를 확인 할 수 없는데,
사용자가 확인 할 수 있도록 @Rollback(false) 도 붙여준다. - testMember() 메소드 설명
값을 넣고 조회하는 것은 MemberRepository를 이용해서 한다.
Assertions.assertThat( ) 을 이용해서 값을 비교하는 검사를 진행할 수 있다.
속성값으로 조회해도 되지만, 엔티티 (Member)단위로 조회해도 검사가 된다. 현재는 영속성 컨텍스트에 있는 member를 그대로 비교하기 때문에 equal은 모두 true이다.
커스텀 단축키 만들기
위의 test() 메소드를 단축키로 생성할 수 있다면 더 빨리 테스트가 진행 될 수 있다.
test()를 예시로 intelliJ에서 커스텀 단축키 만드는 법을 알아보자.
1. settings -> LiveTemplates 간다.
2. + 버튼을 누른다.
3. 먼저 TemplateGroup으로 custom을 만들어주자.
4. 다시 +버튼을 눌러서 Live Template을 만들어주자.
5. Template test:에 코드를 입력한다. 그리고 abbreviation에 단축키로 할 단축키 명을 지정한다.
6. 등록언어도 지정해주고(java), Use static import if possible도 체크해주자
로그 추가하기
1.
application.yml에서
logging:
level:
org.hibernate.SQL: debug
org.hibernate.type: trace
처럼 org.hibernate.type: trace를 추가한다.
binding parmeter에 대한 정보등을 보여줌
2.
1번이 부족하다면 외부 라이브러리를 쓸 수도 있다.
https://github.com/gavlyukovskiy/spring-boot-data-source-decorator
에서 P6Spy 라이브러리를 가져와서 사용하자.
build.gradle에서 implementation 'com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.7.1' 을 의존설정해주자.
프로잭트 첨부
이 게시물은 '실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발' 강의를 수강하고 정리한 내용임을 밝힙니다.
실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발 - 인프런 | 강의
실무에 가까운 예제로, 스프링 부트와 JPA를 활용해서 웹 애플리케이션을 설계하고 개발합니다. 이 과정을 통해 스프링 부트와 JPA를 실무에서 어떻게 활용해야 하는지 이해할 수 있습니다., 본
www.inflearn.com