본문 바로가기
JSP/정리

[jsp] 커넥션 풀

by 미네밍 2017. 1. 17.

<커넥션 풀>


DAO ( Data Access Object )

데이터 베이스에 접속해 데이터 추가, 삭제, 수정 등 관리 하는 클래스

일반적으로 JSP 혹은 Servlet 페이지에서 로직을 기술할 수 있지만, 유지 보수 및 코드 모듈화를 위해 사용


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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
package com.java.member;
 
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
 
public class MemberDAO {
    
    private String driver = "com.mysql.jdbc.Driver";
    private String url = "jdbc:mysql://localhost:3306/mysql";
    private String uid="root";
    private String upw = "1234";    
    
    public MemberDAO(){
        try {
            Class.forName(driver);
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    
    public ArrayList<MemberDTO> memberSelect(){
        
        ArrayList<MemberDTO> dtos = new ArrayList<MemberDTO>();
        
        Connection connection;
        Statement statement;
        ResultSet rs;
        
        try {
            connection = DriverManager.getConnection(url, uid, upw);
            statement = connection.createStatement();
            rs = statement.executeQuery("select * from member");
            while(rs.next()){
                String name = rs.getString("name");
                String id = rs.getString("id");
                String pw = rs.getString("pw");
                String phone1 = rs.getString("phone1");
                String phone2 = rs.getString("phone2");
                String phone3 = rs.getString("phone3");
                String gender = rs.getString("gender");
                
                MemberDTO dto = new MemberDTO(name,id,pw,phone1,phone2,phone3,gender);
                dtos.add(dto);
            }
        
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    
        return null;
        
    }
    
}
 
cs


다음과 같이, jsp와 servlet에서 DB에 있는값들을 가져오는 역할을 하는 '클래스' 를 하나 정의해 주는 개념이라고 보면 된다.



DTO ( Data Transfer Object )

데이터베이스로 얻은 데이터들을 하나의 객체로 묶어 관리하는 기법. 결국 그냥 데이터 관리하는 클래스이다. 코드가 간단하고 보기 쉬워진다.


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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
package com.java.member;
 
public class MemberDTO {
 
    String name,id,pw,phone1,phone2,phone3,gender;
    
    public MemberDTO(String name, String id, String pw, String phone1, String phone2, String phone3,
            String gender) {
        // TODO Auto-generated constructor stub
        this.name = name;
        this.id = id;
        this.pw = pw;
        this.phone1 = phone1;
        this.phone2 = phone2;
        this.phone3 = phone3;
        this.gender = gender;
    }
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    public String getId() {
        return id;
    }
 
    public void setId(String id) {
        this.id = id;
    }
 
    public String getPw() {
        return pw;
    }
 
    public void setPw(String pw) {
        this.pw = pw;
    }
 
    public String getPhone1() {
        return phone1;
    }
 
    public void setPhone1(String phone1) {
        this.phone1 = phone1;
    }
 
    public String getPhone2() {
        return phone2;
    }
 
    public void setPhone2(String phone2) {
        this.phone2 = phone2;
    }
 
    public String getPhone3() {
        return phone3;
    }
 
    public void setPhone3(String phone3) {
        this.phone3 = phone3;
    }
 
    public String getGender() {
        return gender;
    }
 
    public void setGender(String gender) {
        this.gender = gender;
    }
 
    public static void main(String[] args) {
        // TODO Auto-generated method stub
 
    }
 
}
 
cs


다음처럼, 데이터들을 관리하는 클래스가 DTO 클래스이다. 


이 클래스들은 내가 관리하는 테이블에 따라서 내용이 달라질 수 있다. 

이와 같은 클래스들을 만들어 놓으면, jsp 파일 안에서 여러 구문을 붙일 필요 없이,


1
2
<%@ page import="com.java.member.MemberDAO" %>
<%@ page import="com.java.member.MemberDTO" %>
cs

다음과 같이 DAO, DTO 클래스들을 포함시켜 주고

1
2
3
4
5
6
7
8
9
10
11
<%
    MemberDAO mDAO = new MemberDAO();
    ArrayList<MemberDTO> dtos = mDAO.memberSelect();
    
    for(int i = 0; i < dtos.size(); i++){
        MemberDTO dto = dtos.get(i);
        String name = dto.getName();
        String id= dto.getId();
    }
    
%>
cs

이렇게 간단한 코드로 DB 결과를 얻을 수 있다.


PreparedStatement


SQL문 실행을 위해 사용하는 Statement 객체가 중복 코드가 많아지는 단점이 있어 이를 보완하기 위한 것


1
<%@page import="java.sql.PreparedStatement"%>
cs

다음과 같은 구문을 추가해 주어야 한다.



1
2
3
4
5
<%!
String query = "insert into memberforpre (id,pw,name,phone) values(?,?,?,?)";
Connection connection;
PreparedStatement preparedStatement;
%>
cs


데이터 베이스에 'memberforpre' 라는 테이블이 있다고 가정한다. 테이블의 멤버는 

id, pw, name, phone 으로 이루어져 있다. 다른 쿼리와는 조금 다른 것을 느낄 수 있을텐데, values 안의 ? 표시를 다음과 같이 채워주는 것이다.


1
2
3
4
5
6
7
8
<%
PreparedStatement preparedStatement = connection.prepareStatement(query);
preparedStatement.setString(1,"abc");
preparedStatement.setString(2,123);
preparedStatement.setString(3,"홍길동");
preparedStatement.setString(4,"010-1234-5678");
preparedStatement.executeUpdate(); 
%>
cs


이 쿼리는 결국 

1
<% String query = "insert into memberforpre(id,pw,name,phone) values('abc', 123, '홍길동', '010-1234-5678')"%>
cs


위와 같은 코드다. PreparedStatement 를 쓰는 것이 가독성도 더 좋아지고, 실수가 적어지므로 효율적이다.


커넥션 풀(DBCP)

클라이언트에서 다수의 요청이 발생할 때, 데이터 베이스에 부하가 발생하게 된다. 이런 문제를 해결하기 위한 것이 커넥션 풀이다.


미리미리 커넥션 객체를 만들어 데이터베이스에 연결을 하는 개념이라고 보면 된다!

이것은 톰캣 서버에서 먼저 설정을 해주어야 한다.


1. 먼저, tomcat 컨테이너가 데이터베이스 인증을 하도록 코드를 고쳐야 한다.

이클립스의 톰캣 서버 프로젝트 안에 있는 context.xml 을 열어야 한다.


1
2
3
4
5
6
7
8
9
<Resource
        auth="Container"
        driverClassName="com.mysql.jdbc.Driver"
        url="jdbc:mysql://localhost:3306/mysql"
        username="root"
        password="1234"
        type="javax.sql.DataSource"
        maxActive="50"
        maxWait="1000"/>
cs


<Context> 태그 안에 다음과 같이 구문을 추가해준다. 


2. 그리고, 커넥션 풀의 연결 설정을 위해 DAO 클래스에 다음 구문을 추가해보겠다.


1
2
3
4
5
6
7
8
9
try {
            Context init = init = new InitialContext();
            DataSource ds= (DataSource)init.lookup("java:comp/env/jdbc/mysql");
        
catch (NamingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
}
        
cs


기존 Class.forName 이라는 구문으로 설정해 드라이브를 설정해 주었던 구문 대신, 위의 구문으로 바꿔준다.


1
connection = ds.getConnection();
cs

3. 그리고, DriverManager.getConnection(,,) 으로 일일히 연결 설정을 해주었던 부분을 제외하고,

다음과 같이 datasource 에서 연결 객체를 가져오는 방식으로 데이터베이스에 연결할 수 있다.



'JSP > 정리' 카테고리의 다른 글

[jsp] EL(Expression Language)  (0) 2017.01.19
[jsp] 파일 업로드  (0) 2017.01.18
[jsp/DB] mysql 과 jsp 연동하기  (0) 2017.01.17
[jsp] 자바 빈  (0) 2017.01.10
[jsp] 예외 페이지  (0) 2017.01.10

댓글