반응형

JpaRepository 란?

  • https://chb2005.tistory.com/105 이 예제에서는 EntityManager을 주입받아 직접 CRUD 코드를 직접 작성했었음
    • 등록 : em.persist(member)
    • 검색 : em.find(Member.class, memberId)
    • ...
  • 사실 이런 코드들은 매우 반복적임
  • MemberRepository, ItemRepository, ContentRepository 등 여러 Table에서 사용되는 Repository에 들어가는 코드는 대부분 비슷비슷함
  • 이를 편리하게 하기 위해 스프링 JPA에서 미리 JpaRepository에 기능들을 구현해놓음
  • 개발자는 구현클래스 없이 인터페이스만 작성하고 JpaRepository를 상속받아 사용하면 됨
  • 사용방법은 매우 간단하지만, 사전 지식이나 주의할 것도 많고 복잡한 쿼리를 해결할 때는 좋지 않을 수 있음

JpaRepository 사용 방법

spring-data-jpa 라이브러리 다운

implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
  • 추가적으로 개발에 사용할 DB에 맞는 라이브러리도 설치

JpaRepository를 상속받아 사용

  • Member Entity를 관리하는 MemberRepository가 필요한 상황
  • 아래와 같이 JpaRepository를 상속받기만 하면 사용 가능
public interface MemberRepository extends JpaRepository<Member, Long> {
}
  • JpaRepository<> 안에 들어가는 파라미터
    1. MemberRepository와 연결될 Entity => Member
    2. Member Entity의 id의 데이터 타입 => Long
      @Repository, @Transactional 어노테이션을 자동으로 추가하기 때문에 별도로 추가하지 않아도 됨

JpaRepository 사용 예제

  • Member 객체를 만들고 JpaRepository를 CRUD 하는 예제를 만들어 봄

Member 객체

@Entity
@Data
public class Member {

    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String name;
    private int age;
    private Boolean isMale;
}

MemberRepository

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

기본적인 CRUD

  • JpaRepository는 기본적인 CRUD 기능을 제공
    • save (저장, 수정)
    • findById, findAll
    • delete
    • ...
  • 기본적인 기능 사용 방법
    • MemberRepository를 주입받은 controller, service 등에서 아래와 같이 사용 가능
// 저장
Member savedMember = memberRepository.save(member);

// 조회 findById
Optional<Member> optionalMember = memberRepository.findById(id);
Member findMember = optionalMember.get();

// 조회 findAll
List<Member> members = memberRepository.findAll();

// 수정
Member member = memberRepository.findById(id).get();
member.setName(newName);
memberRepository.save(member);

// 삭제
memberRepository.delete(member);
  • findById는 기본적으로 Optional<T> 타입으로 return 해줌
    • optionalMember.isPresent() 이면 get()으로 꺼내올 수 있음
    • optionalMember.isEmpty() 라면 따로 입력된 id에 해당하는 객체가 없는것임 => 에러 처리, 메세지 출력 등 진행
  • save()는 저장하는 기능이지만 객체의 id가 겹친다면 새로 저장하지 않고 update 진행

추가 기능

  • 위의 기본 기능들을 사용할 때는 MemberRepository에 별도의 코드를 작성하지 않았음
  • 이름, 성별, 나이(범위 안에 있는)로 검색 등 다른 기능들을 사용하기 위해서는 MemberRepository에 추가적인 코드가 필요함
public interface MemberRepository extends JpaRepository<Member, Long> {
    Member findByName(String name);
    List<Member> findByAgeGreaterThanEqualAndAgeLessThanEqual(int minAge, int maxAge);
    List<Member> findAllByIsMale(Boolean isMale);
}
  • findByXXX와 findAllByXXX는 기능적으로 차이가 없다고 함
  • return 타입이 객체인지 리스트인지로 하나만 찾는것인지 모두 찾는것인지 구분
반응형

↓ 클릭시 이동

복사했습니다!