Skip to main content

3 posts tagged with "데이터베이스"

View All Tags

· 5 min read
  1. DAO, DTO
  • DAO
    • Data Access Object
    • 데이터 베이스에 접속해서 데이터 추가, 삭제, 수정 등의 작업을 하는 클래스
    • 일반적인 JSP 혹은 Servlet 페이지내에 위에 로직을 함께 기술할 수 도 있음
    • 유지보수 및 코드의 모듈화를 위해 별도의 DAO 클래스를 만들어 사용.
    • DataBase 설정에 관련된 셋팅 및 DTO객체에 Database에서 가져온 데이터 넣어주는 해주는 작업
    • package daodto;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;

public class MemberDAO {

private String url = "jdbc:oracle:thin:@localhost:1521:xe";
private String uid = "c##davidyoon";
private String upw = "DBPASS";

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 connection = null;
Statement stmt = null;
ResultSet resultSet = null;

try {
connection = DriverManager.getConnection(url, uid, upw);
stmt = connection.createStatement();
resultSet = stmt.executeQuery("select * from member");

while(resultSet.next()) {
String name = resultSet.getString("name");
String id = resultSet.getString("id");
String pw = resultSet.getString("pw");
String phone1 = resultSet.getString("phone1");
String phone2 = resultSet.getString("phone2");
String phone3 = resultSet.getString("phone3");
String gender = resultSet.getString("gender");

MemberDTO dto = new MemberDTO(name, id, pw, phone1, phone2, phone3, gender);

dtos.add(dto);
}

}catch(Exception e) {
e.printStackTrace();
}

return dtos;

}
}
  • DTO
    • Data Tranfer Object
    • DAO클래스를 이용하여 데이터 베이스에서 데이터를 관리할 때 데이터를 일반적인 변수에 할당하여 작업할 수도 있지만, 해당 데이터의 클래스를 만들어 사용
    • DAO라는 클래스를 만들어 데이터 베이스에서 가져온 데이터들은 넣어 get set함수로 사용.
    • package daodto;
public class MemberDTO {
private String name;
private String id;
private String pw;
private String phone1;
private String phone2;
private String phone3;
private String gender;




public MemberDTO(String name, String id, String pw, String phone1, String phone2, String phone3, String gender) {
super();
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;
}
}
  • 웹브라우저 -> 서버( Servlet/JSP <-> DAO <-> DTO) -> DataBase
  1. PreparedStatement객체
  • SQL문을 실행하기 위해 Statement 객체 이용
  • Statement 객체의 경우 중복코드가 많아지는 단점
    public void memberUpdate(Member member) {
try {
connection = DriverManager.getConnection(url, uid, upw);
String query = "insert into memberforpre (id, pw, name, phone) values(?, ?, ?, ?)";
int n;
pstmt = connection.prepareStatement(query);

pstmt.setString(1, member.getId());
pstmt.setString(2, member.getPw());
pstmt.setString(3, member.getName());
pstmt.setString(4, member.getPhone());
n = pstmt.executeUpdate();

if (n == 1) {
System.out.println("insert success");
}else {
System.out.println("insert fail");
}

} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
if(connection != null) connection.close();
if(pstmt != null) pstmt.close();
} catch (Exception e) {
// TODO: handle exception
}
}

}
  1. 커넥션 풀(DBCP)
  • 클라이언트 다수의 요청이 발생할 경우 데이터베이스에 부하 발생
  • 이 문제를 해결하기 위해 커네션 풀 사용 (DataBase Connection Pool)
  • 클라이언트가 요청전에 서버에서 미리 데이터베이스 객체를 여러개 생성하여 풀을 만들고 고객이 들어오면 해당 객체가 사용 되는 형식
  • tomcat 컨테이너가 테이터베이스 인증을 하도록 context.xml 파일에 코드 추가
    <Resource
