Spring Boot는 서버와 클라이언트 간의 효율적인 데이터 전송을 위해 여러 가지 응답 처리 방식을 제공합니다.
이러한 다양한 응답 처리 방식은 애플리케이션의 요구사항에 따라 유연하게 선택할 수 있으며, 성능 최적화와 사용자 경험 향상에 기여합니다. 이번 글에서는 각 응답 처리 방식의 특징과 사용 사례를 자세히 살펴보겠습니다.
1. @ResponseBody / @RestController
- 간단한 문자열, 객체, JSON 등을 반환할 때 주로 사용
- 상태 코드와 헤더 설정은 자동으로 처리되며, 기본적으로 200 OK 상태 코드가 사용됨
- json 응답형식
{ "key": "Hello", "value": "World" }
2. ResponseEntity
- 간단하고 유연한 응답 처리
- 주로 API 응답에 상태 코드와 헤더를 명시적으로 설정해야 할 때 사용
- json 응답형식
HTTP/1.1 200 OK Content-Type: application/json Custom-Header: foo { "key": "Hello", "value": "World" }
3. BaseResponse (응답 클래스 직접 구현)
- 일관된 응답 형식이 필요한 경우
- 특히 페이징 정보나 에러 메시지 등의 추가 정보를 포함할 수 있어 RESTful API 설계 시 자주 사용
- json 응답 형식
{ "data": { "key": "Hello", "value": "World" }, "message": "Success", "status": 200 }
4. HttpServletResponse
- 낮은 수준의 제어로 파일을 다운로드할 수 있도록 응답 스트림을 직접 처리할 때 유용
비동기 응답 처리
5. CompletableFuture
- Java 8부터 제공되는 비동기 프로그래밍을 위한 클래스
- 비동기 작업을 비즈니스 로직에서 분리하고 싶을 때 사용
- 예제 코드
@Async public CompletableFuture<String> asyncMethod() { return CompletableFuture.supplyAsync(() -> { // Simulate long running task try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } return "Hello, CompletableFuture!"; }); } @GetMapping("/async-completable") public CompletableFuture<String> asyncCompletable() { return asyncMethod(); }
6. Callable
- 짧은 시간 내에 완료될 수 있는 비동기 응답을 처리할 때 사용
- 긴 작업을 백그라운드 스레드에서 실행하고, Callable을 사용하여 결과를 반환
- 예제 코드
@GetMapping("/async-callable") public Callable<String> asyncCallable() { return () -> { // Simulate long running task Thread.sleep(2000); return "Hello, Callable!"; }; }
7. DeferredResult
- 주로 외부 서비스 호출이 오래 걸려서 비동기 응답으로 처리할 때 사용
- 긴 작업을 별도의 스레드에서 수행하고, 결과를 준비된 DeferredResult 객체에 설정
- 예제 코드
@GetMapping("/async-deferred") public DeferredResult<String> asyncDeferred() { DeferredResult<String> deferredResult = new DeferredResult<>(); new Thread(() -> { try { // Simulate long running task Thread.sleep(2000); deferredResult.setResult("Hello, DeferredResult!"); } catch (InterruptedException e) { deferredResult.setErrorResult(e.getMessage()); } }).start(); return deferredResult; }
8. ResponseBodyEmitter
- 비동기식으로 서버에서 클라이언트로 실시간 데이터를 전송할 때 유용 (실시간 업데이트가 필요한 경우)
9. SseEmitter
- 서버 센트 이벤트(Server-Sent Events)를 전송하기 위해 사용
- 클라이언트와의 실시간 연결이 필요할 때 유용 (실시간 알림, 채팅 등)
10. StreamingResponseBody
- 메모리 사용을 최소화하면서 대용량 데이터를 스트리밍 방식으로 비동기 전송
'Web' 카테고리의 다른 글
[springboot] Multipart로 다중 파일 업로드하기 (0) | 2024.06.26 |
---|---|
[springboot] 설정 클래스 알아보기 (0) | 2024.06.18 |
[springboot] Spring Security 6.x로 소셜 로그인 구현하기 (oauth2) (1) | 2024.06.08 |
[springboot] Spring Security 6.x로 로그인 구현하기 (jwt 인증) (0) | 2024.06.05 |
[springboot] Spring Security 6.x로 안전한 회원가입 구현하기 (security 연결, 패스워드 인코딩) (0) | 2024.06.04 |