programming/spring

[Spring] mybatis 연동

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

​ 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

  1. Debug: Debug, Info, Warn, Error 포함
  2. Info: Info, Warn, Error 포함
  3. Warn: Warn, Error 포함
  4. 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';