JSP와 MVC 패턴: DAO/DTO, 커넥션 풀, EL, JSTL

2024. 10. 18. 15:13·🗄️ Backend/JSP

PreparedStatement(pstmt) 객체

Statement 객체와 PreparedStatement 객체의 차이점

웹 애플리케이션에서 SQL 쿼리를 처리할 때, Statement 객체와 PreparedStatement 객체를 사용할 수 있습니다.

  • Statement 객체: SQL 쿼리를 문자열로 작성하고 직접 실행합니다. 그러나 복잡한 쿼리나 동적인 값이 많을 경우 코드가 복잡해지고 오류 발생 가능성이 높아집니다.
  • PreparedStatement 객체: SQL 쿼리를 미리 컴파일하여 성능을 향상시키고, 파라미터 설정 시 '?'를 사용하여 간편하게 값을 지정할 수 있습니다. 이는 코드의 가독성을 높이고, SQL 인젝션 공격을 예방하는 데 도움이 됩니다.

PreparedStatement 실행 순서

  1. 드라이버 로딩

    Class.forName("com.mysql.cj.jdbc.Driver");
  2. 데이터베이스 연결

    Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "id", "pw");
  3. PreparedStatement 객체 생성

    String sql = "INSERT INTO MEMBER VALUES(?, ?)";
    PreparedStatement pstmt = con.prepareStatement(sql);
  4. 값 설정

    pstmt.setString(1, "value1");
    pstmt.setString(2, "value2");
  5. 쿼리 실행

    int res = pstmt.executeUpdate();

MVC 패턴에서의 Model

DAO 클래스 (Data Access Object)

  • 역할: 데이터베이스에 접속하여 데이터를 추가, 삭제, 수정 등의 작업을 수행하는 클래스입니다.
  • 장점: 데이터베이스 로직을 JSP나 Servlet에서 분리하여 코드의 유지보수성을 높이고, 모듈화를 통해 재사용성을 증가시킵니다.
  • 구조: 각 테이블마다 DAO 클래스를 작성하며, 테이블의 데이터를 자바 객체로 변환하거나 자바 객체의 값을 테이블에 저장합니다.

예제 코드:

public class MemberDAO {
    private Connection getConnection() throws Exception {
        Class.forName("com.mysql.cj.jdbc.Driver");
        return DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "id", "pw");
    }

    public void insertMember(MemberVO member) throws Exception {
        String sql = "INSERT INTO MEMBER (id, name) VALUES (?, ?)";
        try (Connection con = getConnection();
             PreparedStatement pstmt = con.prepareStatement(sql)) {
            pstmt.setString(1, member.getId());
            pstmt.setString(2, member.getName());
            pstmt.executeUpdate();
        }
    }
}

VO 클래스 (Value Object) / DTO 클래스 (Data Transfer Object)

  • 역할: 데이터베이스와 관련된 변수들의 모음을 제공하는 클래스입니다. DAO 클래스를 이용하여 데이터를 주고받을 때 사용됩니다.
  • 구조: 자바빈 규약을 따르며, private 변수와 public getter/setter 메소드를 가집니다.

예제 코드:

public class MemberVO {
    private String id;
    private String name;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

MVC 패턴의 구조

MVC1 전체적인 컴포넌트 설계

  • 구성 요소:

    • Model: 데이터와 관련된 로직을 처리하는 컴포넌트입니다. DAO와 VO 클래스를 포함합니다.
    • View: 사용자 인터페이스를 담당하며, JSP 페이지로 구현됩니다.
    • Controller: 사용자 입력을 처리하고, Model과 View를 연결하는 역할을 합니다.
  • 동작 원리:

    1. 클라이언트의 요청이 Controller로 전달됩니다.
    2. Controller는 요청을 처리하기 위해 Model을 호출합니다.
    3. Model은 비즈니스 로직을 처리하고 데이터를 반환합니다.
    4. Controller는 데이터를 View에 전달하여 사용자에게 응답을 보냅니다.

커넥션 풀 (Connection Pool)

연결 풀 (Connection Pool)

