97. 실력 향상 훈련 (3)
4. 훈련 2 프로젝트 등록 구현
두 번째 훈련은 신규 프로젝트 등록을 구현하는 것이다.
1) DAO 인터페이스에 등록 메서드 추가
ProjectDao 인터페이스에 프로젝트 데이터를 등록할 때 호출할 메서드를 선언한다. 다음은 추가할 메서드이다.
int insert(Project project) throws Exception; //프로젝트 데이터 등록 메서드
2) DAO 구현체에 메서드 추가
ProjectDao 인터페이스의 변경에 맞추어 MySqlProjectDao 클래스도 변경한다. insert() 메서드에서는 사용자가 입력한 프로젝트 정보를 PROJECTS 테이블에 삽입한다. PROJECTS 테이블에 입력할 항목은 프로젝트 이름(PNAME), 내용(CONTENT), 시작일(STA_DATE), 종료일(END_DATE), 상태(STATE), 생성일(CRE_DATE), 태그(TAGS) 이다.
'번호' 컬럼은 값을 지정하지 않아도 자동 증가값이 들어가기 때문에 입력할 때 생략한다. '상태' 컬럼의 기본값은 0으로 설정한다. '생성일'은 INSERT SQL을 실행할 때의 데이터베이스 시간을 입력한다. 나머지 컬럼은 사용자가 프로젝트 등록폼 페이지에 입력한 값으로 설정한다.
3) 페이지 컨트롤러 생성
spms.controls 패키지에 ProjectAddController 클래스를 생성한다. GET 요청이 들어오면 /project/ProjectForm.jsp로 보내고, POST 요청이 들어오면 MySqlProjectDao 객체를 사용하여 프로젝트 데이터를 데이터베이스에 입력한 후, '프로젝트 목록' 페이지로 리다이렉트 하도록 처리한다.
4) JSP 페이지 생성
프로젝트 정보를 입력받을 페이지(webapp/project/ProjectForm.jsp)를 작성한다. 입력 항목의 라벨은 <label> 태그를 사용한다. 입력 항목들은 <ul>과 <li> 태그를 사용하여 정렬한다. 다음 그림은 신규 프로젝트 등록을 위한 입력폼이다(그림 1).
- 훈련 2 결과 소스
두 번째 훈련의 결과 소스이다.
소스 파일 | 설명 |
spms/dao/ProjectDao.java | ProjectDao 인터페이스. insert() 메서드 추가됨. |
spms/dao/MySqlProjectDao.java | insert() 메서드의 구현 추가 |
spms/controls/ProjectAddController.java | 신규 프로젝트의 등록을 처리하는 페이지 컨트롤러 |
webapp/project/ProjectForm.jsp | 프로젝트 등록폼을 생성하는 뷰 컴포넌트 |
- DAO 인터페이스 - ProjectDao
package spms.dao;
import java.util.List;
import spms.vo.Project;
//ProjectDao 인터페이스 정의
public interface ProjectDao {
List<Project> selectList() throws Exception; //프로젝트 목록 반환 메서드
int insert(Project project) throws Exception; //프로젝트 데이터 등록 메서드
}
- DAO 구현체 - MySqlProjectDao
package spms.dao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import javax.sql.DataSource;
import spms.annotation.Component;
import spms.vo.Project;
@Component("projectDao")
public class MySqlProjectDao implements ProjectDao {
...
//프로젝트 등록
@Override
public int insert(Project project) throws Exception {
Connection connection = null;
PreparedStatement stmt = null;
try {
connection = ds.getConnection(); //커넥션 객체 가져오기
stmt = connection.prepareStatement(
"INSERT INTO PROJECTS (PNAME, CONTENT, STA_DATE, END_DATE, STATE, CRE_DATE, TAGS) "
+ "VALUES (?, ?, ?, ?, 0, NOW(), ?)");
stmt.setString(1, project.getTitle());
stmt.setString(2, project.getContent());
stmt.setDate(3, new java.sql.Date(project.getStartDate().getTime()));
stmt.setDate(4, new java.sql.Date(project.getEndDate().getTime()));
stmt.setString(5, project.getTags());
return stmt.executeUpdate();
} catch (Exception e) {
throw e;
} finally {
try {if(stmt != null) stmt.close();} catch(Exception e) {}
try {if(connection != null) connection.close();} catch(Exception e) {}
}
}
}
- 페이지 컨트롤러 - ProjectAddController
package spms.controls;
import java.util.Map;
import spms.annotation.Component;
import spms.bind.DataBinding;
import spms.dao.MySqlProjectDao;
import spms.vo.Member;
import spms.vo.Project;
@Component("/project/add.do")
public class ProjectAddController implements Controller, DataBinding {
//인스턴스 변수
MySqlProjectDao projectDao;
//셋터 메서드
public ProjectAddController setProjectDao (MySqlProjectDao projectDao) {
this.projectDao = projectDao;
return this;
}
//DataBinding 인터페이스의 구현 메서드
@Override
public Object[] getDataBinders() {
//클라이언트가 보낸 매개변수를 Project 인스턴스에 담아 "project"라는 이름으로 Map객체에 저장해라
return new Object[] {"project", spms.vo.Project.class};
}
//Controller 인터페이스 구현 메서드
@Override
public String execute(Map<String, Object> model) throws Exception {
//프런트 컨트롤러가 VO 객체를 무조건 생성할 것이기 때문에 Project 객체 여부로 판단하지 않는다.
Project project = (Project)model.get("project");
if(project.getTitle() == null) {//입력폼을 요청할 때
return "/project/ProjectForm.jsp";
}else {//프로젝트 등록을 요청할 때
projectDao.insert(project);
return "redirect:list.do";
}
}
}
- 뷰 컴포넌트 - ProjectForm.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>프로젝트 등록</title>
<style>
ul {padding: 0;}
li {list-style: none;}
label {
float: left;
text-align: right;
width: 60px;
}
</style>
</head>
<body>
<jsp:include page="/Header.jsp"/>
<h1>프로젝트 등록</h1>
<form action='add.do' method='post'>
<ul>
<li>
<label for="title">제목</label>
<input id="title" type='text' name='title' size="50">
</li>
<li>
<label for="content">내용</label>
<textarea id="content" name='content' rows="5" cols="40"></textarea>
</li>
<li>
<label for="sdate">시작일</label>
<input id="sdate" type='text' name='startDate' placeholder="예) 2022-01-01">
</li>
<li>
<label for="edate">종료일</label>
<input id="edate" type='text' name='endDate' placeholder="예) 2022-01-01">
</li>
<li>
<label for="tags">태그</label>
<input id="tags" type='text' name='tags' placeholder="예) 태그1 태그2 태그3" size="50">
</li>
</ul>
<input type='submit' value='추가'>
<input type='reset' value='취소'>
</form>
<jsp:include page="/Tail.jsp"/>
</body>
</html>
참고도서 : https://freelec.co.kr/book/1674/
[열혈강의] 자바 웹 개발 워크북
[열혈강의] 자바 웹 개발 워크북
freelec.co.kr