일반적으로 REST API를 만들게 되면 SpringBoot에서는 @RestController를 이용하여 JSON 형식으로 값을 반환하게 된다.
일반적으로 데이터를 반환할 때 StatusCode까지 넘겨주는 방식이 ResponseEntity 그리고 @ResponseStatus 가 있다.
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
코드를 입력하세요
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;
    }
}
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;
    }
}
@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);
        }
    }
참고 : https://velog.io/@mooh2jj/SpringBoot-ResponseEntity
참고 : https://newbedev.com/when-use-responseentity-t-and-restcontroller-for-spring-restful-applications