▸Spring MVC/기본 문법

스프링 MVC 컨트롤러 작성하기

코데방 2020. 3. 11.
728x90
- Develop OS : Windows10 Ent, 64bit
- WEB/WAS Server : Tomcat v9.0
- DBMS : MySQL 5.7.29 for Linux (Docker)
- Language : JAVA 1.8 (JDK 1.8)
- Framwork : Spring 3.1.1 Release
- Build Tool : Maven 3.6.3
- ORM : Mybatis 3.2.8

 

스프링 MVC 프로젝트의 전체 동작 구조와 기본 설정 파일들에 대한 내용은 아래글을 참조하시면 됩니다.

 

[Spring/- 기본 상식] - 스프링(Spring) MVC 동작 구조 및 스프링 컨테이너

 

 

 

 


 

[ 컨트롤러 클래스 만들기 ]

 

간단히 클래스에다가 "@Controller" 어노테이션을 붙여주면 됩니다. 다만 주의할 점은 스프링 설정 파일에 등록된 패키지 안에서만 컨트롤러를 검색하니, 설정된 곳과 다른 패키지에 있는 컨트롤러를 작성할 때는 설정파일에도 추가를 해줘야 합니다. 

 

* WEB-INF/spring/appServlet/servlet-context.xml 파일에 컨트롤러를 스캔할 경로 지정

<context:component-scan base-package="com.hsweb.springweb" />

 

* 클래스에 컨틀롤러 어노테이션 추가

@Controller
public class HomeController {

 

 


 

 

[ 요청 처리 메소드 만들기 ]

 

스프링의 컨트롤러에서는 "@RequestMapping" 어노테이션이 붙은 메소드가 요청 처리 담당입니다. 어노테이션에서 URL 매핑을 하면 되는데, 이 때 "/**"로 매핑하면 별도로 매핑한 URL을 제외한 모든 URL은 디폴트 메소드가 처리하게 됩니다.

 

  • "/"       :    "IP:포트/context/" URL 매핑
  • "/*"     :    "IP:포트/context/아무거나~" URL 매핑
  • "/**"   :    "IP:포트/context/아무거나/아무거나/아무거나~" 모든 URL 매핑

만약 "/"로 매핑하면 딱 슬래시로 끝났을 때 주소가 매핑됩니다. 서블릿 매핑과 달리 그 뒤에 뭔가 주소가 더 있으면 매핑되지 않습니다. "/*"로 매핑해야 슬래시 뒤에 뭐가 오던 매핑됩니다. 하지만 이 경우도 뒷 주소에 슬레시가 하나 더 있으면 작동되지 않습니다. 어떤 주소건 간에 디폴트 메소드로 매핑하려면 "/**" 형식으로 매핑해줘야 합니다. 이 경우 다른 곳에서 매핑된 URL을 제외한 모든 URL을 처리해줄 수 있습니다.

 

메소드는 String 타입으로 지정해 JSP 파일의 컨텍스트 패스 이후 경로와 파일 이름(확장자 제외)을 리턴시킵니다. 그러면 Dispatcher가 받아서 다시 뷰 처리를 담당하는 빈(Bean) 객체에 넘겨 처리합니다. 그리고 GET방식과 POST 방식 중 어느 타입의 요청을 받아 처리할지 정해줄 수 있는데 만약 생략한다면 두 타입 모두 받아서 처리하게 됩니다.

 

JSP 파일의 루트 경로는 "WEB-INF/views" 폴더 입니다. 

package com.hsweb.springweb;

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

@Controller
public class HomeController {
	
	// 별도 매핑되지 않은 모든 요청을 처리, GET/POST 둘 다 처리
	@RequestMapping(value = "/**")
	public String home(Model model) {
		return "home";
	}
	
	// /home URL에 대한 요청 처리
	@RequestMapping(value = "/home", method = RequestMethod.GET)
	public String home2(Model model) {
		return "home2";
	}
}

 

 

 


 

 

 

[ 컨트롤러에 @RequestMapping 어노테이션 사용하기 ]

 

컨트롤러 자체에 매핑 어노테이션을 사용하면 해당 URL을 컨트롤러로 보내주고, 그 하위 URL에 대한 매핑을 다시 메소드에 찾습니다. 예를 들어 아래와 같이 "/board/list" 라는 URL을 매핑해준다면, 메소드에 전체 URL을 다 매핑해줄 수 있지만 "/board"는 컨트롤러에 매핑해주고 "/list"는 메소드에 매핑해서 사용할 수 있습니다. 이 방식으로 모듈별로 컨트롤러를 분리시키면 좀 더 깔끔하게 코드를 구현할 수 있습니다.

 

package com.hsweb.springweb;

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

@Controller
@RequestMapping(value="/board") // 컨트롤러 URL 매핑
public class HomeController {
	
	// /list URL에 대한 요청 처리
	@RequestMapping(value = "/list", method = RequestMethod.GET)
	public String home2(Model model) {
		return "/board/list";
	}
}

 

728x90

댓글

💲 추천 글