본문 바로가기
Develop/Spring

[Spring] JdbcTemplate 을 이용한 Database 통신

by 코딩의성지 2019. 10. 10.

오랜만에 글을 쓴다. 또 해외에 다녀오느라 글쓰는게 늦었다.. 

 

오늘은 JdbcTemplate 을 이용해서 쉽게 Database와 통신해보는 걸 포스팅 할 생각이다.


 

Java를 배우신 분들이면 아마 Jdbc를 이용해서 Database 통신을 해봤을 것이다. 복습한다는 생각으로 Jdbc 에 대해 아주 간단하게 설명해보겠다. 아래 그림을 보자.

 

<Jdbc 프로세스>

JDBC 는 Java Databse Connectivity의 줄임말로 Java에서 Database 프로그래밍을 하기 위해 사용되는 API 이다.

Driver를 DB에 맞게 로딩해주면 Database 종류에 상관 없이 사용할 수 있고 Connection 객체를 이용해 database를 연결해주고 PreparedStatement 나 Statement 객체를 이용해 SQL 문을 작성하고 전송한 뒤 close 메서드를 이용해 자원을 해제한다.

 

다들 아시겠지만 그래도 !! 처음 보는 사람들을 위해 예제 하나 작성해보겠다.

1
2
3
4
5
6
7
8
9
10
11
12
@Repository
public class MemberDao implements MemberDaoImpl {
 
    private final static String DRIVER = "com.mysql.jdbc.Driver";
    private final static String URL = "jdbc:mysql://[IP주소]:3306/[DB명]?useSSL=false";
    private final static String USER_ID = "[유저 id]";
    private final static String USER_PW = "[유저 password]";
    
    private final static String MEMBER_INSERT_QUERY = "INSERT INTO member (memId, memPw, memMail) values (?, ?, ?)";
    
