로그인,게시글 삭제 후 상태코드와 함께 성공 메세지 반환 해야 되는데
어떻게 두가지를 함께 반환 할 것인가 , 또한 상태코드는 어떤 방식으로 나타내야 될까?
controller
@GetMapping(value = "/{id}")
public ResponseEntity<Message> findById(@PathVariable long id) {
Optional<User> user = userRepository.findById(id);
Message message = new Message();
HttpHeaders headers = new HttpHeaders();
Charset utf8 = Charset.forName("UTF-8");
MediaType mediaType = new MediaType("application", "json", utf8);
headers.setContentType(mediaType);
message.setStatus(StatusEnum.OK);
message.setMessage("회원가입 성공");
message.setData(user);
return ResponseEntity;
}
message package>messge
package com.example.myblog1.message;
import lombok.Data;
@Data
public class Message {
private StatusEnum status;
private String message;
private Object data;
public Message() {
this.status = StatusEnum.BAD_REQUEST;
this.message = null;
this.data = null;
}
}
message package>StatusEnum
public enum StatusEnum{
OK(200,"OK"),
BAD_REQUEST(400,"BAD_REQUEST"),
NOT_FOUND(404,"NOT FOUND"),
INTERNAL_SERVER_ERRPR(500,"INTERNAL_SERVER_ERROR");
int statusCode;
String code;
StatusEnum(int statusCode, String code){
this.statusCode = statusCode;
this.code = code;
}
}
이 방법을 사용 했으나 현재 요구사항보다 오버 된 설정이기도 하고,
튜텨님 강의를 듣던 중
lombok 사용시 주의할 점으로 @Data 사용시 @setter를 가져오게 됨으로 @Data사용을 지양해야 된다고 말씀하셔서 다른 방법을 하기로 했다.
@Data
StatusEnum
import lombok.Getter;
import lombok.NoArgsConstructor;
@Getter
@NoArgsConstructor
public enum StatusEnum {
SIGNUP_SUCCESS(200,"회원가입 성공"),
LOGIN_SUCCESS(200, "로그인 성공"),
DELETE_SUCCESS(200, "게시글 삭제 성공");
int statusCode;
String code;
StatusEnum(int statusCode, String code) {
this.statusCode = statusCode;
this.code = code;
}
}
ResponseStatusDto
public class ResponseStatusDto {
private String code;
private int statusCode;
public ResponseStatusDto(StatusEnum status){
this.code = status.getCode();
this.statusCode = status.getStatusCode();
}
}
UserController
@PostMapping("/login")
public ResponseStatusDto login(@RequestBody LoginRequest loginRequest, HttpServletResponse response) {
return userService.login(loginRequest, response);
}
UserService
@Transactional // readOnly= true 하면 에러남
public ResponseStatusDto login(LoginRequest loginRequest, HttpServletResponse response) {
String username = loginRequest.getUsername();
String password = loginRequest.getPassword();
// 사용자 확인
User user = userRepository.findByUsername(username).orElseThrow(
() -> new IllegalArgumentException("등록된 사용자가 없습니다.")
);
//비밀번호 확인
if (!user.getPassword().equals(password)) {
throw new IllegalArgumentException("비밀번호가 일치하지 않습니다. ");
}
response.addHeader(JwtUtil.AUTHORIZATION_HEADER, jwtUtil.createToken(user.getUsername(),user.getRole()));
//response에 헤더쪽 값을 넣어수 있는데 키값에는 AUTHORIZATION_HEADER과 토큰 생성 값을 넣어줌
return new ResponseStatusDto(StatusEnum.LOGIN_SUCCESS);
}
중 이 부분
return new ResponseStatusDto(StatusEnum.LOGIN_SUCCESS);
으로 상태코드와 메세지를 dto에 담아 클라이언트에게 반환해 준다.
return ResponseEntity.status(HttpStatus.OK).body(userService.login(loginRequestDto,response));