오봉이와 함께하는 개발 블로그
스프링 데이터 JPA - 동작 확인 본문
728x90
스프링 데이터 JPA와 DB 설정, 동작확인
application.properties
spring.datasource.url=jdbc:h2:tcp://localhost/~/datajpa
spring.datasource.username=sa
spring.datasource.password=
spring.datasource.driver-class-name=org.h2.Driver
#이 옵션은 애플리케이션 실행 시점에 테이블을 drop 하고, 다시 생성한다.
spring.jpa.hibernate.ddl-auto=create
# JPA가 쓰는 쿼리를 콘솔에 남기는 설정
# spring.jpa.properties.hibernate.show_sql=true
spring.jpa.properties.hibernate.format_sql=true
# JPA가 쓰는 쿼리를 로그 파일로 남기는 설정
logging.level.org.hibernate.SQL=debug
# JPA 쿼리에 파라미터까지 볼 수 있다.
# logging.level.org.hibernate.type=trace
실제 동작하는지 확인
일반 JPA
회원 엔티티
@Entity
@Getter @Setter
public class Member {
@Id @GeneratedValue
private Long id;
private String username;
public Member(String username) {
this.username = username;
}
protected Member() { // JPA특성상 생성자를 생성하면 기본 생성자가 필요한데
// protected로 하는 이유는 다른 클래스에서 함부로 사용하지 못 핟록 하기 위함
}
}
회원 JPA 리포지토리
@Repository
public class MemberJpaRepository {
@PersistenceContext // 빈 등록
private EntityManager em;
public Member save(Member member) {
em.persist(member);
return member;
}
public Member find(Long id) {
return em.find(Member.class, id);
}
}
JPA 기반 테스트
@SpringBootTest
@Transactional
@Rollback(value = false) // 테스트가 끝날 때 flush도 안 하고 영속성 컨텍스트에 데이터도 지우지 않음.
class MemberJpaRepositoryTest {
@Autowired
MemberJpaRepository memberJpaRepository;
@Test
public void testMember() {
Member member = new Member("memberA");
Member savedMember = memberJpaRepository.save(member);
Member findMember = memberJpaRepository.find(savedMember.getId());
assertThat(findMember.getId()).isEqualTo(member.getId());
assertThat(findMember.getUsername()).isEqualTo(member.getUsername());
// 이게 true인 이유는 JPA는 같은 트랜잭션 안에 있는 객체는 동일성을 보장하기 때문이다.
assertThat(findMember).isEqualTo(member);
}
}
assertThat(findMember).isEqualTo(member);
가 통과하는 이유는 JPA는 같은 트랜잭션 안에서는 동일성을 보장하기 때문이다.
위 테스트 코드가 한 트랜잭션 안에 있다.
스프링 데이터 JPA
스프링 데이터 JPA 리포지토리
public interface MemberRepository extends JpaRepository<Member, Long> {
// <T(Object Type), ID(T의 PK가 어떤 타입인가?)>
}
스프링 데이터 JPA 기반 테스트
@SpringBootTest
@Transactional
@Rollback(value = false)
class MemberRepositoryTest {
@Autowired
MemberRepository memberRepository;
@Test
void testMember() {
Member member = new Member("memberA");
Member savedMember = memberRepository.save(member);
Member findMember = memberRepository.findById(savedMember.getId()).get();
assertThat(findMember.getId()).isEqualTo(member.getId());
assertThat(findMember.getUsername()).isEqualTo(member.getUsername());
// 이게 true인 이유는 JPA는 같은 트랜잭션 안에 있는 객체는 동일성을 보장하기 때문이다.
assertThat(findMember).isEqualTo(member);
}
}
쿼리 파라미터 로그 남기기
implementation 'com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.5.7'
를 build.gradle
에 추가하자.
쿼리 파라미터를 로그로 남기는 외부 라이브러리는 시스템 자원을 사용하므로, 개발 단계에서는 편하게 사용해도 되지만, 운영시스템에 적용하려면 꼭 성능테스트를 하고 사용하는 것이 좋다.
인프런 김영한 지식공유자님 강의 : 실전! 스프링 데이터 JPA
728x90
'BE > JPA' 카테고리의 다른 글
스프링 데이터 JPA - 공통 인터페이스 설정, 적용, 분석 (0) | 2022.09.07 |
---|---|
스프링 데이터 JPA - 예제 도메인 모델과 동작확인 (0) | 2022.09.07 |
JPA 2 - 스프링 데이터 JPA 소개 (0) | 2022.09.07 |
JPA 2 - OSIV와 성능 최적화 (0) | 2022.09.07 |
JPA 2 - API 개발 고급 정리 (0) | 2022.09.07 |
Comments