[Spring] 스프링 MVC 시작하기 (with IntelliJ)
2023. 11. 17.
반응형

 

이 포스팅에서는 IDE에서 스프링 MVC 프로젝트를 만드는 법을 다룹니다.

 

웹 어플리케이션을 개발을 위한 프로젝트는 웹을 위한 디렉토리 구조가 추가됩니다.

그동안 다뤘던 비즈니스 로직(Model, Controller)이외에도 화면(View)을 다뤄야 하기 때문입니다.

 

저는 인텔리제이(IntelliJ)를 사용해 프로젝트를 만들어보겠습니다.

 

 

 

 

새로 프로젝트를 생성한 후에 Maven 프로젝트를 만들어줍니다.

Archetype: org.apache.maven.archetypes:maven-archetype-quickstart

 

그리고 Spring MVC 프로젝트를 만들기 위해 추가 설정이 필요합니다.

 

프로젝트를 선택하고 오른쪽 마우스를 누르고 Add Frameworks Supports를 선택합니다.

그리고 Spring - Spring MVC를 선택해야 하는데... 저는 Spring 자체가 아예 뜨지 않았습니다.

(되는 사람은 이렇게 하세요)

 

 

 

반응형

 

 

 

 

그래서 다른 방법을 택했습니다.

프로젝트를 선택하고 오른쪽 마우스를 누르고 Open Module Settings를 선택합니다.

그리고 Libraries를 선택하면 아래와 같은 화면이 뜹니다.

 

 

 

여기서 + 버튼을 누르고 From Maven을 누른 후 아래와 같이 선택합니다.

 

 

 

그럼 이제 Spring MVC 프로젝트를 만들 준비가 되었습니다.

다시 Add Frameworks Supports를 선택한 후 Web을 추가해주면 다음과 같은 파일구조가 완성됩니다.

 

 

 

 

 

 

 

 

 

 

 

  • src/main/java
  • src/main/web
  • src/main/web/WEB-INF
  • src/main/web/WEB-INF/view

 

java 폴더에는 비즈니스 로직이, web 폴더에는 화면과 관련된 HTML, CSS, JS, JSP 등 웹 어플리케이션을 구현하는데 필요한 코드가 위치하게 됩니다.

추가로 화면들을 한 파일에 모으기 위해 WEB-INF아래에 view라는 디렉토리를 추가했습니다.

(잠시 후 경로를 설정하기 위해서 중요한 부분임!)

 

 

 

반응형

 

 

 

 

다음은 pom.xml에 의존성을 추가해줍니다.

 

 

<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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>org.example</groupId>
  <artifactId>springMVC</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>war</packaging>

  <name>springMVC</name>
  <url>http://maven.apache.org</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>

    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>3.1.0</version>
      <scope>provided</scope>
    </dependency>

    <dependency>
      <groupId>javax.servlet.jsp</groupId>
      <artifactId>javax.servlet.jsp-api</artifactId>
      <version>2.3.2-b02</version>
      <scope>provided</scope>
    </dependency>

    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>jstl</artifactId>
      <version>1.2</version>
    </dependency>

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>5.0.2.RELEASE</version>
    </dependency>
  </dependencies>

  <build>
    <plugins>
      <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.8.0</version>
        <configuration>
          <source>11</source>
          <target>11</target>
          <encoding>utf-8</encoding>
        </configuration>
      </plugin>
    </plugins>
  </build>

</project>

 

 

JSP를 사용하기 위해 servlet, jsp, jstl 등 의존성을 추가적으로 설정해 줬습니다.

packaging의 값은 원래 jar로 설정되지만 war로 바꾸어주었습니다.

war란 web application archive의 약자로 서블릿/JSP를 이용한 웹 어플리케이션을 개발할 경우 war값을 주어야 합니다.

 

 

 

다음으로는 웹 서버인 톰캣을 설정해 보겠습니다.

 

Run > Edit Configurations

 

 

 

이 화면에서 Tomcat Server > Local 을 선택합니다.

 

 

 

Application server의 Configure 버튼을 눌러 tomcat 서버를 추가해 줍니다.

 

https://tomcat.apache.org

 

Apache Tomcat® - Welcome!

The Apache Tomcat® software is an open source implementation of the Jakarta Servlet, Jakarta Server Pages, Jakarta Expression Language, Jakarta WebSocket, Jakarta Annotations and Jakarta Authentication specifications. These specifications are part of the

tomcat.apache.org

 

tomcat 파일을 로컬에 가지고 있지 않다면 위의 사이트에 접속해 tomcat을 다운 받아서 설정해 주세요.

후에 Fix를 눌러줍니다.

 

 

 

Application context가 원래는 /프로젝트 명으로 설정되어 있는데 /로 바꿔줍니다.

 

이는 우리가 만들 웹의 주소를 뜻하는데 /프로젝트 명으로 설정하면

"http://localhost:8080/프로젝트명/index.jsp"로 기본 경로가 설정되기 때문에

간결하게 "http://localhost:8080/index.jsp"로 만들어줬습니다.

 

 

 

 

반응형

 

 

 

 

이제 프로젝트를 실행시킬 웹 서버의 설정이 완료되었습니다.

그럼 이제 스프링 MVC를 설정해 보겠습니다.

 

MvcConfig.java

 

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.ViewResolverRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
@EnableWebMvc
public class MvcConfig implements WebMvcConfigurer {

  @Override
  public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
    configurer.enable();
  }

  @Override
  public void configureViewResolvers(ViewResolverRegistry registry) {
    registry.jsp("/WEB-INF/view/", ".jsp");
  }

}

 

