-
Spring MVC 기본 설정 02 - Annotation을 이용한 Spring mvc ConfigJava/Spring 2018. 12. 19. 14:35
Spring mvc 프로젝트를 구성할때 제일 많이 사용하는 설정 방식은 xml을 이용한 방식이다.
xml을 이용하는 방식은 널리 퍼져있어서 검색하기에는 좋지만 내가 보기엔 가독성이 떨어지고 이해하기가 힘든 구석이 있어보인다.
java annotation을 이용해 spring mvc 를 설정하는 방식을 공부하고 적용해가면서 기록을 남기려고 한다.
기본적인 dependency는 이전글(클릭) 에서 추가했다는 가정하에 진행하고자 한다.
모든 config 관련 class들은 {기본 패키기}.config 라는 패키지에 생성하도록 한다.
1. WebMvcConfig 설정
WebMvcConfig 클래스는 기본적인 서블릿 설정을 하는 클래스라고 생각하면 된다.
ViewResolver 설정을 여기서 할 수있다.
@Configuration annotation으로 이 클래스는 config 클래스라고 명시를 해준다.
@EnableWebMvc annotation으로 Spring Web Mvc 설정 클래스라고 명시를 해준다.
@ComponentScan으로 후에 @Autowired 로 자동으로 DI가 될 수 있는 component들의 기본 경로를 설정한다.
1234567891011121314151617181920212223242526package com.pang.pangs_spring_mvc.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.EnableWebMvc;import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;import org.springframework.web.servlet.view.InternalResourceViewResolver;import org.springframework.web.servlet.view.JstlView;@Configuration@EnableWebMvc@ComponentScan(basePackages = { "com.pang.springdemo" })public class WebMvcConfig implements WebMvcConfigurer {// View resolver 설정@Beanpublic InternalResourceViewResolver resolver() {InternalResourceViewResolver resolver = new InternalResourceViewResolver();resolver.setViewClass(JstlView.class);resolver.setPrefix("/WEB-INF/views/");resolver.setSuffix(".jsp");return resolver;}}cs 2. HibernateConfig 설정
2.1. application.properties에 database 접속 정보 및 hibernate 설정 값 입력
Spring orm 매핑으로 hibernate를 사용할 거니 hibernate 설정 파일을 작성한다.
src/main/resources 폴더를 생성하고 application.properties 라는 파일을 생성한다.
application.properties 파일에는 프로젝트 설정 값들을 입력해놓고 입력한 설정 정보를 설정 클래스에서 접근해서 사용한다.
이렇게 설정 정보를 파일로 빼놓는 이유는 소스를 공개할때 민감한 정보는 공개하지 않기 위한 이유도 있고
만약설정 정보가 바뀌었을때 손 쉽게 설정값만 변경하면 되니 유지보수적인 측면에서도 이유가 된다.
12345678910111213141516171819202122## JDBC connection properties#jdbc.driver=com.mysql.cj.jdbc.Driverjdbc.url=jdbc:mysql://{mysql url}/{schema_name}?allowPublicKeyRetrieval=true&useSSL=false&serverTimezone=UTCjdbc.user={userName}jdbc.password={password}## Connection pool properties#connection.pool.initialPoolSize=5connection.pool.minPoolSize=5connection.pool.maxPoolSize=20connection.pool.maxIdleTime=3000## Hibernate properties#hibernate.dialect=org.hibernate.dialect.MySQLDialecthibernate.show_sql=truehibernate.packagesToScan={기본패키지}.entitycs 2.2 HibernateConfig class 설정
2.1 단계에서 입력한 디비 정보를 입력하는 config class를 생성한다.
클래스 명을 HibernateConfig 로 생성했다.
Connection pool 을 생성하고 hibernate 설정과 sessionfactory 설정 transaction 설정을 했다.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117package com.pang.pangs_spring_mvc.config;import java.beans.PropertyVetoException;import java.util.Properties;import java.util.logging.Logger;import javax.sql.DataSource;import org.hibernate.SessionFactory;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.ComponentScan;import org.springframework.context.annotation.ComponentScans;import org.springframework.context.annotation.Configuration;import org.springframework.context.annotation.PropertySource;import org.springframework.core.env.Environment;import org.springframework.orm.hibernate5.HibernateTransactionManager;import org.springframework.orm.hibernate5.LocalSessionFactoryBean;import org.springframework.transaction.annotation.EnableTransactionManagement;import com.mchange.v2.c3p0.ComboPooledDataSource;@Configuration@EnableTransactionManagement@ComponentScans(value = { @ComponentScan("com.pang.pangs_spring_mvc")})@PropertySource({ "classpath:application.properties" })public class HibernateConfig {@Autowiredprivate Environment env;private Logger logger = Logger.getLogger(getClass().getName());@Beanpublic DataSource myDataSource() {// Connection Pool을 생성한다.ComboPooledDataSource myDataSource = new ComboPooledDataSource();// jdbc driver 설정을 한다.try {myDataSource.setDriverClass("com.mysql.jdbc.Driver");}catch (PropertyVetoException exc) {throw new RuntimeException(exc);}// 연결정보가 옳바른지 로그를 남긴다.logger.info("jdbc.url=" + env.getProperty("jdbc.url"));logger.info("jdbc.user=" + env.getProperty("jdbc.user"));// database connection props 설정.myDataSource.setJdbcUrl(env.getProperty("jdbc.url"));myDataSource.setUser(env.getProperty("jdbc.user"));myDataSource.setPassword(env.getProperty("jdbc.password"));// connection pool props 설정.myDataSource.setInitialPoolSize(getIntProperty("connection.pool.initialPoolSize"));myDataSource.setMinPoolSize(getIntProperty("connection.pool.minPoolSize"));myDataSource.setMaxPoolSize(getIntProperty("connection.pool.maxPoolSize"));myDataSource.setMaxIdleTime(getIntProperty("connection.pool.maxIdleTime"));return myDataSource;}private Properties getHibernateProperties() {// hibernate properties 설Properties props = new Properties();props.setProperty("hibernate.dialect", env.getProperty("hibernate.dialect"));props.setProperty("hibernate.show_sql", env.getProperty("hibernate.show_sql"));return props;}// need a helper method// read environment property and convert to intprivate int getIntProperty(String propName) {String propVal = env.getProperty(propName);// now convert to intint intPropVal = Integer.parseInt(propVal);return intPropVal;}@Beanpublic LocalSessionFactoryBean sessionFactory(){// create session factory beanLocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();// set the propertiessessionFactory.setDataSource(myDataSource());sessionFactory.setPackagesToScan(env.getProperty("hibernate.packagesToScan"));sessionFactory.setHibernateProperties(getHibernateProperties());return sessionFactory;}@Bean@Autowiredpublic HibernateTransactionManager transactionManager(SessionFactory sessionFactory) {// setup transaction manager based on session factoryHibernateTransactionManager txManager = new HibernateTransactionManager();txManager.setSessionFactory(sessionFactory);return txManager;}}cs 3. AppInitializer 클래스 설정
위의 단계에서 설정한 config 클래스를 합치는 작업을 해야한다.
이름도 매우긴 AbstractAnnotationConfigDispatcherServletInitializer 클래스를 상속받아 마지막 설정 클래스를 완성한다.
12345678910111213141516171819202122package com.pang.pangs_spring_mvc.config;import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;public class AppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {@Overrideprotected Class<?>[] getRootConfigClasses() {return new Class[] { HibernateConfig.class };}@Overrideprotected Class<?>[] getServletConfigClasses() {return new Class[] { WebMvcConfig.class };}@Overrideprotected String[] getServletMappings() {return new String[] {"/"};}}cs 4. 설정 완료 및 테스트
Spring MVC 설정을 완료했다.
HomeController 와 index.jsp 를 만들어서 프로젝트가 정상적으로 돌아가는지 확인 해보자.
설정이 하나라도 잘못 됐다면 빌드하는 도중에 에러가 나올 것이다.
404가 발생한다면 component scan 에서 옳바른 패키지 명을 입력했는지 확인해보고 그래도 안될경우
tomcat의 context 를 확인해봐야한다.
500 에러가 발생한다면 db 정보를 확인해 봐야 알 수 있을 것이다.
5. Github 주소
git 주소를 첨부하니 자세한 소스는 clone 으로 받아서 확인해보면 좋을듯 하다.
https://github.com/euihyunHwang/spring-mvc-starter.git
'Java > Spring' 카테고리의 다른 글
[Maven] - Mac OS에 Maven 설치하기 (mvn : command not found 해결하기) (0) 2019.01.09 Spring REST API 프로젝트 공부 - 01 (0) 2018.12.21 Spring MVC 기본 설정 01 - 기본적인 pom.xml dependency 목록 (0) 2018.12.19 Spring Boot 로 만드는 Upload와 Download Rest API - JPA - Hibernate 연결하기 (0) 2018.12.18 Spring Boot 로 만드는 Upload와 Download Rest API 예제-05 (4) 2018.12.17 댓글