요르딩딩
context-*.xml 에 대해 알아보자 (1) 본문
context-common.xml
<context:component-scan base-package="com.A.B.C">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Service"/>
=> component-scan 빈으로 등록 될 준비를 마친 클래스들을 스캔하여, 빈으로 등록해주는 것.
(@Controller, @Service, @Component, @Repository 어노테이션을 붙인 클래스들이 빈으로 등록 될 준비를 한 것이다.)
=> base-package는 패키지를 어디부터 스캔할지 지정해주는 부분.
(base package 기준으로 클래스들을 스캔하여 빈으로 등록)
=> stereotype은 간략히 말해, 고정된 또는 일반적인 패턴을 의미.
=> exclude-filter는 @Controller 를 제외하고 싶을때 사용
use-default="false"는 기본 어노테이션 @Controller, @Component @Service등을 스캔하지 않음.
include-filter은 기본 어노테이션을 스캔하지 않는다고 설정하고, include-filter를 통해서 특정 어노테이션만 스캔할 수 있음
<bean id="AAA" class="org.jasypt.encryption.pbe.config.EnvironmentStringPBEConfig">
<property name="algorithm" value="PBEWithMD5AndDES" />
<property name="passwordEnvName" value="APP_ENCRYPTION_PASSWORD" />
=> algorithm 암/복호화 알고리즘이다. 암호화 할 때 쓴 알고리즘 이름을 넣어야 함.
=> passwordEnvName 환경변수로 지정한 키 값
프로젝트가 서버에 올라와 있다면 환경변수명을 value값과 같게 생성하고,
값에는 password 값을 넣어주고 난 뒤 Tomcat을 재시작하면 정상적으로 동작하는 것을 확인 할 수 있습니다.
주의할 점은 Eclipse에서는 윈도우의 환경변수를 읽어오지 못한다는 것입니다.
아래와 같이 해줘야 Eclipse에서 환경변수를 읽어오는 것이 가능해집니다.
Run - Run Configurations - 현재 사용중인 Tomcat 선택 - Environment탭 클릭 - 환경변수 추가
참고:https://its-easy.tistory.com/16
<bean id="BBB" class="org.jasypt.encryption.pbe.StandardPBEStringEncryptor">
<property name="config" ref="AAA" />
<property name="password" value="AAAAAA" />
=> StandardPBEStringEncryptor PBEEncryptor를 상속받는 다른 클래스도 사용
<bean id="propertyCofigAAAAA" class="org.jasypt.spring31.properties.EncryptablePropertyPlaceholderConfigurer">
<constructor-arg ref="BBB" />
<property name="locations">
<list>
<value>classpath:/conf/globals.properties</value>
<value>classpath:/conf/jdbc.properties</value>
=> 1. PropertyPlaceholderConfigurer를 이용한 properties 파일 읽어오기
=> 암호화 된 값들이 있는 .properties 파일의 위치를 설정
<util:properties id="AAAProperties" location="classpath:/conf/globals.properties"/>
=> 2 <util:properties/>를 이용한 properties 파일 읽어오기
=> 읽어드릴 properties id를 정하고, 위치를 입력
context-datasource.xml
<bean id="dataSourceAAA" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
=> BasicDataSource를 Bean으로 등록합니다.
=> datasource란 JDBC는 명세의 일부분이면서 일반화된 연결 팩토리입니다.
DB와 관계된 Connection 정보를 담고 있으며, Bean으로 등록하여 인자로 넘겨줍니다. Spring은 Datasource로 DB와의 연결을 합니다.
=> properties를 읽어서 값을 가져올 때 # 과 $ 방식이 있는데, Jasypt를 사용하면 $ 방식을 사용해야 합니다.
destroy-method속성을 하지 않더라도 DBCP connection close 처리를 해주고 있었다. default 처리
출처: https://one0.tistory.com/15 [ONE.0의 공부노트], https://gmlwjd9405.github.io/2018/05/15/setting-for-db-programming.html
context-mapper.xml
SqlSessionFactory
<bean id="sqlSessionFactoryAAA" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSourceAAA" />
<property name="configLocation" value="classpath:/mapper/config/sql-mapper-AAAconfig.xml" />
<property name="mapperLocations" value="classpath:/mapper/AAA/*.xml" />
Database Connection Pool(DBCP)
: JDBC를 통하여 DB에 연결할 경우, 매번 드라이버를 로드하고 Connection 객체를 가져와야하는데 매우 비효율적이다.
이를 해소하기 위해 웹 컨테이너가 실행되면서 DB와 연결된 Connection 객체를 미리 Pool에 생성해두고 필요할 때에 가져다쓰고 반환한다.
DB의 부하를 줄이고 유동적으로 연결을 관리할 수 있다.
SessionFactory
: 단일 데이터 저장소, 안정적인 스레드를 위한 목적으로 사용된다.
SessionFactory를 사용함으로서 다수의 스레드가 DB세션에 동시에 접근가능하며 특정 데이터베이스에 매핑된 캐시가 변하지 않는다.
SessionFactory는 프로그램이 실행될 때만 생성되고 프로그램 내의 소스코드가 이에 접근할 수 있도록 Singleton형태를 지닌다.
SqlSessionFactory
데이터베이스와의 연결과 SQL의 실행에 대한 모든 것을 가진 가장 중요한 객체이다.
이 객체가 DataSource를 참조하여 MyBatis와 Mysql 서버를 연동시켜줍니다.
config
MyBatis는 SQL Mapping 프레임워크로 별도의 설정 파일을 가질 수 있다.
[Mybatis에 별도의 설정을 주고 싶을떄 ]
1. mybatis-config.xml파일을 이용
2. sqlSessionFactory에 다음과 같이 configLocation 속성을 추가
=>별도의 설정파일이 필요한 다른 이유는 마이바티스 XML파일이 매퍼 클래스와 동일한 classpath에 있지 않은 경우
(예를 들어 mybatis 제너레이터를 따로 사용하는 경우)
Spring + MyBatis 를 사용하면, DataSource 과 SqlSessionFactory 를 정의해서 빈으로 주입시켜줘야한다.
1. configLocation : mybatis 설정파일이 위치한 경로를 지정 (주로 mybatis-config.xml 위치)
2. mapperLocations : Mapper 를 스캔하기 위한 XML 파일 경로 지정 (*mapper.xml 파일들이 모여있는 위치)
SessionFactory에 DatabaseSource를 주입하여 DB와의 연결통로를 만들고, 각 DAO에서 DB와의 연결을 사용하기 위해 SessionTemplate을 주입한다.
MapperScannerConfigurer
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="mapper.AAA" />
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactoryAAA" />
MapperScannerConfigurer
- Mapper 인터페이스의 수가 많아지면 MapperScannerConfigurer를 이용하여 Mapper 인터페이스의 객체를 한 번에 등록하는 것이 편리함.
- MapperScannerConfigurer를 이용하면 지정한 패키지 아래 모든 인터페이스가 Mapper 인터페이스로 간주되어 Mapper 인터페이스의 객체가 DI 컨테이너에 등록되는 것이다.
- basePackage 속성에서 지정하는 것은 Mapper 인터페이스를 검색할 대상이 되는 Package
context-mapper-auto.xml
<bean id="sqlSessionFactoryAutoAAA" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSourceAAA" />
<property name="configLocation" value="classpath:/mapper/config/sql-mapper-AAAconfig.xml" />
<property name="mapperLocations" value="classpath:/mapper/auto/*.xml" />
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.auto.mapper" />
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactoryAutoAAA" />
context-scheduler.xml
<context:component-scan base-package="com.schedule">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Service"/>
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
<bean id="AAABatch" class="org.springframework.scheduling.quartz.JobDetailFactoryBean" p:durability="true">
<property name="jobClass" value="com.schedule.AAASchedule" />
<property name="applicationContextJobDataKey" value="applicationContext"/>
<property name="jobDataAsMap">
<map>
<entry key="BBBService" value-ref="BBBService" />
<entry key="BBBproperties" value-ref="BBBproperties" />
<bean id="AAABatchTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<property name="jobDetail" ref="AAABatch"/>
<property name="cronExpression" value="0 0 5 * * ? *"/>
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="AAABatchTrigger"/>
<property name="quartzProperties">
<props>
<prop key="org.quartz.threadPool.class">org.quartz.simpl.SimpleThreadPool</prop>
<prop key="org.quartz.threadPool.threadCount">1</prop>
<prop key="org.quartz.threadPool.threadPriority">5</prop>
<prop key="org.quartz.jobStore.class">org.quartz.simpl.RAMJobStore</prop>
<prop key="org.quartz.jobStore.misfireThreshold">60000</prop>
context-transaction.xml
<bean id="txManagerAAA" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSourceAAA"/>
<tx:advice id="txAdviceAAA" transaction-manager="txManagerAAA">
<tx:attributes>
<tx:method name="*" propagation="REQUIRED" rollback-for="Exception"/>
<aop:config>
<aop:pointcut id="requiredTxAAA" expression="execution(public * com.service..*.*(..))"/>
<aop:advisor advice-ref="txAdviceAAA" pointcut-ref="requiredTxAAA" />
'[Web] > [Spring]' 카테고리의 다른 글
[Spring 분석] 메일 템플릿을 활용한 메일작성 (0) | 2021.10.01 |
---|---|
context-common.xml 에 대해 알아보자 (0) | 2021.09.15 |
Controller에 대해 알아보자 (0) | 2021.09.09 |
[Spring 분석] (No.3) Jar, War, Ear란 (0) | 2021.09.06 |
[Spring 분석] (No.2)Bean, Application Context(Bean Factory)란 (0) | 2021.09.01 |