WEB, 실전jsp강좌 & DAO/DTO,prepareStatement객체, DBCP
DAO (Data Access Object)
- DB에 접속해서 데이터를 추가/삭제/수정 등의 작업을 하는 클래스
- 일반적인 JSP, Servlet 페이지내에서 DB작업을 함께 기술할 수 있지만, 유지보수 및 코드의 모듈화를 위해 별도의 DAO클래스 만들어 사용한다
DTO (Data Transfer Object)
- 데이터들을 하나로 묶는것
- DB에서 데이터를 관리할 때 데이터를 일반적인 변수에 할당하여 작업 할수도 있지만, 해당 데이터의 클래스를 만들어 사용한다
prepareStatement객체
- sql문 실행을 위해 Statement객체를 사용
-
Statement객체는 중복코드가 많아짐. 따라서 PreparedStatement객체를 사용한다.
- 사용 전 : 데이터가 많아지면 복잡하고 난잡해진다.
Statement stmt = null; stmt = (Statement) con.createStatement(); rs = stmt.executeQuery("Insert into user (userId, userPw, name, phone, gender) values ('hyemi', 'hyemi2', '이혜미', '0109999999', 'f' )"); rs = stmt.executeQuery("Insert into user (userId, userPw, name, phone, gender) values ('changho', 'changho22', '이창호', '0109999999', 'f' )");
- 사용 후 : 가독성이 좋다 ```java private PreparedStatement pstmt; String SQL = “Insert into user (userId, userPw, name, phone, gender) values (?, ?, ?, ?, ?)”; pstmt = connection.prepareStatement(SQL); pstmt.setString(1, “hyemi”); pstmt.setString(2, “hyemi12”); pstmt.setString(3, “이혜미”); pstmt.setString(4, “0109999999”); pstmt.setString(5, “f”); rs = pstmt.executeUpdate(); pstmt.setString(1, “changho”); pstmt.setString(2, “changho22”); pstmt.setString(3, “이창호”); pstmt.setString(4, “0109999999”); pstmt.setString(5, “f”); rs = pstmt.executeUpdate();
### 커넥션 풀(DBCP)
- 클라이언트에서 다수의 요청이 발생하면(커넥션 객체를 다수 생성해야 한다) DB에 부하가 발생한다
- 이 문제를 해결하기 위해 커넥션 풀(DataBase Connection Pool)기법을 이용 한다
- <u>커넥션객체를 미리 만들어 놓는다</u>
![dbcp](https://user-images.githubusercontent.com/55946791/68067525-5cc1d880-fd8b-11e9-828e-9bece4f4813d.JPG)
#### DBCP 사용
1. tomcat컨테이너가 db인증을 하도록 context.xml 파일을 열어 아래의 코드를 추가한다
(서버에서 커넥션풀을 만들어야 하기 때문에 서버에 작업한다)
```xml
<Resource
auth="Container"
driverClassName = "com.mysql.jdbc.Drvier"
url = "jdbc:mysql://localhost:3306/studyweb";
username = "root";
password = "devham7676";
name = "jdbc/Mysql8"
type ="javax.sql.DataSource"
maxActive = "50"
maxWait = "1000"
/>
예제
- MemberDAO.java ```java package com.javalac.daotoex;
import java.sql.*; import java.util.ArrayList;
import com.mysql.jdbc.Statement; // db를 직접 관리/수정 public class MemberDAO {
private String dbUrl = "jdbc:mysql://localhost:3306/studyweb";
private String dbId = "root";
private String dbPw = "devham7676";
public MemberDAO() {
try {
// 드라이브 로드
Class.forName("com.mysql.jdbc.Drvier");
}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(dbUrl, dbId, dbPw);
stmt = (Statement) con.createStatement();
rs = stmt.executeQuery("select * from user");
while(rs.next()) {
String id = rs.getString("userId");
String pw = rs.getString("userPw");
String name = rs.getString("name");
MemberDTO dto = new MemberDTO(id, pw, name);
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;
} } ```
- MemberDTO.java
package com.javalac.daotoex; // db에서 가져온 데이터를 관리해주는 클래스 public class MemberDTO { private String userId; private String userPw; private String userName; public MemberDTO(String userId, String userPw, String userName) { this.userId = userId; this.userPw = userPw; this.userName = userName; } public String getUserId() { return userId; } public void setUserId(String userId) { this.userId = userId; } public String getUserPw() { return userPw; } public void setUserPw(String userPw) { this.userPw = userPw; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } }
- memberSelect.jsp
<% // 데이터 작업 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.getUserName(); String id = dto.getUserId(); String pw = dto.getUserPw(); out.println("이름 :"+name+", 아이디 :"+id+", 비밀번호 :"+pw+"<br>"); } %>
Reference
https://www.inflearn.com/course/%EC%8B%A4%EC%A0%84-jsp-%EA%B0%95%EC%A2%8C/lecture/1180