본문 바로가기

웹 어플리케이션 공부/Spring 공부

Spring 공부 - 초기 설정

반응형

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