DEVELOPMENT/Spring

[스프링부트 완전정복] 4. 컨트롤러 구현

Tiny Commit 2025. 10. 8. 13:12

 

 

 

 

 

1. 컨트롤러 개요

1. 컨트롤러

  • 스프링 부트는 MVC 설정과 톰캣서버 설정(실행과 배포)을 자동으로 해준다. 
  • 웹에서 사용자 요청 → 디스패처 서블릿이 요청을 받고 컴트롤러가 처리
  • 컨트롤러: 웹에서 사용자 요청으로 구현된 메서드를 처리하고 결과를 뷰에 전달한다. 

 

2. 컨트롤러 구현과정

  • BookController 클래스를 컨트롤러(@Controller, @RestController)로 사용
  • BookController 클래스는 웹요청 URL을 받아(@RequestMapping) 웹페이지에 화면 출력

 

 

 

 

 

2. 컨트롤러 정의

1. @Controller로 컨트롤러 정의하기

  • 이 컨트롤러로 정의하면 특정 자바 클래스가 컨트롤러 역할을 하게 됩니다. 
  • 웹 어플리케이션에서 사용자의 요청과 응답을 처리하는 컨트롤러
package com.springboot.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@Controller  // ① Controller 선언
public class Example01Controller {

    @RequestMapping(value = "/exam01", method = RequestMethod.GET)  // ② URL 매핑
    public String requestMethod() {  // ③ 반환 타입은 String
        return "viewPage01";  // ④ 뷰 이름 반환 (JSP, Thymeleaf 등)
    }
}

 

 

  • @Controller
    • 스프링 MVC의 컨트롤러임을 선언.
    • 주로 뷰(JSP, Thymeleaf) 를 반환할 때 사용.
  • @RequestMapping
    • /exam01 요청이 들어오면 requestMethod() 실행.
    • GET 방식만 허용.
  • requestMethod()
    • 반환 타입이 String.
    • 리턴 값 "viewPage01" 은 뷰 파일 이름.
    • 즉, viewPage01.jsp 또는 viewPage01.html 을 찾아서 렌더링.

 

 

 

 

2. @RestController로 컨트롤러 정의하기

  • Restful웹 서비스: HTTP 요청에 대한 응답을 RESTful 아키텍처 스타일에 맞춰 처리하는 자바 클래스
  • 뷰 없이 문자열과 JSON 형식의 데이터를 반환
package com.springboot.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

@RestController  // ① RestController 선언
public class Example02Controller {

    @RequestMapping(value = "/exam02", method = RequestMethod.GET)  // ② URL 매핑
    public String requestMethod() {  // ③ 반환 타입 String
        return "@RestController 예제입니다";  // ④ 응답 본문(body)으로 전송
    }
}

 

 

  • @RestController
    • @Controller + @ResponseBody 합친 기능.
    • 뷰를 거치지 않고, 데이터를 그대로 응답.
  • @RequestMapping
    • /exam02 요청이 들어오면 실행.
    • GET 요청만 허용.
  • requestMethod()
    • 반환 값 "@RestController 예제입니다" 가 HTML 뷰가 아닌 그대로 클라이언트에 출력.
    • 즉, 브라우저에서 보면 그냥 문자열 응답.

 

 

 

 

 

 

3. @RequestMapping을 이용한 요청 매핑 경로 설정

  • 사용자 요퐁이 들어오면 컨트롤러와 메서드가 호출되어 요청을 처리합니다. 
  • 이때 사용자 URL에 맞는 컨트롤러와 메서드를 연결시키는 것

 

1. 컨트롤러에 @RequestMapping 적용하기

  • 컨트롤러에 선언되는 경우: 클래스 수준의 @RequestMapping. 이때, 기본 매핑 경로를 설정하지 않은 매서드여야 한다. 
  • @RequestMapping(value="웹 요청 URL", method=RequestMethod.HTTP_요청방식)
속성 타입 설명
value String 기본 매핑 경로 이름
method RequestMethod HTTP 요청 방식 (GET, POST, PUT, DELETE)
headers String 매핑된 요청의 헤더
name String 매핑 이름 지정
params String 매핑된 요청 파라미터
path String 서블릿 환경만의 경로 매핑 URI
consumes String 매핑된 요청의 소비 가능한 미디어 유형
produces String 매핑된 요청의 생산 가능한 미디어 유형

 

 

2. 메서드에 @RequestMapping 적용하기

  • 컨트롤러 안에 어떤 메서드를 처리할지 선언하는 경우: 메서드 수중의 @RequestMapping. 이때 method는 GET이 default

 

package com.springboot.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@Controller
@RequestMapping(value = "/exam03", method = RequestMethod.GET)  // 클래스 레벨 매핑
public class Example03Controller {

    @RequestMapping  // 메소드 레벨 매핑
    public String requestMethod() {
        return "viewPage03";
    }
}

 

 

 

 

3. @RequestMapping 단순화하기

변형 @RequestMapping 

애너테이션 설명 method 속성 대응
@GetMapping GET 요청 매핑 method=RequestMethod.GET
@PostMapping POST 요청 매핑 method=RequestMethod.POST
@PutMapping PUT 요청 매핑 method=RequestMethod.PUT
@DeleteMapping DELETE 요청 매핑 method=RequestMethod.DELETE
@PatchMapping PATCH 요청 매핑 method=RequestMethod.PATCH
  • @RequestMapping(method=RequestMethod.GET) 대신 @GetMapping으로 더 간단하게 사용 가능.

 

 

 

 

