커넥션 풀
웹 애플리케이션이 실행됨과 동시에 연동할 데이터베이스와의 연결을 미리 설정하여, 필요할 때마다 미리 연결해 놓은 상태를 이용해 빠르게 데이터베이스와 연동하여 작업하는 기술이다.
즉 미리 데이터베이스와 연결시킨 상태를 계속해서 유지하는 기술이다.
톰캣 컨테이너는 자체적으로 커넥션 풀 기능을 제공한다.
톰캣 실행 -> 미리 데이터베이스와 연결 -> Connection Pool 객체 생성 -> 애플리케이션이 데이터베이스와 연동할 일이 생기면 Connection Pool 객체의 메서드를 호출해 빠르게 연동하여 작업
JNDI
필요한 자원을 키/값(key/value) 쌍으로 저장한 후 필요할 때 키를 이용해 값을 얻는 방법.
톰캣이 만든 Connection Pool 객체에 접근할 때 JNDI를 이용한다.
커넥션 풀 실습
먼저 context.xml 파일에 톰캣 DataSource를 설정한다.
username, password, url은 본인의 계정과 DB 주소 정보를 입력하면 된다.
<Resource name="jdbc/oracle"
auth="Container"
type="javax.sql.DataSource"
username="유저네임"
password="패스워드"
driverClassName="oracle.jdbc.driver.OracleDriver"
factory="org.apache.tomcat.dbcp.dbcp2.BasicDataSourceFactory"
url="접속할 DB 주소와 포트 번호, SID"
maxActive="500"
/>
이렇게 미리 DB와 연결시킨다.
그리고 MemberDAO.java 파일을 수정한다.
package ex02;
import java.sql.Connection;
import java.sql.Date;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;
public class MemberDAO {
private Connection con;
private PreparedStatement pstmt;
private DataSource dataFactory;
// 생성자 추가: 인스턴스가 생성됐을 때 DB 접속정보 가져오려고
public MemberDAO() {
// 톰캣이 만들어 놓은 커넥션 풀에 접근하기 위한 방법
try {
// JNDI에 접근하기 위해 기본 경로 지정
Context ctx = new InitialContext();
Context envContext = (Context) ctx.lookup("java:/comp/env");
// 톰캣 context.xml에 설정한 name인 jdbc/oracle을 이용해 DataSourse를 받아옴
dataFactory = (DataSource) envContext.lookup("jdbc/oracle");
} catch (Exception e) {
e.printStackTrace();
}
}
public List<MemberVO> listMembers(){
List<MemberVO> list = new ArrayList<MemberVO>();
try {
// DataSourse를 이용해 DB에 연결
con = dataFactory.getConnection();
String query = "select * from t_member";
System.out.println("prepareStatement: " + query);
pstmt = con.prepareStatement(query);
ResultSet rs = pstmt.executeQuery();
while (rs.next()) {
String id = rs.getString("id");
String pwd = rs.getString("pwd");
String name = rs.getString("name");
String email = rs.getString("email");
Date joinDate = rs.getDate("joinDate");
MemberVO vo = new MemberVO();
vo.setId(id);
vo.setPwd(pwd);
vo.setName(name);
vo.setEmail(email);
vo.setJoinDate(joinDate);
list.add(vo);
}
rs.close();
pstmt.close();
con.close();
} catch (Exception e) {
e.printStackTrace();
}
return list; // 조회한 레코드의 개수만큼 ArrayList를 반환
}
public void addMember(MemberVO memberVO) {
try {
con = dataFactory.getConnection();
String id = memberVO.getId();
String pwd = memberVO.getPwd();
String name = memberVO.getName();
String email = memberVO.getEmail();
String query = "insert into t_member (id, pwd, name, email) values(?, ?, ?, ?)";
System.out.println("prepareStatement: " + query);
pstmt = con.prepareStatement(query);
pstmt.setString(1, id);
pstmt.setString(2, pwd);
pstmt.setString(3, name);
pstmt.setString(4, email);
pstmt.executeUpdate();
pstmt.close();
con.close();
} catch (Exception e) {
e.printStackTrace();
}
}
public void delMember(String id) {
try {
con = dataFactory.getConnection();
String query = "delete from t_member where id = ?";
System.out.println("prepareStatement: " + query);
pstmt = con.prepareStatement(query);
pstmt.setString(1, id);
pstmt.executeUpdate();
pstmt.close();
con.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
이와 맞춰서 memberForm.html, MemberServlet.java 파일을 수정하면 된다.
참고: 실제 서비스에서는 회원 정보를 바로 삭제 안하고 탈퇴여부(Y/N) 속성을 두고 N을 Y로 업데이트를 함.
(사용자가 실수로 삭제할 경우 데이터 복구 시키기 위함)
JSP
JSP 정의
JSP는 디자이너 입장에서 화면의 수월한 기능 구현과 개발 후 화면의 편리한 유지관리 목적으로 도입되었다.
기존 서블릿에서는 자바 코드를 기반으로 문자열을 사용해 HTML과 자바스크립트로 화면을 구현했지만, JSP는 이와 반대로 HTML, CSS, JavaScript를 기반으로 JSP 요소들을 사용해 화면을 구현한다.
톰캣 컨테이너에서 JSP 변환 과정
JSP 파일을 자바 파일로 변환 -> 자바 파일을 클래스 파일로 컴파일 -> 클래스 파일을 실행하여 그 결과를 브라우저로 전송해 출력
JSP 디렉티브
- page 디렉티브 태그
- JSP 컨테이너(톰캣 등)가 JSP 파일을 서블릿 소스 코드로 변환할 때 필요한 설정 정보
<%@ page language=“java” contentType=“text/html; charset=UTF-8” pageEncoding=“UTF-8” %>
- include 디렉티브 태그
- 공통적으로 사용되는 JSP 페이지(헤더, 푸터, 메뉴 등)를 미리 만들어두고, 여러 JSP 페이지에서 컴파일 시점에 해당 파일의 내용을 삽입하여 사용할 수 있게 해주는 태그
<%@ include file = “포함 파일 경로” %>
JSP 스크립트 요소
- 선언문
- JSP에서 변수나 메서드를 선언할 때 사용
<%! 멤버변수 or 멤버메서드 %>
- 스크립틀릿
- JSP에서 자바 코드를 작성할 때 사용
<% 자바 코드 %>
- 표현식
- JSP에서 변수의 값을 출력할 때 사용
- 안에 세미콜론이 있으면 안된다.
<%= 값 or 자바변수 or 자바식 %>
- 주석문
<%— 내용 —%>
로그인 화면 실습 (login2.html)
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>로그인 창</title>
</head>
<body>
<form name="frmLogin" method="post" action="result.jsp" encType="utf-8">
아이디: <input type="text" name="user_id"> <br>
비밀번호: <input type="password" name="user_pw"> <br>
<input type="submit" value="로그인">
<input type="reset" value="다시입력">
</form>
</body>
</html>

로그인 화면 실습 (result.jsp)
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
request.setCharacterEncoding("utf-8");
String user_id = request.getParameter("user_id");
String user_pw = request.getParameter("user_pw");
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>결과출력창</title>
</head>
<body>
<%
if (user_id == null || user_id.length() == 0) {
%>
아이디를 입력하세요. <br>
<a href="login2.html">로그인하기</a>
<%
} else {
if (user_id.equals("admin")) {
%>
<h1>관리자로 로그인 했습니다.</h1>
<form>
<input type="button" value="회원정보 삭제하기"/>
<input type="button" value="회원정보 수정하기"/>
</form>
<%
} else {
%>
<h1>환영합니다. <%= user_id %>님!!</h1>
<%
}
}
%>
</body>
</html>

'Java' 카테고리의 다른 글
| [TIL-260313] Servlet & JSP 입문: MVC 패턴 실습 (0) | 2026.03.13 |
|---|---|
| [TIL-260312] Servlet & JSP 입문: JSP 내장 객체, 액션 태그, 모델2 (0) | 2026.03.13 |
| [TIL-260310] Servlet & JSP 입문: 서블릿의 응답 처리, DB 연동 (0) | 2026.03.10 |
| [TIL-260309] Servlet & JSP 입문: JSP 실습, Servlet 기초 (0) | 2026.03.10 |
| [TIL-260306] Servlet & JSP 입문: 자바와 웹, 웹 애플리케이션, HTTP (0) | 2026.03.08 |