본문 바로가기
JPA/스프링 DATA JPA

Data JPA 01 - 스프링 데이터 jpa 맛보기

by 킹차니 2022. 1. 2.

 

스프링 데이터 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를 바탕으로 정리하였습니다.