오봉이와 함께하는 개발 블로그
Servlet - Servlet DB 연동(기본 JDBC) 본문
728x90
서블릿 DB 연동
서블릿의 비즈니스 로직 처리
- 데이터베이스 관련 작업
- 다른 서버 연동해서 데이터 얻는 작업 등
- 예
- 회원 등록 요청 처리(DB에 회원 정보가 저장)
- 로그인 처리 (DB에 있는 회원 정보와 입력하여 전송된 로그인 정보가 일치하는지 검사)
- 쇼핑몰 주문 처리 작업
- 비즈니스 로직 처리 과정
- 클라이언트로부터 요청
- 데이터베이스 연동과 같은 비즈니스 로직 처리
- 결과를 클라이언트에게 응답
- HTML로 요청 -> 서블릿에서 요청 받음 -> DAO에서 비즈니스 로직 처리. 결과 반환 -> 서블릿에서 결과 받아서 클라이언트에게 응답 -> 클라이언트에서 결과 출력
- 나중에 스프링에서 처리하는 과정
- JSP로 요청 -> 컨트롤러가 요청 받음 -> DAO에서 비즈니스 로직 처리. 결과 반환 -> 컨트롤러가 결과 받아서 클라이언트에게 응답 -> 클라이언트에서 결과 출력
DTO vs VO
- DTO (Data Transfer Object)
- 데이터 저장 (전송) 담당 클래스
- Controller, Service, View 등 계층간 데이터 교환을 위해 사용되는 객체
- 비즈니스 로직을 갖지 않는 순수한 데이터 객체
- getter, setter 메소드만 포함
- 가변의 성격 (setter를 사용해서 데이터 변경 가능)
- VO (Value Object)
- 데이터 저장 담당 클래스
- DTO와 혼용해서 사용되지만
- VO는 값(Value)을 위해 사용되는 객체로 불변(read only)의 속성
- 보통 getter의 기능만 포함
- 일반적으로 DTO와 같은 용도로 사용
서블릿 DB연동 예제 - MemberDAO.java, MemberVO.java, MemberSelectServlet.java
package com.example.servlet4.sec04;
import java.sql.*;
import java.util.ArrayList;
import java.util.Date;
public class MemberDAO {
// DB 연결 담당 메소드
public Connection connDB() {
Connection con = null;
try {
Class.forName("com.mysql.cj.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/servletdb?serverTimezone=UTC";
String user = "root";
String pwd = "";
con = DriverManager.getConnection(url, user, pwd);
if(con != null) {
System.out.println("연결 성공");
}
} catch(Exception e) {
System.out.println("연결 오류 발생!");
e.printStackTrace();
}
return con;
}
// 회원 정보 조회 메소드(전체 회원 정보 select : MemberVO 반환)
// MemberVO를여러 행 반환 : ArrayList<MemberVO>
public ArrayList<MemberVO> memberSelect() {
Connection con = null;
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
ArrayList<MemberVO> memList = new ArrayList<MemberVO>();
try {
con = connDB();
String query = "select * from member";
preparedStatement = con.prepareStatement(query);
resultSet = preparedStatement.executeQuery(query);
while(resultSet.next()) { // 결과 세트에서 한 행씩 처리
// 한 행(회원 1명당) 처리
String id = resultSet.getString("memId");
String pwd = resultSet.getString("memPwd");
String name = resultSet.getString("memName");
String email = resultSet.getString("memEmail");
Date joinDate = resultSet.getDate("memJoinDate");
// 한 행 정보 가져와 memberVO에 Setter 이용하여 저장
MemberVO vo = new MemberVO();
vo.setId(id);
vo.setPwd(pwd);
vo.setName(name);
vo.setEmail(email);
vo.setJoinDate(joinDate);
// 각 memberVO를 ArrayList에 저장
memList.add(vo);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
resultSet.close();
preparedStatement.close();
con.close();
} catch (Exception e) {
e.printStackTrace();
}
}
return memList;
}
}
package com.example.servlet4.sec04;
import java.util.Date;
public class MemberVO {
private String id;
private String pwd;
private String name;
private String email;
private Date joinDate;
// 디폴트 생성자
public MemberVO() { }
// 현재는 매개변수 있는 생성자 필요 없다.
public MemberVO(String id, String pwd, String name, String email, Date joinDate) {
this.id = id;
this.pwd = pwd;
this.name = name;
this.email = email;
this.joinDate = joinDate;
}
// Getter / Setter
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public Date getJoinDate() {
return joinDate;
}
public void setJoinDate(Date joinDate) {
this.joinDate = joinDate;
}
}
package com.example.servlet4.sec04;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Date;
//@WebServlet(name = "MemberSelectServlet", value = "/MemberSelectServlet")
@WebServlet("/sec04/MemberSelectServlet")
public class MemberSelectServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doProcess(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doProcess(request, response);
}
protected void doProcess(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
// 서버에서 클라이언트로 데이터 전송에 자바 IO스트림 이용
PrintWriter out = response.getWriter();
MemberDAO dao = new MemberDAO();
ArrayList<MemberVO> memList = dao.memberSelect();
out.print("<html><head></head><body>");
out.print("<table border=1><tr align='center' bgcolor='gold'>");
out.print("<td>아이디</td><td>비밀번호</td><td>이름</td><td>이메일</td>" +
"<td>가입일</td></tr>");
for(int i = 0; i < memList.size(); i++) {
// 오브젝트 반환 MemberVO 타입으로 형변환
MemberVO vo = (MemberVO)memList.get(i);
String id = vo.getId();
String pwd = vo.getPwd();
String name = vo.getName();
String email = vo.getEmail();
Date joinDate = vo.getJoinDate();
// 한 행씩 출력
out.print("<tr><td>" + id + "</td><td>" +
pwd + "</td><td>" +
name + "</td><td>" +
email + "</td><td>" +
joinDate + "</td></tr>");
}
out.print("</table></body></head>");
}
}
서블릿 DB연동 연습문제 - BookDAO.java, BookVO.java, BookSelectServlet.java
package com.example.servlet4.sec05;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.Date;
public class BookDAO {
// DB 연결 담당 메소드
public Connection connDB() {
Connection con = null;
try {
Class.forName("com.mysql.cj.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/servletdb?serverTimezone=UTC";
String user = "root";
String pwd = "";
con = DriverManager.getConnection(url, user, pwd);
if(con != null) {
System.out.println("연결 성공");
}
} catch(Exception e) {
System.out.println("연결 오류 발생!");
e.printStackTrace();
}
return con;
}
// 회원 정보 조회 메소드(전체 회원 정보 select : BookVO 반환)
// BookVO를 여러 행 반환 : ArrayList<BookVO>
public ArrayList<BookVO> bookSelect() {
Connection con = null;
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
ArrayList<BookVO> bookList = new ArrayList<BookVO>();
try {
con = connDB();
String query = "select * from book";
preparedStatement = con.prepareStatement(query);
resultSet = preparedStatement.executeQuery(query);
while(resultSet.next()) { // 결과 세트에서 한 행씩 처리
// 한 행(책 한 개당) 처리
String bookNo = resultSet.getString("bookNo");
String bookName = resultSet.getString("bookName");
String bookAuthor = resultSet.getString("bookAuthor");
int bookPrice = resultSet.getInt("bookPrice");
Date bookDate = resultSet.getDate("bookDate");
String pubNo = resultSet.getString("pubNo");
// 한 행 정보 가져와 BookVO에 Setter 이용하여 저장
BookVO vo = new BookVO();
vo.setBookNo(bookNo);
vo.setBookName(bookName);
vo.setBookAuthor(bookAuthor);
vo.setBookPrice(bookPrice);
vo.setBookDate(bookDate);
vo.setPubNo(pubNo);
// 각 BookVO를 ArrayList에 저장
bookList.add(vo);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
resultSet.close();
preparedStatement.close();
con.close();
} catch (Exception e) {
e.printStackTrace();
}
}
return bookList;
}
}
package com.example.servlet4.sec05;
import java.util.Date;
public class BookVO {
private String bookNo;
private String bookName;
private String bookAuthor;
private int bookPrice;
private Date bookDate;
private String pubNo;
public BookVO() { }
public BookVO(String bookNo, String bookName, String bookAuthor, int bookPrice, Date bookDate, String pubNo) {
this.bookNo = bookNo;
this.bookName = bookName;
this.bookAuthor = bookAuthor;
this.bookPrice = bookPrice;
this.bookDate = bookDate;
this.pubNo = pubNo;
}
public String getBookNo() {
return bookNo;
}
public void setBookNo(String bookNo) {
this.bookNo = bookNo;
}
public String getBookName() {
return bookName;
}
public void setBookName(String bookName) {
this.bookName = bookName;
}
public String getBookAuthor() {
return bookAuthor;
}
public void setBookAuthor(String bookAuthor) {
this.bookAuthor = bookAuthor;
}
public int getBookPrice() {
return bookPrice;
}
public void setBookPrice(int bookPrice) {
this.bookPrice = bookPrice;
}
public Date getBookDate() {
return bookDate;
}
public void setBookDate(Date bookDate) {
this.bookDate = bookDate;
}
public String getPubNo() {
return pubNo;
}
public void setPubNo(String pubNo) {
this.pubNo = pubNo;
}
}
package com.example.servlet4.sec05;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Date;
@WebServlet("/sec05/BookSelectServlet")
public class BookSelectServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doProcess(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doProcess(request, response);
}
protected void doProcess(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
// 서버에서 클라이언트로 데이터 전송에 자바 IO스트림 이용
PrintWriter out = response.getWriter();
BookDAO dao = new BookDAO();
ArrayList<BookVO> bookList = dao.bookSelect();
out.print("<html><head></head><body>");
out.print("<table border=1><tr align='center' bgcolor='gold'>");
out.print("<td>도서번호</td><td>도서명</td><td>저자</td><td>가격</td>" +
"<td>발행일</td><td>출판사번호</td></tr>");
for(int i = 0; i < bookList.size(); i++) {
// 오브젝트 반환 MemberVO 타입으로 형변환
BookVO vo = (BookVO)bookList.get(i);
String bookNo = vo.getBookNo();
String bookName = vo.getBookName();
String bookAuthor = vo.getBookAuthor();
int bookPrice = vo.getBookPrice();
Date bookDate = vo.getBookDate();
String pubNo = vo.getPubNo();
// 한 행씩 출력
out.print("<tr><td>" + bookNo + "</td><td>" +
bookName + "</td><td>" +
bookAuthor + "</td><td>" +
bookPrice + "</td><td>" +
bookDate + "</td><td>" +
pubNo + "</td></tr>");
}
out.print("</table></body></head>");
}
}
728x90
'BE > Servlet' 카테고리의 다른 글
Servlet - 포워딩 (0) | 2021.12.29 |
---|---|
Servlet - Servlet DB연동(Connection Pool) (0) | 2021.12.28 |
Servlet - DOM 객체, name 속성, jQuery 사용 (0) | 2021.12.28 |
Servlet - Servlet 요청 API (0) | 2021.12.27 |
Servlet - Servlet 개요 (0) | 2021.12.27 |
Comments