WebMvcConfigurer 인터페이스에 정의되어 있는 메소드들을 구현해 줌으로써 Spring MVC에 필요한 기능들을 설정할 수 있습니다.

 

@EnableWebMvc: 스프링 MVC를 사용하는데 필요한 다양한 설정 생성

configureDefaultServletHandling(): DispatcherServlet의 매핑 경로를 '/'로 주었을 때 JSP 등 웹앱을 바르게 처리하기 위한 설정

configureViewResolvers(): JSP를 이용해 컨트롤러의 실행 결과를 보여주기 위한 경로 설정 (앞에 "/WEB-INF/view", 뒤에 ".jsp" 매번 안 붙여도 되게 설정)

 

pom.xml을 통해서 스프링 MVC 설정을 마쳤습니다.

그럼 DispatcherServlet을 통해서 웹 요청을 받기 위해서 web.xml 파일에 DispatcherServlet을 등록하도록 하겠습니다.

 

web.xml

 

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">

<servlet>
  <servlet-name>dispatcher</servlet-name> <!--Dispatcher 이름 등록-->
  <servlet-class>
    org.springframework.web.servlet.DispatcherServlet
  </servlet-class>
  <init-param>
    <param-name>contextClass</param-name> 
    <param-value>
      org.springframework.web.context.support.AnnotationConfigWebApplicationContext
    </param-value>
  </init-param>
  <init-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>
      config.MvcConfig
      config.ControllerConfig
    </param-value>
  </init-param>
  <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping> <!-- 모든 요청을 DispatcherServlet이 처리하도록 서블릿 맵핑 -->
  <servlet-name>dispatcher</servlet-name>
  <url-pattern>/</url-pattern>
</servlet-mapping>

<filter>
  <filter-name>encodingFilter</filter-name> <!-- 인코딩 처리 필터 설정 -->
  <filter-class>
    org.springframework.web.filter.CharacterEncodingFilter
  </filter-class>
  <init-param>
    <param-name>encoding</param-name>
    <param-value>UTF-8</param-value>
  </init-param>
</filter>
<filter-mapping>
  <filter-name>encodingFilter</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>

</web-app>

 

 

이제 대략적인 설정이 끝났으니 코드를 구현해 보겠습니다.

먼저 Controller부터 구현해 보겠습니다.

 

HelloController.java

 

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

@Controller
public class HelloController {

	@GetMapping("/hello")
	public String hello(Model model,
			@RequestParam(value = "name", required = false) String name) {
		model.addAttribute("greeting", "안녕하세요, " + name);
		return "hello";
	}
}

 

@Controller: 이 어노테이션을 지정하면 스프링 MVC 컨트롤러로 사용

@GetMapping: 메소드가 처리할 요청 경로 지정. "/hello"경로로 들어온 GET요청을 hello() 메소드가 처리

Model: 컨트롤러의 처리 결과를 뷰에게 전달

@RequestParam: HTTP 요청 파라미터의 값을 메서드의 파라미터로 전달

model.addAttribute: "greeting"이라는 모델 속성의 값을 "안녕하세요, " + name으로 설정

return "hello": 컨트롤러의 처리 결과를 보여줄 뷰의 이름으로 "hello"를 리턴 (ViewResolver가 처리)

 

HelloController는 위와 같은 기능을 합니다.

그럼 만약 "http://localhost:8080/hello?name=bk"라고 요청 URL이 들어오면 어떻게 될까요?

name 파라미터의 값이 "bk"가 되어 로직을 처리하게 됩니다.

 

 

 

반응형

 

 

 

 

그럼 이 컨트롤러를 스프링 빈에 등록하겠습니다. 역시나 설정 파일을 통해 등록해야 합니다.

 

ControllerConfig.java

 

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import controller.HelloController;

@Configuration
public class ControllerConfig {

	@Bean
	public HelloController helloController() {
		return new HelloController();
	}

}

 

 

이제 컨트롤러의 구현이 끝났습니다. 그러면 이 로직을 보여줄 수 있는 화면을 만들어보겠습니다.

view 코드는 jsp를 통해 구현합니다. 아까 만들었던 view 폴더 안에 hello.jsp 파일을 만들어봅시다.

 

 

hello.jsp

 

<%@ page contentType="text/html; charset=utf-8" %>
<!DOCTYPE html>
<html>
  <head>
    <title>Hello</title>
  </head>
  <body>
    인사말: ${greeting}
  </body>
</html>

 

 

"http://localhost:8080/hello?name=bk"라는 주소가 입력되면 name 파라미터에 bk가 전달되었죠?

컨트롤러 로직에서 return "hello"; 가 이 화면으로 돌아오면 인사말: 안녕하세요, bk가 될 것입니다.

 

직접 실행해서 확인해 보겠습니다.

 

 

실제로 확인되었습니다. 

 

정리해 보자면 다음과 같습니다.

 

  1. 주소창에 "http://localhost:8080/hello?name=bk" 입력
  2. GetMapping으로 HelloController에서 hello라는 경로로 들어온 요청을 처리
  3. 파라미터 name 값을 bk로 전달
  4. greeting이라는 모델 속성에 값 설정 (name -> bk)
  5. 뷰의 이름 hello로 처리 결과 전달
  6. hello.jsp에서 화면 처리

이러한 과정을 통해 요청이 처리되게 됩니다. 

ControllerConfig, MvcConfig 파일에 각종 설정을 통해 요청을 간결하고 쉽게 처리할 수 있었습니다.

 

 

출처: 초보 웹 개발자를 위한 스프링 5 프로그래밍 입문

반응형
myoskin