반응형
프로젝트 환경설정
Dependencies
- spring-boot-starter-web
- 톰캣, 스프링 웹 MVC 등 지원
- spring-boot-starter-thymeleaf
- 뷰 단을 SSR로 제공하는 타임리프 템플릿 엔진
- Spring-boot-starter-data-jpa
- aop, jdbc (HikariCP 커넥션 풀), 하이버네이트 , 스프링 데이터 jpa 등 지원
- spring-boot-starter(공통)
- 스프링 부트 + 스프링 코어 + 로깅 등 지원
테스트 라이브러리
- spring-boot-starter-test
- junit, mockito, assertj, spring-test
핵심 라이브러리
- 스프링 MVC
- 스프링 ORM
- JPA, 하이버네이트
- 스프링 데이터 JPA
기타 라이브러리
- H2 데이터베이스 클라이언트
- 커넥션 풀 : 기본은 HikariCP
- WEB (thymeleaf)
- 로깅 SL4FJ & LogBack
- 테스트
H2 데이터베이스 설치
H2 데이터베이스 버전은 1.4.200을 사용했다. 맥환경에서는 설치 후 bin 폴더에서 ./h2.sh
를 통해 실행한다.
- 최초 접속시
jdbc:h2:~/jpashop
후 루트 폴더에~/jpashop.mv.db
파일 생성 확인 - 이후 접속시
jdbc:h2:tcp://localhost/~/jpashop
JPA 및 DB 설정
application.yml 파일에 DB 접속 정보를 설정한다.
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
회원 도메인
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
EntityManager em;
public Long save(Member member) {
em.persist(member);
return member.getId();
}
public Member find(Long id) {
return em.find(Member.class, id);
}
}
스프링 부트 starter-jpa가 em을 자동 생성해줘서 @PersistenceContext
을 통해 가져다 쓰면 된다.
테스트
package jpabook.jpashop;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.annotation.Rollback;
import org.springframework.transaction.annotation.Transactional;
import static org.assertj.core.api.Assertions.*;
@SpringBootTest
class MemberRepositoryTest {
@Autowired MemberRepository memberRepository;
@Test
@Transactional
@Rollback(value = false)
public void testMember() {
// given
Member member = new Member();
member.setUsername("memberA");
// when
Long savedId = memberRepository.save(member);
Member findMember = memberRepository.find(savedId);
// then
assertThat(findMember.getId()).isEqualTo(member.getId());
assertThat(findMember.getUsername()).isEqualTo(member.getUsername());
assertThat(findMember).isEqualTo(member);
}
}
@Transactional
: 실제 디비에 접근할 수 있다. 테스트 동작 하면서 커밋, 끝나면서 롤백시켜준다. 롤백을 하고 싶지 않다면@Rollback(false)
로 설정하면 된다.@SprinBootTest
: 실제 서버를 돌리는 상황처럼 톰캣을 실행해서 테스트를 할 수 있도록 지원해준다.
쿼리 파라미터 로그 남기기
application.yml
에서 적용한 org.hibernate.type
이 부분을 통해 SQL 로그를 남겨도 파라미터는 ?
로 나온다.
implementation 'com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.5.6'
다음 라이브러리를 추가하면 파라미터로 들어오는 ?
도 로그에 같이 보여준다.
자세한 정보는 https://github.com/gavlyukovskiy/spring-boot-data-source-decorator 를 참고하자.
이 글은 김영한 님의 "실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발"을 듣고 정리한 내용입니다.
반응형