본문 바로가기

스프링

[Spring Boot -5] 스프링 부트가 개발자에게 직접적으로 주는 장점[3] root-context.xml

반응형

https://yuni-spring.tistory.com/42

 

[Spring Boot -4] 스프링 부트가 개발자에게 직접적으로 주는 장점[2] servlet-context.xml

https://yuni-spring.tistory.com/41 [Spring Boot -3]스프링 부트가 개발자에게 직접적으로 주는 장점[1] Web.xml https://yuni-spring.tistory.com/40 스프링 부트 톰캣은 어디서 실행될까? 이전 글인 스프링 부트 장점과

yuni-spring.tistory.com

 

이전 글을 참고하고 오면 더 좋습니다.


 

이전 글에서 root-context.xml 과 servlet-context.xml  의 각 하는 일에 대해 아래와 같이 작성하였다.

 

우선 servlet-context.xml은 웹 계층 (서블릿 콘텍스트)에 관한 스프링 빈 설정을 한다. (스프링 빈 설정이라는 뜻 ㅋㅋ)
그 외 db설정이나 전역적인 빈 설정을 root-context.xml 이 맡아서 한다

 

 

servlet-conmtext.xml 은 view와 관련된, root-context.xml 은 view와 관련되지 않은 나머지 설정

이라고 하면 더 편하게 생각 할 수 있다.

 

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:tx="http://www.springframework.org/schema/tx"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
    https://www.springframework.org/schema/beans/spring-beans.xsd
	http://www.springframework.org/schema/tx
    http://www.springframework.org/schema/tx/spring-tx-4.3.xsd">
	
	<!-- Root Context: defines shared resources visible to all other web components -->
		
		 
	<!-- 1.DBCP 사용을 위한 DataSource를 bean 등록 -->
	
	<bean id="realDataSource" class="org.apache.commons.dbcp2.BasicDataSource">
	
	<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" />
		<property name="url" value="jdbc:oracle:thin:@localhost:1521:xe"/>
		<property name="username" value="community"/>
		<property name="password" value="1234"/>

		
		<!-- 커넥션 풀 설정 -->
         <!-- 초기 커넥션 수, 기본 0 -->
		<property name="initialSize" value="10" />
        <!-- 최대 커넥션 수, 기본 8 -->
		<property name="maxTotal" value="50" />
        <!-- 유휴 상태로 존재할 수 있는 커넥션 최대 수, 기본 8 -->
		<property name="maxIdle" value="20" /> 
        <!-- 유휴 상태로 존재할 수 있는 커넥션 최소 수, 기본 0 -->
		<property name="minIdle" value="10" /> 
        <!-- 예외 발생 전 커넥션이 반환 될 떄 까지 대기하는 최대 시간(ms), 기본 -1(무기한) -->
		<property name="maxWaitMillis" value="-1" /> 

	
	</bean>
	
		<!-- 
		log4j를 이용한 SQL 로그 출력용 bean 생성
		* realDataSource를 이용해서 SQL 수행 내용, 결과를 출력하는 역할
		-> realDataSource를 대체하는 역할
	 	-->
	 <bean id="dataSource" class="net.sf.log4jdbc.Log4jdbcProxyDataSource">
	 	<constructor-arg ref="realDataSource" />
	 	
	 	<property name="logFormatter">
	 		<bean class="net.sf.log4jdbc.tools.Log4JdbcCustomFormatter">
	 			<property name="loggingType" value="MULTI_LINE"/>
	 			<property name="sqlPrefix" value="[SQL]" />
	 		</bean>
	 	</property>
	 </bean>

	
		<!-- Mybatis 관련 Bean 생성 -->
		
		<!--
        SqlSession : sql구문을 DB에 전달, 실행하는 객체 
		SqlSessionFactory : SqlSession을 만드는 객체 
				
        sqlSessionFactoryBean : mybatis 설정 파일(mybatis-config.xml)과
        Connection Pool 정보를 이용하여 SqlSessionFactory를 만드는 객체 
				
        sqlSessionTemplate : SqlSession 객체에 트랜잭션 처리 역할이 가능하도록 하는 객체 
        -->
	
		<!-- 마이바티스 SqlSession 등록하기 (xml 방식으로 bean 등록) -->
		<bean id="sqlSessionFactoryBean" class="org.mybatis.spring.SqlSessionFactoryBean">
			<!-- mybatis-config.xml 설정 불러오기 -->
			<property name="configLocation" value="classpath:mybatis-config.xml" />
			<property name="dataSource" ref="dataSource" />
		</bean>
	
		<!-- 
        SqlSessionTemplate : 기본 SQL 실행 + 
        트랜잭션 관리 역할을 하는 SqlSession을 생성할 수 있게 하는 객체
        (Spring bean으로 등록해야함.) 
        -->
		<bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
			<constructor-arg ref="sqlSessionFactoryBean" />
		</bean>
	
		<!-- 스프링에서 사용하는 proxy를 이용한 트랜잭션 제어가 안될 경우
        추가적인 트랜잭션 매니저를 추가해서 문제 해결 -->
		<bean id="transactionManager"
        class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
			<property name="dataSource" ref="dataSource" />
		</bean>
		
		
		<!--
        파일 업로드를 위한 MutipartResolver 구현체 CommonsMultipartResolver bean 등록 
        -> CommonsMultipartResolver를 bean으로 등록하면
            multipart/form-data 형식으로 요청 시  
            input type="file" 태그를 자동적으로 인식하여 
            MultipartFile 객체로 반환하고
            파일 외의 데이터(정수, 문자열 등의 텍스트 데이터)는 기존처럼 사용 가능
            (MultipartRequest 필요 없음)
		-->
		<bean id="multipartResolver" 
        class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
		 <property name="maxUploadSize" value="104857600"/>
		 <property name="maxUploadSizePerFile" value="104857600"/>
		 <property name="maxInMemorySize" value="104857600"/>
		</bean>
        
	<!-- 
		maxUploadSize 
			: 한 요청당 업로드가 허용되는 최대 용량을 바이트 단위로 설정.
			-1 은 제한이 없다는 뜻으로 이 프로퍼티를 지정하지 않을때 기본값.
		
		maxUploadSizePerFile
		 : 한 파일당 업로드가 허용되는 최대 용량을 바이트 단위로 설정.
			-1 은 제한이 없다는 뜻으로 이 프로퍼티를 지정하지 않을때 기본값.
			
		maxInMemorySize 
			: 디스크에 저장하지 않고 메모리에 유지하도록 
			허용하는 바이트 단위의 최대 용량을 설정.
			
	 		사이즈가 이보다 클 경우 이 사이즈 이상의 데이터는 파일에 저장됩니다. 
			 기본값은 10240 바이트.
	 -->	
