mybatis에서 발생되는 기록을 mybatis-spring이 제공받아서 기록하는 법
- Mybatis Framework에서 제공되는 로그를 Spring 로그 구현체로 기록되도록 설정하는 방법
- log4jdbc-log4j2-jdbc4 라이브러리를 프로젝트에 빌드 처리 - pom.xml
- DAO 관련 Framework에서 발생되는 로그를 Spring 로그 구현체에게 전달하는 라이브러리
<dependency>
<groupId>org.bgee.log4jdbc-log4j2</groupId>
<artifactId>log4jdbc-log4j2-jdbc4</artifactId>
<version>1.16</version>
</dependency>
2.DataSource 관련 클래스를 Spring Bean으로 등록한 bean 엘리먼트에서 driverClassName 필드값 url 필드값을 변경하여 인젝션 처리 - root-context.xml
- DAO 관련 Framework에서 발생되는 로그를 전달받아 처리하기 위해 driverClassName 필드값과 url 필드값을 log4jdbc-log4j2-jdbc4 라이브러리에서 제공되는 값으로 변경하여 인젝션 처리
<bean class="org.springframework.jdbc.datasource.DriverManagerDataSource" id="dataSource">
<property name="driverClassName" value="net.sf.log4jdbc.sql.jdbcapi.DriverSpy"/>
<property name="url" value="jdbc:log4jdbc:oracle:thin:@localhost:1521:xe"/>
<property name="username" value="scott"/>
<property name="password" value="tiger"/>
</bean>
3.[src/main/resources] 폴더에 [log4jdbc.log4j2.properties] 파일 작성
log4jdbc.spylogdelegator.name = net.sf.log4jdbc.log.slf4j.Slf4jSpyLogDelegator
4.[src/main/resources] 폴더의 [log4j.xml] 파일에서 로그 이벤트에 대한 기록 설정
- dbc.sqlonly: 완성된 SQL 명령 기록
<logger name="jdbc.sqlonly">
<level value="info"></level>
</logger>
- jdbc.sqltiming : SQL 명령의 실행 시간(ms) 기록
<logger name="jdbc.sqltiming">
<level value="info"></level>
</logger>
- jdbc.audit: ResultSet 관련 정보를 제외한 모든 JDBC 관련 정보 기록
<logger name="jdbc.audit">
<level value="info"></level>
</logger>
- jdbc.resultset: ResultSet 관련 정보를 포함한 모든 JDBC 관련 정보 기록 - 불필요
<logger name="jdbc.resultset">
<level value="info"></level>
</logger>
- jdbc.resultsettable : ResultSet 관련 정보를 테이블(표) 형식으로 기록
<logger name="jdbc.resultsettable">
<level value="info"></level>
</logger>
- jdbc.connection : Connection 관련 정보를 기록 - Open 또는 Close
<logger name="jdbc.connection">
<level value="info"></level>
</logger>
=================================
Junit
- Spring Framework를 이요아형 테스트 프로그램을 작성해 모듈(단위 프로그램) 테스트 하는 방법
- Junit 라이브러리와 spring-text 라이브러리를 프로젝트에 빌드 처리 -pom.xml
- ⇒ junit 라이브러리와 sping-test 라이브러리의 scope 엘리먼트 주석 처리
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${org.springframework-version}</version>
<scope>test</scope>
</dependency>
2.[src/test/resources] 폴더의 [log4j.xml] 파일의 내용 변경
- [src/text/java] 폴더에테스트 클래스 작성 - 테스트 메소드를 이용하여 모듈 테스트
- <scope>test</scope>로 설정된 있는경우 테스트 파일 실행시 빌드되므로 자동 완성기능을 사요할시 주석 처리
DataSourceTest
- @Runwith : 테스트 메소드를 호출하여 실행하기 위한 클래스(Clazz)를 설정하는 어노테이션
- value 속성 : 테스트 메소드를 호출하기 위한 클래스(Clazz)를 속성값으로 설정 - 다른 속성이 없는 경우 속성값만 설정 가능
- SpringJUnit4ClassRunner : Spring Container(ApplicationContext 객체)를 생성하여 Spring Bean을 제공하여 테스트 프로그램을 실행하는 클래스
- @ContextConfiguration : 테스트 클래스에서 사용될 Spring Bean Configuration File을 설정하는 어노테이션
- locations 속성 : Bean Configuration File을 배열의 요소로 설정하여 속성값으로 설정
- ⇒ Bean Configuration File 경로는 file 접두사를 사용하여 파일 시스템 경로 표현
- @Autowired 어노테이션을 사용하여 DataSource 관련 클래스의 Spring Bean를 필드에 인젝션 처리
- @Test : 테스트 메소드를 설정하는 어노테이션
- ⇒Runner 클래에 의해 호출되어 명령이 실행되는 메소드
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"file:src/main/webapp/WEB-INF/spring/root-context.xml"})
public class DataSourceTest {
public static final Logger logger=LoggerFactory.getLogger(DataSourceTest.class);
@Autowired
private DataSource dataSource;
@Test
public void testDataSource() throws SQLException {
logger.info("DataSource = "+dataSource);
logger.info("Connection = "+dataSource.getConnection());
}
}
StudentServiceTest
- 테스트 프로그램은 DAO 클래스 또는 Service 클래스의 메소드를 검사할 목적으로 작성
- @WebAppConfiguration : WebAppcationContext 객체 (Spring Container)를 용하여 Spring 관리하도록 설정하는 어노테이션
@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@ContextConfiguration(locations = {"file:src/main/webapp/WEB-INF/spring/root-context.xml"
,"file:src/main/webapp/WEB-INF/spring/appServlet/servlet-context.xml"})
public class StudentServiceTest {
public static final Logger logger=LoggerFactory.getLogger(StudentServiceTest.class);
@Autowired
private StudentService studentService;
@Test
public void testStudentList() {
List<Student> studentList=studentService.getStudentList();
for(Student student:studentList) {
/*
logger.info(student.getNo()+", "+student.getName()+", "+student.getPhone()
+", "+student.getAddress()+", "+student.getBirthday().substring(0, 10));
*/
logger.info(student.toString());
}
}
}
StudentControllerTest
- [*] 패턴문자를 사용하여 Bean Configuration File 설정 가능
- ⇒ [**] 형식으로 폴더를 표현하면 0개 이상의 하위 폴더를 표현
- WebApplicationContext : SpringMVC(웹프로그램)에서 사용하는 Spring Container 객체
- MockMvc : 요청과 응답을 가상으로 제공하기 위한 클래스
- @Before : 테스트 메소드 호출 전 실행될 명령을 작성한 메소드에 설정하는 어노테이션 - 초기화 작업
- MockMvcBuilders.webAppContextSetup(WebApplicationContext context) : MockMvcBuilder 객체를 반환하는 메소드
- MockMvcBuilder.build() : MockMvc 객체를 반환하는 메소드
@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@ContextConfiguration(locations = {"file:src/main/webapp/WEB-INF/spring/**/*.xml"})
public class StudentControllerTest {
public static final Logger logger=LoggerFactory.getLogger(StudentControllerTest.class);
@Autowired
private WebApplicationContext context;
private MockMvc mvc;
@Before
public void setup() {
mvc=MockMvcBuilders.webAppContextSetup(context).build();
logger.info("MockMvc 객체 생성");
}
}
- MockMvc.perform(Builder requestBuilder) : 가상으로 웹프로그램을 요청하는 메소드
- ⇒ ResultActions 객체(요청에 대한 처리 결과를 저장한 객체) 반환
- MockMvcRequestBuilders.get(String url) : 요청 URL 주소를 이용하여 GET 방식으로 요청하는 메소드
- ⇒ RequestBuilder 객체(웹프로그램의 요청정보를 저장한 객체) 반환
- ResultActions.andReturn() : 요청 처리 메소드의 결과를 MvcResult 객체로 반환하는 메소드
@Test
public void testStudentDisplay() throws Exception {
MvcResult result=mvc.perform(MockMvcRequestBuilders.get("/student/display")).andReturn();
logger.info(result.getModelAndView().getViewName());
logger.info(result.getModelAndView().getModel().toString());
}
댓글