본문 바로가기
공부/Spring

[Spring] 로그인, 회원 가입 결과 반환 형식

by 웅대 2023. 1. 30.
728x90
반응형

클라이언트가 아이디와 비밀번호를 request body에 담아 POST 요청을 보내면 그에 따른 결과를 반환하려한다.

 

반환 형식은 아래와 같이 구현해보았다.

@AllArgsConstructor
@Getter
public class LoginAndJoinResponse {
    private int code;
    private HttpStatus httpStatus;
    private String message;
    private Object data;
}

code는 http 상태 코드를 의미하고 httpStatus는 http 상태를 의미하고 message는 반환 결과에 대한 설명을 의미하고 data는 반환해줄 데이터를 의미한다.

 

일단은 로그인 성공하면 key를 jwt, value를 토큰 값으로하는 Object를 LoginAndJoinResponse의 data에 넣어준다.

 

token의 정보를 담은 클래스는 TokenResponse이다.

@Getter
@AllArgsConstructor
public class TokenResponse {
    private String jwt;
}

 

 

회원 가입의 경우 따로 보내줄 데이터를 없으므로 null 값이 들어가도록 설계했다.

 

이제 로그인 회원가입 컨트롤러에서 이러한 결과를 반환해보려한다.

 

@RestController
@RequestMapping("/api/users")
@RequiredArgsConstructor
public class UserController {
    private final UserService userService;

    @PostMapping("/join")
    public ResponseEntity<LoginAndJoinResponse> join(@RequestBody UserJoinDto user) {
        userService.join(user.getUserId(), user.getUserPwd());
        LoginAndJoinResponse res = new LoginAndJoinResponse(
                200,
                HttpStatus.OK,
                "회원 가입 성공",
                null
        );
        return new ResponseEntity<>(res, res.getHttpStatus());
    }

    @PostMapping("/login")
    public ResponseEntity<LoginAndJoinResponse> login(@RequestBody UserJoinDto user) {
        String token = userService.login(user.getUserId(), user.getUserPwd());
        LoginAndJoinResponse res = new LoginAndJoinResponse(
                200,
                HttpStatus.OK,
                "로그인 성공",
                new TokenResponse(token)
        );
        return new ResponseEntity<>(res, res.getHttpStatus());

    }
}

ResponseEntity안에 LoginAndJoinResponse 인스턴스와 http 상태 값을 넣어주어 반환하면 된다.

 

postman의 결과를 보면

원하는 형식대로 반환하고 있다.

 

일단은 내 나름대로 만들어봤는데 아직 부족한 점이 있는 것 같다.

 

1. data의 쓰임새가 적다.

data는 Object 타입으로 클라이언트에서 사용해야하는 정보를 넘겨준다.

 

지금으로썬 로그인 성공시 토큰을 담아 반환하는 것에만 쓰이고 있다.

 

그러다보니 로그인 실패, 회원 가입 성공, 회원가입 실패에는 null  값이 반환되어 오히려 낭비되는 공간이 아닌가하는 생각이 들었다.

 

2. http 상태 코드의 중복

return 값을 보면 ResponseEntity의 인자 안에 HttpStatus 값을 넣어주고 있다.

 

그리고 postman의 반환 헤더를 보면 상태 코드를 반환해주고 있다.

 

반환 헤더와 반환 바디에서 상태 코드가 중복이 된다.

 

3. 에러 처리

현재는 로그인, 회원 가입 성공하는 부분만 구현을 했는데 실패 과정도 반환하도록 만들 예정이다.

 

처음에는 controller에서 모든 실패를 처리해서 ResponseEntity를 반환하려고 생각을 했다.

 

그런데 그렇게 구현하면 Controller에서의 코드도 늘어나고 가독성도 좋지 않을 것 같아서 고민을 하다가 ControllerAdvice를 활용해서 에러 부분만 따로 처리해주려고 한다.

 

 

728x90
반응형

댓글