https://yuni-spring.tistory.com/42
이전 글을 참고하고 오면 더 좋습니다.
이전 글에서 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 같은 설정을 너무 오랜만에 보긴 한다.
어떤 식으로 레거시와 부트의 차이가 있는지 비교해보기 위해 알아봤지만..글쎄.. 너무 깊게 파고들 이유는 없을 것 같다.
이렇게 최종적으로 스프링 레거시 프로젝트의 기본 설정을 부트에서는 어떻게 잡아주는지, 장점이 뭔지 공부해봤다.
다음 글부터는 내가 생각했던 토이 프로젝트를 준비하고, 준비가 완료되는대로 포스팅할 예정이다.
'스프링' 카테고리의 다른 글
[SPRING] JPA는 현업에서 많이 쓰일까 ? (1) | 2024.11.16 |
---|---|
[인텔리제이] 프로젝트 세팅이 귀찮을 때 꿀팁 방출 : 프로젝트 복사 쉽게하는 법 (1) | 2024.10.16 |
[Spring Boot -4] 스프링 부트가 개발자에게 직접적으로 주는 장점[2] servlet-context.xml (0) | 2024.04.05 |
[Spring Boot -3]스프링 부트가 개발자에게 직접적으로 주는 장점[1] Web.xml (0) | 2024.03.27 |
[Spring Boot -2]스프링 부트 톰캣은 어디서 실행될까? (0) | 2024.03.26 |