    private Connection conn = null;
    private PreparedStatement pstmt = null;
 
 

나는 보통 Driver, URL, DB 계정 그리고 쿼리문은 상수로 만들어 놓고 시작한다. (나중에 이값을 바꿔줘야할 때 찾기 귀찮다.) 

 

아 위의 설정은 스프링 설정 파일 (root-context.xml) 에 아래와 같이 설정해도 된다.

1
2
3
4
5
6
<beans:bean id ="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
    <beans:property name="driverClass" value="com.mysql.jdbc.Driver" />
    <beans:property name="jdbcUrl" value="jdbc:mysql://[ip주소]:3306/[db 명]?useSSL=false" />
    <beans:property name="user" value="[계정명]"/>
    <beans:property name="password" value="[계정명]"/>
</beans:bean>
 

 

그리고 Connection 과 PreparedStatement 도 선언해두자.

 

이번에는 실제 member라는 table에  삽입을 하는 메서드를작성해보자.

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
    @Override
    public int memberInsert(Member member) {
        
        int result = 0;
        
        try {
            Class.forName(DRIVER);
            conn = DriverManager.getConnection(URL, USER_ID, USER_PW);
            
            pstmt = conn.prepareStatement(MEMBER_INSERT_QUERY);
            
            pstmt.setString(1, member.getMemId());
            pstmt.setString(2, member.getMemPw());
            pstmt.setString(3, member.getMemMail());
            result = pstmt.executeUpdate();
            
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                if (pstmt != null) {
                    pstmt.close();
                }
                if (conn != null) {
                    conn.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
 
        return result;
    }
 
 

이렇게 .... 길다.... 단지 insert 하나하는데 이렇게 길다 ....  이걸 매번 해줘야한다니 참 스트레스였다.

 

한번 쯤 써보셨으면 위의 말이나 소스코드가 무슨 말인지 이해 되실거라 생각한다. 오늘은 JDBC를 설명하려고 글을 쓰는게 아니니 이정도만 설명하고 넘어가도록 하겠다.

 

오늘은 Jdbc의 저런 일련의 과정을 한방에 해결할 수 있는 JdbcTemplate에 대해 공부해볼꺼다.

 

<JdbcTemplate 프로세스>

 

이 JdbcTemplate을 이용해서 Driver 로딩, Database 연결, 자원해제 이런 행위를 Spring Framework에 다 맡겨버리고, 우리는 Query 만 다루면 된다.

 

먼저 이걸 쓰기 위해서는 DataSource라는 녀석을 먼저 알아야 한다. 얘는 데이터베이스 연결과 관련된 정보 (Driver, DB IP 주소, 계정 정보) 를 가지고 있는 녀석인데 스프링 이나 c3p0로 에서 제공하는 DriverManagerDataSource라는 클래스를 쓰면 된다. 

 

 

자, 그럼 대망의 JdbcTemplate 예제 소스를 공개하겠다!!

 

먼저 이걸 사용하기 위해서는 pom.xml을 살짝 수정해줘야한다.

1
2
3
4
5
6
7
8
9
10
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>3.1.1.RELEASE</version>
        </dependency>
     <dependency>
            <groupId>com.mchange</groupId>
            <artifactId>c3p0</artifactId>
            <version>0.9.5</version>
        </dependency>
 

이런 식으로 dependency만 추가해주면된다.  하나만 추가하면 되는데 둘 다 보여주기 위해서 추가했다.ㅎㅎ 

( 아! 뭐 하나만 더 얘기하고 가자면 ... c3p0는 커넥션 풀이라는 걸 쓸때 쓰면된다고 생각하면 된다)

 

이제 자바소스를 보자 .

1
2
3
4
5
6
7
8
9
10
11
12
@Repository
public class MemberDao implements MemberDaoImpl {
 
    private final static String DRIVER = "com.mysql.jdbc.Driver";
    private final static String URL = "jdbc:mysql://[IP주소]:3306/[DB명]?useSSL=false";
    private final static String USER_ID = "[유저 id]";
    private final static String USER_PW = "[유저 password]";
    
    private final static String MEMBER_INSERT_QUERY = "INSERT INTO member (memId, memPw, memMail) values (?, ?, ?)";
    
    private com.mchange.v2.c3p0.DriverManagerDataSource dataSource;
    //private org.springframework.jdbc.datasource.DriverManagerDataSource dataSource;
 
 

아까전에 있던 Connection 이나 PreparedStatement 그리고 여기선 선언 안했지만 ResultSet 까지 다 제거해주고 저 DataSource 객체만 선언하자 !

 

그리고 위에서 보이는 DB 관련 정보를 DataSource에 세팅을 해줘야한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
    public MemberDao() {
        //c3p0
        dataSource = new DriverManagerDataSource();
        dataSource.setDriverClass(DRIVER);
        dataSource.setJdbcUrl(URL);
        dataSource.setUser(USER_ID);
        dataSource.setPassword(USER_PW);
        
        //spring
        /*
        dataSource = new org.springframework.jdbc.datasource.DriverManagerDataSource();
        dataSource.setDriverClassName(DRIVER);
        dataSource.setUrl(URL);
        dataSource.setUsername(USER_ID);
        dataSource.setPassword(USER_PW);
        */
        jdbcTemplate = new JdbcTemplate();
        jdbcTemplate.setDataSource(dataSource);
    } 
 
 
만약에 설정파일에 정보를 삽입해놓은경우 위의 생성자는 더 간단해진다.
1
2
3
4
@Autowired
public UserDao(ComboPooledDataSource dataSource) {
    the.template = new JdbcTemplate(dataSource)
}
 

이렇게 생성자에 dataSource를 한번만 세팅해주면 ~~~~~ 두번은 안해도 된다 !! ㅎㅎㅎ c3p0 나 spring이나 세팅하는 방법은 뭐 거기서 거기다. 그리고 그 dataSource를 jdbcTemplate에 세팅해주면 준비 끝!!

 

자...!! 그다음은 아까 member table에  삽입을 하는 메서드를 JdbcTemplate를 이용해서 작성해보자.

1
2
3
4
5
6
7
8
9
    @Override
    public int memberInsert(Member member) {    
        int result = 0;
        
        
        return result;    
    }
 
 

와우 ... 아까 그 길던 소스가 ... 세 줄로 줄었다. ㅎㅎㅎ

 

오늘 포스팅은 여기까지 해야겠다. 그럼 오늘도 즐코~~~~

반응형

댓글