티스토리 뷰
Chapter05. 컨트롤러 구현 : '도서 쇼핑몰'에서 도서 목록 출력
5.1 컨트롤러 개요
5.1.1 컨트롤러
스프링 MVC는 웹에서 사용자 요청을 받으면 가장 먼저 디스패처 서블릿에 전달한다.
디스패처 서블릿은 요청을 전달받는 창구 역할만 할 뿐 실제로는 컨트롤러가 요청을 처리한다.
5.1.2 컨트롤러 구현 과정
이전 도서 쇼핑몰 애플리케이션에서는 WelcomeController 와 BookController 두 가지 클래스를 컨트롤러로 사용한다.
WelcomeController 클래스는 사용자의 웹 요청 url http://localhost:8080/bookmarket/home 을 받아 웹 브라우저 화면에 도서 쇼핑몰의 인사말을 출력한다.
BookController 클래스는 웹 요청 url http://localhost:8080/bookmarket/books 을 받아 웹 브라우저 화면에 전체 도서 목록을 출력한다.
5.2 컨트롤러 정의
컨트롤러가 사용자 요청을 전달받아 처리하고 결과를 반환할 수 있도록 특정 자바 클래스를 컨트롤러로 정의하는 @Controller 및 해당 컨트롤러와 의존 관계에 있는 모든 자바 클래스를 빈 객체로 등록해야한다.
5.2.1 @Controller를 이용한 컨트롤러 정의
컨트롤러는 메서드를 포함하고 있는 일반적인 자바 클래스가 아니라 웹 브라우저에서 들어온 요청을 처리하는 메서드를 포함하고 있는 특정 자바 클래스이다.
이때 @Controller를 선언해 특정 자바 클래스가 컨트롤러 역할을 하도록 한다.
* @Controller를 사용하려면 import org.springframework.stereotype.Controller; 를 임포트해야 한다.
Example01Controller
package com.springmvc.chap05;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
@Controller
public class Example01Controller {
@RequestMapping(value="/exam01", method=RequestMethod.GET)
public void requestMethod() {
System.out.println("@Controller 예제입니다.");
}
}
Example02Controller
package com.springmvc.chap05;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
@Controller
public class Example02Controller {
@RequestMapping(value="/exam02", method=RequestMethod.GET)
public void requestMethod() {
System.out.println("Example02 입니다.");
}
}
5.2.2 <context:component-scan> 요소로 컨트롤러 등록
디스패처 서블릿이 모든 컨트롤러를 인식할 수 있도록 하려면 컨트롤러뿐만 아니라 컨트롤러와 의존 관계에 있는 자바 클래스들을 스프링 MVC 설정 파일(Servlet-context.xml)에 빈 객체로 등록해야 한다.
<context:component-scan base-package="패키지 이름" />
컴포넌트(@Controller, @Autowired ..) 자동 인식 기능 지원
위와 같이 작성하면 @로 선언된 것들을 빈 객체로 자동으로 등록을 한다. 그리고 의존 관계에 있는 자바 클래스들도 빈 객체로 자동 등록한다.
만약 package 뒤에 "com.springmvc.*"으로 작성하면 패키지 하위에 있는 컨트롤러 및 의존 관계에 있는 자바 클래스를 검색해 모두 빈 객체로 자동 등록한다. (Servlet-context)
빈 객체로 등록해야한다. 이 말은 즉 new한다. 생성해야한다는 말이다. 그렇기 때문에 context:component-scan 요소를 작성하지 않으면 직접 수동으로 등록해주어야 한다.
수동방법
//객체 등록하는 구문
<beans:bean class="come.springmvc.controller.HomeController"/>
<beans:bean id="bookRepositoryImpl" class="come.springmvc.controller.repository.BookRepositoryImpl"/>
//변수에 주입함
<beans:bean id="bookServiceImpl" class="com.springmvc.service.BookServiceImpl">
<beans:property name="bookRepository" ref="bookRepositoryImpl" />
</beans:bean>
<beans:bean class="com.springmvc.service.BookController">
<beans:property name="bookService" ref="bookServiceImpl" />
</beans:bean>
위에서의 bookService와 아래에서의 bookService는 같은 변수이다.
public void setBookService(BookService bookService){
this.bookService=bookService;}
* 북마켓 객체는
@controller
bookcontroller
@controller
hommecontroller
@Repository
bookrepository
@service
bookservice
간출여서 4개가 있다. 모두 애너테이션을 가지고 있으므로 자동으로 생성된다. 또한, 서블렛에서 인식하고 자동 생성하므로 서블렛이 가지고 있다. 이걸 @autowired에서 달라고 하면 주는 형태로 구현된다.
하지만, book 은 @가 없다 그러므로 자동으로 객체 생성하지 않는다.
5.3 @RequestMapping 을 이용한 요청 매핑 경로 설정
스프링 MVC에서는 어떤 컨트롤러와 메서드가 웹에서 들어온 사용자 요청을 처리할지 매핑할 수 있다.
@RequestMapping은 이런 매핑을 지원하고 형식은 다음과 같다.
@RequestMapping(value="웹 요청 URL" [,method=RequestMethod.HTTP 요청 방식, ...])
* method 를 생략하면 자동으로 GET 형식을 따른다.
@RequestMapping의 속성 유형
속성 | 타입 | 설명 |
value | String | 기본 매핑 경로 이름 |
method | RequestMethod | 매핑할 HTTP 요청 방식(GET,POST,HEAD,OPTIONS,PUT,DELETE,TRACE) |
headers | String | 매핑된 요청의 헤더 |
name | String | 해당 매핑에 이름 지정 |
params | String | 매핑된 요청 매개변수 |
path | String | 서블릿 환경에서만 경로 매핑 url |
consumes | String | 매핑된 요청의 소비 가능한 미디어 유형 |
produces | String | 매핑된 요청의 생산 가능한 미디어 유형 |
5.3.1 컨트롤러에 @RequestMapping 적용
@RequestMapping에는 두가지 형식이 있다.
클래스 수준의 @RequestMapping와 메서드 수준의 @RequestMapping이 있다.
클래스 수준은 클래스 위에 @RequestMapping이 선언된다.
그리고 메서드 수준은 메서드 위에서 @RequestMapping이 선언된다.
또한, 사용할 때 기본 매핑 경로를 설정하지 않은 @RequestMapping만 선언된 요청 처리 메서드가 있어야한다.
5.3.3 메서드에 @RequestMapping 적용
이제까지는 클래스 수준의 @RequestMapping을 적용했다.
메서드 수준에서 @RequestMapping은 method속성의 기본값으 GET 방식이므로 생략할 수 있다.
5.3.4 메서드에 @RequestMapping 작성하기
클래스 수준의 @RequestMapping 및 웹 요청으로 경로를 지정했었다.
이번 실습에서는 메서드 수준의 @RequestMapping 및 웹 요청 url 과 매핑할 기본 경로를 선언한다.
그때 경로는 /books 밑에 /all이 들어가기 때문에 http://localhost:8080/bookmarket/books/all이 되어야 제대로 실행된다.
package com.springmvc.controller;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import com.springmvc.domain.Book;
import com.springmvc.service.BookService;
@Controller
@RequestMapping("/books")
public class BookController {
@Autowired
private BookService bookService;
@RequestMapping
public String requestBookList(Model model) {
List<Book> list = bookService.getAllBookList();
model.addAttribute("bookList",list);
return "books";
}
@RequestMapping("/all")
public String requestAllBooks(Model model) {
List<Book> list = bookService.getAllBookList();
model.addAttribute("bookList",list);
return "books";
}
}
5.3.5 메서드 수준의 @RequestMapping 단순화
HTTP 요청 방식에 대한 매핑을 단순화하고 요청 처리 메서드 의미를 좀 더 잘 표현하는데 도움이 되도록 메서드 수준의 @RequestMapping을 변경할 수 있다.
아래의 표는 변형하여 지원하는 @RequestMapping이다.
단순화한 다양한 @RequestMapping
애너테이션 | 설명 | method 속성 사용 |
@GetMapping | 매핑할 HTTP 요청 방식이 GET 인 경우 | method = RequestMethod.GET |
@PostMapping | 매핑할 HTTP 요청 방식이 POST 인 경우 | method = RequestMethod.POST |
@PutMapping | 매핑할 HTTP 요청 방식이 PUT 인 경우 | method = RequestMethod.PUT |
@DeleteMapping | 매핑할 HTTP 요청 방식이 DELETE 인 경우 | method = RequestMethod.DELETE |
@PatchMapping | 매핑할 HTTP 요청 방식이 PATCH 인 경우 | method = RequestMethod.PATCH |
* 이제부터는 @RequestMapping대신 사용할 속성에 맞는 애너테이션을 찾아 입력하면 더욱 간단히 사용할 수 있다.
5.3.6 단순화한 @RequestMapping 사용하기
단순화한 메서드 수준의 @RequestMapping으로 코드를 변형했다.
BookController.java
package com.springmvc.controller;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import com.springmvc.domain.Book;
import com.springmvc.service.BookService;
@Controller
@RequestMapping("/books")
public class BookController {
@Autowired
private BookService bookService;
@GetMapping
public String requestBookList(Model model) {
List<Book> list = bookService.getAllBookList();
model.addAttribute("bookList",list);
return "books";
}
@GetMapping("/all")
public String requestAllBooks(Model model) {
List<Book> list = bookService.getAllBookList();
model.addAttribute("bookList",list);
return "books";
}
}
'코딩 > spring' 카테고리의 다른 글
[15주 4일차] 요청 처리 메서드의 파라미터 유형 : 다양한 조건으로 검색한 도서 목록 출력하기 (0) | 2024.01.18 |
---|---|
[15주 4일차] 컨트롤러 구현 (2) (0) | 2024.01.18 |
[15주 3일차] 스프링 MVC 애플리케이션의 계층적 구조 (0) | 2024.01.17 |
[15주 2일차] 도서 쇼핑몰 프로젝트 (0) | 2024.01.16 |
[15주 2일차] 스프링 MVC의 프로젝트 구조 (0) | 2024.01.16 |
- Total
- Today
- Yesterday