본문으로 바로가기


* Spring과 DB 연결

 

- Spring을 쓰기전 Dynamic Web Project로 DB 연동을 할때 반드시 써야할 코드들이 있는데, Spring을 사용하면 코드의 중복을 최소한으로 줄여줘서 가독성이 좋고 사용하기 간단하다.

- 핵심코드만 남긴채 중복코드를 줄이는 방법으로 많이 사용되는 것은 Template method 패턴이다.

 

 

 

* Mybatis란?

 

- 객체지향 언어인 자바의 관계형 데이터 베이스 프로그래밍을 좀더 쉽게 사용할 수 있도록 도와주는 개발 프레임 워크이다. 즉, JDBC보다 더 쉽게 사용할수 있도록 개발되었다.

- JDBC에서 처리하는 코드와 파라미터 설정 및 결과 매핑을 대신 해준다. JDBC 코드와 수동으로 셋팅하는 파라미터 결과 매핑을 제거해줘서 사용하기 편리하다.

- 데이터베이스 레코드에 원시타입, Map 인터페이스 그리고 자바 POJO를 설정해서 매핑하기 위해 xml과 Annotation을 사용할 수 있다.

- Mybatis는 JDBC와는 다르게 SQL문이 애플리케이션 소스 코드로부터 완전히 분리되어 있다.

- 다양한 언어로 다양한 개발이 가능하다.

- 다양한 메소드를 호출하여 여러가지 방식으로 데이터를 가져올수 있다. (가져오는거 미루기, SQL 줄이기 등)

 

 

위의 개념을 더 쉽게 이해하자면 기존의 JDBC를 이용하여 DB 연동하는 방식은 아래 처럼 메소드 하나를 사용할때마다 DB 연동 코드와 SQL문을 일일히 사용해줘야해서 중복된 코드가 많아 필요한 부분의 SQL문을 찾는게 힘들었다.

Connection을 일일히 맺고, SQL문을 써서 ResultSet을 사용해서 rs.next()등 무조건 다 써줘야한다는 의미이다.

SQL의 변경 등이 발생할 경우 수정하려면 메소드안에 있는 코드를 java는 java 코드대로 SQL은 SQL 코드대로 뒤져봐야해서 유연성이 좋지 못했다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
public class MemberDAO {
    Connection con;
    PreparedStatement pstmt;
    ResultSet rs;
    
    public MemberDAO() {
        try{
            Context init = new InitialContext();
              DataSource ds = (DataSource) init.lookup("java:comp/env/jdbc/OracleDB");
              con = ds.getConnection();
        }catch(Exception ex){
            System.out.println("DB 연결 실패 : " + ex);
            return;
        }
    }
//기존의 JDBC 코드는
//DB를 연동하려면 일일히 Context,ResultSet,PreparedStatement 등 여러 코드들을 중복해서 써줘야한다.
//java 코드와 SQL 코도를 함께 사용하는 구조이다.    
            public List getStareCount() throws Exception{
                MemberBean member = null;
                String sql = "select " + 
                        "count(decode(AD_STARE,'응시','1'))," + 
                        "count(decode(AD_STARE,'미응시','1'))" + 
                        "from jlpt_admission";
        
                System.out.println(sql);
                List list = new ArrayList();
                try{
                    pstmt = con.prepareStatement(sql);
                    
                    rs= pstmt.executeQuery();
                    
                while(rs.next()){
                    int a=rs.getInt(1);
                    list.add(a);
                    }
                    return list;
                }catch(Exception ex){
                    System.out.println("getStareCount 에러 : " + ex);
                }finally{
                    if(rs!=null)try{rs.close();}catch(SQLException ex){}
                    if(pstmt !=null)try{pstmt.close();}catch(SQLException ex){}
                }
                return null;
            }
}
cs

 

하지만 Mybatis를 사용하면 쿼리문을 xml 문서에 따로 사용하기 때문에 쿼리문만 따로 관리하기가 쉽고 변환이 자유로우며 가독성이 좋아진다.

 

 

 

 

 

* Mybatis와 DataBase 연결

 

- 이 블로그의 포스팅을 따라하기 위해선 아래 파일을 다운 받아 프로젝트를 import 시킨 뒤 따라하는 것을 추천한다. 중간중간 추가 설정해야하는 부분을 다 블로그에 적을 수가 없었다.

 

 

 

 

1. 라이브러리 추가

- 아래 사이트로 들어가서 최신 버전의 Mybatis 라이브러리를 다운 받자. 필자는 사용율이 가장 많은 3.4.5 버전을 가져왔다.

- mvnrepository : https://mvnrepository.com/artifact/org.mybatis/mybatis

 

 

Maven 카테고리에서 아래 dependency 를 복사해오자.

 

 

 

라이브러리를 복사해온뒤 pom.xml 에서 복붙하여 mybatis 라이브러리를 추가해주자.

라이브러리 추가하는 방법은 위 사이트에서 필요한 라이브러리들을 찾아 추가해줄수 있다.

DB 연동을 하기 위해선 아래의 라이브러리들이 필요하다. 아래 라이브러리들을 추가해주자

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-dbcp2 -->        
<!-- mybatis 라이브러리 -->        
        <dependency>
            <groupId>commons-dbcp</groupId>
            <artifactId>commons-dbcp</artifactId>
            <version>1.4</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>${org.springframework-version}</version>
        </dependency>
 
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>${org.springframework-version}</version>
         </dependency>
 
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.4.5</version>
        </dependency>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>1.3.1</version>
        </dependency>