4. 요청 처리 매서드와 모델 유형

  • 요청처리 메서드: 웹에서 사용자의 요청을 처리, 사용자 요청을 처리하고 결과 데이터를 관리하고 전달하는 모델과 처리된 모델과 데이터를 웹에서 출력하는 뷰를 포함

1. Model 인터페이스로 메서드 작성하기

  • 모델 인터페이스는 사용자 요청 처리 결과를 뷰에 보여주는데, addAttribute() 객체에 담아 전달합니다.
  • Model 객체는 키-값 쌍(attribute) 으로 데이터를 저장.
package com.springboot.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.ui.Model;

@Controller
public class Example06Controller {

    @GetMapping("/exam06")
    public String requestMethod(Model model) {
        model.addAttribute("data1", "Model 예제");
        model.addAttribute("data2", "웹 요청 URL은 /exam06 입니다");
        return "viewPage";
    }
}

 

 

2. ModelMap 클래스로 메서드 작성하기

  • ModelMap 은 Model 과 비슷하지만, Map 기반이라 put() 대신 addAttribute() 사용.
  • Model 과 기능적으로 큰 차이는 없지만, 키-값 관리가 조금 더 유연.

 

package com.springboot.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.ui.ModelMap;

@Controller
public class Example07Controller {

    @GetMapping("/exam07")
    public String requestMethod(ModelMap model) {
        model.addAttribute("data1", "ModelMap 예제");
        model.addAttribute("data2", "웹 요청 URL은 /exam07 입니다");
        return "viewPage";
    }
}

 

 

3. ModelAndView 클래스로 메서드 작성하기

  • 사용자 요청 결과 데이터를 ModelAndView 객체의 addObject()에 답고 setViewName() 뷰 이름을 설정.
package com.springboot.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.servlet.ModelAndView;

@Controller
public class Example08Controller {

    @GetMapping("/exam08")
    public ModelAndView requestMethod() {
        ModelAndView mav = new ModelAndView();
        mav.addObject("data1", "ModelAndView 예제");
        mav.addObject("data2", "웹 요청 URL은 /exam08 입니다");
        mav.setViewName("viewPage");
        return mav;
    }
}
  • ModelAndView 는 데이터(Model)와 뷰(View 이름)를 동시에 설정할 수 있음.
  • addObject() → 데이터 전달, setViewName() → 뷰 설정.
  • 주로 데이터와 뷰 이름을 한 번에 제어하고 싶을 때 사용.

 

 

 

 

 

 

5. [도서 쇼핑몰] 도서 목록 표시하기

0. 오류 해결 - CSS

 

Download

Download Bootstrap to get the compiled CSS and JavaScript, source code, or include it with your favorite package managers like npm, RubyGems, and more.

getbootstrap.com

 

  1. @Controller 컨트롤러 생성(BookController.java)
  2. @RestController 컨트롤러 생성 (WelcomController.java)
  3. @RequestMapping을 적용한 클래스 생성 - 도서 목록 페이지 수정(books.html)
  4. 메서드 수준의 @RequestMapping 작성하기 (BookController.java)
  5. 단순화한 @RequestMapping 작성하기 (@GetMapping) (BookController.java)
  6. ModelAndView 클래스로 결과 반환하기 (BookController.java)

결과

 

 

 

 

 

 

 

 


연습문제

더보기

01. 컨트롤러로 쓰는 자바 클래스에 붙이는 애너테이션은?
정답: ① @Controller — 스프링 MVC 컨트롤러 클래스를 표기하는 기본 애너테이션.

02. 스프링 부트 컨트롤러 설명으로 옳은 것은?
정답: — 컨트롤러는 @Controller 가 선언된 특정 자바 클래스입니다.

03. 어떤 메서드가 어떤 URL을 처리할지 매핑하는 애너테이션은?
정답: ④ @RequestMapping — 요청 URL/HTTP 메서드를 메서드(또는 클래스)에 매핑.

04. 모델/뷰 유형으로 ‘옳지 않은’ 것은?
정답: ③ ModelAndMap — 존재하지 않는 타입(올바른 건 ModelAndView).

05. ModelAndView에 대한 설명으로 ‘옳지 않은’ 것은?
정답: — addAttribute()는 Model/ModelMap에서 쓰고, ModelAndView는 addObject() 사용.

06. requestMovies()로 가는 브라우저 주소는?
정답: http://localhost:8080/movies — 클래스 레벨 /movies + 메서드 경로 없음 → /movies.

07. requestBooks()로 가는 브라우저 주소는?
정답: http://localhost:8080/movies/books — 클래스 /movies + 메서드 /books.

08. 메서드 수준 @RequestMapping의 단축 애너테이션이 ‘아닌’ 것은?
정답: ③ @UpdateMapping — 스프링엔 @PutMapping/@PatchMapping은 있어도 @UpdateMapping은 없음.

09. requestMovies()를 단축 애너테이션으로 매핑하려면?
정답: ① @GetMapping — 클래스 /movies가 있으니 메서드 경로 없이 GET만 지정하면 /movies.

10. requestBooks()를 단축 애너테이션으로 매핑하려면?
정답: ④ @GetMapping("/books") — 원래 method = RequestMethod.GET이므로 GET 전용 축약.

 

 

 

 

 

 


출처 : 송미영, 『 스프링부트 완전정복: 개념부터 실정 프로젝트까지 』길벗캠퍼스 (2024).