KOSA Spring - 응답 데이터형식 및 공통 처리

채정윤·2025년 4월 18일

Spring

목록 보기
12/25

ResponseEntity 정리

HTTP 응답에 헤더와 상태 코드 포함 → 부가 정보 전달 가능

항목설명
ResponseEntity응답 본문 + 헤더 + 상태 코드 모두 설정 가능
HttpHeaders응답 헤더 설정용 객체
Content-Type데이터 형식을 명시 (application/json)
HttpStatus.OKHTTP 200 상태 코드 (성공 응답)
  • 클라이언트에게 보낼 JSON 형식의 문자열 데이터
    String message = "{\"name\":\"초코에몽\"}";
  • 응답 헤더에 Content-Type을 명시
  • 클라이언트에게 "JSON 형식 데이터임"을 알려줌
    HttpHeaders header = new HttpHeaders();
    header.add("Content-Type", "application/json;charset=UTF-8");
  • 본문(message), 헤더(header), HTTP 상태 코드(200 OK) 포함해 응답
    return new ResponseEntity<String>(message, header, HttpStatus.OK);

🌟1. enctype="multipart/form-data"

  • 용도: 파일을 포함한 폼 데이터를 서버로 전송할 때 사용.
  • 주요 특징: 폼 데이터를 multipart/form-data로 인코딩하여 전송하며, 텍스트 필드와 파일 필드를 구분하여 전송함.
<form method="POST" enctype="multipart/form-data">
    <input type="text" name="username">
    <input type="file" name="profile_picture">
</form>
  • 일반 필드 (username) → multipart reserve
  • 파일 필드 (profile_picture) → multipart files

🌟2. @ControllerAdvice

  • 용도: Spring MVC에서 예외 처리, 공통 모델 속성 설정 등을 중앙에서 관리.
  • 주요 특징:
    • 여러 컨트롤러에서 발생할 수 있는 예외를 한 곳에서 처리.
    • 모든 컨트롤러에 공통적인 속성이나 바인딩 초기화 등을 적용.
  • 주요 어노테이션:
    • @ExceptionHandler: 예외 처리
    • @ModelAttribute: 공통 모델 속성 설정
    • @InitBinder: 바인딩 초기화
@ControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(NullPointerException.class)
    public ResponseEntity<String> handleNullPointer(NullPointerException e) {
        return ResponseEntity.status(HttpStatus.BAD_REQUEST)
                             .body("널포인터 예외가 발생했어요!");
    }

    @ExceptionHandler(Exception.class)
    public ResponseEntity<String> handleAll(Exception e) {
        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
                             .body("서버에서 에러가 발생했어요!");
    }
}
  • 공통 모델 속성 추가 예시:
    @ControllerAdvice
    public class GlobalModelAdvice {
    
        @ModelAttribute("appName")
        public String appName() {
            return "나의 스프링 앱";
        }
    }
    
    • 모든 뷰에서 ${appName}을 사용할 수 있게 만들어줌.

0개의 댓글