코딩기록 저장소 🐕/JSP

DBCP

kimkongmom 2023. 9. 19. 12:10

 

 

 

context.xml

<Context> 태그 내에 <Resource> 태그를 추가하여 데이터베이스 연결 정보를 설정합니다. 설정에는 다음과 같은 정보가 포함됩니다:
데이터베이스 드라이버 클래스 (driverClassName)
데이터베이스 URL (url)
데이터베이스 접속 계정 정보 (username 및 password)
커넥션 풀 설정 (예: maxTotal, maxIdle, maxWaitMillis)

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?xml version="1.0" encoding="UTF-8"?>
 
<Context>
 
  <!-- 오라클 접속 정보 -->
  <Resource
      auth="Container"
      name="jdbc/oraclexe"
      type="javax.sql.DataSource"
      driverClassName="oracle.jdbc.OracleDriver"
      url="jdbc:oracle:thin:@localhost:1521:xe"
      username="GD"
      password="1111"
      maxTotal="8"
      maxIdle="8"
      maxWaitMillis="-1" />
 
 
</Context>
cs

 

 

 

 

데이터베이스 설계 및 테이블 생성 (SQL 파일)

 

1
2
3
4
5
6
7
8
9
10
11
12
DROP TABLE BOARD_T;
CREATE TABLE BOARD_T (
  BOARD_NO    NUMBER NOT NULL,
  TITLE       VARCHAR2(1000 BYTE) NOT NULL,
  CONTENT     CLOB,
  MODIFIED_AT DATE,
  CREATED_AT  DATE,
  CONSTRAINT PK_BOARD PRIMARY KEY(BOARD_NO)
);
 
DROP SEQUENCE BOARD_SEQ;
CREATE SEQUENCE BOARD_SEQ NOCACHE;
cs

 

 

 

DTO (Data Transfer Object) 클래스 생성

이 클래스는 게시판 글과 관련된 데이터를 저장합니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package domain;
 
import java.sql.Date;
 
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
 
@NoArgsConstructor
@AllArgsConstructor
@Data
@Builder
public class BoardDto {
  private int board_no;
  private String title;
  private String content;
  private Date modified_at;
  private Date created_at;
  
  
}
 
cs

 

 

 

 DAO (Data Access Object) 클래스 생성

 

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
package repository;
 
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
 
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;
 
import domain.BoardDto;
 
public class BoardDao {
 
  // 모든 메소드가 공동으로 사용할 객체 선언
  private Connection con;
  private PreparedStatement ps;
  private ResultSet rs;
  
  // Connection Pool 관리 DataSource 객체 선언
  private DataSource dataSource;
  
  // Singleton Pattern으로 BoardDao 객체 생성
  private static BoardDao dao = new BoardDao();
  private BoardDao() {
    // META-INF/context.xml에 있는 <Resource name="jdbc/oraclexe" /> 태그 내용을 읽어서 DataSource 객체 생성하기
    try {
      Context context = new InitialContext();
      Context env = (Context)context.lookup("java:comp/env");
      dataSource = (DataSource)env.lookup("jdbc/oraclexe");
    } catch(Exception e) {
      e.printStackTrace();
    }
  }
  public static BoardDao getDao() {
    return dao;
  }
  
