티스토리 뷰

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 을 받아 웹 브라우저 화면에 전체 도서 목록을 출력한다.

컨트롤러 구현 과정1

 

 

 

 

 

 


 

 

 

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";
	}

}

 

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday