-
스프링 데이터 JPA의 간단한 소개JPA/스프링 데이터 JPA 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를 통해 얼마나 코드를 간략하게 줄일 수 있고 어느 기능이 지원되는지, 그리고 어떠한 기능들은 실무에서 사용하면 안되는지에 대해서 공부할 것이다.
'JPA > 스프링 데이터 JPA' 카테고리의 다른 글
@EntityGraph - 어노테이션으로 fetch join (0) 2023.08.12 벌크성 수정 쿼리 (0) 2023.08.11 스프링 데이터 JPA의 페이징과 정렬 (0) 2023.08.11 @Query - 쿼리 정의하기 (0) 2023.08.11 쿼리 메서드 - 메서드 이름으로 자동 쿼리 생성 (0) 2023.08.11