요르딩딩

context-*.xml 에 대해 알아보자 (1) 본문

[Web]/[Spring]

context-*.xml 에 대해 알아보자 (1)

요르딩딩 2021. 9. 13. 19:01
728x90
반응형
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" />

728x90
반응형
Comments