Skip to content

[BE] 질문사항

Solar edited this page Mar 29, 2020 · 1 revision

1. 동일한 기능 요청에 대해 프론트와 iOS에게 서로 다른 Response 응답을 주도록 구현하였는데 비효율적인 코드 일까요?

회원정보 요청에 대한 응답으로 프론트에게는 템플릿을, iOS에게는 JSON 객체를 반환합니다.

두 가지 별도로 처리를 하다보니 중복 코드가 보이는데 잘못된 코드인지, 어쩔 수 없는 부분인지 의문이 들었습니다.

다른 팀들의 의견도 들어보았는데 모두 JSON으로 넘겨준다고 하였습니다. 프론트와 iOS 에게 동일하게 JSON으로 응답하면 코드중복이 없고 한번에 처리할 수 있으니 편리할 것 같단 생각이 들었지만 프론트에게 사전에 템플릿으로 제공하겠다고 정하여서 그대로 진행하였는데 이 부분도 설계의 차이인 건가요?

# 회원정보보기 기능

[프론트] - 요청 url : /users

응답으로 회원정보를 맵핑한 템플릿을 넘겨줍니다.

image-20200329135839230

[iOS] - 요청 url : /api/users

응답으로 회원정보를 JSON 형식으로 넘겨줍니다.

image-20200329135949124

2. 잘못된 요청을 처리하기 위해 사용자 정의 Exception을 사용하여도 좋나요?

회원정보를 요청 시 로그인한 사용자만 보여줄 수 있도록 하기위해서 처음 생각한 반환타입은 다음과 같습니다. 실패 시엔 ResponseResult 객체, 성공 시엔 User 객체를 JSON 타입으로 응답합니다.

실패시 ResponseResult 타입 : {"valid":false,"errorMessage":"로그인이 필요합니다."}
성공시 User 타입 : {"id":1,"userId":"solar","password":"1111","name":"solari","birthday":"2020-03-24","gender":"female","email":"solar@test.com","phoneNumber":"010-1111-2222","interest":"[board, movie]"}

처음 코드를 구현할 때는 Exception을 던지는 것보다 if 문 안에서 바로 return 하는 것이 좋을 것 같아 다음과 같이 작성하다 보니 성공시와 실패시에 반환하는 객체의 타입이 달라서 에러가 났습니다.

// Error나는 잘못짠 코드
public ResponseResult viewProfile(HttpSession session) {
    log.debug("[*] session getId : {}", session.getId());
    if (HttpSessionUtils.isNotLoginUser(session)) {
        final String NOT_LOGINED_MESSAGE = "로그인이 필요합니다.";
        return new ResponseResult(false, NOT_LOGINED_MESSAGE);
    }

    return HttpSessionUtils.getUserFromSession(session);
}

검색결과 @ResponseBody 어노테이션과 HashMap<String, Object> 타입으로 리턴하면 한번에 처리가 가능하여 아래와 같이 작성하게 되었는데, 코드가 복잡한 것 같고 그냥 Exception을 던지면 깔끔할 것 같았습니다. ㅠㅠㅠ ( 그리고 이 코드에서 상태코드도 별도로 넣어주기 위해서는 ResponseEntity<HashMap<String, Object>> 로 수정해서 넣어줘야 했는데... 너무 복잡해지는 것 같아요......)

@ResponseBody
@GetMapping("")
public HashMap<String, Object> viewProfile(HttpSession session) {
    log.debug("[*] session getId : {}", session.getId());
    HashMap<String, Object> responseMap = new HashMap<>();
    if (HttpSessionUtils.isNotLoginUser(session)) {
        final String NOT_LOGINED_MESSAGE = "로그인이 필요합니다.";
        responseMap.put("result", new ResponseResult(false, NOT_LOGINED_MESSAGE));
        return responseMap;
    }

    User sessionUser = HttpSessionUtils.getUserFromSession(session);
    responseMap.put("result", sessionUser);
    return responseMap;
}
비로그인 요청시 : {"result":{"valid":false,"errorMessage":"로그인이 필요합니다."}}
로그인 후 요청시 : 
{"result":{"userId":"solar","name":"solari","birthday":"2020-03-24","gender":"female","email":"solar@test.com","phoneNumber":"010-1111-2222","interest":"board, movie"}}

그래서 그냥 NotFoundUserException을 만들어서 던지도록 코드를 구현하였더니 깔끔하고, 처음 의도한 Response 형태가 되었습니다.

public User viewProfile(HttpSession session) {
    log.debug("[*] session getId : {}", session.getId());
    if (HttpSessionUtils.isNotLoginUser(session)) {
        final String NOT_LOGINED_MESSAGE = "로그인이 필요합니다.";
        throw new NotFoundUserException(NOT_LOGINED_MESSAGE);
    }

    return HttpSessionUtils.getUserFromSession(session);
}

그냥 사용자정의 Exception을 던지는 것이 나은 방법인가요??

3. 302로 응답할 때 Body에 내용을 담아주는 것이 좋을까요?

로그인 성공 시, Response 로 302 status로 redirect 할 주소를 넘겨주면서 Body에는 "success" 문자열을 넣어줬습니다. 사용자에게는 보이지 않는 부분이겠지만 제가 확인을 하다보니 "success" 문구가 있을 때 확인이 편했어서 넣게되었는데 이 부분은 원하는대로 그냥 써도 될까요.

image-20200329134910519

회고...

이 모든게 초반에 Response 시 타입을 확실히 정하지 않아서 그런 것 같습니다. 반환 타입이 String, ResponseEntity, ResponseResult 로 통일성이 없어서 복잡합니다 ㅠㅠㅠㅠ 스프링 어려워요😫