ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • TIL 69일 - 로그인 API 만들기
    공부/Spring 사용한 프로젝트 2022. 3. 8. 22:46

    true or false 반환하는 GET login API

    일단 단계적으로 하기위해 true or false를 반환하는 GET login API를 만들려고 한다.

     

    다른 컨트롤러, 레포지토리, WebSecurityConfg 수정 등은 너무 당연한거라 스킵

     

    UserService 클래스에서는 아래처럼 코드를 수정했다.

    public Boolean loginUser(String email, String password) {
            User user = userRepository.findUserByEmail(email);
            Boolean isMatched = passwordEncoder.matches(password, user.getPassword());
            return isMatched;
    }

    요렇게 하니까 API 요청에 성공했고 비밀번호가 맞으면 true, 아니면 false를 반환한다.

    존재하지 않는 이메일을 요청하면?

    userRepository.findUserByEmail는 repository에 추가한 메서드이다. 처음에는 아래처럼 만들었었다.

    public interface UserRepository extends CrudRepository<User,Integer> {
        User findUserByEmail(String email);
    }

     

    이랬떠니 userRepository.findUserByEmail(email).orElseThrow 메서드가 없다고 나왔다. 

    그래서 다시 아래처럼 수정했다.

    public interface UserRepository extends CrudRepository<User,Integer> {
        Optional<User> findUserByEmail(String email);
    }

     

    위처럼 바꿨더니 이제 에러를 던질 수 있게 되었다.

    public Boolean loginUser(String email, String password) {
            User user = userRepository.findUserByEmail(email).orElseThrow(() -> new RuntimeException("이메일이 존재하지 않습니다."));
            Boolean isMatched = passwordEncoder.matches(password, user.getPassword());
            return isMatched;
    }

     

    근데 이렇게 하고 끝나면 요청했을 때 Intercal Server Error로 뜬다. 하지만 이메일이 틀렸다고 알려줘야 하기 때문에 다른 방법을 찾아봤다.

     

    아래 방법은 Bad Request라는 것을 알려준다.

    public Boolean loginUser(String email, String password) {
            User user = userRepository.findUserByEmail(email).orElseThrow(() -> new ResponseStatusException(HttpStatus.BAD_REQUEST, "이메일이 존재하지 않습니다."));
            Boolean isMatched = passwordEncoder.matches(password, user.getPassword());
            return isMatched;
        }

     

    하지만 이것 만으로는 사용자가 이메일을 잘못 입력한건지 비밀번호를 잘못 입력한건지 알 수 없다. 다른 정보가 필요하다.

     

     

    컨트롤러 클래스에 아래 코드를 추가했다.

      @ExceptionHandler(ResponseStatusException.class)
        public Object nullex(Exception e) {
            System.err.println(e.getClass());
            System.out.println(e.getMessage());
            return "myService";
        }

    이렇게 하면 ResponseStatusExteption이 발생할 때 "myService" 텍스트를 반환하게 된다.

    하지만 이렇게 할 경우 클라이언트 단에서 에러임을 알 수 없었다. (try catch에 잡히지 않는다.)

     

    일단 내일 이어서 더 해보자.

Designed by Tistory.