[TIL]12.22 로그인, 게시글 삭제 후 상태코드와 함께 성공 메세지 반환

hyewon jeong·2022년 12월 22일
0

TIL

목록 보기
7/138
post-thumbnail

1. 문제점

로그인,게시글 삭제 후 상태코드와 함께 성공 메세지 반환 해야 되는데
어떻게 두가지를 함께 반환 할 것인가 , 또한 상태코드는 어떤 방식으로 나타내야 될까?


## 2. 시도 한 점 1. ResponseEntity 클래스 이용 상태코드와 함께 메세지를 전달 하는 방법 중 HttpEntity 클래스는 Http Headers 와 body 메서드를 포함하는 클래스로 이 것을 상속 받은** ResponseEntity는 httpEntity를 상속받고 사용자의 응답 데이터가 포함된 클래스이기 때문에** **HttpStatus** HttpHeaders HttpBody 를 포함한다.

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

3. 해결

  1. 별도로 상태코드&메세지 클래스 생성 ,반환 값을 Dto이용

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에 담아 클라이언트에게 반환해 준다.



4. 알게 된 점

  • ResponseEntity 클래스를 이용해서 상태코드 등 의
    httpHeaders/body/data 를 가져올 수 있다는 점
  • Dto로 필요한 것만 받아오고 반환하는 방법
  • ResponseEntity 클래스를 이용 없이 스프링 프레임워크가 제공하는 방법으로 간단히 표현하는 방법
  return ResponseEntity.status(HttpStatus.OK).body(userService.login(loginRequestDto,response));

5. 기타 공부

ResponseEntity

profile
개발자꿈나무

0개의 댓글