spring project 생성

  1. File 메뉴 -> new 메뉴 -> Spring Legacy Project 메뉴 실행
  2. pom.xml
    version 변경
    java version 1.8 -> 11
    org.springframework-version 3.1.1.RELEASE -> 5.3.16
    log4j version 1.2.15 -> 1.2.17 junit version 4.7 -> 4.12

    dependency 추가:
    spring-test
    lombok
    jackson
    dbcp, mybatis, ojdbc8, spring-jdbc aspectjweaver fileupload (option) tiles(option)

         <!-- spring-test -->
         <dependency>
             <groupId>org.springframework</groupId>
             <artifactId>spring-test</artifactId>
             <version>${org.springframework-version}</version>
         </dependency>
         <!-- lombok -->
         <dependency>
             <groupId>org.projectlombok</groupId>
             <artifactId>lombok</artifactId>
             <version>1.18.24</version>
             <scope>provided</scope>
         </dependency>		
         <!-- jackson-databind -->
         <dependency>
             <groupId>com.fasterxml.jackson.core</groupId>
             <artifactId>jackson-databind</artifactId>
             <version>2.13.2.2</version>
         </dependency>
    
         <!-- commons-dbcp2 -->
         <dependency>
             <groupId>org.apache.commons</groupId>
             <artifactId>commons-dbcp2</artifactId>
             <version>2.9.0</version>
         </dependency>
         <!-- spring-jdbc -->
         <dependency>
             <groupId>org.springframework</groupId>
             <artifactId>spring-jdbc</artifactId>
             <version>${org.springframework-version}</version>
         </dependency>
         <!-- ojdbc8 -->
         <dependency>
             <groupId>com.oracle.database.jdbc</groupId>
             <artifactId>ojdbc8</artifactId>
             <version>19.3.0.0</version>
         </dependency>
         <!-- mybatis -->
         <dependency>
             <groupId>org.mybatis</groupId>
             <artifactId>mybatis</artifactId>
             <version>3.5.9</version>
         </dependency>
         <!-- mybatis-spring -->
         <dependency>
             <groupId>org.mybatis</groupId>
             <artifactId>mybatis-spring</artifactId>
             <version>2.0.6</version>
         </dependency>
    
  3. mybatis 설정
    • datasource-context.xml
      datasource : connection pool 설정
    • global.properties
    • mybatis-context.xml
    • mybatis-config.xml
      • callSettersOnNulls : 결과값이 null이어도 map에 put해줌
      • mapUnderscoreToCalmeSCase : 카멜케이스로 변환
      • jdbcTypeForNull : 파라미터가 null
<settings>
  <setting name="callSettersOnNulls" value="true"/>