  • 개요: 데이터베이스 연결 풀은 미리 생성된 데이터베이스 연결을 필요할 때마다 재사용하는 기술입니다. 연결 풀이 가득 차면 새로운 연결을 생성하여 풀에 추가합니다.
  • 장점:
    • 데이터베이스 연결 시간을 줄여 성능을 향상시킵니다.
    • 자원을 효율적으로 사용합니다.
    • 데이터베이스 연결 관리가 간소화됩니다.

커넥션 풀 설정

  • Eclipse 설정: Servers 폴더에서 context.xml 파일을 수정하여 커넥션 풀을 설정할 수 있습니다.
  • 예제 설정:
    <Resource
    auth="Container"
    driverClassName="com.mysql.cj.jdbc.Driver"
    url="jdbc:mysql://localhost:3306/test?serverTimezone=Asia/Seoul"
    username="jsp"
    password="jsp"
    name="jdbc/mysql"
    type="javax.sql.DataSource"
    maxActive="300"
    maxWait="1000"
    />

DataSource 객체

  • 역할: 데이터베이스 URL, 사용자명, 비밀번호, 드라이버 클래스를 미리 정의하여 커넥션 풀을 관리합니다.
  • 설정 및 사용: context.xml 파일에 DataSource를 정의한 후, JSP나 Servlet에서 JNDI를 이용하여 DataSource 객체를 참조합니다.

커넥션 풀 사용 예제

  1. context.xml 설정

    <Resource
    auth="Container"
    driverClassName="com.mysql.cj.jdbc.Driver"
    url="jdbc:mysql://localhost:3306/test?serverTimezone=Asia/Seoul"
    username="jsp"
    password="jsp"
    name="jdbc/mysql"
    type="javax.sql.DataSource"
    maxActive="300"
    maxWait="1000"
    />
  2. JSP/Servlet에서 DataSource 사용

    InitialContext initContext = new InitialContext();
    Context envContext = (Context) initContext.lookup("java:/comp/env");
    DataSource ds = (DataSource) envContext.lookup("jdbc/mysql");
    

try (Connection con = ds.getConnection()) {
// 데이터베이스 작업 수행
}


## MVC 패턴에서의 JSP와 서블릿

### 서블릿의 역할

- **정의**: 자바를 사용하여 웹 서버에서 동적으로 요청을 처리할 수 있는 서버 측 프로그램입니다.
- **역할**: 클라이언트의 요청을 받아 비즈니스 로직을 처리하고, JSP 페이지로 데이터를 전달하는 역할을 합니다.

### JSP의 역할

- **정의**: HTML 내에 자바 코드를 삽입하여 동적으로 웹 페이지를 생성할 수 있는 기술입니다.
- **역할**: 데이터베이스에서 조회한 데이터를 사용자에게 보여주는 역할을 하며, 서블릿에서 전달받은 데이터를 사용하여 웹 페이지를 생성합니다.

## EL (Expression Language)

### EL의 정의 및 사용법

**EL(Expression Language)**은 JSP에서 데이터를 쉽게 접근하고 조작할 수 있도록 도와주는 스크립트 언어입니다. EL을 사용하면 JSP 페이지 내 스크립트 코드를 최소화하고, 표현식의 가독성을 높일 수 있습니다.

### 사용법

- **기존 표현식**: `<%= value %>` → **EL 표현식**: `${value}`
- **기존 액션 태그**: `<jsp:getProperty name="member" property="name"/>` → **EL 표현식**: `${member.name}`

EL은 자동으로 게터 메서드를 호출합니다. 예를 들어 `${dto.property}`는 `dto.getProperty()`를 호출하는 것과 동일합니다.

### 연산자

- **산술 연산자**: `+`, `-`, `*`, `/`, `%`
- **관계 연산자**: `==`, `!=`, `<`, `<=`, `>`, `>=`
- **조건 연산자**: `a ? b : c`
- **논리 연산자**: `&&`, `||`

### 내장 객체

- **기본 검색 순서**: `request` → `session` → `application`
- **주요 내장 객체**:
  - `requestScope`: JSP의 `request` 객체 참조
  - `sessionScope`: JSP의 `session` 객체 참조
  - `applicationScope`: JSP의 `application` 객체 참조
  - `param`: 요청 파라미터 참조
  - `pageScope`: JSP의 `page` 객체 참조
  - `paramValues`: 요청 파라미터(배열) 참조
  - `initParam`: 서블릿 컨텍스트 초기화 파라미터 참조
  -