<!-- mysql을 사용할 경우 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>6.0.6</version>
        </dependency>
<!-- orcle을 사용할 경우 -->
        <dependency>
            <groupId>com.oracle</groupId>
            <artifactId>ojdbc6</artifactId>
            <version>11.2.0.3</version>
        </dependency>
cs

 

 

 

 

 

2. 로깅 툴(Logger)

- Log란 기록이란 뜻으로 Controller가 잘 실행되고 있는지 실행 기록을 남기는 것이다. 이 log는 콘솔창에서 확인할 수 있다.

- Log 대신 System.out.println()으로 실행되는지 확인해도 되지만 이는 IO 리소스를 많이 사용하여 시스템이 느려질 수 있는 우려가있다.
- log를 파일로 저장하여 분석할 필요가 있다. System.out.println()는 파일로 저장이 불가능하지만 로깅툴을 사용하면 가능하다. 

 

 

* 로깅 툴에는 여러 종류가 있다.

1. commons-logging : 스프링3에서 사용하던 로깅툴
2. log4j : 효율적인 메모리 관리로 그동안 많이 사용되었음
3. logback : log4j보다 성능이 더 우수하여 최근에 많이 사용
4. SLF4j : logback 을 사용하기 위한 인터페이스

 

* slf4j 사용방법 : 아래 로깅 버전을 pom.xml의 <properties> 목록에 넣는다.

1
2
3
4
5
6
7
8
<properties>
        <java-version>1.8</java-version>
        <!-- 2018년 5월 현재 최신 버전 5.0.3, 에러가 날 경우 호환성을 위해 버전을 내려야 함 -->
        <org.springframework-version>4.3.2.RELEASE</org.springframework-version>
        <org.aspectj-version>1.8.10</org.aspectj-version>
        <!-- 로깅 최신 버전 -->
        <org.slf4j-version>1.7.25</org.slf4j-version>
    </properties>
cs

 

 

* log Level : DEBUG < INFO < WARN< ERROR< FATAL
- Debug : Debug, info, error 포함

- Info : info, warn, error 포함

- warn : warn, error 포함

- error : error만 포함

- 아래의 jdbc.sqlonly 기록은 Debug 레벨 이상의 log만 수집하겠다는 뜻

- Lebel이 높은 log가 찍힐수록 컨트롤러 실행에 문제가 있는것

1
2
3
4
5
6
7
    <!-- log4jdbc-log4j2 -->
    <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"/>
cs

 

 

* 로그를 수집할 클래스에 변수 선언

- private 쓰는 이유 : 외부(public)에서 로그를 가로채지 못하도록 하기 위해서
- static final 쓰는 이유 : 로그 내용이 바뀌지 않도록 하기 위해

1
private static final Logger logger = LoggerFactory.getLogger(클래스이름.class);
cs

 

 

* 로그를 수집할 메소드에서 로그 수집 명령어 호출

1
logger.info("로그 타이틀", 출력할 값);
cs

 

 

 

3. Database 연결 설정

 

- cmd를 켜서 sqlplus의 system 계정으로 접속한다.

 

 

- spring 이란 tablespace를 생성한다

 

- spring이란 사용자를 추가하고 기본 tablespace를 spring으로 설정한다.

 

- spring사용자에게 권한을 부여한다.

 

- sql developer에 spring 사용자가 접속되면 성공! 다른 sql 툴을 사용해도 접속가능하면 성공!

 

 

 

 

4. src/main/test에서 컨트롤러를 돌려 db 연결을 테스트해 볼것이다.

 

- 프로젝트 디렉터리 구조

 

 

- test에서 사용할 수 있는 테스트 라이브러리인 JUnit을 사용하자. JUnit을 사용하려면 라이브러리를 추가해줘야한다.

 

1
2
3
4
5
6
7
<!-- Test -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
cs

 

 

- OracleConnectionTest란 컨트롤러를 만들어서 DB 연동 코드를 작성하자.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
package com.example.spring01;
 
import java.sql.Connection;
import java.sql.DriverManager;
 
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
 
public class OracleConnectionTest {
    //로깅을 위한 변수 선언
    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:TestDB";
    private static final String USER="spring";//아이디
    private static final String PW="1111";//
    
    @Test//Junit이 테스트하는 메소드
    public void test() throws ClassNotFoundException {
        Class.forName(DRIVER);//jdbc 드라이버 로딩
        
        //괄호안에 리소스 자동 삭제 
        try(Connection conn=DriverManager.getConnection(URL, USER, PW)){
            logger.info("오라클에 연결되었습니다");
        }catch(Exception e) {
            e.printStackTrace();
        }
    }
 
}
 
cs

 

 

- Junit으로 db 연결이 제대로 됐는지 test해보자

- window- showview - Uunit을 눌러 jUnit상태를 볼수있다.

- 컨+f11 을 눌러 실행시키면 JUnit이 돌아가는데 1개 메소드중에 1개가 Errors 없이 정상 완료(Runs)되면 db 연동에 성공한 것이다.

 

 


다음 포스팅에서는 Spring에서 Mybatis를 이용해서 어떻게 쿼리문을 작성하고, DB의 값을 다루는 지에 대한 과정을 상세하게 알아보도록 하겠습니다.

'Back-End > Spring' 카테고리의 다른 글

[spring] 회원관리 및 게시판 만들기 실습  (1) 2018.06.11
[Spring] Spring Bean Scope 종류  (0) 2018.05.16
[Spring] Annotation 종류  (2) 2018.05.16