본문 바로가기
Spring/Spring

[Spring] 스프링을 이용한 MVC패턴 구현(5) - @Controller 구성

by J4J 2021. 2. 18.
300x250
반응형

개요

 

들어가기에 앞서
Controller란?
프로젝트 설정
ServletContext 설정 파일 변경 (xml → Java)
파일 구성

 

 

 

안녕하세요. J4J입니다.

 

이번 포스팅은 스프링을 이용한 MVC패턴 구현 중 다섯 번째인 @Controller구성에 대해 적어보는 시간을 가져보려고 합니다.

 

 

들어가기에 앞서

 

 

이번 포스팅은 위의 스프링 MVC구조에서 빨간 박스에 포함되는 내용에 대해 적어보고자 합니다.

 

 

Controller란?

 

컨트롤러는 모델과 뷰 사이를 연결해주는 구간으로 비즈니스 로직이 처리된 모델과 사용자의 화면에 보일 뷰 이름을 리턴해줍니다.

 

컨트롤러로 사용되는 어노테이션은 보통 @Controller, @RestController 등이 있는데 @Controller 같은 경우는 이번 포스팅에서와 같이 스프링과 JSP를 이용한 MVC패턴을 만들 때 사용되고 @RestController는 단순히 데이터만 제공해주는 Rest API를 만들기 위해 사용됩니다.

 

Rest API에 대한 포스팅은 추후에 기회가 되면 포스팅을 하도록 하겠습니다.

 

 

반응형

 

 

프로젝트 설정

 

※ 스프링과 관련된 코드는 모두 STS-3.9.12.RELEASE 버전을 기준으로 작성되었습니다.

 

[ 1. 컨트롤러 설정을 위한 dependency 추가 (일반적으로 프로젝트 생성 시 추가되어 있음) ]

 

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/maven-v4_0_0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>com.spring</groupId>
	<artifactId>mvc</artifactId>
	<name>mvc</name>
	<packaging>war</packaging>
	<version>1.0.0-BUILD-SNAPSHOT</version>
	<properties>
		<java-version>1.8</java-version>
		<org.springframework-version>5.2.11.RELEASE</org.springframework-version>
		<org.aspectj-version>1.9.6</org.aspectj-version>
		<org.slf4j-version>1.7.30</org.slf4j-version>
	</properties>
	<dependencies>
		<!-- Spring -->
		
        	...
        
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-webmvc</artifactId>
			<version>${org.springframework-version}</version>
		</dependency>
		
		<!-- MySQL, MyBatis, @Repository -->
		
        	...
		
		<!-- @Service -->
		
        	...
            
	</dependencies>
    <build>
    
        ...
        
    </build>
</project>

 

 

[ 2. servlet-context.xml 설정 추가 ]

 

