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를 통해 얼마나 코드를 간략하게 줄일 수 있고 어느 기능이 지원되는지, 그리고 어떠한 기능들은 실무에서 사용하면 안되는지에 대해서 공부할 것이다.