본문 바로가기
Archive/Java 풀스택 아카데미

[TIL] 16. 11월 Spring Framework(Controller)

by Lseing 2025. 11. 4.

🧐 Spring Controller 란?

MVC 패턴의 'C'를 담당하는, Spring 웹 애플리케이션의 안내 데스크이다.

클라이언트(브라우저)로부터 오는 모든 HTTP 요청을 가장 먼저 받아서 어떤 일을 할지 그리고 어떤 응답을 돌려줄지를 결정하고 지시하는 핵심 역할이다.

일반 객체 VS Controller Bean

이전 글이었던 Bean 편에서 봤듯이 Controller도 컨테이너가 관리하는 Bean이다.

1. 일반 객체 (개발자가 직접 제어)

  • 개발자가 new 키워드로 직접 생성함
  • 개발자가 요청이 올 때마다 직접 호출해야 함
  • 웹 서버와 연결하는 로직을 직접 관리해야 함

2. Controller Bean (컨테이너가 제어)

  • @Controller를 보고 컨테이너가 자동으로 생성함 (Bean 등록)
  • /students라는 GET 요청이 오면 컨테이너가 알아서 getStudents 메서드를 실행함
  • 개발자는 오직 비즈니스 로직에만 집중하면 된다

Controller의 핵심 특징

1. 동작 방식 (Request Flow)

컨테이너가 모든 요청을 받는 게 아니라, DispatcherServlet이라는 프론트 컨트롤러가 먼저 요청을 받는다.

클라이언트 요청DispatcherServlet (중앙 관제소) → HandlerMapping (요청 URL과 맞는 Controller 탐색) → Controller 메서드 실행View 또는 데이터 반환

 

2. 요청 매핑 (Request Mapping)

Controller의 가장 핵심 기능이다. 특정 URL과 HTTP 메서드(GET, POST...)를 개발자가 만든 메서드와 연결해준다.


@Controller VS @RestController ✔️

Spring Controller에는 두 가지 종류가 있다.

1. @Controller (전통적인 방식)

  • View (웹 페이지)를 반환하는 것이 목적이다.
  • 메서드가 반환하는 String 값은 템플릿(JSP) 파일의 이름이 된다.
  • 데이터를 View로 보낼 때는 Model 객체를 사용한다.

2. @RestController (현대 API 방식)

  • 데이터 (JSON, XML)를 반환하는 것이 목적이다.
  • @Controller + @ResponseBody가 합쳐진 어노테이션이다.
  • 메서드가 반환하는 객체(DTO, List 등)가 자동으로 JSON으로 변환되어 응답 Body에 담긴다.
  • 프론트엔드(React, Vue.js)와 백엔드가 분리된 API 서버에 사용된다.

요청 데이터 받는 방법

클라이언트가 보낸 데이터를 Controller는 아주 쉽게 받을 수 있다.

1. @RequestParam

  • 쿼리 스트링 (?key=value) 값을 받을 때 사용한다.
  • 예: /search?keyword=spring

2. @PathVariable

  • 경로 자체에 포함된 값 (/users/123)을 받을 때 사용한다.
  • 예: /users/100

3. @RequestBody

  • 요청 Body에 담겨오는 JSON 데이터를 자바 객체(DTO)로 변환할 때 사용한다.
  • 주로 @RestController와 함께 @PostMapping에서 사용

응답 데이터 보내는 방법

1. View 반환 (@Controller 사용 시) Model 객체에 데이터를 담고, 뷰 이름을 반환한다.

2. 데이터 반환 (@RestController 사용 시) 그냥 자바 객체를 반환하면 끝이다. Spring이 알아서 JSON으로 바꿔준다.

정리: Controller를 왜 사용할까?

  1. 관심사의 분리: 웹 요청 처리 로직(Controller)과 핵심 비즈니스 로직(Service)을 명확하게 분리할 수 있다.
  2. 명확한 진입점: @GetMapping 등으로 어떤 URL이 어떤 기능을 수행하는지 한눈에 파악할 수 있다.
  3. 데이터 자동 변환: JSON을 객체로, 객체를 JSON으로 바꾸는 귀찮은 작업을 프레임워크가 알아서 해준다.
  4. 유연한 테스트: Service에 의존하므로, Service만 가짜(Mock)로 만들어 단위 테스트를 수행하기 매우 편리하다.