PreparedStatement(pstmt) 객체
Statement 객체와 PreparedStatement 객체의 차이점
웹 애플리케이션에서 SQL 쿼리를 처리할 때, Statement 객체와 PreparedStatement 객체를 사용할 수 있습니다.
- Statement 객체: SQL 쿼리를 문자열로 작성하고 직접 실행합니다. 그러나 복잡한 쿼리나 동적인 값이 많을 경우 코드가 복잡해지고 오류 발생 가능성이 높아집니다.
- PreparedStatement 객체: SQL 쿼리를 미리 컴파일하여 성능을 향상시키고, 파라미터 설정 시 '?'를 사용하여 간편하게 값을 지정할 수 있습니다. 이는 코드의 가독성을 높이고, SQL 인젝션 공격을 예방하는 데 도움이 됩니다.
PreparedStatement 실행 순서
드라이버 로딩
Class.forName("com.mysql.cj.jdbc.Driver");
데이터베이스 연결
Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "id", "pw");
PreparedStatement 객체 생성
String sql = "INSERT INTO MEMBER VALUES(?, ?)"; PreparedStatement pstmt = con.prepareStatement(sql);
값 설정
pstmt.setString(1, "value1"); pstmt.setString(2, "value2");
쿼리 실행
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를 연결하는 역할을 합니다.
동작 원리:
- 클라이언트의 요청이 Controller로 전달됩니다.
- Controller는 요청을 처리하기 위해 Model을 호출합니다.
- Model은 비즈니스 로직을 처리하고 데이터를 반환합니다.
- 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 객체를 참조합니다.
커넥션 풀 사용 예제
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" />
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과 같은 컨테이너에 기본 포함되지 않기 때문에 별도의 라이브러리를 설치해야 합니다.
설치 방법
- JSTL 라이브러리에서
jstl.jar
,standard.jar
파일을 다운로드합니다. - 다운로드한 파일을 톰캣의
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 |