SpringBoot ResponseEntity& @ResponseStatus & Custom

SaGo_MunGcci·2022년 8월 7일
0

스프링

목록 보기
15/31

Definition Access

  • 일반적으로 REST API를 만들게 되면 SpringBoot에서는 @RestController를 이용하여 JSON 형식으로 값을 반환하게 된다.

  • 일반적으로 데이터를 반환할 때 StatusCode까지 넘겨주는 방식이 ResponseEntity 그리고 @ResponseStatus 가 있다.



Mechanism

1.HttpEntity 상속 받아 사용하는 ResponseEntity

ResponseEntity는 HTTP 요청에 의한 HttpStatus, HttpHeader와 HttpBody를 포함하는 HttpEntity 클래스를 상속받는다.

  • 헤더 와 바디, 상태 코드 로 구성되어 있고 http 응답을 나타낼 때 사용

  • HttpEntity( http 헤더, 바디 ) 를 상속 받았고, HttpStatus 상태 코드를 추가 할 수 있다.

예시

@RestController
public class MyController {

    @GetMapping(path = "/test")
    public ResponseEntity<User> test() {
        User user = new User();
        user.setName("Name 1");

        HttpHeaders responseHeaders = new HttpHeaders();
        // ...
        return new ResponseEntity<>(user, responseHeaders, HttpStatus.OK);
    }

}

or

코드를 입력하세요

2.@ResponseStatus

  • ResponseEntity 객체 대신 StatusCode를 retuen하고 싶을 때 사용하는 또 다른 방법이다. 바로 @ResponseStatus를 사용하는 것이다.

  • 파라미터로 HttpStatus 객체를 가져와 StatusCode를 보내줄 수 있다.

@RestController
public class MyController {

    @GetMapping(path = "/test")
    @ResponseStatus(HttpStatus.OK)
    public User test() {
        User user = new User();
        user.setName("Name 1");

        return user;
    }

}

3. 직접 만들어서 사용하는 방법

package com.sparta.jwt_refresh_token_include.dto;

import lombok.AllArgsConstructor;
import lombok.Getter;
import org.springframework.http.HttpHeaders;

@Getter
@AllArgsConstructor
public class ResponseDto<T> {
    private boolean success;
    private T data;
    private Error error;

    public static <T> ResponseDto<T> success(T data) {
        return new ResponseDto<>(true, data, null);
    }


    public static <T> ResponseDto<T> successHeader(T data, HttpHeaders headers) {
        return new ResponseDto<>(true, data, null);
    }

    public static <T> ResponseDto<T> fail(String code, String message) {
        return new ResponseDto<>(false, null, new Error(code, message));
    }

    @Getter
    @AllArgsConstructor
    static class Error {
        private String code;
        private String message;

    }

}
  • 여기서는 import org.springframework.http.HttpHeaders;를 임포트해서 header에 응답값을 받는다.
  • @RestController(@Controller + @responseBody)를 적용한 controller에서 service를 만들어 로직을 처리해서 헤더에 제대로 받은 응답값을 responsebody로 보낸다.
@Transactional
    public ResponseDto<?> signup(MemberRequestDto memberRequestDto) {

        name = memberRequestDto.getNickname();
        p1 = memberRequestDto.getPassword();
        String p2 = memberRequestDto.getPasswordConfirm();

        System.out.println(name);
        System.out.println(p1);
        System.out.println(p2);

        if (!p1.equals(p2)) {

            return ResponseDto.fail("PASSWORD_NOT_CORRECT", "비밀번호와 비밀번호 확인이 일치하지 않습니다.");

        } else if (name.equals("")) {

            return ResponseDto.fail("NickName_Is_NULL", "아이디를 입력해주세요");

        } else if (memberRepository.existsByNickname(memberRequestDto.getNickname())) {

            return ResponseDto.fail("NickName_Is_Already exist", "중복된 닉네임입니다.");

        } else {

            Member member = memberRequestDto.toMember(passwordEncoder);
            memberRepository.save(member);

            return ResponseDto.success(member);

        }
    }


Retrospection

  • 가닥이 안잡히던 개념들이 어느정도 이해된 것 같다.

참고 : https://velog.io/@mooh2jj/SpringBoot-ResponseEntity
참고 : https://newbedev.com/when-use-responseentity-t-and-restcontroller-for-spring-restful-applications



profile
이리저리 생각만 많은 사고뭉치입니다.

0개의 댓글