2. Spring과 mybatis의 연동
2.1 로깅툴
2.1.1 로깅툴을 사용하는 이유
- System.out.println() 명령어는 IO 리소스를 많이 사용하여 시스템이 느려질 수 있음
- 로그를 파일로 저장하여 분석할 필요가 있음
2.1.2 로깅툴의 종류
- commons-logging: 스프링 3에서 사용하던 로깅툴
- log4j: 효율적인 메모리 관리로 그동안 많이 사용되었음
- logback: log4j보다 성능이 더 우수하여 최근에 많이 사용되고 있음
SLF4J: logback을 사용하기 위한 인터페이스
2.1.3 SLF4J 설정방법
1. pom.xml의 slf4j-version을 1.7.25로 설정
<properties>
<java-version>1.8</java-version>
<org.springframework-version>5.1.4.RELEASE</org.springframework-version>
<org.aspectj-version>1.9.2</org.aspectj-version>
<org.slf4j-version>1.7.25</org.slf4j-version>
</properties>
2. pom.xml에 라이브러리 추가
ch.qos.logback
logback-classic
1.2.3
org.slf4j
slf4j-api
${org.slf4j-version}
org.slf4j
jcl-over-slf4j
${org.slf4j-version}
runtime
org.slf4j
slf4j-log4j12
${org.slf4j-version}
runtime
log4j
log4j
1.2.17
javax.mail
javax.jms
jms
com.sun.jdmk
jmxtools
com.sun.jmx
jmxri
runtime
3. src/main/resources에 logback.xml 파일 작성
<logger name=*"jdbc.sqlonly"* level=*"DEBUG"*/>
<logger name=*"jdbc.sqltiming"* level=*"INFO"*/>
<logger name=*"jdbc.audit"* level=*"WARN"*/>
<logger name=*"jdbc.resultset"* level=*"ERROR"*/>
<logger name=*"jdbc.resultsettable"* level=*"ERROR"*/>
<logger name=*"jdbc.connection"* level=*"INFO"*/>
<appender name=*"CONSOLE"* class=*"ch.qos.logback.core.ConsoleAppender"*>
<layout class=*"ch.qos.logback.classic.PatternLayout"*>
%d{HH:mm:ss.SSS} [%thread] %-4level [%logger.%method:%line]-
%msg%n
<appender name=*"LOGFILE"* class=*"ch.qos.logback.core.rolling.RollingFileAppender"*>
/WEB-INF/logback.log
<rollingPolicy class=*"ch.qos.logback.core.rolling.TimeBasedRollingPolicy"*>
logback.%d{yyyy-MM-dd}.log
30
%d{yyyy-MM-dd HH:mm:ss.SSS} %-4level [%logger.%method:%line]
- %msg %n
<logger name=*"myweb"* additivity=*"false"*>
<level value=*"INFO"* />
<appender-ref ref=*"LOGFILE"* />
<appender-ref ref=*"CONSOLE"* />
<level value=*"INFO"* />
<appender-ref ref=*"CONSOLE"* />
4. 로그를 수집할 클래스에 변수 선언
private static final Logger logger = LoggerFactory.getLogger(클래스이름.class);
- private: 외부에서 로그를 가로채지 못하도록 하기 위해서
- static final: 로그 내용이 바뀌지 않으므로
5. 로그를 수집할 method에서 로그 수집 명령어 호출
logger.info("로그 타이틀", 출력할 값);
2.1.4 로그의 level
- Debug: Debug, Info, Warn, Error 포함
- Info: Info, Warn, Error 포함
- Warn: Warn, Error 포함
- Error: Error만 포함
2.2 데이터베이스 연결 설정 및 테스트
2.2.1 오라클 테이블 스페이스 생성
cmd에서 작업
-- 관리자 계정으로 접속
sqlplus SYSTEM/1234;
-- Oracle 12c 버전의 경우 11g와 호환하기 위해 아래 명령어를 입력
CALTER SESSION SET "_ORACLE_SCRIPT" = TRUE;
-- 테이블 스페이스 생성
CREATE TABLESPACE spring
DATAFILE 'D:/spring.dbf' SIZE 50m
autoextend ON
NEXT 10m
maxsize UNLIMITED;
-- 관리자 계정으로 접속
CREATE USER spring IDENTIFIED BY 1234 DEFAULT TABLESPACE spring;
-- 사용권한 부여
GRANT CONNECT, RESOURCE, DBA TO spring;
2.2.2 src/test/java/OracleConnectionTest.java
데이터베이스 연결을 테스트하기 위한 테스트 케이스 작성
@Test 코드에서 에러가 발생할 경우 Add JUnit 4 library to the build path를 클릭하여 라이브러리를 추가해야 함
package com.corock.spring01;
import java.sql.Connection;
import java.sql.DriverManager;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class OracleConnectionTest {
// 로깅을 위한 변수 선언(import 주의!)
private static final Logger logger = LoggerFactory.getLogger(OracleConnectionTest.class);
private static final String DRIVER = "oracle.jdbc.driver.OracleDriver";
// 연결 문자열 jdbc:oracle:thin:@호스트:포트번호:SID
private static final String URL = "jdbc:oracle:thin:@localhost:1521:orcl";
private static final String USER = "spring";
private static final String PW = "1234";
@Test // JUnit이 테스트하는 method
public void test() throws Exception {
Class.forName(DRIVER); // 드라이버 로딩
try (Connection conn = DriverManager.getConnection(URL, USER, PW)) {
logger.info("오라클에 연결되었습니다.");
} catch (Exception e) {
e.printStackTrace();
}
}
}
2.2.3 src/test/java/MybatisTest.java
자바 코드에 데이터베이스 연결 문자열 등의 중요한 정보를 직접 입력하는 것은 위험함
* mybatis 관련 bean
SqlSessionTemplate : SqlSession 객체 생성
SqlSessionFactoryBean : SqlSessionTemplate 객체 생성
DriverManagerDataSource : DB연동 클래스
package com.corock.spring01;
import javax.inject.Inject;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.slf4j.Logger; // import 할 때 주의! 이걸로 해야 함!
import org.slf4j.LoggerFactory;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
// JUnit 4.0으로 현재 클래스를 실행시킴
// JUnit Test Case로 만든 클래스
@RunWith(SpringJUnit4ClassRunner.class)
// mybatis에서 참조하는 설정파일의 위치를 알려줌
@ContextConfiguration(locations = { "file:src/main/webapp/WEB-INF/spring/root-context.xml" })
public class MybatisTest {
// 로깅을 위한 변수
private static final Logger logger = LoggerFactory.getLogger(MybatisTest.class);
@Inject // 의존관계 주입 코드(스프링에서 객체를 생성하여 전달)
private SqlSessionFactory sqlFactory;
@Test // JUnit이 테스트할 코드
public void testFactory() {
logger.info("sqlFactory: " + sqlFactory);
}
@Test
public void testSession() {
// mybatis 실행을 위한 SqlSession 객체 생성
try (SqlSession sqlSession = sqlFactory.openSession()) {
logger.info("sqlSession: " + sqlSession);
logger.info("mybatis 연결 성공");
} catch (Exception e) {
e.printStackTrace();
}
}
}
2.3 Controller와 view의 연결 실습
2.3.1 controller.MainController.java
2.3.2 views/include/header.jsp
2.3.3 views/include/menu.jsp
2.3.4 views/main.jsp
2.3.5 views/test/gugu.jsp
2.3.6 views/test.jsp
2.3.7 views/test/doA.jsp
2.3.8 views/test/doB.jsp
2.3.9 views/test/doC.jsp
2.3.10 views/test/doE.jsp
2.3.11 model.dto.ProductDTO.java
2.3.12 controller.SampleRestController.java
2.3.13 src/test/java/MainControllerTest.java
2.4 회원정보관리 예제
2.4.1 회원관리의 전체적인 구조
Controller
MemberController.java
Service
MemberService.java 인터페이스
MemberServiceImpl.java구현클래스
Model
MemberDAO.java 인터페이스
MemberDAOImple.java 구현클래스
MemberDTO.java
memberMapper.xmlsql mapper
View
member_list.sjp
write.jsp
view.jsp
2.4.2 member 테이블
CREATE TABLE Member (
userid VARCHAR2(50) NOT NULL PRIMARY KEY,
passwd VARCHAR2(50) NOT NULL,
name VARCHAR2(50) NOT NULL,
email VARCHAR2(50),
join_date DATE DEFAULT SYSDATE
);
INSERT INTO Member (userid, passwd, name, email)
VALUES ('lee', '1234', '이도훈', 'coco@nate.com');
SELECT * FROM Member;
COMMIT;
2.4.3 model.dto.MemberDTO.java
2.4.4 controller.MemberController.java
2.4.5 service.MemberService.java
2.4.6 service.MemberServiceImpl.java
2.4.7 model.dao.MemberDAO.java
2.4.8 model.dao.MemberDAOImpl.java
2.4.9 src/main/resources/mybatis-config.xml
2.4.10 src/main/resources/mappers/memberMapper.xml
2.4.11 src/main/resources/mappers/memberMapper.xml
...
-- 비밀번호 확인
-- 맞았을 때 : 1
SELECT COUNT() *FROM** Member
WHERE userid = 'kim' AND passwd = '1234';
-- 틀렸을 때 : 0
SELECT COUNT() *FROM** Member
WHERE userid = 'kim' AND passwd = '5555';