서버의 데이터 관리 클래스

DAO

Data Access Object

데이터 베이스에 접속해서 CRUD 등의 작업을 하는 클래스이다..

JSP 혹은 Servlet 패이지 내에 함께 기술할 수 있지만, 유지보수 및 코드의 모듈화를 위해 별도의 DAO 클래스를 만들어 사용한다.

// MemberDAO.java

public class MemberDAO {

	private String url = "jdbc:oracle:thin:@localhost:1521:xe";
	private String uid = "scott";
	private String upw = "tiger";
	
	
	public MemberDAO() {
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	public ArrayList<MemberDTO> memberSelect() {
		
		ArrayList<MemberDTO> dtos = new ArrayList<MemberDTO>();
		
		Connection con =null;
		Statement stmt = null;
		ResultSet rs = null;
		
		try {
			con = DriverManager.getConnection(url, uid, upw);
			stmt = con.createStatement();
			rs = stmt.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 (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if(rs != null) rs.close();
				if(stmt != null) stmt.close();
				if(con != null) con.close();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		
		return dtos;
	}
	
}

DTO

Data Transfer Object

DAO 클래스를 이용하여 데이터 베이스에서 데이터를 관리할 때 데이터를 해당 데이터의 클래스를 만들어 사용한다.

// MemberDTO.java
public class MemberDTO {

	private String name;
	private String id;
	private String pw;
	
    ...
	
	public MemberDTO(String name, String id, String pw, String phone1, String phone2, String phone3, String gender) {
		this.name = name;
		this.id = id;
		this.pw = pw;

        ...
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
    
    ...

}

사용 예제

<%@page import="com.javalec.daotoex.MemberDTO"%>
<%@page import="java.util.ArrayList"%>
<%@page import="com.javalec.daotoex.MemberDAO"%>

<%
    MemberDAO memberDAO = new MemberDAO();
    ArrayList<MemberDTO> dtos = memberDAO.memberSelect();
    
    for(int i=0; i<dtos.size(); i++) {
        MemberDTO dto = dtos.get(i);
        String name = dto.getName();
        String id = dto.getId();
        String pw = dto.getPw();
        String phone = dto.getPhone1() + " - "+ dto.getPhone2() + " - " + dto.getPhone3();
        String gender = dto.getGender();
        
        out.println("이름 : " + name + ", 아이디 : " + id + ", 비밀번호 : " + pw + ", 연락처 : " + phone + ",  성별 : " + gender + "<br />" );
    }
%>

PreparedStatement

기존 Statement 객체는 다양한 데이터를 입력할 때마다 SQL 문을 새로 작성해야한다는 단점이 있었다. PreparedStatement 클래스는 디폴트 템플릿을 만들어 값만 입력할 수 있도록 한다.

<%!
    PreparedStatement preparedStatement;
%>

<%
    String query = "insert into memberforpre (id, pw, name, phone) values (?, ?, ?, ?)";
    preparedStatement = connection.prepareStatement(query);
    
    preparedStatement.setString(1, "abc");
    preparedStatement.setString(2, "123");
    preparedStatement.setString(3, "홍길동");
    preparedStatement.setString(4, "010-1234-5678");
    n = preparedStatement.executeUpdate();
    
    ...
%>

n 이 1이면 성공했음을 뜻한다.

커넥션 풀(DBCP)

클라이언트에서 다수의 요청이 발생할 경우 데이터베이스에 부하가 생긴다. 따라서 커넥션 풀(Database Connection Pool)에서 미리 데이터베이스에 커넥트를 하고 사용한다.

DBCP 는 서버에 있으므로 tomcat 컨테이너가 데이터베이스 인증을 하도록 context.xml 을 수정해야한다.

  1. context.xml
<!-- context.xml -->

<Resource
    auth = "Container"
    driverClassName = "oracle.jdbc.driver.OracleDriver"
    url = "jdbc:oracle:thin:@localhost:1521:orcl"
    username = "amy"
    password = "tiger"
    name = "jdbc/Oracle11g"
    type = "javax.sql.DataSource"
    maxActive = "50"
    maxWait = "1000"
/>

maxActive 값은 몇 개의 데이터를 미리 가져올지 결정하는 것이고, maxWait 값은 만일 51 번째 데이터 요청이 들어왔을 때 기다리는 ms 단위의 시간 값이다.

  1. DAO 클래스

위의 MemberDAO.java 를 다음과 같이 수정한다.


public class MemberDAO {

	private DataSource dataSource;
    
    public MemberDAO() {
        try {
			Context context = new InitialContext();
			dataSource = (DataSource)context.lookup("java:comp/env/jdbc/Oracle11g");
		} catch (Exception e) {
			e.printStackTrace();
		}
    }

    public ArrayList<MemberDTO> memberSelect() {
		
		try {
//			con = DriverManager.getConnection(url, uid, upw);
			con = dataSource.getConnection();
            
            ...
        }
    }
}


https://www.youtube.com/playlist?list=PLieE0qnqO2kTyzAlsvxzoulHVISvO8zA9