spring 환경설정
spring project 생성
- File 메뉴 -> new 메뉴 -> Spring Legacy Project 메뉴 실행
-
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.12dependency 추가:
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>
- mybatis 설정
- datasource-context.xml
datasource : connection pool 설정 - global.properties
- mybatis-context.xml
- mybatis-config.xml
- callSettersOnNulls : 결과값이 null이어도 map에 put해줌
- mapUnderscoreToCalmeSCase : 카멜케이스로 변환
- jdbcTypeForNull : 파라미터가 null
- datasource-context.xml
<settings>
<setting name="callSettersOnNulls" value="true"/>
<Settings>
- 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 추가
- 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
- junit 라이브러리 추가 Properties -> Java build path 설정 페이지 -> Libraries 탭 -> Add library 버튼 -> junit 선택 -> version 4 선택
jdbc로그 설정
slf4j <- 인터페이스
- 로그구현체 commom-log , log4j, logback
- pom.xml
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>
- 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
-
log4j.xml 파일 설정
- logger 추가
```javascript
```
- logger 추가
- src/main/resources/log4jdbc.log4j2.properties 파일 생성
log4jdbc.spylogdelegator.name= net.sf.log4jdbc.log.slf4j.Slf4jSpyLogDelegator
트랜잭션
- 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);
}
- 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"/> -->
- 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;
}
}
- 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>
- 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