티스토리 뷰
개요
- Spring MVC 애플리케이션에서 @Controller와 @RestController는 클라이언트의 요청을 처리하는 역할을 함
@Controller
- 주로 JSP, Thymeleaf 등 템플릿 뷰를 사용하여 HTML 페이지를 렌더링할 때 사용
- 메서드에서 반환한 값은 View Resolver를 통해 해석되어 뷰(템플릿)로 전달
@RestController
- RESTful API 엔드포인트를 제공하며, 데이터를 JSON, XML 등으로 직렬화하여 클라이언트에 반환
- 내부적으로 @Controller와 @ResponseBody가 결합된 형태로 동작
역할 및 책임
@Controller
역할
- 웹 애플리케이션에서 클라이언트의 요청을 받아 템플릿 기반의 뷰를 반환하는 역할을 담당
주요 책임
- HTTP 요청 매핑 (예: GET, POST 등)
- 요청 파라미터 바인딩 및 검증
- 비즈니스 로직 처리 후 Service 계층에 위임
- Model 객체에 데이터를 담아 View Resolver에 전달하여 HTML 렌더링 수행
특징
- 반환 값은 주로 뷰 이름(String)으로 처리됨
- 필요에 따라 메서드에 @ResponseBody를 추가하여 직접 데이터를 반환할 수 있음
예시 코드
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
@RequestMapping("/greeting")
public class GreetingController {
@GetMapping
public String greeting(Model model) {
// Model에 데이터를 담아 뷰에 전달
model.addAttribute("message", "안녕하세요, Spring MVC!");
// viewResolver가 'greeting'이라는 이름의 템플릿을 찾아 렌더링함
return "greeting";
}
}
위 코드는 클라이언트의 /greeting 요청을 받아 Model에 메시지를 담고, greeting.html (또는 JSP 등) 템플릿을 렌더링
@RestController
역할
- RESTful API 엔드포인트를 제공하며, 클라이언트에게 데이터를 JSON, XML 등으로 직렬화하여 반환하는 역할을 담당
주요 책임
- HTTP 요청 매핑 및 파라미터 검증
- Service 계층 호출 후, 결과 데이터를 직렬화하여 응답으로 반환
특징
- 클래스 레벨에 @ResponseBody가 암묵적으로 적용됨
- 객체를 반환하면 Jackson 등의 라이브러리를 통해 JSON, XML 등으로 자동 직렬화됨
예시 코드
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/api/greeting")
public class GreetingRestController {
@GetMapping
public Message greeting() {
// 객체를 반환하면, Jackson에 의해 JSON으로 직렬화되어 클라이언트에 전달됨
return new Message("안녕하세요, Spring REST API!");
}
}
// 간단한 DTO 클래스
class Message {
private String text;
public Message(String text) {
this.text = text;
}
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
}
위 코드는 /api/greeting 요청에 대해 Message 객체를 반환
@RestController 덕분에 Message 객체가 JSON 형식으로 자동 변환되어 클라이언트에게 전달
비교
추가 내용
1. 예외 처리 및 응답 상태 코드 관리
@Controller
- @ExceptionHandler와 @ControllerAdvice를 사용하여, 발생한 예외에 따른 적절한 에러 페이지나 메시지를 반환할 수 있음
@RestController
- 글로벌 예외 처리(@ControllerAdvice)를 통해 예외 발생 시, HTTP 상태 코드와 함께 JSON 형식의 에러 응답을 제공할 수 있음
- ResponseEntity를 사용하면 응답 상태 코드, 헤더, 본문을 세밀하게 제어할 수 있음
미디어 타입(Content Negotiation)
@Controller
- ViewResolver를 통해 HTML, XML 등 다양한 뷰 템플릿을 지원
@RestController
- 기본적으로 JSON을 반환하지만, 클라이언트의 Accept 헤더에 따라 XML 등 다른 미디어 타입으로 응답할 수 있도록 설정할 수 있음
보안 및 데이터 검증
- 입력 데이터 유효성 검증을 위해 @Valid와 BindingResult를 활용하여 사용자 입력을 검증
- Spring Security를 통한 인증 및 권한 관리를 적용하여 각 엔드포인트의 보안을 강화
캐싱 및 성능 최적화
@RestController
- API 응답에 대해 @Cacheable 등 캐싱 전략을 적용하여 서버 부하를 줄이고 응답 속도를 향상시킬 수 있음
면접 대비 질문
기본 질문
Q1. @Controller와 @RestController의 차이점을 설명하세요.
모범 답변
@Controller는 주로 템플릿 뷰(예: Thymeleaf, JSP)를 렌더링하여 HTML 페이지를 반환하는 데 사용됩니다.
반면, @RestController는 @Controller와 @ResponseBody가 결합된 형태로, 반환 객체를 JSON이나 XML 등으로 자동 직렬화하여 RESTful API 응답을 제공합니다.
Q2. 언제 @RestController를 사용해야 하고, 언제 @Controller를 사용해야 하나요?
모범 답변
RESTful API를 제공하거나 데이터만을 반환해야 하는 경우 @RestController를 사용합니다.
동적 HTML 페이지 렌더링이 필요한 경우에는 @Controller를 사용하여 View Resolver를 통해 템플릿을 반환합니다.
심화 질문
Q1. @Controller에서 직접 JSON을 반환하려면 어떻게 해야 하나요?
모범 답변
@Controller에서 메서드에 @ResponseBody를 추가하면, 반환 객체가 JSON 등으로 직렬화되어 직접 HTTP 응답 본문에 매핑됩니다.
Q2. @RestController가 내부적으로 @ResponseBody를 포함하고 있다는 의미는 무엇인가요?
모범 답변
@RestController를 사용하면 클래스의 모든 메서드에 자동으로 @ResponseBody가 적용되어, 메서드에서 반환하는 객체가 뷰가 아닌 HTTP 응답 본문에 직접 매핑됩니다.
Q3. 예외 처리나 응답 상태 코드 관리는 어떻게 처리할 수 있나요?
모범 답변
@Controller와 @RestController 모두 @ControllerAdvice를 통해 글로벌 예외 처리를 적용할 수 있습니다.
특히, @RestController에서는 ResponseEntity를 사용하여 응답 상태 코드, 헤더, 본문을 세밀하게 제어할 수 있습니다.
압박 질문
Q1. 동적 웹 페이지와 REST API를 혼용하여 개발할 때 잘못된 어노테이션 사용으로 어떤 문제가 발생할 수 있나요?
모범 답변
잘못된 어노테이션 사용으로 인해 데이터 직렬화가 의도치 않게 적용되거나, 뷰 템플릿이 제대로 렌더링되지 않는 등, 클라이언트가 예상한 응답 형식과 다른 결과가 발생할 수 있습니다.
Q2. @RestController를 사용할 때 보안과 성능 최적화를 위해 고려해야 할 사항은 무엇인가요?
모범 답변
데이터 직렬화와 관련하여 캐싱 전략(@Cacheable)이나 ResponseEntity를 통한 세밀한 상태 코드 관리가 필요하며, 입력 데이터의 유효성 검증 및 인증/권한 부여(Spring Security) 설정이 중요합니다.
Q3. 클라이언트의 Accept 헤더에 따라 미디어 타입이 다른 응답을 보내야 하는 상황에서 @RestController는 어떻게 대응하나요?
모범 답변
Spring의 Content Negotiation 기능을 통해, 클라이언트의 Accept 헤더를 확인한 후 적절한 MessageConverter가 동작하여 JSON, XML 등 요청에 맞는 미디어 타입으로 응답을 자동 변환합니다.
'Spring' 카테고리의 다른 글
[Spring] 예외 처리 (@ExceptionHandler, @ControllerAdvice 등) (0) | 2025.02.18 |
---|---|
[Spring] 요청 매핑 (@RequestMapping, @GetMapping 등) (0) | 2025.02.17 |
[Spring] Model-View-Controller (MVC) 구조 (1) | 2025.02.14 |
[Spring] Controller, Service, Repository 패턴 (0) | 2025.02.13 |
[Spring] 스프링 프레임워크 정리 (1) | 2025.02.12 |
- Total
- Today
- Yesterday
- 해시 테이블
- 탐색 알고리즘
- 데이터베이스
- 프리코스
- CPU 스케줄링
- 알고리즘
- 자료구조
- db
- 분할 정복
- 그리디 알고리즘
- 스프링
- k8
- Spring
- B+Tree
- 동적 프로그래밍
- i/o모델
- devops
- CS
- restful api
- 운영체제
- 백트래킹
- MSA
- 우선순위 큐
- TRIE
- Java
- Spring Boot
- 우아한 테크코스
- 우테코
- HTTP
- 자바
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
31 |