Schedule JPA Project 트러블 슈팅 - 2

Jiyeong Kim·2025년 2월 11일

TIL

목록 보기
22/24

1. Login Controller

발단

  • 로그인 구현 단계에서, login시 로그인을 실패할 경우와 성공할 경우를 구분하고 싶었음
  • 실패 시 : 다시 로그인으로 리다이렉트
  • 성공 시 : HttpStatus.OK 등 형태로 반환하기

로 만들고 싶었음

전개

아래 교안 형태와 다르게 나는 Home을 만들지 않았기 때문에, 메서드 반환타입을 JSON 응답으로 반환해주는 것으로 바꾸어야 했다.

 if (userId == null) {
        redirectAttributes.addFlashAttribute("error", "이메일 또는 비밀번호가 올바르지 않습니다.");
        return "redirect:/login";
    }

    // 로그인 성공 시 Session 생성
    HttpSession session = request.getSession();
    UserResponseDto loginUser = loginService.findById(userId);
    session.setAttribute(Const.LOGIN_USER, loginUser);

    // 로그인 성공 후 홈 화면으로 이동
    return "redirect:/home";
}
  • @Controller를 @RestController로 바꾸기
    • @Controller에서 String을 반환하면 뷰(View) 이름으로 인식됨.
    • ResponseEntity<>를 반환하려면 @RestController 또는 @ResponseBody가 필요.
    • 메서드 반환 타입을 String login에서 ResponseEntity<>로 바꿔준다.
  • @ModelAttribute를 @RequestBody로 바꾸어 JSON 요청 처리해주어야 함
@RestController
@RequiredArgsConstructor
public class LoginController {

    private final LoginService loginService;

    @PostMapping("/login")
    public ResponseEntity<LoginResponseDto> login(
            @Valid @RequestBody LoginRequestDto dto,
            HttpServletRequest request
            .
            .
            .

위기

// 로그인 성공시 로직
        // Session의 Default Value는 true이다.
        // Session이 request에 존재하면 기존의 Session을 반환하고,
        // Session이 request에 없을 경우에 새로 Session을 생성한다.
        HttpSession session = request.getSession();

        // 회원 정보 조회
        UserResponseDto loginUser = loginService.findById(userId);

        // Session에 로그인 회원 정보를 저장한다.
        session.setAttribute(Const.LOGIN_USER, loginUser);

        // 로그인 성공시
        return ResponseEntity.ok(responseDto);

로그인 성공시에 대한 json 반환타입은 구현하였다.

절정

다만, 이럴 경우 로그인 실패시 리다이렉트가 불가능하다.

        // 실패시 로그인페이지로
        if (userId == null) {
            return "redirect:/login";
        }

리다이렉트를 하려면 결국 수정하기 전의 형태로 돌아가야 하기 때문이다.

방식설명코드 예제
JSON 기반 리다이렉트 응답 (RESTful API 방식)ResponseEntity<> 유지하면서 프론트에서 리다이렉트 처리✅ @RestController 유지
서버 측 리다이렉트 (Spring MVC 방식)"redirect:/login"을 반환하여 서버에서 직접 리다이렉트✅ @Controller 사용

결말

로그인 실패시의 로직을 수정하여 예외응답 401을 뜨게 만들어주었다.

// 실패시 401 UNAUTHORIZED 응답 반환
        if (userId == null) {
            return ResponseEntity.status(HttpStatus.UNAUTHORIZED).build();
        }

2. Optional

User findByEmail(String email); 
vs
Optional<User> findByEmail(String email);
User findByEmail(String email);

로 UserRepository에 작성을 하고 났더니 LoginService-Email 조회 부분에서 계속해서 오류가 났다.

조원들에게 물어본 결과

email을 조회했을때, null인 경우를 대비해 optional이라는 래퍼클래스로 감싸야 한다고 한다.

profile
해봅시다

0개의 댓글