3~4일간 공부한 것을 바탕으로 정리할 겸 제작해보자.
1. 화면 설계하기
2. Server 생성
3. JDBC DataSource 설정하기
<Resource
auth="Container"
driverClanssName="oracle.jdbc.driver.OracleDriver"
maxActive="50" maxWait="100"
name="jdbc/Oracle11g"
password="사용db비밀번호"
type="javax.sql.DataSource"
url="jdbc:oracle:thin:@localhost:1521:(SID)"
username="사용db아이디"/>
해당 태그를 context.xml에 추가해주자.
프로젝트 라이브러리에 objdbc가 설치 되어 있음을 확인한다.
4. 웹 프로젝트 추가하기
5. jsp 페이지 생성하기 (View)
이 때, 서버가 제대로 작동하는지 페이지 경로를 제대로 지정해 줬는지 다시 한번 확인하고, 미리 그림을 그려본다.
<%@ page language="java" contentType="text/html; charset=EUC-KR"
pageEncoding="EUC-KR"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>Insert title here</title>
</head>
<body>
<div style="display : flex; flex-direction: column; align-items:center">
<h1>Simple Notice Board</h1>
<table width="500" cellpadding="0" cellspacing="0" border="1">
<tr>
<td>ID</td>
<td>작성자</td>
<td>제목</td>
<td>생성일</td>
<td>댓글수</td>
</tr>
<c:forEach items="${allList}" var="dto">
<tr>
<td>${dto.mId}</td>
<td>${dto.mName}</td>
<td>
<c:forEach begin="1" end="${dto.mIndent}">-</c:forEach>
<a href="content_view.do?mId=${dto.mId}">${dto.mTitle}</a></td>
<td>${dto.mDate}</td>
<td>${dto.mHit}</td>
</tr>
</c:forEach>
<tr>
<td colspan="5"> <a href="write_view.do">글작성</a> </td>
</tr>
</table>
</div>
</body>
</html>
결과는 다음과 같다.
6. DTO 객체 및 DAO 생성
import java.sql.Timestamp;
public class Dto {
int mId;
String mName;
..중략
public Dto() {
// TODO Auto-generated constructor stub
}
public Dto(int mId, String mName, .. 중략) {
this.mId = mId;
this.mName = mName;
..중략
}
getter & setter 중략
}
package com.notice_board.dao;
public class Dao {
DataSource dataSource;
public Dao() {
try {
Context context = new InitialContext();
dataSource = (DataSource) context.lookup("java:comp/env/jdbc/Oracle11g");
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
public ArrayList<Dto> list() {
ArrayList<Dto> dtos = new ArrayList<Dto>();
Connection connection = null;
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
try {
connection = dataSource.getConnection();
String query = "select mId, mName,..중략 from notice_board order by mGroup desc, mStep asc";
preparedStatement = connection.prepareStatement(query);
resultSet = preparedStatement.executeQuery();
while (resultSet.next()) {
int mId = resultSet.getInt("mId");
String mName = resultSet.getString("mName");
..중략
Dto dto = new Dto(mId, mName .. 중략);
dtos.add(dto);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if(resultSet != null) resultSet.close();
if(preparedStatement != null) preparedStatement.close();
if(connection != null) connection.close();
} catch (Exception e2) {
e2.printStackTrace();
}
}
return dtos;
}
}
Dao에 대해서만 살펴보자.
Datasource는 Connection을 효율적으로 관리하기 위한 객체이다.
DB 요청마다 매번 Connection을 생성 할 필요 없이 Datasource에서 미리 만들어놓은 Connection을 가져다 쓴다는 컨셉이다.
Dao 생성자에서는 다음과 같은 역할을 한다.
context 관련 객체를 생성한다.
이전에 context.xml에 정의해두었던 DataSource관한 것들을 lookup 메소드를 통해 불러온다.
list() 메소드는 DB에서 모든 글을 요청하여 List에 담아 리턴한다.
dataSource에서 미리 생성한 connection객체를 얻는다.
connection객체를 이용해 쿼리를 요청한다. 이후에 PreparedStatement에 담는다.
이러한 결과를 실행하고 resultSet에 담는다.
resultSet.next()은 Boolean형으로 다음이 있다면 True를 반환하고 현재 인덱스의 데이터를 지운다( 이 때, resultSet에 담긴 객체는 빈 객체이다.)
이후에 get()메소드를 이용하여 자료를 얻는다.
로직을 마치면 모든 연결을 종료하고 값을 리턴한다.
7. Command 추가하기
package com.notice_board.command;
public class ListCommand implements Command {
@Override
public void execute(HttpServletRequest request, HttpServletResponse response) {
// TODO Auto-generated method stub
Dao dao = new Dao();
ArrayList<Dto> dtos = dao.list();
request.setAttribute("allList", dtos);
}
}
dao를 이용하여 원하는 dto 객체를 가져온다.
그리고 request의 파라미터 값으로 allList 를 보낸다.
이 때 객체를 보내려면 setAttribute() String 타입을 보내려면 setParameter()를 이용한다.
8. FrontController 생성
package com.notice_board.frontcontroller;
@WebServlet("*.do")
public class FrontController extends HttpServlet {
private static final long serialVersionUID = 1L;
public FrontController() {
super();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
actionDo(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
actionDo(request, response);
}
private void actionDo(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("EUC-KR");
String viewPage = null;
Command command = null;
String uri = request.getRequestURI();
String conPath = request.getContextPath();
String com = uri.substring(conPath.length());
if(com.equals("/list.do")) {
command = new ListCommand();
command.execute(request, response);
viewPage = "list.jsp";
}
RequestDispatcher dispatcher = request.getRequestDispatcher(viewPage);
dispatcher.forward(request, response);
}
}
.do 확장자에 대한 요청에 모두 FrontController에서 응답한다.
getRequestURL = IP를 포함한 모든 주소를 가져온다.
getRequestURI = path(디렉토리경로) 와 page(파일)경로를 모두 가져온다.
getContextPath = path(디렉토리경로)만 가져온다.
execute로 요청을 받고 값을 기록한다.
RequestDispatcher로 request를 할 page를 지정하고
해당 페이지에 settAttribute한 request 및 response를 forward한다.
작동 원리를 다시 살펴보면
FrontController에서 서블릿은 .do확장자에 관한 요청을 모두 받아 적절한 Command 에 로직을 요청한다.
Command는 다시 Dao에게 Dto를 생성시키고, 생성된 Dto를 request에 담는다.
Dao는 Dto를 생성하는 로직을 가지고 Dto를 Command에 리턴한다.
FrontController에서는 Command의 로직을 받아 해당 jsp페이지에 request 값 전달 및 response 한다.
.jsp는 전달받은 request값을 이용하여 화면에 출력한다.
'BackEnd > Spring' 카테고리의 다른 글
[실습] DB데이터로 Navigation 만들기 (Mybatias,Gson) (0) | 2019.06.04 |
---|---|
Tiles설치 및 사용하여 html 템플릿 관리하기 (0) | 2019.06.03 |
Spring-petclinic예제로 스프링 시작하기(IoC, Bean,AoP) (0) | 2019.05.27 |
전자정부프레임워크 설치 및 세팅하기(3) (0) | 2019.05.26 |
전자정부프레임워크 설치 및 세팅하기(2) (0) | 2019.05.26 |