Notice
Recent Posts
Recent Comments
Link
«   2026/05   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
Archives
Today
Total
관리 메뉴

ki-sd 님의 블로그

[2026-05-21] 데이터베이스 커넥션 풀(DBCP) 도입 및 HTTP 상태 관리(Session/Cookie) 본문

WebStudy

[2026-05-21] 데이터베이스 커넥션 풀(DBCP) 도입 및 HTTP 상태 관리(Session/Cookie)

ki-sd 2026. 5. 21. 20:28

오늘은 기존의 일반적인 JDBC 연동 방식이 가진 성능적 한계를 개선하기 위해 DBCP(Database Connection Pool)를 도입하고, HTTP 프로토콜의 무상태(Stateless) 특성을 보완하기 위한 Session과 Cookie의 동작 원리 및 적용 방법을 학습했다.

 

1. DBCP(DataBase Connection Pool)와 JNDI 연동 기존에는 클라이언트의 요청이 발생할 때마다 DB 커넥션을 새로 생성하고 닫는 방식을 사용했다. 이 방식은 커넥션 생성 비용이 커서 서버 성능 저하 및 메모리 누수를 유발할 수 있음을 확인했다.

  • DBCP 동작 원리: 웹 서버(Tomcat)가 시작될 때 지정된 개수만큼의 DB 커넥션을 미리 생성하여 풀(Pool)에 보관한다. 클라이언트 요청 시 풀에서 커넥션을 빌려와 사용하고, 작업이 끝나면 close()를 통해 연결을 종료하는 것이 아니라 풀에 다시 반환(재사용)하는 구조를 실습했다.
  • JNDI(Java Naming and Directory Interface) 활용: EmpDAO에서 InitialContext 객체를 생성하여 디렉토리 서비스를 열고, java://comp/env 경로를 통해 톰캣이 관리하는 자원에 접근했다. 이후 DataSource ds = (DataSource)c.lookup("jdbc/oracle");를 통해 web.xml과 context.xml에 명명된 DB 설정 정보를 찾아 커넥션을 얻어오는 방식으로 코드를 개선했다.

2. HTTP 상태 관리: Session과 Cookie HTTP 프로토콜은 이전 요청을 기억하지 못하는 무상태(Stateless) 특성이 있다. 로그인 유지나 최근 본 상품 등의 기능을 구현하기 위해 클라이언트와 서버 측에 각각 데이터를 저장하는 방식을 비교 및 실습했다.

  • Cookie (클라이언트 측 저장): * 데이터가 사용자의 브라우저(로컬)에 저장되며 보안에 취약하므로, 중요하지 않은 텍스트 데이터(예: 최근 본 상품, 아이디 저장)를 보관하는 데 사용된다.
    • setMaxAge(초)를 통해 브라우저가 종료되어도 지정된 시간만큼 데이터가 유지되는 특징을 확인했다.
  • Session (서버 측 저장):
    • 데이터가 서버의 메모리에 저장되며 브라우저당 1개씩 고유하게 생성된다. 보안이 필요한 데이터(예: 로그인 아이디, 권한 등)를 저장하는 데 적합하다.
    • session.setAttribute()로 값을 저장하고, session.getAttribute()로 값을 읽어와 header.jsp나 main.jsp에서 로그인 상태에 따라 UI를 다르게 렌더링하는 조건부 출력을 구현했다.

3. VO/Bean 패턴을 통한 데이터 캡슐화

  • EmpBean, FoodVO, GoodsVO, MemberVO 등 여러 테이블 스키마에 대응하는 데이터 전송 객체들을 작성했다.
  • Lombok의 @Data 어노테이션을 활용하여 보일러플레이트 코드(Getter/Setter 등)를 줄이고, DB 계층에서 추출된 데이터를 View(JSP) 계층으로 안전하게 전달하는 객체 지향적 데이터 은닉화 원칙을 적용했다.

4. 모듈화된 화면 레이아웃 적용

  • header.jsp, home.jsp, main.jsp 파일들을 분리하여 작성하고, <jsp:include> 액션 태그를 사용해 하나의 메인 화면으로 조립했다.
  • 이를 통해 페이지 간 중복되는 HTML 레이아웃 구조를 최소화하고, 특정 영역(예: 로그인 폼, 내비게이션 바)의 유지보수성을 높이는 템플릿 기반 렌더링 방식을 확인했다.