-
[스프링부트/웹 애플리케이션 개발]H2 데이터베이스 설치, JPA와 DB 설정, 동작확인스프링&스프링부트 2023. 1. 3. 16:53
- 저번에 이미 설치 완료
인프런 스프링 입문 08 / 스프링 DB 접근, H2, JDBC
스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술 스프링 DB 접근 기술 H2 데이터베이스 설치 - https://www.h2database.com/html/download-archive.html - 1.4.200 버전 platfrom-dindependent 다운로드 - 압축
gitofjy.tistory.com
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; //스프링부트에서는 EntityManager 생성 자동으로 해줌 public Long save(Member member) { em.persist(member); return member.getId(); } public Member find(Long id) { return em.find(Member.class, id); } }
- ctrl + shift + T > create new test
- build.gradle 코드 추가
test { useJUnitPlatform() }
-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
- test
package jpabook.jpashop; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; import org.springframework.transaction.annotation.Transactional; @RunWith(SpringRunner.class) @SpringBootTest class MemberRepositoryTest { @Autowired MemberRepository memberRepository; @Test @Transactional public void testMember() throws Exception { //given Member member = new Member(); member.setUsername("memberA"); //when Long saveId = memberRepository.save(member); Member findMember = memberRepository.find(saveId); //then Assertions.assertThat(findMember.getId()).isEqualTo(member.getId()); Assertions.assertThat(findMember.getUsername()).isEqualTo(member.getUsername()); } }
- test 성공, 자동으로 table 생성
- H2 연결 확인
- JDBC URL 과 application.yml에 spring.datasource.url 일치 확인하고 연결
- member 테이블 생성되어 있음
- member 테이블에 행 없음
> test에 transactional 어노테이션은 테스트가 끝나면 롤백
> o.s.t.c.transaction.TransactionContext : Rolled back transaction for test:
- 만약 test에 transaction의 rollback을 하지 않고 확인하고 싶다면?
> @Transactional 어노테이션 밑에 @Rollback(flase) 어노테이션 추가
@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(saveId); //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)); //findMember == member: true //같은 transaction 안에서 저장하면 영속성 context가 같음, 같은 영속성 context 안에서는 식별자가 같으면 같은 entity
- 쿼리 파라미터 로그 남기기
1) application.yml 코드 추가
logging: level: org.hibernate.SQL: debug org.hibernate.type: trace
2) 외부 라이브러리 (p6spy) 사용 ( https://github.com/gavlyukovskiy/spring-boot-data-source-decorator )
> 개발 단계에서는 사용 가능하지만, 운영/배포할 때는 성능 테스트하고 사용해야 함
- build.gradle 코드 추가
implementation 'com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.5.6'
728x90'스프링&스프링부트' 카테고리의 다른 글
[스프링부트/웹 애플리케이션 개발]엔티티 클래스 개발 -1 (0) 2023.01.04 [스프링부트/웹 애플리케이션 개발]기본 설계 (0) 2023.01.03 [스프링부트/웹 애플리케이션 개발]devtools setting, spring-boot-devtools 실행 안 될 때 (0) 2023.01.02 [스프링부트/웹 애플리케이션 개발]view 환경 설정, thymeleaf 템플릿 엔진 (0) 2023.01.02 [스프링부트/웹 애플리케이션 개발]라이브러리 (1) 2023.01.02