<Settings>  
  1. web.xml 변경
    • web-app dtd 2.5에서 4.0으로 변경
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0">
  • context-param contextConfigLocation 수정 : /WEB-INF/config/root-context.xml
        <context-param>
       <param-name>contextConfigLocation</param-name>
       <param-value>classpath:/spring/*-context.xml</param-value>
        </context-param>
    
  • encodingFilter 추가
  1. log4j.xml 파일 수정
    • log4j.dtd 경로 변경
     <!DOCTYPE log4j:configuration PUBLIC "-//APACHE//DTD LOG4J 1.2//EN" "log4j.dtd">
 "log4j.dtd"  =>  http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/xml/doc-files/log4j.dtd 
  1. junit 라이브러리 추가 Properties -> Java build path 설정 페이지 -> Libraries 탭 -> Add library 버튼 -> junit 선택 -> version 4 선택

jdbc로그 설정

slf4j <- 인터페이스

  • 로그구현체 commom-log , log4j, logback
  1. pom.xml
    pmd설정
    log4jdbc 의존성 추가
         <!-- log4jdbc -->
         <dependency>
             <groupId>org.bgee.log4jdbc-log4j2</groupId>
             <artifactId>log4jdbc-log4j2-jdbc4.1</artifactId>
             <version>1.16</version>
         </dependency>
    

log4j 버전을 1.2.15 에서 1.2.17.로 변경
@Log4j는 log 객체를 생성하여 로그를 출력할 수 있게 하는 어노테이션을 사용하려면 runtime scope는 삭제함

		<dependency>
			<groupId>log4j</groupId>
			<artifactId>log4j</artifactId>
			<version>1.2.17</version>

<scope>runtime</scope>

  1. global.properties
    jdbc.driver = net.sf.log4jdbc.sql.jdbcapi.DriverSpy
    jdbc.url = jdbc:log4jdbc:oracle:thin:@localhost:1521:xe
    jdbc.username = hr
    jdbc.password = hr
    
  2. log4j.xml 파일 설정

    • logger 추가
      ```javascript

    ```

  3. src/main/resources/log4jdbc.log4j2.properties 파일 생성
    log4jdbc.spylogdelegator.name= net.sf.log4jdbc.log.slf4j.Slf4jSpyLogDelegator
    

트랜잭션

  1. jdbc 트랜잭션 처리
try{
      conn = db.connect();
      conn.setAutoCommit(false);

      String sql1 = "UPDATE table1 SET data1 = ? WHERE data1 = 100";
      String sql2 = "UPDATE table2 SET data1 = ? WHERE data1 = 200";

      pstmt1 = conn.prepareStatement(sql1);
      pstmt1.setInt(1,a);
      pstmt1.executeUpdate();

      pstmt2 = conn.prepareStatement(sql2);
      pstmt2.setInt(1,a);
      pstmt2.executeUpdate();
      conn.commit();

} catch (Exception se) {
      conn.rollback();
      se.printStackTrace();
} finally {
      db.close(conn);
}
  1. spring 트랜잭션 설정
        <!-- transactionManager 빈 등록  -->
     <bean id="transactionManager" 
           class="org.springframework.jdbc.datasource.DataSourceTransactionManager" >
         <property name="dataSource" ref="dataSource"></property>
     </bean>
    	
     <!-- @Transactional 애노테이션 스캔-->
     <tx:annotation-driven/>
    
        <!-- <aop:aspectj-autoproxy proxy-target-class="true"/> -->
    
  2. service 클래스에 어노테이션 설정
@Service
public class OrdServiceImpl implements OrdService {

	@Autowired OrdDtlMapper ordDtlMapper;
	@Autowired OrdMapper ordMapper;
	
	@Override
	@Transactional
	public int insert(String data) {		
		int r = ordMapper.insert(data);
		ordDtlMapper.insert(data);
		return r;
	}
}
  1. aop 설정 : 모든 서비스 메서드에 자동으로 트랜잭션 설정
     <!-- Transaction Advice 설정 -->
     <tx:advice id="txAdvice" transaction-manager="transactionManager">
         <tx:attributes>
             <tx:method name="find*" read-only="true" />
             <tx:method name="*"/>
         </tx:attributes>
     </tx:advice>
    	
     <!-- Transaction AOP 설정 -->
     <aop:config>
         <aop:pointcut expression="execution(* com.yedam.app..*ServiceImpl.*(..))" id="txPointCut"/>
         <aop:advisor advice-ref="txAdvice" pointcut-ref="txPointCut"/>
     </aop:config>
    
  2. TestCase로 Service 계층을 테스트 하면 정상적으로 트랜잭션 처리되나 Controller를 호출하면 트랜잭션 처리가 안되는 경우 조치방법 에러메시지 : JDBC Connection will not be managed by Spring
    조치방법 : servlet-context.xml 에서 Controller 이 아닌 Annotation들을 exclude-filter 처리함
     <context:component-scan base-package="com.yedam.app" >
         <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
         <context:include-filter type="annotation" expression="org.springframework.web.bind.annotation.ControllerAdvice"/>	 
         <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service"/>
         <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Repository"/>
     </context:component-scan>
    

tomcat 설정

C:\dev\apache-tomcat-9.0.50\wtpwebapps\prjt
C:\dev\workspace.metadata.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\prjt 톰캣설정