Spring, spring-boot의 mvc 다양한 설정 설명

web/Spring|2018. 6. 3. 11:18

Spring에서 사용하는 다양한 설정이 존재한다.


그 설정들에 대한 정리가 필요할 것같아서 한번 정리해 보았다.


※ 스프링 MVC 사용을위한 설정

- 기존에 스프링 MVC 설정을 위해서 xml 파일에 다음과 같이 설정하였다.

<mvc:annotation-driven/>


하지만 대부분의 설정이 xml에서 java로 변경하는 추세에서는 다음과 같이 설정한다.

1
2
3
4
5
@Configuration
@EnableWebMvc
public class WebConfig {
 
}
cs

여기서 추가적인 기본 설정들을 커서텀하고 싶을 경우 WebMvcConfigurerAdapter 추상클래스를 상속받아 재정의하여 사용했다.

1
2
3
4
5
@Configuration
@EnableWebMvc
public class WebConfig extends WebMvcConfigurerAdapter {
 
}
cs


하지만 spring5에서는 WebMvcConfigurerAdapter를 사용하지 않는다. 

대신 WebMvcConfigurer 인터페이스를 사용한다.


그 이유는 WebMvcConfigurerAdaper에 경우 추상클래스였기에 필요치 않은 메서드도 구현을 해야했지만 java8에서는 디폴트 메서드가 생기면서 그럴필요가 없어졌기 때문이다.

Deprecated. 
as of 5.0 WebMvcConfigurer has default methods (made possible by a Java 8 baseline) and can be implemented directly without the need for this adapter


그렇기 때문에 몇가지 문법 사용에 변경되었는데 그중에 내가 사용하는 부분중에서는 intercepter설정과 MessageConverter설정이 변경되었다.

기존에는 다음과같이 사용했다.

1
2
3
4
5
6
7
8
9
10
11
12
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
    converters.add(converter());
    super.configureMessageConverters(converters);
}
 
@Override
public void addInterceptors(InterceptorRegistry registry) {
    // Always Interceptor
    registry.addInterceptor(alwaysInterceptor()).addPathPatterns("/**").excludePathPatterns("/weather");
    super.addInterceptors(registry);
}
cs



하지만 webMvcConfigurer 인터페이스를 사용하면 다음과 같이 사용하면 된다.

1
2
3
4
5
6
7
8
9
10
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
    converters.add(converter());
}
 
@Override
public void addInterceptors(InterceptorRegistry registry) {
    // Always Interceptor
    registry.addInterceptor(alwaysInterceptor()).addPathPatterns("/**").excludePathPatterns("/weather");
}
cs



그리고 설정에서 사용하는 @EnableMvc 과연 이놈은 무슨놈일까 궁금했다. 이놈은 Spring-Boot 에서는 굳이 사용할 필요가 없다고 하는데 왜일까?


@EnableMvc 애노테이션을 붙히게 되면 WebMvcConfigurationSupport 클래스가 자동으로 빈으로 등록이된다.

이 클래스는 Mvc Java Config 설정에서 설정을 제공하는 주요 클래스이다. 그렇기 때문에 기본적이 웹 설정을 제외한 handler 등등의 설정을 진행하기 위해서는 해당 설정이 필요하다.

spring-boot에서는 기본적으로 클래스패스에 웹관련 설정이 있을경우 WebMvcAutoConfiguration 클래스를 동작하여 기본적인 설정을 진행해준다.


하지만 커스텀을 진행하려고 한다면 무조건 @EnableWebMvc 애노테이션을 붙혀주거나 WebMvcConfigurationSupport를 상속받아야한다. 왜냐면 WebMvcConfigurationSupport클래스는 WebMvcAutoConfiguration 클래스가 동작하지 않을때만 동작하기 때문이다.


이렇게 spring mvc 설정에 관련된 클래스들에 대해 알아보았다.


평소에 정리가 되지않아 헷갈렸는데 정리가 되어서 기분이좋다.






댓글()

스프링 프레임워크의 기본적인 구성

web/Spring|2016. 12. 21. 22:22

1. VO 객체
-> 데이터를 담을 객체를 생성

