-
Notifications
You must be signed in to change notification settings - Fork 2
[BE] 질문사항
회원정보 요청에 대한 응답으로 프론트에게는 템플릿을, iOS에게는 JSON 객체를 반환합니다.
두 가지 별도로 처리를 하다보니 중복 코드가 보이는데 잘못된 코드인지, 어쩔 수 없는 부분인지 의문이 들었습니다.
다른 팀들의 의견도 들어보았는데 모두 JSON으로 넘겨준다고 하였습니다. 프론트와 iOS 에게 동일하게 JSON으로 응답하면 코드중복이 없고 한번에 처리할 수 있으니 편리할 것 같단 생각이 들었지만 프론트에게 사전에 템플릿으로 제공하겠다고 정하여서 그대로 진행하였는데 이 부분도 설계의 차이인 건가요?
# 회원정보보기 기능
[프론트] - 요청 url : /users
응답으로 회원정보를 맵핑한 템플릿을 넘겨줍니다.
[iOS] - 요청 url : /api/users
응답으로 회원정보를 JSON 형식으로 넘겨줍니다.
회원정보를 요청 시 로그인한 사용자만 보여줄 수 있도록 하기위해서 처음 생각한 반환타입은 다음과 같습니다. 실패 시엔 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을 던지는 것이 나은 방법인가요??
로그인 성공 시, Response 로 302 status로 redirect 할 주소를 넘겨주면서 Body에는 "success" 문자열을 넣어줬습니다. 사용자에게는 보이지 않는 부분이겠지만 제가 확인을 하다보니 "success" 문구가 있을 때 확인이 편했어서 넣게되었는데 이 부분은 원하는대로 그냥 써도 될까요.
이 모든게 초반에 Response 시 타입을 확실히 정하지 않아서 그런 것 같습니다. 반환 타입이 String, ResponseEntity, ResponseResult 로 통일성이 없어서 복잡합니다 ㅠㅠㅠㅠ 스프링 어려워요😫