반응형
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<> 안에 들어가는 파라미터
- MemberRepository와 연결될 Entity => Member
- 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 타입이 객체인지 리스트인지로 하나만 찾는것인지 모두 찾는것인지 구분
반응형
'Spring Boot > 문법 정리' 카테고리의 다른 글
[Spring Boot] 연관관계 매핑 - 1:1, 1:N, N:M (0) | 2022.12.31 |
---|---|
[Spring Boot] Swagger 3.0 적용 (0) | 2022.07.09 |
[Spring Boot] 관계형 DB - 순환 참조 해결 방법 ( DTO활용 방법 등 ) (0) | 2022.07.03 |
[Spring Boot] Entity Manager을 사용한 MySQL CRUD 예제 (1) | 2022.07.01 |
[Spring Boot] JPA 관련 개념 정리 (0) | 2022.07.01 |