티스토리 뷰

개요

  • 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 등 다른 미디어 타입으로 응답할 수 있도록 설정할 수 있음

보안 및 데이터 검증

  • 입력 데이터 유효성 검증을 위해 @ValidBindingResult를 활용하여 사용자 입력을 검증
  • 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 등 요청에 맞는 미디어 타입으로 응답을 자동 변환합니다.

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/08   »
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
글 보관함