Spring Data JPA를 이용한 CRUD

Yebali·2021년 7월 21일
1

약간의_Spring

목록 보기
18/30

Spring Data JPA란?

Spring JPA를 잘 모르겠다면 아래 글을 읽고 오자!
Spring Data JPA

JPA를 이용한 CRUD

Spring Data JPA를 사용한 코드를 보기 전, 순수한 JPA를 이용해 구현된 코드를 보자!

Member Entity

public class Member extends BaseEntity {
    
    @Id @GeneratedValue
    @Column(name = "member_id")
    private Long id;
    
    private String username;
    
    private int age;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "team_id")
    private Team team;
}

순수한 JPA

@Repository
public class MemberJpaRepository {

    @PersistenceContext
    private EntityManager em;

    public Member save(Member member) {
        em.persist(member);
        return member;
    }

    public void delete(Member member) {
        em.remove(member);
    }

    public List<Member> findAll() {
        return em.createQuery("select m from Member m", Member.class)
                .getResultList();
    }

    public Optional<Member> findById(Long id) {
        Member member = em.find(Member.class, id);
        return Optional.ofNullable(member);
    }

    public long count() {
        return em.createQuery("select count(m) from Member m", Long.class)
                .getSingleResult(); //하나만 반환함.
    }

    public Member find(Long id) {
        return em.find(Member.class, id);
    }
}

Entity Manager의 persist, remove, createQuery를 사용하여 DB에 접근한다.
수정에 대한 코드가 없는데 수정은 트랜잭션 안에서 데이터를 변경하는 '변경감지'기능 방식을 사용하면 된다.


Spring Data JPA

@Repository
public interface MemberRepository extends JpaRepository<Member, Long> {}

오타가 아니다. 정말 이게 전부이다.
놀랍게도 Spring Data JPA는 순수한 JPA에서 직접 코딩했던 기본적인 CRUD 매서드들을 모두 자동으로 구현해준다.
정확히는 JpaRepository 인터페이스를 상속받는 인터페이스에 자동으로 구현체를 생성해 Bean으로 관리해준다.
자동으로 생성되는 매서드들은 findAll(), save(), delete() 등과 같은 공통 CRUD 매서드들이다.
JpaRepository<>에 들어가는 타입은 다음과 같다.

JpaRepository<엔티티 타입, 식별자(PK) 타입>

JpaRepository의 상속

JpaRepository 인터페이스의 상속은 위와 같은 구조이다.
위에 보이는 매서스들이 자동으로 구현되고 있다.
사실상 대부분의 공통 매서드들을 제공하는 것이다.

결론

Spring Data JPA는 우리가 기본적으로 구현해야하는 매서드들을 대부분 자동으로 구현해준다.
이런 특징은 단순하고 반복되는 코딩을 방지해준다는 장점으로 이어진다.

하.지.만. 절대 만능은 아니다. 대부분의 실무에서 각각의 Entity가 가진 값들만 사용하는 경우는 많지 않다.
그리고 Spring Data JPA는 JPA의 일부이기 때문에 우리는 결국 JPA자체를 잘 알아야 한다.

profile
머리에 다 안들어가서 글로 적는 중

0개의 댓글