auth="Container"
driverClassName="oracle.jdbc.driver.OracleDriver"
url="jdbc:oracle:thin:@localhost:1532:xe"
username="c##davidyoon"
password="xxxx"
name="jdbc/Oracle18g"
type="javax.sql.DataSource"
maxActive="50" //풀 갯수
maxWait="1000" // 다음 풀(51번째) 만들때 대기 시간
/>

· 3 min read
  1. JDBC 살펴보기
  • Java Database Connectivity
  • JAVA 프로그램에서 SQL문을 실행하여 데이터를 관리하기 위한 JAVA API
  • JDBC의 특징은 다양한 데이터 베이스에 대해서 별도의 프로그램을 만들 필요 없이, 해당 데이터 베이스의 JDBC를 이용하면 하나의 프로그램으로 데이터 베이스를 관리할 수 있다.
  1. 데이터 베이스 연결 순서
  • oracle 설치Path/product/18.0.0/dbhomeXE/jdbc/lib/ojdbc8.jar 복사
  • project/lib/ 붙여넣기
  • project java build path -> libraries -> add library -> user Library -> user Libraries -> add ojdbc8
  • tomcat lib/ 아래에도 ojdbc.jar 넣어주어야 한다.
  • JDBC 드라이버 로드 DriverManager
    • Class.forName("oracle.jdbc.driver.OracleDriver"); -> 메모리에 OracleDriver 로드
  • 데이터 베이스 연결 Connection
    • DriverManager.getConnection(JDBC URL, 계정아이디, 비밀번호); -> Connection 객체 생성
  • SQL문 실행 Statement
    • connection.createStatement(); -> Statement 객체를 통해 SQL문이 실행
  • 데이터 베이스 연결 해제 ResultSet
    • statement.executeQuery(), statement.executeUpdate() -> SQL문의 결과값을 ResultSet 객체로 받음
  1. Statement 객체 살펴보기
  • Statement(interface)
    • executeQuery() resultSet: SQL문 실행 후 여러 개의 결과값 생기는 경우 사용 ex(select)
    • executeUpdate() int: SQL문 실행 후 테이블의 내용만 변경되는 경우 사용 ex (insert, delete, update)
  • executeQuery() 실행 후 반환 되는 레코드 셋
    • executeQuery() -> ResultSet -> 로우 데이터 셋
    • ResultSet()
      • next() : 다음 레코드로 이동
      • previous(): 이전 레코드로 이동
      • first(): 처음으로 이동
      • last(): 마지막으로 이동
      • get메소드(getString, getInt)
    <%@page import="java.sql.Connection"%>
<%@page import="java.sql.DriverManager"%>
<%@page import="java.sql.ResultSet"%>
<%@page import="java.sql.Statement"%>
<%@ page language="java" contentType="text/html; charset=EUC-KR"
pageEncoding="EUC-KR"%>
<%!
Connection connection;
Statement statement;
ResultSet resultSet;

String driver = "oracle.jdbc.driver.OracleDriver";
String url = "jdbc:oracle:thin:@localhost:1521:xe";
String uid = "c##davidyoon";
String upw = "3302";
String query = "select * from member";
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>Insert title here</title>
</head>
<body>
<%
try{
Class.forName(driver);
connection = DriverManager.getConnection(url, uid, upw);
statement = connection.createStatement();
resultSet = statement.executeQuery(query);

while(resultSet.next()){
String id = resultSet.getString("id");
String pw = resultSet.getString("pw");
String name = resultSet.getString("name");
String phone = resultSet.getString("phone");

out.println("아이디 :" + id + ", 비밀번호 : "+ pw +", 이름 :" + name + ", 전화번호 : " + phone +"<br/>");
}
}catch(Exception e) {
e.printStackTrace();
}finally{
try{
if(resultSet != null) resultSet.close();
if(statement != null) statement.close();
if(connection != null) connection.close();
} catch(Exception e) {
e.printStackTrace();
}

}

%>


</body>
</html>