<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/mvc"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:beans="http://www.springframework.org/schema/beans"
	xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd
		http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">

	<annotation-driven /> <!-- Spring MVC를 위한 설정 -->

	<resources mapping="/resources/**" location="/resources/" /> <!--/resources/**로 요청할 경우 ${webappRoot}/resources 탐색 -->

	<beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!-- View Resolver(뷰 리졸버) -->
		<beans:property name="prefix" value="/WEB-INF/views/" /> <!-- view name 앞에 붙을 경로 -->
		<beans:property name="suffix" value=".jsp" /> <!-- view name 뒤에 붙을 파일 확장자 -->
	</beans:bean>
	
	<context:component-scan base-package="com.spring.mvc.controller" /> <!-- contoller관련 클래스 등록 패키지 -->
</beans:beans>

 

 

[ 3. Controller 클래스 생성 (com.spring.mvc.controller.CartController) ]

 

package com.spring.mvc.controller;

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.PostMapping;

import com.spring.mvc.dto.Cart;
import com.spring.mvc.service.CartService;

@Controller // 해당 클래스를 빈으로 등록
public class CartController {
	
	@Autowired
	CartService cartServiceImpl;
	
	@PostMapping("/insertCarts.do")
	public String insertCarts(Cart cart) {
		cartServiceImpl.insertCarts(cart); // 카트에 담길 데이터 저장
		return "redirect:selectCart.do"; // get요청으로 "도메인/selectCart.do" URL 호출
	}
	
	@GetMapping("/selectCart.do") // HTTP메서드 중 get요청으로 "도메인/selectCart.do"를 URL로 접근할 경우 
	public String selectCart(Model model) {
		model.addAttribute("carts", cartServiceImpl.selectCart()); // carts라는 값에 카트에 담겨있는 물건을 데이터베이스에서 가져와 저장
		return "mart"; // mart라는 view name을 리턴 (view resolver를 통해 view object로 변경)
	}
	
	@GetMapping("/") // 프로젝트 시작 시 mart페이지로 리다이렉트
	public String init() {
		return "redirect:selectCart.do";
	}
}

 

 

해당 컨트롤러가 올바르게 동작하는지는 다음 포스팅에서 확인하도록 하겠습니다.

 

 

728x90

 

 

ServletContext 설정 파일 변경 (xml → Java)

 

※ 스프링과 관련된 코드는 모두 STS-3.9.12.RELEASE 버전을 기준으로 작성되었습니다.

 

위에 작성한 코드들중 다른 것은 변경 없이 servlet-context.xml파일만 다음과 같이 변경해주시면 됩니다.

 

[ 1. servlet-context.xml 파일 수정 ]

 

<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/mvc"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:beans="http://www.springframework.org/schema/beans"
	xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd
		http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">

	<!-- java 방식 -->
	<context:annotation-config></context:annotation-config>
	<beans:bean class="com.spring.mvc.config.ServletContext"></beans:bean>
	
	<!-- xml 방식 -->
	<!-- 	
	<annotation-driven /> Spring MVC를 위한 설정

	<resources mapping="/resources/**" location="/resources/" /> /resources/**로 요청할 경우 ${webappRoot}/resources 탐색

	<beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> View Resolver(뷰 리졸버)
		<beans:property name="prefix" value="/WEB-INF/views/" /> view name 앞에 붙을 경로
		<beans:property name="suffix" value=".jsp" /> // view name 뒤에 붙을 파일 확장자
	</beans:bean>
	
	<context:component-scan base-package="com.spring.mvc.controller" /> contoller관련 클래스 등록 패키지 
	-->
</beans:beans>

 

 

[ 2. ServletContext 클래스 생성 (com.spring.mvc.config.ServletContext) ]

 

package com.spring.mvc.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.servlet.view.InternalResourceViewResolver;

@Configuration // 설정파일로 등록
@EnableWebMvc // Spring MVC를 위한 설정
@ComponentScan(basePackages = {"com.spring.mvc.controller", "com.spring.mvc.config"}) // contoller, config 관련 클래스 등록 패키지
public class ServletContext implements WebMvcConfigurer {
	
	@Override
	public void addResourceHandlers(ResourceHandlerRegistry registry) { // /resources/**로 요청할 경우 ${webappRoot}/resources 탐색
	    registry.addResourceHandler("/resources/**").addResourceLocations("/resources/");
	}
	
       @Bean
       public ViewResolver viewResolver() { // View Resolver(뷰 리졸버)
          InternalResourceViewResolver vr = new InternalResourceViewResolver();
          vr.setPrefix("/WEB-INF/views/"); // view name 앞에 붙을 경로
          vr.setSuffix(".jsp"); // view name 뒤에 붙을 파일 확장자
          return vr;
       }
}

 

 

파일 구성

 

 

 

정리

 

컨트롤러는 모델과 뷰 사이를 연결해주는 구간
컨트롤러에 사용되는 어노테이션은 @Controller, @RestController가 존재
@Controller는 MVC패턴, @RestController는 Rest API를 제공할 때 사용
말을 덧 붙이면 @RestController = @Controller + @ResponseBody

 

 

이상으로 스프링을 이용한 MVC패턴 구현 중 다섯 번째인 @Controller구성에 대해 간단하게 알아보는 시간이었습니다.

 

읽어주셔서 감사합니다.

728x90
반응형

댓글