관심쟁이 영호

[#6] JPA를 이용한 로그인 본문

Project/ADYB - 쇼핑몰

[#6] JPA를 이용한 로그인

관심쟁이 영호 2021. 8. 3. 15:47
반응형

JPA를 이용한 로그인

 

이번 포스팅은 로그인 기능을 구현 내용과 구현 중 맞닿은 에러에 대해서 다룰 것이다!

 

이번 내용은 다음과 같다.

  • Login 프론트 구현
  • Login 컨트롤러 구현
  • UserRepository 기능 확장
  • Login 서비스 구현

Login 프론트 구현

먼저 코드를 살펴보자!

<!doctype html>
<html lang="ko">
<head>
    <meta charset="UTF-8">

    <title>로그인</title>
</head>
<body>
로그인입니다.

<form method="post" action="/login">
    ID :<input type="text" name="id"><br>
    PASSWORD :<input type="text" name="password"><br>
    <button type="submit">제출</button>
</form>
</body>
</html>

 

코드 설명

  • form 태그를 통해서 post 요청을 수행한다.
  • 상대경로를 통해 "/login"으로 요청을 수행한다.
  • id와 password를 입력할 수 있다.

Login 컨트롤러 구현

코드로 바로 보자.

 

@Controller
@RequiredArgsConstructor
@Slf4j
public class LoginController {
    @Autowired
    private final UserRepository userRepository;
    @Autowired
    private final LoginService loginService;

    @GetMapping("/login")
    public String login() {
        return "login";
    }

    @PostMapping("/login")
    public String loginId(@ModelAttribute User user) {
    
        loginService.login(user);

        return "redirect:/";

    }
    
};

 

코드설명

  • GetMapping : "/login"으로 매핑된다. 뷰 리졸버를 통해서 "login.html"을 호출한다.
  • PostMapping: "/login"으로 매핑된다. LoginService의 login 메소드를 실행한다.
  • 홈을 리다이렉트한다.

UserRepository 기능 확장

이 부분을 보면서 살짝 고생했다.. ㅋㅋ

먼저, 코드를 살펴보자.

 

public interface UserRepository extends JpaRepository<User, Long> {
    @Query("select m from user m where m.id = ?1")
    List<User> finduser(String id, String password);
};

 

UserRepository를 수정하였다. query문에 password도 찾아야하는데 일단은 조금만 뒤에 완성하자!

 

그냥 내생각 : JpaRepository를 이용하여 "findOne"이나 "findById"를 이용하려했는데, 설정된 파라미터 정보를 보니까 Option<>, Long Id인 것이다. 근데 회원은 String 타입의 id와 String 타입의 password를 입력하는데, Long으로 보낼 수도 없다. 그래서 GeneratedValue로 sequenceid를 넣어야하는가 싶은데 상식적으로 누가 sequenceid로 검색을 하나.. 그래서 새롭게 만들었다!

 

코드 설명

  • 먼저, 생성할 쿼리를 지정해주어야한다. 방법은 "@Query" 어노테이션을 사용한다. 괄호안에 쿼리를 써주자.
  • 두번째로, 리턴타입을 User라고 할 수 없다고 판단된다. 컨트롤러처럼 ModelAttribute가 적용이 안된다. 그래서 List로 받았다.
  • 세번째로, 테이블에 이름을 지정해주어야한다. 쿼리문을 살펴보면 user 테이블을 조회하였다. 그래서 명시적으로 User클래스의 Entity 속성을 user로 지정해주어야 한다.
@Entity(name = "user")

 

※ 맞닿은 에러 : 먼저 List<User>대신 User로 리턴을 했다가 매핑 오류가 났다. @ModelAttribute와 같이 지정해주는 줄 착각했다. 다음에는 해당하는 기능이 있는지 찾아보자!

 

※ 두번째로 Entity속성을 지정해주지않아서 오류가 났다. 지정해라!!

 

※ 어느정도 구현이 완료되면 QueryDsl로 리팩토링해보자.

 


Login 서비스 구현

코드를 바로 보자!

@Service
@RequiredArgsConstructor
@Slf4j
public class LoginService {
    @Autowired
    private final UserRepository userRepository;

    public String login(User user){
    
        List<User> lis = userRepository.finduser(user.getId(), user.getPassword());
        
        return "redirect:/";
    }

};

코드 설명

  • 컨트롤러에서 LoginService의 login 메소드를 호출한다.
  • 호출된 login 메소드는 DB에 검색하여 해당하는 회원정보가 있는지 조회한다.
  • 그리고 홈으로 리다이렉트한다.

※ 회원정보가 검색되었을 경우 or 검색되지 않았을 경우를 나누어 구현을 완성해야한다.

※ 로그인 validation 처리도 하여야 한다.

300x250
Comments