1. pom.xml
Maven 은 자바 프로젝트의 빌드를 자동화해주는 빌드 툴이다. 즉, 자바 소스를 compile 하고 package 해서 deploy하는 일을 자동화 해주는 것이다.
Maven 은 settings.xml 과 pom.xml 두 가지 설정파일을 참조한다. settings.xml은 maven tool 자체에 관련된 설정을 담당한다. Maven 자체에 설정 값을 바꾸는 일은 잘 없으므로 우리가 주목해야 할 설정파일은 pom.xml이다. POM(Project Object Model)을 설정하는 파일인 pom.xml은 다시 말하자면 프로젝트 내 빌드 옵션을 설정하는 부분이다. pom.xml을 살펴보자.
webapp Maven 프로젝트를 설정했다면 <webapp></webapp>태그가 생성되었을 것이다. 각 태그가 의미하는 바를 알고 프로젝트 진행하는 것이 맞다고 생각하여 적어보았다.
<modelVersion> | maven의 pom.xml의 모델 버전 |
<groupId> | 프로젝트를 생성한 조직 또는 그룹명, 보통 URL의 역순으로 저장한다. |
<version> | 어플리케이션의 버전. 접미사로 SNAPSHOT이 붙으면 아직 개발단계라는 의미이다. |
<packaging> | jar, war, ear, pom 등 패키지 유형을 나타낸다. |
<name> | 프로젝트 명 |
<description> | 프로젝트 설명 |
<url> | 프로젝트를 찾을 수 있는 URL |
<properties> | pom.xml에서 중복해서 사용되는 설정(상수) 값들을 지정해 놓는 부분. 다른 위치에서 ${...}로 표기해서 사용할 수 있다. |
<profiles> | dev, prod 이런 식으로 나눠야할 필요가 있는 설정 값은 profiles로 설정한다. |
이렇게 Maven으로 생성된 프로젝트의 경우 자바 소스는 src/main/java폴더에 생성하고, 웹 앱과 관련된 html, css 등은 src/main/webapp폴더에 작성된다.
2. web.xml
<servlet>
<servlet-name>mvc</servlet-name>
<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>kr.or.connect.mvcexam.config.WebMvcContextConfiguration</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>mvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
DispatcherServlet이 오게되면, WebMvcContextConfiguration을 찾아주세요. AnnotationConfigWebApplication을 이용할 것입니다.
라는 뜻이다.
<context-param>
<param-name>contextClass</param-name>
<param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext
</param-value>
</context-param>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>kr.or.connect.guestbook.config.ApplicationConfig
</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
listener는 어떤 특정한 이벤트가 일어났을 때 동작하는 것이다.
ContextLoaderListener: Context가 로딩되는 이벤트가 일어났을 때, Context-param을 참조한다.
이 때, param-value에 쓰여있는 클래스 ApplicationConfig를 참조한다.
2-1. WebMvcConfig설정
WebMvcConfig 클래스: 기본적인 서블릿 설정을 하는 클래스 + (ViewResolver설정 가능)
- @Configuration: 자바 Annotation으로 이 클래스는 config 클래스라고 명시하는 기능
- @EnableWebMvc: 자바 Annotation으로 Spring Web Mvc 설정 클래스라고 명시. web mvc를 이용하는데 있어서 Spring Container가 가져야할 기본적인 mvc를 구축할 수 있는 configuration 환경을 제공해주는 것.
- InternalResourceViewResolver: 뷰 이름으로부터 JSP나 Tiles 연동을 위한 View 객체 리턴
해당 정의만 보고 이해했을 때는 'Configuration으로 config했는데, 왜 또 Spring Web Mvc 설정 어노테이션을 따로하는거지?' 하는 궁금증이 생겼었다. (Config가 하면 모든 web mvc 설정까지 config 되는 줄 알았다.) 이해를 쉽게 풀어쓰자면 '@Configuration'은 단지
"xml파일에서 여기가 바로 Config 파일이다! "하고 알려주는 역할, '@EnableWebMvc'는 "이제 여기서는 Web MVC 구축할 공장(Container) 필요합니다!"
이렇게 잘 역할을 분리해서 이해하는 것이 좋을 것 같다. 아래 코드는 이해를 돕기 위해 webapp 프로젝트에서 설정한 WebMvcContextConfiguration 파일이다.
package kr.or.connect.mvcboard.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
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.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import org.springframework.web.servlet.view.InternalResourceViewResolver;
@Configuration
@EnableWebMvc
@ComponentScan(basePackages= {"kr.or.connect.mvcboard.controller"})
public class WebMvcContextConfiguration extends WebMvcConfigurerAdapter{
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/assets/**").addResourceLocations("classpath:/META-INF/resources/webjars/").setCachePeriod(31556926);
registry.addResourceHandler("/css/**").addResourceLocations("/css/").setCachePeriod(31556926);
registry.addResourceHandler("/img/**").addResourceLocations("/img/").setCachePeriod(31556926);
registry.addResourceHandler("/js/**").addResourceLocations("/js/").setCachePeriod(31556926);
}
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
@Override
public void addViewControllers(final ViewControllerRegistry registry) {
System.out.println("addViewControllers가 호출됩니다. ");
registry.addViewController("/").setViewName("index");
}
@Bean
public InternalResourceViewResolver getInternalResourceViewResolver() {
InternalResourceViewResolver resolver = new InternalResourceViewResolver();
resolver.setPrefix("/WEB-INF/views/");
resolver.setSuffix(".jsp");
return resolver;
}
}
2-2. ApplicationConfig 설정
package kr.or.connect.mvcboard.config;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
@Configuration
@ComponentScan(basePackages = { "kr.or.connect.mvcboard.dao", "kr.or.connect.mvcboard.service"})
@Import({ DBConfig.class })
public class ApplicationConfig {
}
@ComponentScan 어노테이션은 Scan 범위를 저장할 수 있다. basePackages의 경우 괄호 안에 직접 패키지 경로를 직접 적어주어 스캔할 위치를 지정할 수 있다.
@import 어노테이션을 이용하면 하나의 @Configuration 클래스에서 다수의 @Configuration 클래스를 묶을 수 있다. 같은 환경에서 사용되는 빈 오브젝트들이더라도 서로 성격이 다른 오브젝트들의 구성정보와 분리 가능하다. 서로 성격이 다른 빈 오브젝트르 다른 Configuration 클래스에서 구성하고, 메인 Configuration 클래스(ApplicationConfig.java)에서 다른 Configuration 클래스들을 import 하는 것.
(상속의 방법과 static 변수사용등도 생각해보았지만, 짧은 지식으로 추측해본 결과 상속은 다중상속이 안되기 때문에 더 복잡해지고, static 변수를 사용하게 되면 유지보수관리측면에서 어마어마한 귀찮음이 예상된다.)
'웹 어플리케이션 공부 > Spring 공부' 카테고리의 다른 글
스프링 필터 (0) | 2022.01.23 |
---|---|
Spring으로 개발하며 맞닥뜨린 CORS! (1) | 2021.12.08 |
MongoDB 와 Spring 연동설정 (0) | 2020.05.05 |