JPA로 원하는 매개변수로 findBy 메소드 생성하기

반응형
728x90
반응형

기본제공 findById(PK) 메소드

public Optional<Member> getMember(Long idx) {
	return memberRepository.findById(idx);
}

 

JPA에서 ID값을 파라미터로 SELECT 할 수 있는 기본 findById 메소드를 제공한다. 하지만 ID 필드가 아닌 다른 여러 필드들로도 데이터를 조회할 경우가 생기게된다.

 

 

상황

로그인 API를 구현하면서 파라미터로 받아온 아이디와 패스워드에 맞는 회원 정보가 있는지 조회해야하는 상황이 생겼다. 

 

1) AuthController.java

@PostMapping("/login")
public ResponseEntity<?> login(@ModelAttribute LoginDto loginDto, @ApiParam(hidden = true) HttpSession session) {
  /* ID, PWD 체크 */
  Optional<Member> member = memberService.getMemberLoginCheck(loginDto);

  if(member.isEmpty()) {
  throw new BadRequestException();
  }

  ...
}

 

2) MemberService.java

/**
* 회원 존재 여부 확인
* @param loginDto
* @return
*/
public Optional<Member> getMemberLoginCheck(LoginDto loginDto) {
	return memberRepository.findByMemberIdAndMemberPwd(loginDto.getMemberId(), loginDto.getMemberPwd());
}

 

3) MemberRepository.java

public interface MemberRepository extends JpaRepository<Member, Long> {
    Optional<Member> findByMemberIdAndMemberPwd(String memberId, String memberPwd);
}

 

 

주의할점

memberId, memberPwd에 맞는 WHERE 조건으로 조회해오는 메소드를 Repository.java에 생성하여 해당 메소드를 호출하여 상황을 해결했다. 여기서 주의할점은 메서드 명이다.

findByMemberIdAndMemberPwd

 

단순한 메서드명으로 보이겠지만, 여기서 보이는 키워드를 보자.

MemberId
And
MemberPwd

이 3가지의 키워드를 통해 우리는 WHERE-AND 쿼리를 사용하겠다는 의미로 선언했다. 따라서 memberId, memberPwd를 다른 명칭으로 쓴다면 JPA에서는 해당 컬럼을 찾을 수 없다는 에러를 발생시킨다. 만약 비밀번호 컬럼명이 memberPwd인데, findByMemberIdAndPwd로 메서드명을 지정했을때 Pwd 컬럼을 찾을 수 없다는 에러를 만난다. 메서드명을 통해 컬럼명, And, Or, Between 등으로 쉽게 원하는 데이터를 조회할 수 있음을 인지하자.

 

 

반응형

Designed by JB FACTORY