[Spring Boot/JPA] Spring data JPA : JpaRepository 사용
Spring Data JPA는 JPA를 기반으로 하는 데이터 액세스 계층을 쉽게 구현할 수 있게 도와주는 도구이다.
일반적인 Repository 사용에 필요한 기본적인 인터페이스와 필요에 따라 확장가능하기 때문에 개발자들이 데이터 액세스 레이어를 더 쉽게 작성하고 유지보수할 수 있도록 도와준다.
Repository 인터페이스: Spring Data JPA는 Repository 인터페이스를 제공하며, 이를 통해 데이터베이스 조작을 위한 메서드를 정의할 수 있으며, 기본적인 쿼리를 제공한다.
쿼리 메서드: Repository 인터페이스에 메서드를 정의할 때, 메서드 이름만으로 자동 인식하여 쿼리를 생성할 수 있다.
개발자는 별도의 SQL 쿼리를 작성하지 않고도 간단한 메서드 호출을 통해 데이터베이스 조작을 수행할 수 있다.
동적 쿼리 생성: 필요에 따라 동적으로 쿼리를 생성할 수 있도록 지원한다.
의존성 추가
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
//...
}
Spring Data JPA 사용을 위해 다음과 같은 의존성을 추가해준다.
JpaRepository
public interface MemberRepository extends JpaRepository<Member, Long> {
// 쿼리 메서드
Member findMemberByEmail(String email);
// 동적 쿼리 생성
@Query(value= "select m from Member m where m.memberId = :id and m.email = :email" )
Member findMemberByIdAndEmail(@Param("id") Long id, @Param("email") String email);
}
다음은 Member 엔티티를 데이터베이스와 상호작용하기 위한 JpaRepository를 정의한 것이다.
Generic Type : JpaRepository<Member, Long>에서 Member는 엔터티 타입을 나타내고, Long은 해당 엔터티의 PK를 명시한다.
JpaRepository 제공 메서드 : JpaRepository를 상속받아 기본적으로 제공되는 메서드들을 사용할 수 있다. 대표적인 메서드들에는 다음이 있다.
- findById(ID id): ID에 해당하는 엔터티를 찾아 반환
- findAll(): 모든 엔터티를 조회하여 리스트로 반환
- save(S entity): 엔터티를 저장하거나 업데이트
- deleteById(ID id): ID에 해당하는 엔터티를 삭제
- existsById(ID id): ID에 해당하는 엔터티가 존재하는지 여부를 확인
- count(): 저장된 엔터티의 총 개수를 반환
쿼리 메서드: 구현한 메서드의 이름을 인식하여 자동으로 쿼리를 생성하는 기능을 제공한다. 이는 별도의 쿼리문을 작성하지 않아도 된다.
findMemberByEmail 메서드는 email 필드를 기준으로 Member를 찾게 된다.
동적 쿼리 생성: findMemberByIdAndEmail 메서드는 @Query 어노테이션을 사용하여 직접 JPQL 쿼리를 정의할 수 있으며, 사용자 정의 쿼리를 생성 가능하다.
JpaRepository 사용
@Service
@AllArgsConstructor
@Transactional(readOnly = true)
public class MemberServiceImpl implements MemberService{
private final MemberRepository memberJpaRepository;
private final ModelMapper modelMapper;
private final PasswordEncoder encoder;
@Override
@Transactional
public Long addMember(MemberJoinRequestDto inputMember) {
Member exist = memberJpaRepository.findMemberByEmail(inputMember.getEmail());
if(exist != null){
throw new AlreadyExistElementException("이미 존재하는 이메일입니다.");
}
inputMember.setPassword(encoder.encode(inputMember.getPassword()));
Member member = modelMapper.map(inputMember, Member.class);
member.setRole(RoleType.COMMON);
member = memberJpaRepository.save(member);
return member.getMemberId();
}
@Override
public CustomUserInfoDto getMemberInfoIncludePwdByEmail(String email) {
Member member = memberJpaRepository.findMemberByEmail(email);
CustomUserInfoDto dto = modelMapper.map(member, CustomUserInfoDto.class);
return dto;
}
}
일반적인 Repository 사용과 동일하게 사용하면 된다.
save()와 같은 기본적으로 제공되는 메서드를 사용할 수도 있고, 정의한 쿼리 메서드인 findMemberByEmail도 사용하고 있는 모습을 볼 수 있다.
'Backend > Spring' 카테고리의 다른 글
[Spring Boot] Swagger API Docs 작성하기 (SpringDoc, SpringBoot 3 버전) (0) | 2024.01.15 |
---|---|
[Spring Boot] 사용자 정의 예외처리 : Exception Handler (0) | 2024.01.15 |
[Spring Boot/JPA] JPQL : ToMany 관계의 컬렉션 조회 최적화 (1) | 2024.01.09 |
[Spring Boot/JPA] JPQL : 지연 로딩과 N+1 문제 해결 (1) | 2024.01.08 |
[Spring Boot] DI/IoC의 개념, Bean 등록 및 의존성 주입 방법들 (3) | 2023.12.02 |