public class BoardVO { 

private Integer bno; 
private String title; 
private String content; 
private String writer; 
private Date regdate; 
private int viewcnt; 

public Integer getBno() { 
return bno; 

public void setBno(Integer bno) { 
this.bno = bno; 

public String getTitle() { 
return title; 

public void setTitle(String title) { 
this.title = title; 

public String getContent() { 
return content; 

public void setContent(String content) { 
this.content = content; 

public String getWriter() { 
return writer; 

public void setWriter(String writer) { 
this.writer = writer; 

public Date getRegdate() { 
return regdate; 

public void setRegdate(Date regdate) { 
this.regdate = regdate; 

public int getViewcnt() { 
return viewcnt; 

public void setViewcnt(int viewcnt) { 
this.viewcnt = viewcnt; 
}

2. DAO 인터페이스
public interface BoardDAO { 

public void create(BoardVO vo) throws Exception; 

public BoardVO read(Integer bno) throws Exception; 

public void update(BoardVO vo) throws Exception; 

public void delete(Integer bno) throws Exception; 

public List<BoardVO> listAll() throws Exception; 


3. DAO 구현 클래스
@Repository 
public class BoardDAOImpl implements BoardDAO { 

@Inject 
private SqlSession session; 

private static String namespace="org.zerock.mapper.BoardMapper"; 

@Override 
public void create(BoardVO vo) throws Exception { 
session.insert(namespace+".create", vo); 


@Override 
public BoardVO read(Integer bno) throws Exception { 
return session.selectOne(namespace+".read", bno); 


@Override 
public void update(BoardVO vo) throws Exception { 
session.update(namespace +".update", vo); 


@Override 
public void delete(Integer bno) throws Exception { 
session.delete(namespace+".delete",bno); 


@Override 
public List<BoardVO> listAll() throws Exception { 
return session.selectList(namespace + ".listAll"); 


}

4. 데이터베이스에 사용할 쿼리를 정리한 mapper xml파일
<mapper namespace="org.zerock.mapper.BoardMapper"> 

<insert id="create"> 
insert into tbl_board(title, content, writer) 
values(#{title}, #{content}, #{writer}) 
</insert> 

<select id="read" resultType="org.zerock.domain.BoardVO"> 
select 
bno, title, content, writer, 
regdate, viewcnt 
from 
tbl_board 
where bno = #{bno} 
</select> 

<update id="update"> 
update tbl_board set title=#{title}, content=#{content} 
where bno=#{bno} 
</update> 

<delete id="delete"> 
delete from tbl_board where bno= #{bno} 
</delete> 

<select id="listAll" resultType="org.zerock.domain.BoardVO"> 
<![CDATA[ 
select  
bno, title, content, writer, regdate, viewcnt 
from  
tbl_board 
where bno > 0 
order by bno desc, regdate desc 
]]> 
</select> 
</mapper>

5. root-context.xml
-> Bean 관리

<!-- 스프링에 빈으로 등록하기, 패키지 자동인식 --> 
<context:component-scan base-package="org.zerock.persistence"></context:component-scan> 

<bean id="dataSource" 
class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
<property name="driverClassName" value="net.sf.log4jdbc.sql.jdbcapi.DriverSpy"></property> 
<property name="url" 
value="jdbc:log4jdbc:mysql://192.168.25.57:3306/book_ex"></property> 
<property name="username" value="root"></property> 
<property name="password" value="ddd00"></property> 
</bean> 

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> 
<property name="dataSource" ref="dataSource"/> 
<property name="configLocation" value="classpath:/mybatis-config.xml"></property> 
<property name="mapperLocations" value="classpath:mapper/**/*Mapper.xml"></property> 
</bean> 

<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate" destroy-method="clearCache"> 
<constructor-arg name="sqlSessionFactory" ref="sqlSessionFactory"></constructor-arg> 
</bean> 
</beans>

6. 테스트 클래스
@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations = { "file:src/main/webapp/WEB-INF/spring/**/*.xml"}) 
public class BoardDAOTest { 
private static final Logger logger= LoggerFactory.getLogger(BoardDAOTest.class); 

@Inject //BoardDAO에 대한 의존성 주입 
private BoardDAO dao; 

@Test // 글 생성 테스트 
public void testCreate() throws Exception { 
BoardVO board = new BoardVO(); 
board.setTitle("input the new Text"); 
board.setContent("input the new Text Content"); 
board.setWriter("user00"); 
dao.create(board); 


@Test 
public void testRead() throws Exception { 
logger.info(dao.read(1).toString()); 


@Test 
public void testUpdate() throws Exception { 
BoardVO board = new BoardVO(); 
board.setBno(1); 
board.setTitle("Update Title"); 
board.setContent("Update Content"); 
dao.update(board); 


@Test 
public void testDelete() throws Exception { 
dao.delete(1); 
}

출처 
남가람북스
코드로 배우는 스프링 웹 프레임워크

'web > Spring' 카테고리의 다른 글

STS의 github 연동  (0) 2016.12.21
Mybatis의 #{} 문법 사용방법  (0) 2016.12.21
Spring의 UTF-8 처리 필터 등록  (0) 2016.12.21
스프링 프레임워크의 기본적인 구성  (0) 2016.12.21
Mybatis 관련 정리  (0) 2016.12.21
typeAliases 사용방법  (0) 2016.12.21

댓글()