👩‍🏫 Study/스프링레거시 강의

servlet-context.xml, root-context.xml, web.xml 대신 Java로 Configuration하기

개발진스 2023. 10. 20. 01:47
728x90

우선 제일 먼저 web.xml 파일을 삭제하고 pom.xml 파일에 web.xml파일을 사용하지 않겠다고 지정한다.

plugin부분에 아래 내용을 추가한다

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-war-plugin</artifactId>
    <version>3.2.0</version>
    <configuration>
    <failOnMissingWebXml>false</failOnMissingWebXml>
    </configuration>
</plugin>

 

web.xml을 대신할 자바 파일 생성해보자

스프링에서 가장 처음 제공하는 파일이 있는데 AbstractAnnotationConfigDispatcherServletInitializer이다. 이 클래스를 상속받아서 web.xml을 대신할 자바를 만들 수 있다.

 

WebConfig.java

package kr.board.config;

import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;

public class WebConfig extends AbstractAnnotationConfigDispatcherServletInitializer{

	@Override
	protected Class<?>[] getRootConfigClasses() {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	protected Class<?>[] getServletConfigClasses() {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	protected String[] getServletMappings() {
		// TODO Auto-generated method stub
		return null;
	}
	
}

WebConfig.java의 메소드를 완성시켜보자

 

WebConfig.java

	@Override
	protected Class<?>[] getRootConfigClasses() {
		return new Class[] { RootConfig.class };
	}

	@Override
	protected Class<?>[] getServletConfigClasses() {
		return new Class[] { ServletConfig.class };
	}

	@Override
	protected String[] getServletMappings() {
		return new String[] { "/" };
	}
	
	@Override
	protected Filter[] getServletFilters() {
		CharacterEncodingFilter encodingFilter = new CharacterEncodingFilter();
		encodingFilter.setEncoding("UTF-8");
		encodingFilter.setForceEncoding(true);
		
		return new Filter[]{encodingFilter};
	}

 

web.xml은 스프링이 시작하면서 제일 먼저 시작이되기 때문에 WebConfig.java에 있는 메소드들을 실행시킨다.

servlet-context.xml과 root-context.xml도 자바 파일로 변경해서 xml에서 하던 작업들을 작성해보자

 

우선 spring 폴더를 모두 지워준다.

 

servlet-context.xml파일을 ServletConfig라는 자바 파일을 만들어서 작성해보자.

우선 어노테이션으로 @Configuration, @EnableWebMvc, @ComponentScan(basePackages = {"kr.board.controller"})를 입력해준다.

// servlet-context.xml
@Configuration
@EnableWebMvc
@ComponentScan(basePackages = {"kr.board.controller"})
public class ServletConfig implements WebMvcConfigurer{

	@Override
	public void addResourceHandlers(ResourceHandlerRegistry registry) {
		// TODO Auto-generated method stub
		WebMvcConfigurer.super.addResourceHandlers(registry);
	}

	@Override
	public void configureViewResolvers(ViewResolverRegistry registry) {
		// TODO Auto-generated method stub
		WebMvcConfigurer.super.configureViewResolvers(registry);
	}
	
}

그리고 ResourceHandlerRegistry와 ViewResolverRegistry를 override해준다.

 

원래 servlet-context.xml에 있던 resource와 viewResolver를 메소드로 작성해주는 것이다.

메소드 내용을 채워보자

 

// servlet-context.xml
@Configuration
@EnableWebMvc
@ComponentScan(basePackages = {"kr.board.controller"})
public class ServletConfig implements WebMvcConfigurer{

	@Override
	public void addResourceHandlers(ResourceHandlerRegistry registry) {
		registry.addResourceHandler("/resources/**").addResourceLocations("/resources/");		
	}

	@Override
	public void configureViewResolvers(ViewResolverRegistry registry) {
		InternalResourceViewResolver bean=new InternalResourceViewResolver();
		bean.setPrefix("/WEB-INF/views/");
		bean.setSuffix(".jsp");
		registry.viewResolver(bean);
	}
	
}

 

이번엔 root-context.xml을 RootConfig 자바파일로 만들어보자

@Configuration
@MapperScan(basePackages = {"kr.board.mapper"})
@PropertySource({"classpath:persistence-mysql.properties"})
public class RootConfig {
     
	@Autowired
	private Environment env;
	
	@Bean
	public DataSource myDataSource() {
		HikariConfig hikariConfig=new HikariConfig();
		hikariConfig.setDriverClassName(env.getProperty("jdbc.driver"));
		hikariConfig.setJdbcUrl(env.getProperty("jdbc.url"));
		hikariConfig.setUsername(env.getProperty("jdbc.user"));
		hikariConfig.setPassword(env.getProperty("jdbc.password"));
		
		HikariDataSource myDataSource=new HikariDataSource(hikariConfig);
		return myDataSource;
	}
	
	// 커넥션풀을 만들어줌
	@Bean
	public SqlSessionFactory sessionFactory() throws Exception{
	  SqlSessionFactoryBean sessionFactory=new SqlSessionFactoryBean();
	  sessionFactory.setDataSource(myDataSource());
	  return (SqlSessionFactory)sessionFactory.getObject();
	}
	
}

 

root-context.xml에서 DB에 관련된 설정들을 다시 자바 파일로 만들어준다.

 

 

+ Spring Security 를 자바기반으로 환경설정하기

 

우선 pom.xml에 dependency를 추가한다.

<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-web</artifactId>
    <version>${org.springsecurity-version}</version>
</dependency>
<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-config</artifactId>
    <version>${org.springsecurity-version}</version>
</dependency>
<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-taglibs</artifactId>
    <version>${org.springsecurity-version}</version>
</dependency>

그리고 pom.xml 상단에 springframework-version 아래에

<org.springsecurity-version>5.0.2.RELEASE</org.springsecurity-version>

를 추가해준다

 

 

Spring Security 동작 클래스 만들기

 

AbstractSecurityWebApplicationInitializer클래스를 상속하여 SecurityInitializer를 생성한다

내부적으로 DelegatingFilterProxy를 스프링에 등록하여 스프링 시큐리티를 내부적으로 동작시킨다

 

package kr.board.config;

import org.springframework.security.web.context.AbstractSecurityWebApplicationInitializer;

public class SecurityInitializer extends AbstractSecurityWebApplicationInitializer {

}

 

 

Spring Security 환경설정파일 만들기

 

WebSecurityConfigurerAdapter클래스를 상속하여 SecurityConfig객체를 생성한다

  • @EnableWebSecurity는 스프링MVC와 스프링 시큐리티를 결합하는 클래스이다
  • configure() 메서드를 Override하고 관련 설정을 한다

 

package kr.board.config;

import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;

public class SecurityConfig extends WebSecurityConfigurerAdapter {

}

 

SecurityConfig자바파일을 만들고 WebSecurityConfigurerAdapter 클래스를 extends를 해준다.

 

configure(HttpSecurity http)를 오버라이딩 해준다.

 

 

WebConfig 클래스에 등록하기

 

등록이 다 완료되면 WebConfig에 추가를 해줘야한다.

getRootConfigClasses 리턴 값에 SecurityConfig.class를 추가해준다.

 

 

 

 

 

 

 

 

728x90