 `cookie`: 쿠키 객체 참조

### EL 예제

- **기존 코드**:
```java
String name = session.getAttribute("name");
이름 : <%=name%>
  • EL 코드:
    이름 : ${sessionScope.name}

JSTL (JSP Standard Tag Library)

JSTL의 정의 및 사용법

JSTL은 JSP에서 사용할 수 있는 태그 라이브러리로, HTML 태그와 자바 코드를 혼합한 JSP 코드를 간결하고 가독성 높게 작성할 수 있도록 돕습니다. Tomcat과 같은 컨테이너에 기본 포함되지 않기 때문에 별도의 라이브러리를 설치해야 합니다.

설치 방법

  1. JSTL 라이브러리에서 jstl.jar, standard.jar 파일을 다운로드합니다.
  2. 다운로드한 파일을 톰캣의 lib 디렉토리에 복사합니다.

JSTL Core Library

JSTL Core 라이브러리는 출력, 제어문, 반복문 등의 기본적인 기능을 제공합니다. JSP 파일 내에서 사용하기 위해 반드시 태그 라이브러리를 선언해야 합니다.

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

주요 태그

  • c:out: 값 출력

    <c:out value="${user.email}" default="no-email@example.com"/>

    user.email 값이 null이면 "no-email@example.com"을 출력합니다.

  • c:set: 변수 설정

    <c:set var="변수명" value="설정값" scope="범위"/>
  • c:remove: 변수 제거

    <c:remove var="변수명" scope="범위"/>
  • c:if: 조건문

    <c:if test="${조건식}"> 내용 </c:if>
  • c:choose: 다중 조건문

    <c:choose>
      <c:when test="${조건식}"> 내용 </c:when>
      <c:otherwise> 내용 </c:otherwise>
    </c:choose>
  • c:forEach: 반복문

    <c:forEach items="${컬렉션}" var="변수명">
      내용
    </c:forEach>

JSTL 사용 예제

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<c:set var="message" value="Hello, JSTL!"/>
<c:if test="${not empty message}">
    <c:out value="${message}"/>
</c:if>

이 예제는 JSTL을 사용하여 "Hello, JSTL!" 메시지를 설정하고 출력하는 간단한 예제입니다.


'🗄️ Backend > JSP' 카테고리의 다른 글

JSP와 MyBatis  (4) 2024.10.18
JSP와 MVC2 패턴  (1) 2024.10.18
쿠키(Cookie)와 세션(Session) 완벽 가이드  (0) 2024.10.18
JSP와 서블릿: 동적 웹 개발의 기초  (0) 2024.10.18
HTML 기초 및 태그 정리  (2) 2024.10.17
'🗄️ Backend/JSP' 카테고리의 다른 글
  • JSP와 MyBatis
  • JSP와 MVC2 패턴
  • 쿠키(Cookie)와 세션(Session) 완벽 가이드
  • JSP와 서블릿: 동적 웹 개발의 기초
hjwjo
hjwjo
백엔드 및 풀스택 개발에 관심 있는 초보 개발자의 개발 블로그입니다.
  • hjwjo
    Jeongwoo's Devlog
    hjwjo
  • 전체
    오늘
    어제
    • Devlog
      • 🗄️ Backend
        • Java
        • Spring
        • JPA
        • SQL
        • JSP
        • AWS
        • GCP
        • Linux
        • GitHub
        • ML
        • Security
      • 🖥️ Frontend
        • React
        • CSS
      • 🏅 Project
        • Hackathon
        • Team Project
      • 📊 Algorithm
        • BOJ
      • 📜 Certs
        • ADsP
        • SQLD
        • 정보처리기사
      • 📖
        • JavaScript
      • 일상
        • 면접후기
  • 블로그 메뉴

    • 홈
    • Devlog
    • 태그
    • 방명록
  • 링크

    • GitHub
  • 공지사항

  • 인기 글

  • 태그

    스프링
    java
    정보처리기사
    DML
    springboot
    GCP
    백엔드
    백준
    쿼리
    java기초
    데이터베이스
    정처기
    스프링부트
    SQL
    Spring
    AWS
    jsp
    자바
    ADsP
    http
  • 최근 댓글

  • 최근 글

hjwjo
JSP와 MVC 패턴: DAO/DTO, 커넥션 풀, EL, JSTL
상단으로

티스토리툴바