오봉이와 함께하는 개발 블로그

Servlet - Servlet DB 연동(기본 JDBC) 본문

BE/Servlet

Servlet - Servlet DB 연동(기본 JDBC)

오봉봉이 2021. 12. 28. 19:43
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