JPA/스프링 데이터 JPA

스프링 데이터 JPA의 간단한 소개

chanhee01 2023. 8. 11. 15:53

스프링 데이터 JPA란 중복되는 JPA 코드들을 인터페이스로 묶어둔 다음 스프링 데이터 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);
    }
}

위의 코드는 기존의 repository 코드이다. save, find같은 기능들은 모든 테이블에서 공통적으로 사용하는 메서드이기 때문에 중복된 코드이다. 이러한 코드들을 스프링 데이터 JPA 인터페이스를 사용해서 최소화할 수 있다.

 

 

 

 

스프링 데이터 JPA 인터페이스

public interface MemberRepository extends JpaRepository<Member, Long> { // <> 안에는 <엔티티타입, PK 타입>

}

repository를 만들고 JpaRepository<>를 extends로 상속받으면 된다. JpaRepository<엔티티타입, PK타입>을 넣어주면 된다.

 

 

@Repository도 들어있지 않는데, 스프링 데이터 JPA에서 프록시 객체를 만들어주기 때문에 따로 @Reqository 어노테이션을 생략해도 된다. 컴포넌트 스캔을 스프링 데이터 JPA가 자동으로 처리해주는 것이다.

 

 

 

스프링 데이터 JPA 코드 테스트

@SpringBootTest // 스프링부트 테스터는 끝나고 롤백시켜줘서 데이터가 안남음
@Transactional
@Rollback(false) //를 넣어주면 롤백을 안해줌
class MemberRepositoryTest {

    @Autowired MemberRepository memberRepository;

    @Test
    public void testMember() {
        Member member = new Member("memberA");
        Member savedMember = memberRepository.save(member);

        Member findMember = memberRepository.findById(savedMember.getId()).get();
        // 원래 Optinal로 반환이라 get()으로 꺼내면 안되는데 jpa 공부니까 일단 get()으로 꺼내기

        assertThat(findMember.getId()).isEqualTo(member.getId());
        assertThat(findMember.getUsername()).isEqualTo(member.getUsername());
        assertThat(findMember).isEqualTo(member);
    }
}

인터페이스만 있지만 memberRepository를 받아와서 사용하면 save()와 findById() 등을 사용할 수 있어진다. 이러한 이유는 스프링 데이터 JPA에서 애플리케이션 로딩시점에 해당 인터페이스의 구현 클래스들을 자동으로 만들어주기 때문이다.

 

 

 

스프링 데이터 JPA의 카텍고리에서는 스프링 데이터 JPA를 통해 얼마나 코드를 간략하게 줄일 수 있고 어느 기능이 지원되는지, 그리고 어떠한 기능들은 실무에서 사용하면 안되는지에 대해서 공부할 것이다.