JSP 기본 09

이정우·2021년 10월 28일
1

JSP

목록 보기
10/10

PreparedStatement

insert문과 같은 경우 여러 값을 넣을려면 '"+name+"','"+userid+"',... 이렇게 복잡한 따옴표가 쓰인다. 이를 쉽게 쓰기 위해 PreparedStatement를 쓴다.

PreparedStatement pstmt = con.prepareStatement(sql);
String sql = "insert into member values(?,?,?...)"; //?는 바인드 변수라고 하여 매번 변수 값이 바뀔 수 있으므로 미리 정해놓지 않고 동적으로 값을 할당할 때 사용함. 이를 위해선 우선 setXXX()메서드를 사용하고 excute()메소드를 순차적으로 실행해야 한다.

setXXX()는 바인드 변수의 매개 변수 값을 설정한다.
setXXX(int 순서, 실제 데이터나 변수);XXX에는 데이터 형이 들어간다.
실 사용 방법

pstmt.setInt(1, Integer.parseInt(admin));
pstmt.setString(2, name);......`

setXXX에서 이미 쿼리문을 전달했기 때문에 executeXXX()는 그냥 메서드만 호출하면 된다.

pstmt.excuteUpdate(); //sql문이 select면 excuteQuery()로 ResultSet을 얻고 
//delete, insert등은 Update문을 실행함.
pstm.close();

짜투리 정보

인코딩 방식을 EUC-KR으로 했는데 중간에 따로 UTF-8로도 방식을 변환해줫었는데 이게 문젠지 인코딩을 여러번 해서 그런지 데이터 용량이 매우 커졌다. 한글 세 글자를 기준으로 18BYTE를 잡아먹어서 데이터 크기 제한에 걸렸는데 역시 통일해주는게 좋을듯 하다.

데이터베이스 커넥션 풀

java에서 oracle을 쓰기 위해선 커넥션이 필수이다. 하지만 여러 사용자가 모일 경우 커넥션에 과부하가 걸려서 서버 다운이나 속도 저하가 올 수 있다. 이러한 단점을 보안하기 위해 사용하는 기법이 DBCP이다. DBCP는 DBCP 매니저가 어느 정도 연결을 미리 확보해 놓고 있다가 클라이언트가 요청을 해오면 연결을 해 주고 클아이언트가 작업이 다 끝나면 연결을 다시 DBCP 매너지한테 반환을 해준다. 즉, 미리 DBCP 매너지가 커넥션을 해두고 필요할때 바로바로 주는 방식이다. 이러면 매번 클라이언트가 접속할 때마다 데이터베이스에 연결을 시도할 때에 비해서 데이터 베이스에 걸리는 연결 부하가 월등히 적어진다. POOL의 개수는 수정할 수 있으며 아파치에서 이미 만들어둔것을 사용할 수도 있다.

DBCP 사용

기본적인 셋팅을 완료 후 아래의 아파치에 존재하는 DBCP 샘플 코드를 입력하면 연동 가능.

기본적인 셋팅 예.. ojdbcx.jar 파일도 필요

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@page import = "java.sql.*" %>
<%@page import = "javax.sql.*" %>
<%@page import = "javax.naming.*" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<% 
Context initContext = new InitialContext();
Context envContext  = (Context)initContext.lookup("java:/comp/env");
DataSource ds = (DataSource)envContext.lookup("jdbc/myoracle");
Connection conn = ds.getConnection();
out.println("DBCP 연동 성공");
%>
</body>
</html>

DAO(Data Access Obejct)

DAO는 모든 DB관련 애플리케이션에 반드시 존재하는 클래스이다.
DAO는 java에서 데이터 베이스에 저장된 데이터를 조회하는 클래스이다. 즉, 데이터베이스의 데이터에 접근하기 위한 객체인 것이다. 접근하여 데이터베이스 레코드의 조회, 추가, 수정, 삭제등을 한다. DAO는 DB에서 얻은 데이터를 VO에 저장한다.
VO는 DB의 테이블의 정보를 자바에서 얻어오기 전에 회원 정보를 저장할 공간을 위한 준비 과정이다. 즉 DB와 DAO사이에서 데이터의 전달을 담당하는게 VO 클래스이다. 각 행들이 모여서 매핑을 통해 하나의 VO가 된다.예전에 배운 자바 빈이 DB와 접목하게 되면 VO라고 불리게 된다.
자바 빈, VO(Value Object..값만을 저장한다고 해서), DTO(Data Transfer Object 데이터 전달하는 목적으로 사용된다고 해서..) 세 가지 용어는 같은 의미로 사용된다.

  • 요약
    -DAO란 DB에서 데이터에 접근이 목적이고 접근 후 수정 삭제 추가 조회를 하는, 모든 DB관련된 애플리 케이션에 존재하는 클래스이다. 또한 DB에서 얻은 데이터를 저장하는 클래스도 필요한 우리는 이러한 클래스를 자바 빈이라고 불렀으니 DB와 관련될 때는 VO라고 이야기한다. 둘 다 같은 의미이다.즉 VO를 통해 데이터들을 하나씩 변수로 관리하지 않고 하나의 클래스로 데이터들을 변수로 관리해서 저장하는 것이다.

DAO는 DB에서 데이터를 VO 객체를 통해 얻어오거나 추가 삭제 등을 한다. 이런 작업마다 객체를 생성하기 보다는 싱글톤 패턴을 사용하는것이 효율적이다.

싱글톤 패턴

싱글톤 패턴은 인스턴스가 오로지 단 하나만 존재할 수 있도록 클래스를 설계하는 것. 인스턴스를 여러 번 생성하면 성능 저하가 올 수 있기 때문에 싱글톤 패턴을 사용해서 한 번만 생성하는 것.

생성자는 private이어야 한다.즉 다른 클래스에서 인스턴스 생성이 불가능해진다. 그리고 내부에 자기 자신 인스턴스를 생성한다. 그렇기에 외부 클래스에서는 수정이 불가능하고 값만 얻을 수 있기에(read only property) setter는 만들지 않고 getter만 만든다.
또한 생성자를 private만들어서 원래는 외부 클래스에서 인스턴스를 만들때마다 메모리를 할당받게 되던것을(new 연산자) 호출을 private으로 막고 대신 클래스 내부에서 자기 자신의 객체를 만들어서 단 한번만 객체를 만들고 이 객체를 getInstance()를 통해서 접근할 수 있도록 하였다. 즉 메모리 낭비를 줄이기 위해 사용되는 것이다. 즉 싱글톤 패턴은 private때문에 외부 클래스에서는 new 연산자를 사용하지 못 하고 getInstance()메소드로 대신해서 클래스 선언부 내부에서 자신이 생성한 객체를 얻어오는 방법이다.

싱글톤 패턴으로 만든 DAO 클래스

public class MemberDAO {
private MemberDAO() {
	
}
private static MemberDAO instance = new MemberDAO();

public static MemberDAO getInstance() {
	return instance;
}
}

여기에 connection을 얻어오는 getConnection()메서드를 추가하면 된다.

작업시 폴더로 작업

단순히 회원 관리만을 목적이라면 모르겠지만 실제 웹페이지는 게시판 관리, 회원 관리 등 많은 작업이 필요하다. 이러한 작업 jsp들을 폴더별로(work, board, member etc...)관리해주는게 효율적이다.

경로 지정 주의할점

모든 파일은 WEB-INF폴더 아래를 기준으로 함. 즉 WEB-INF폴더안에 또 다른 폴더를 만들어서 해당 폴더에서 form action으로 파일 경로를 지정할 경우 바로 지정하면 경로를 찾지 못함. ../ 상대 경로를 통해 윗 폴더로 이동해줘야함. 근데 생각해야할게 많아짐...

DB관련

private key에서 값들을 자동으로 적어주는 기능인 sequence 기능이 존재. 오라클 전용인듯.

출처 : 국비 교육

profile
프로그래밍 공부 중!

0개의 댓글