스프링 데이터 JPA
data jpa의 맛을 살짝 보자.
스프링 프로젝의 의존성은 아래와 같다.
plugins {
id 'org.springframework.boot' version '2.6.2'
id 'io.spring.dependency-management' version '1.0.11.RELEASE'
id 'java'
}
group = 'study'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'
configurations {
compileOnly {
extendsFrom annotationProcessor
}
}
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-web'
compileOnly 'org.projectlombok:lombok'
runtimeOnly 'com.h2database:h2'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
test {
useJUnitPlatform()
}
application.yml은 아래와 같다.
spring:
datasource:
url: jdbc:h2:tcp://localhost/~/datajpa
username: king
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
그리고 먼저 테스트를 위한 Member엔티티는 아래와 같다.
import lombok.Getter;
import lombok.Setter;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
@Getter @Setter
@Entity
public class Member {
@Id @GeneratedValue
private Long id;
private String username;
protected Member(){}/*private으로 하면 프록시 객체를 만들 수 없다.*/
public Member(String username) {
this.username = username;
}
}
그리고 Data jpa를 적용하지 않은 repository는 다음과 같을 것이다. (member저장과 조회)
import org.springframework.stereotype.Repository;
import study.datajpa.entity.Member;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
@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);
}
}
그리고 이를 테스트해보자.
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 study.datajpa.entity.Member;
import static org.assertj.core.api.Assertions.*;
@Rollback(false) //자동으로 rollback시키는 것을 막음
@Transactional //트랜잭션 단위
@SpringBootTest//이거 하나면 스프링 빈을 사용할 수 있다.
class MemberJPArepositoryTest {
@Autowired MemberJPArepository memberJPArepository;
@Test
void save() {
Member member = new Member("memberA");
Member saveMember = memberJPArepository.save(member);
Member findMember = memberJPArepository.find(saveMember.getId());
assertThat(member.getId()).isEqualTo(findMember.getId());
assertThat(saveMember.getId()).isEqualTo(findMember.getId());
assertThat(member).isEqualTo(findMember);
}
}
당연히 테스트는 잘 통과한다.
이제 Data jpa를 사용하는 repository를 보자. data jpa를 사용한 repository는 인터페이스이고, JpaRepository<T, ID>를 extends하면 된다.
import org.springframework.data.jpa.repository.JpaRepository;
import study.datajpa.entity.Member;
public interface MemberRepository extends JpaRepository<Member, Long> {
}
그리고 우리가 아무것도 구현하지 않아도 기본적인 CRUD메서드를 제공한다. 이를 테스트 해보자
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 study.datajpa.entity.Member;
import static org.assertj.core.api.Assertions.assertThat;
@Transactional @Rollback(false)
@SpringBootTest
class MemberRepositoryTest {
@Autowired
MemberRepository memberRepository;
@Test
void testMember(){
Member member = new Member("memberA");
Member saveMember = memberRepository.save(member);
Member findMember = memberRepository.findById(saveMember.getId()).orElseGet(()->new Member("nullMember"));
assertThat(member.getId()).isEqualTo(findMember.getId());
assertThat(saveMember.getId()).isEqualTo(findMember.getId());
assertThat(member).isEqualTo(findMember);
}
}
테스트는 물론 성공한다.
김영한님의 인프런 강의와 PDF를 바탕으로 정리하였습니다.
'JPA > 스프링 DATA JPA' 카테고리의 다른 글
Data JPA 06 쿼리 메서드 - 반환타입, 페이징 (0) | 2022.01.06 |
---|---|
Data JPA 05 쿼리 메서드 - Query, 리포지토리 메서드에 쿼리 정의하기 (0) | 2022.01.05 |
Data JPA 04 쿼리 메서드 - NamedQuery (0) | 2022.01.05 |
Data JPA 03 쿼리 메소드 - 메서드 이름으로 쿼리 생성 (0) | 2022.01.05 |
Data JPA 02 - 예제 도메인 확인하기, 공통 인터페이스 (0) | 2022.01.04 |