[Spring Boot/JPA] Spring data JPA : JpaRepository 사용

2024. 1. 15. 06:15
반응형

 

 

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를 상속받아 기본적으로 제공되는 메서드들을 사용할 수 있다. 대표적인 메서드들에는 다음이 있다.

  1. findById(ID id): ID에 해당하는 엔터티를 찾아 반환
  2. findAll(): 모든 엔터티를 조회하여 리스트로 반환
  3. save(S entity): 엔터티를 저장하거나 업데이트
  4. deleteById(ID id): ID에 해당하는 엔터티를 삭제
  5. existsById(ID id): ID에 해당하는 엔터티가 존재하는지 여부를 확인
  6. 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도 사용하고 있는 모습을 볼 수 있다.

 

 

 

 

 

반응형

BELATED ARTICLES

more