  // 자원 반납 메소드
  public void close() {
    try {
      if(rs != null) rs.close();
      if(ps != null) ps.close();
      if(con != null) con.close();
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
  
  // 게시글 등록 메소드
  public int register(BoardDto dto) {
    
    // 등록 결과 선언 (insert 실행 결과는 삽입된 행의 개수이다.)
    int insertResult = 0;
    
    try {
      
      // Connection Pool에서 Connection을 하나 받아온다.
      // Connection Pool 관리는 DataSource 객체가 수행한다.
      
      con = dataSource.getConnection();
      
      // 쿼리문 작성 
      String sql = "INSERT INTO BOARD_T(BOARD_NO, TITLE, CONTENT, MODIFIED_AT, CREATED_AT) VALUES (BOARD_SEQ.NEXTVAL, ?, ?, SYSDATE, SYSDATE)";
      
      // ps 객체 생성 (쿼리문 실행을 담당하는 객체)
      ps = con.prepareStatement(sql);
      
      // 쿼리문의 변수(?로 처리된 부분)에 값을 전달
      ps.setString(1, dto.getTitle());   // 1번째 물음표(?)에 dto.getTitle() 전달하기
      ps.setString(2, dto.getContent()); // 2번째 물음표(?)에 dto.getContent() 전달하기
      
      // 쿼리문의 실행
      insertResult = ps.executeUpdate();
      
    } catch (Exception e) {
      e.printStackTrace();
    } finally {
      close();
    }
    
    // 등록 결과 반환
    return insertResult;
    
  }
  
  
  
  
  
  
  
}
cs

 

 

공통 클래스 작성 (ActionForward.java):

ActionForward 클래스를 생성하고, 이동 경로와 리다이렉트 여부를 나타내는 필드를 정의합니다. 이 클래스는 서블릿에서 다음 이동을 지정하는 데 사용됩니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
package common;
 
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
 
@NoArgsConstructor
@AllArgsConstructor
@Data
public class ActionForward {
  private String path;
  private boolean isRedirect;
}
 
cs

 

서비스 인터페이스 작성 (BoardService.java):

BoardService 인터페이스를 생성합니다. 이 인터페이스는 비즈니스 로직을 처리하기 위한 메서드를 정의합니다.

 

1
2
3
4
5
6
7
8
9
10
package service;
 
import javax.servlet.http.HttpServletRequest;
 
import common.ActionForward;
 
public interface BoardService {
  public ActionForward register(HttpServletRequest request);
}
 
cs

 

 

 

서비스 구현 클래스 작성 (BoardServiceImpl.java):

구현된 메서드 내에서 데이터베이스와 상호 작용하고, 필요한 작업을 수행합니다.

 

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
32
33
34
35
36
37
38
39
40
41
42
package service;
 
import javax.servlet.http.HttpServletRequest;
 
import common.ActionForward;
import domain.BoardDto;
import repository.BoardDao;
 
public class BoardServiceImpl implements BoardService {
 
  // 모든 서비스가 공동으로 사용하는 BoardDao 객체 가져오기
  private BoardDao dao = BoardDao.getDao();
  
  @Override
  public ActionForward register(HttpServletRequest request) {
    
    // 등록할 제목과 내용
    String title = request.getParameter("title");
    String content = request.getParameter("content");
    
    // 제목 + 내용 -> BoardDto 객체
    BoardDto dto = BoardDto.builder()
                     .title(title)
                     .content(content)
                     .build();
    
    // BoardDao의 register 메서드 호출
    int registerResult =  dao.register(dto);
    
    // 등록 성공(registerResult == 1), 등록 실패(registerResult == 0)
    String path = null;
    if(registerResult == 1) {
      path = "/board/list.jsp";
    } else if(registerResult == 0) {
      path = "/index.jsp";
    }
    // 어디로 어떻게 이동하는지 반환 (insert 수행 후에는 반드시 redirect 이동한다.)
    return new ActionForward(path, true);
  }
 
}
 
cs

 

 

 

 

웹 페이지 (JSP 파일) 생성

게시판 목록

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<c:set var="contextPath" value="<%=request.getContextPath()%>" />
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script src="https://code.jquery.com/jquery-3.7.1.min.js" integrity="sha256-/JqT3SQfawRcv/BIHPThkBvs0OEvtFFmqPF/lYI/Cxo=" crossorigin="anonymous"></script>
</head>
<body>
 
  <div>
    <a href="${contextPath}/board/list.do">게시판목록</a>
  </div>
  
</body>
</html>
cs

 

 

 

 

웹 페이지 (JSP 파일) 생성

작성하러가기 버튼

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<c:set var="contextPath" value="<%=request.getContextPath()%>" />
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script src="https://code.jquery.com/jquery-3.7.1.min.js" integrity="sha256-/JqT3SQfawRcv/BIHPThkBvs0OEvtFFmqPF/lYI/Cxo=" crossorigin="anonymous"></script>
</head>
<body>
 
  <div>
   <a href="${contextPath}/board/write.do">작성하러가기</a>
  </div>
  
  <hr>
  
  
  
</body>
</html>
cs

 

 

 

 

웹 페이지 (JSP 파일) 생성

작성폼, 버튼

 

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<c:set var="contextPath" value="<%=request.getContextPath()%>" />
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script src="https://code.jquery.com/jquery-3.7.1.min.js" integrity="sha256-/JqT3SQfawRcv/BIHPThkBvs0OEvtFFmqPF/lYI/Cxo=" crossorigin="anonymous"></script>
<script>
 
  $(function(){
    // 함수 호출
    fnboardList();
    fnBoardRegister();  
  })
  
  // 함수 정의
  function fnboardList() {
    $('btn_list').click(function(){
    location.href = '${contextPath}/board/list.do';
    })
  }
  
  // 함수 정의
  function fnBoardRegister() {
    $('#frm_register').submit(function(event){
      if($('#title').val() === '') {
        alert('제목은 필수입니다.');
        $('#title').focus();
        event.preventDefault();
        return;
      }
    })
  }
</script>
</head>
<body>
 
  <div>
   <form id="frm_register" method="post" action="${contextPath}/board/register.do">
    <div>
      <label for="title">제목</label>
      <input type="text" id="title" name="title">
    </div>
    <div>
      <textarea rows="5" cols="50" name="content"></textarea>
    </div>
    <div>
      <button type="submit">작성완료</button>
      <button type="reset">작성초기화</button>
      <button type="button" id="btn_list">목록으로이동</button>
    </div>
   </form>
  </div>
 
  
</body>
</html>
cs

 

 

 

 

컨트롤러 작성 (BoardController.java):

BoardController 서블릿을 생성합니다. 이 서블릿은 클라이언트 요청을 처리합니다.
doGet 메서드 내에서 요청 주소를 확인하고, 해당 요청에 따른 처리를 수행합니다.
요청 처리 후, ActionForward 객체를 생성하여 이동 경로와 리다이렉트 여부를 설정합니다.
최종적으로, ActionForward 객체에 따라 다음 페이지로 이동합니다.

 

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
package controller;
 
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
import common.ActionForward;
import service.BoardService;
import service.BoardServiceImpl;
 
/**
 * Servlet implementation class BoardController
 */
@WebServlet("*.do")
public class BoardController extends HttpServlet {
    private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public BoardController() {
        super();
        // TODO Auto-generated constructor stub
    }
 
    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        
      // BoardFilter 실행 후 Controller 실행
      
      // 요청 인코딩(BoardFilter가 수행함) + 응답 타입과 인코딩
      //request.setCharacterEncoding("UTF-8");
      response.setContentType("text/html; charset=UTF-8");
      
      // 요청 주소 확인
      String requestURI = request.getRequestURI();
      String contextPath = request.getContextPath();
      String urlMapping = requestURI.substring(contextPath.length());
      
      // 어디로 어떻게 이동할 것인지 알고 있는 ActionForward 객체
      ActionForward af = null;
      
      // BoardService 객체 생성
      BoardService boardService = new BoardServiceImpl();
      
      // 요청에 따른 처리
      switch(urlMapping) {
      // 단순 이동 (forward 처리)
      case "/board/list.do" :
        af = new ActionForward("/board/list.jsp"false);
        break;
      case "/board/write.do" :
        af = new ActionForward("/board/write.jsp"false);
        break;
      // 서비스 처리
      case "/board/register.do":
        af = boardService.register(request);
        break;
      }
      // 이동
      if(af != null) {
        if(af.isRedirect()) {
          response.sendRedirect(af.getPath());
        } else {
          request.getRequestDispatcher(af.getPath()).forward(request, response);
        }
      }
      
    }
 
    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        doGet(request, response);
    }
 
}
 