</beans>

 

 

db연결, log4j, mybatis, fileUpload 설정과 같은 view와 관련없는 설정을 맡고있다.

 

스프링 부트에서 위와 같은 설정을 적용한다면

build.gradle 에 dependency 추가하고

implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:2.2.0'

 

 

application.properties 에 db 소스와 mybatis 연결코드 작성 

spring.datasource.url=jdbc:mysql://localhost:3306/mydb?useSSL=false&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=my-password
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver 

mybatis.config-location=classpath:mybatis/mybatis-config.xml

# 파일 업로드 설정
spring.servlet.multipart.max-file-size=100MB
spring.servlet.multipart.max-request-size=100MB

 

sessionFactory, sessionTemplate 설정은 외부라이브러리 또는 내장 클래스를 Bean으로 등록하고자 할 경우 사용하는 @Configuration

붙여주고 작성

 

 

@Configuration
public class MybatisConfig {

// sqlSessionFactory
    @Bean
    public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
        SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
        sqlSessionFactoryBean.setDataSource(dataSource);
        sqlSessionFactoryBean.setConfigLocation(new ClassPathResource("mybatis/mybatis-config.xml"));
        
        return sqlSessionFactoryBean.getObject();
    }
// sqlSessionTemplate
 @Bean
    public SqlSessionTemplate sqlSessionTemplate(SqlSessionFactory sqlSessionFactory) {
        return new SqlSessionTemplate(sqlSessionFactory);
    }

}

 

트랜잭션 관리는.. 위 클래스에서 아래와 같이 코드를 추가해주면 된다고 한다.

그런데 스프링 부트에서 @Transaction 어노테이션을 사용하면 일반적으로

PlatformTransactionManager 라는 class를 불러서 사용한다고 한다.

 

특정 트랜잭션 관리 전략이 있거나, 여러 개의 db를 각각의 별도 트랜잭션 관리를 한다면 따로 아래와 같이 작업하고

일반적으로는 어노테이션만 사용하는 것 같다.

@Bean
    public PlatformTransactionManager transactionManager(DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }

 

막상 파고들면 class마다 config들을 잡아주긴 해야겠지만

xml 파일에 태그 맞춰가며 작성하는 것보다 훨씬 편하고, 간결한 장점이 있는 것 같다.

 

사실 mybatis 를 사용하는 스프링 부트보다 JPA를 사용하는 스프링 부트 프로젝트를 더 많이 경험해서 그런지

sessionFactory 같은 설정을 너무 오랜만에 보긴 한다.

 

어떤 식으로 레거시와 부트의 차이가 있는지 비교해보기 위해 알아봤지만..글쎄.. 너무 깊게 파고들 이유는 없을 것 같다.

 

 

이렇게 최종적으로 스프링 레거시 프로젝트의 기본 설정을 부트에서는 어떻게 잡아주는지, 장점이 뭔지 공부해봤다.

 

다음 글부터는 내가 생각했던 토이 프로젝트를 준비하고, 준비가 완료되는대로 포스팅할 예정이다.

 

 

반응형