Spring MVC 환경설정
제너레이터에서 Maven 원형을 선택하고,
이름은 mvc-practice,
JDK 버전의 경우는 11로 하고, 저는 Azul로 진행하였습니다.
Maven 원형을 사용하면 특정 유형의 프로젝트에 대한 기본 파일과 구조를 쉽게 설정할 수 있습니다.
이를 통해 개발자는 복잡한 설정 작업을 줄이고, 일관된 프로젝트 구조를 유지할 수 있도록 합니다.
프로젝트 구조 정리
1. src -> main -> java 디렉토리 생성
2. java > com.demo.devfun 패키지 생성
3. com.demo.devfun 아래에 controller, service, dao, dto 패키지 생성
< Dependency 추가 >
<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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>mvc-practice</artifactId>
<packaging>war</packaging>
<version>1.0-SNAPSHOT</version>
<name>mvc-practice Maven Webapp</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<org.springframework-version>5.2.3.RELEASE</org.springframework-version>
</properties>
<dependencies>
<!-- 기본 세팅 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${org.springframework-version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${org.springframework-version}</version>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.2</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.5</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.6.0</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<plugin>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<version>9.4.9.v20180320</version>
<configuration>
<httpConnector>
<port>9080</port>
</httpConnector>
<scanIntervalSeconds>0</scanIntervalSeconds>
<webApp>
<contextPath>/</contextPath>
</webApp>
</configuration>
</plugin>
</plugins>
</build>
</project>
pom.xml
Maven 프로젝트 객체 모델 [POM]은 프로젝트의 빌드 및 종속성 관리를 위한 XML 파일입니다.
프로젝트의 구성, 종속성, 빌드 설정 등을 정의합니다.
종속성에는 프로젝트가 필요로 하는 라이브러리와 그 버전을 정의합니다.
<build> 태그는 프로젝트의 빌드 과정을 정의하고,
<plugins> 태그는 빌드 과정에서 사용할 플로그인들을 정의합니다.
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee https://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<servlet>
<servlet-name>spring</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext-webapp.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>spring</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>
web.xml
Spring MVC 기반 웹 애플리케이션을 위한 배치 설명자로, 웹 애플리케이션의 구성 및 설정을 정의합니다.
이 파일은 서블릿 컨테이너이자 우리가 사용할 Jetty에 의해 사용됩니다.
DispatcherServlet 설정
클라이언트의 요청을 전달받는 객체이자,
애플리케이션의 모든 요청을 처리하는 중앙 제어 역할을 합니다.
URL 패턴 / 에 매핑되어 모든 요청을 처리합니다.
Web 설정을 위한 작업
resources -> applicationContext-webapp.xml을 생성합니다.
위에서 만든 web.xml의 DispatcherServlet의 config 경로를 보면,
classpath를 현재 파일의 경로로 작성한 것을 볼 수 있습니다.
즉, 해당 경로의 웹 container 구동을 위한 설정을 진행한다고 볼 수 있고,
classpath는 기본적으로 resources 아래의 경로로 인식하는 것을 확인할 수 있습니다.
Spring MVC 설정 파일
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!-- DispatcherServlet Context: defines this servlet's request-processing infrastructure -->
<context:component-scan base-package="com.demo.devfun"/>
<mvc:annotation-driven />
<mvc:default-servlet-handler/>
<!-- Handles HTTP GET requests for /resources/** by efficiently serving up static resources in the ${webappRoot}/resources directory -->
<mvc:resources mapping="/resources/**" location="/resources/" />
<!-- Resolves views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/views directory -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/"/>
<property name="suffix" value=".jsp"/>
</bean>
<!-- JSON 설정 -->
<bean id="jsonView" class="org.springframework.web.servlet.view.json.MappingJackson2JsonView">
<property name="contentType" value="text/html; charset=UTF-8"/>
</bean>
<bean id="beanNameViewResolver" class="org.springframework.web.servlet.view.BeanNameViewResolver">
<property name="order" value="0"/>
</bean>
</beans>
이 파일은 Spring MVC 애플리케이션의 설정 파일로서
컨텍스트 설정, Spring MVC 설정, 정적 리소스 핸들링, 뷰 리졸버 설정, JSON 설정을 합니다.
특히, @Controller 어노테이션이 붙은 클래스를 요청 처리 메서드로 사용하고,
정적 리소스를 기본 서블릿이 처리하도록 설정합니다.
package com.demo.devfun.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import java.time.ZonedDateTime;
import java.util.HashMap;
import java.util.Map;
@Controller
public class PingController {
@RequestMapping(value="/ping", produces = "application/json")
@ResponseBody
public Object healthCheck(){
Map<String, Object> map = new HashMap<>();
map.put("today", ZonedDateTime.now().getMonth() + ":" + ZonedDateTime.now().getDayOfMonth());
return map;
}
}
controller -> 클래스 생성[Ping Controller]
1. 클라이언트가 /ping 경로로 HTTP 요청을 보냅니다.
2. Spring MVC 프레임워크는 이 요청을
PingController 클래스의 healthCheck 메서드로 매핑합니다.
3. healthCheck 메서드는 현재 날짜를 포함하는 Map 객체를 생성합니다.
4. 이 Map 객체는 @ResponseBody 어노테이션에 의해 JSON 형식으로
변환되어 HTTP 응답으로 클라이언트에게 전송됩니다.
jetty 실행 설정
위와 같은 방법으로 실행시켜주면 됩니다.
터미널로 실행시킬 때는 'mvn clean package'와
mvn jetty:run을 실행시켜주면 됩니다.
실행 및 Ping Test
두둥탁..! 아니.. HTTP ERROR 503이 뜨는 겁니다.
그래서 처음부터 다시 고쳐봤는데도 아무래도 처음 접하는 것이다 보니
오류를 디버깅하는 것이 매우 힘들었습니다.
그 과정 속에서 찾았던 부분이 applicationContext-webapp.xml에서 경로를
잘못 지정해줬다는 것입니다.
'src/maiin/webapp/WEB-INF/' 경로에 xml이 존재하는 데
경로를 잘못 지정해줘서 에러가 발생했습니다.
다행히 성공적으로 출력되는 모습을 확인할 수 있었습니다.
아직까지 백엔드 개발은 처음이라 익히고 배워야할 부분이 많지만,
그래도 열심히 해보려고 합니다!
혹시 제가 틀린 부분이 있다거나, 피드백 해주실 분은
언제든 대환영입니다!
'개발 > 웹' 카테고리의 다른 글
[React] React를 사용해서 간단한 페이지 만들기 (0) | 2024.07.12 |
---|