cs

 

 

 

 

필터 작성 (BoardFilter.java):

BoardFilter 필터를 생성합니다. 이 필터는 클라이언트 요청을 가로채서 요청 처리 전에 필요한 작업을 수행합니다.

 

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
package filter;
 
import java.io.IOException;
import java.util.Arrays;
import java.util.Map;
import java.util.Map.Entry;
 
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
/**
 * Servlet Filter implementation class BoardFilter
 */
@WebFilter("*.do")
public class BoardFilter extends HttpFilter implements Filter {
       
    /**
     * @see HttpFilter#HttpFilter()
     */
    public BoardFilter() {
        super();
        // TODO Auto-generated constructor stub
    }
 
    /**
     * @see Filter#destroy()
     */
    public void destroy() {
        // TODO Auto-generated method stub
    }
 
    /**
     * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
     */
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        
      // 컨트롤러가 실행되기 이전에 처리되는 코드
      
      HttpServletRequest req = (HttpServletRequest) request ;
      HttpServletResponse res = (HttpServletResponse) response;
 
      // 요청 인코딩
      req.setCharacterEncoding("UTF-8");
      
      // 요청 주소 확인
      System.out.println(req.getRequestURI());
      
      // 요청 파라미터 확인
      Map<StringString[]> map = req.getParameterMap();
      for(Entry<StringString[]> entry : map.entrySet()) {
        System.out.println(entry.getKey() + ":" + Arrays.toString(entry.getValue()));
      }
      
        // pass the request along the filter chain
        chain.doFilter(request, response);
    }
 
    /**
     * @see Filter#init(FilterConfig)
     */
    public void init(FilterConfig fConfig) throws ServletException {
        
      System.out.println(":::::: BoardFilter 시작 ::::::");
    }
 
}
 
cs

 

 

 

 

'코딩기록 저장소 🐕 > JSP' 카테고리의 다른 글

MyBatis  (0) 2023.09.21
게시물 CRUD,DBCP  (0) 2023.09.20
mvc pattern2  (0) 2023.09.19
mvc pattern  (0) 2023.09.18
jsp session 로그인 장바구니 cookie  (0) 2023.09.18