servlet-context.xml, root-context.xml, web.xml 대신 Java로 Configuration하기
우선 제일 먼저 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를 추가해준다.