refamily : 원본글과 답변에 대한 그룹 묶음 restep : 같은 그룹끼리의 정렬(순서)을 관리 relevel : 답변에 대한 디자인을 처리하기위한 것(내가 답변하고자 하는 레벨+1(답변시 한칸씩 옆으로 밀리는 모습))
* [실습] dynamic web project name : board_fc lib : jstl 라이브러리 copy
File WebContent\WEB-INF\board.sql
* 게시판 생성시 필요한 컬럼 정보
테이블 - 게시판(board) 속성 no : number - primary key : 글번호 title : varchar2(150) - nut null : 글제목 writer : varchar2(30) - not null : 글작성자 content : varchar2(4000) - not null : 글내용 writedate : varchar2(14) - not null : 글작성(수정) 일시 (yyyyMMddHHmmss) viewcount : number - not null : 조회수(최초입력 : 0, 조회시마다 1씩 증가) ----------답변과 관련된 속성---------- refamily : number - not null : 원본글 기준으로 그 답변 글들을 묶은 그룹번호 기분글(최초 원본글) - 새로운 값(글번호) 답변글 : 답변하는 글의 refamily값 restep : number - not null : 같은 refamily로 묶인 글들 사이에서의 정렬 순서 기준글 : 0 답변글 : 답변하는 글의 restep값 + 1 relevel : number - not null : 답변 레벨 기준글 : 0 답변글 : 답변하는 글의 relevel + 1
시퀀스 - 게시판 글번호를 위한 자동증가 시퀀스 이름 : board_no_seq : 0~무한대, 1씩 증가
* table 생성 쿼리
create table board( no number, title varchar2(150) not null, writer varchar2(30) not null, content varchar2(4000) not null, writedate varchar2(14) not null, viewcount number not null, --답변과 관련된 속성 refamily number not null, restep number not null, relevel number not null, constraint board_pk primary key(no) ) select * from board; drop table board;
drop sequence board_no_seq; create sequence board_no_seq; select board_no_seq.nextval from dual;
public class LoginController implements Controller{ public ForwardDTO execute(HttpServletRequest request,HttpServletResponse response) throws Exception{ //1. 요청파라미터 조회
ForwardDTO forwardDTO = null; try { MemberDTO mto = memberManageService.getMemberById(id); //아이디가 맞는 경우 if(mto!=null){ //아이디가 맞고 비밀번호도 맞는 경우 if(mto.getPassword().equals(password)){ //세션으로 로그인 정보 넘기기 HttpSession httpSession = request.getSession(); httpSession.setAttribute("memberDTO", mto); forwardDTO = new ForwardDTO("/res/login_success.jsp", false); } else{//아이디는 맞고 비밀번호는 틀린경우
import member.dto.ForwardDTO; //FrontController 서블릿 public class MemberFrontController extends HttpServlet { private static final long serialVersionUID = 1L;
public MemberFrontController() { super(); // TODO Auto-generated constructor stub }
MemberDTO mdto = (MemberDTO) request.getAttribute("mdto"); //update 시 오류가 날수 있기 때문에 DB를 먼저 update 하고 session의 값을 바꿔 줘야 한다. memberManageService.modifyMember(mdto); mdto.setMileage(login_info.getMileage()); httpSession.setAttribute("memberDTO", mdto); forwardDTO = new ForwardDTO("/res/member_details.jsp", false);
package member.dto; //url값을 가지고 있는 DTO public class ForwardDTO { private String url; private boolean redirect;//true-리다이렉트, false - 요청디스패치 public ForwardDTO() { super(); // TODO Auto-generated constructor stub } public ForwardDTO(String url, boolean redirect) { super(); this.url = url; this.redirect = redirect; } public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } public boolean isRedirect() { return redirect; } public void setRedirect(boolean redirect) { this.redirect = redirect; } @Override public String toString() { return "ForwardDTO [url=" + url + ", redirect=" + redirect + "]"; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + (redirect ? 1231 : 1237); result = prime * result + ((url == null) ? 0 : url.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; ForwardDTO other = (ForwardDTO) obj; if (redirect != other.redirect) return false; if (url == null) { if (other.url != null) return false; } else if (!url.equals(other.url)) return false; return true; }
}
package member.dto;
public class MemberDTO { private String id; private String password; private String name; private String registerNumber1; private String registerNumber2; private int mileage; public MemberDTO() { super(); } public MemberDTO(String id, String password, String name, String registerNumber1, String registerNumber2, int mileage) { super(); this.id = id; this.password = password; this.name = name; this.registerNumber1 = registerNumber1; this.registerNumber2 = registerNumber2; this.mileage = mileage; } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getRegisterNumber1() { return registerNumber1; } public void setRegisterNumber1(String registerNumber1) { this.registerNumber1 = registerNumber1; } public String getRegisterNumber2() { return registerNumber2; } public void setRegisterNumber2(String registerNumber2) { this.registerNumber2 = registerNumber2; } public int getMileage() { return mileage; } public void setMileage(int mileage) { this.mileage = mileage; } @Override public String toString() { return "MemberDTO [id=" + id + ", password=" + password + ", name=" + name + ", registerNumber1=" + registerNumber1 + ", registerNumber2=" + registerNumber2 + ", mileage=" + mileage + "]"; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((id == null) ? 0 : id.hashCode()); result = prime * result + mileage; result = prime * result + ((name == null) ? 0 : name.hashCode()); result = prime * result + ((password == null) ? 0 : password.hashCode()); result = prime * result + ((registerNumber1 == null) ? 0 : registerNumber1.hashCode()); result = prime * result + ((registerNumber2 == null) ? 0 : registerNumber2.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; MemberDTO other = (MemberDTO) obj; if (id == null) { if (other.id != null) return false; } else if (!id.equals(other.id)) return false; if (mileage != other.mileage) return false; if (name == null) { if (other.name != null) return false; } else if (!name.equals(other.name)) return false; if (password == null) { if (other.password != null) return false; } else if (!password.equals(other.password)) return false; if (registerNumber1 == null) { if (other.registerNumber1 != null) return false; } else if (!registerNumber1.equals(other.registerNumber1)) return false; if (registerNumber2 == null) { if (other.registerNumber2 != null) return false; } else if (!registerNumber2.equals(other.registerNumber2)) return false; return true; }
}
* exception
package member.exception;
public class DuplicatedIdException extends Exception{ public DuplicatedIdException(){} public DuplicatedIdException(String message){ super(message); } }
package member.exception;
public class DuplicatedRegisterNumberException extends Exception{ public DuplicatedRegisterNumberException(){} public DuplicatedRegisterNumberException(String message){ super(message); } }
//디비 관련과 커넥션을 만들어 놓은 클래스 //싱글톤 패턴을 사용해서 커넥션이 한번만 되도록 설정. public class DatabaseUtility { //싱글톤 패턴 - 생성자에서 DataSource객체를 생성해서 instance변수에 할당. private BasicDataSource dataSource; private static DatabaseUtility instance = new DatabaseUtility();
private DatabaseUtility(){ dataSource = new BasicDataSource();//객체 생성 //프라퍼티 설정 //1. 연결할 DB와 관련된 설정 dataSource.setDriverClassName("oracle.jdbc.driver.OracleDriver");//BasicDataSource를 사용하면 따로 드라이버 로딩을 해줄 필요가 없다. 바로 처리가능 dataSource.setUrl("jdbc:oracle:thin:@127.0.0.1:1521:XE"); dataSource.setUsername("scott"); dataSource.setPassword("tiger");
public class MemberManageService { //회원 관리 비지니스 로직을 처리하는 Business Service 클래스 private static MemberManageService instance = new MemberManageService(); private MemberDAO dao; private MemberManageService(){ dao = MemberDAO.getInstance(); } public static MemberManageService getInstance(){ return instance; } //가입 처리 메소드 public void registerMember(MemberDTO mto)throws SQLException, DuplicatedIdException, DuplicatedRegisterNumberException{
//1. 등록된 ID가 있는 지 체크 // - 이미 등록된 ID라면 DuplicatedIdException를 발생시킨다. if(dao.selectMemberById(mto.getId())!=null){ throw new DuplicatedIdException(mto.getId()+"는 이미등록된 아이디 입니다.");
} //2. 등록된 주민번호가 있는 지 체크 // - 이미 등록된 주민번호라면 DuplicatedRegisterNumberException 발생시킨다. if(dao.selectMemberByregisterNumber(mto.getRegisterNumber1(), mto.getRegisterNumber2())!=null){ throw new DuplicatedRegisterNumberException("는 이미 가입된 주민번호 입니다."); } //3. 디비에 회원정보 등록 처리 dao.insertMember(mto);
} //전체 회원목록 조회 public ArrayList<MemberDTO> getMemberList() throws SQLException{ return dao.selectAllMember(); } //마일리지 범위로 조회 public ArrayList<MemberDTO> selectMemberByMileageRange(int startMileage, int endMileage)throws SQLException { return dao.selectMemberByMileageRange(startMileage, endMileage); } //ID로 회원 목록조회 public MemberDTO getMemberById(String id) throws SQLException{ return dao.selectMemberById(id); } public void modifyMember(MemberDTO mto) throws SQLException{ dao.updateMember(mto);
} public void removeMemberById(String id)throws SQLException { dao.deleteMemberById(id);
} public ArrayList<MemberDTO> getSearchByMemberName(String name) throws SQLException{ return dao.searchByMemberName(name);
} }
* res
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@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=UTF-8"> <title>Insert title here</title> </head> <body> <jsp:include page="/menu.jsp"/> <c:if test="${requestScope.error_message!=null }"> 실행 도중 오류가 발생했습니다.<br> 오류 내용 ${error_message } </c:if> <a href='/${initParam.context_root }/index.jsp'>메인페이지로 이동</a> </body> </html>
create table member( id varchar2(10), password varchar2(10) not null, name varchar2(50) not null, register_number varchar2(13) not null, mileage number, constraint member_pk primary key(id) ) select id, password, name, register_number1, register_number2, mileage from member where name like '%'||?||'%'"
import member.dto.ForwardDTO; //FrontController 서블릿 public class MemberFrontController extends HttpServlet { private static final long serialVersionUID = 1L;
public MemberFrontController() { super(); // TODO Auto-generated constructor stub }
public class LoginController implements Controller{ public ForwardDTO execute(HttpServletRequest request,HttpServletResponse response) throws Exception{ //1. 요청파라미터 조회
ForwardDTO forwardDTO = null; try { MemberDTO mto = memberManageService.getMemberById(id); //아이디가 맞는 경우 if(mto!=null){ //아이디가 맞고 비밀번호도 맞는 경우 if(mto.getPassword().equals(password)){ //세션으로 로그인 정보 넘기기 HttpSession httpSession = request.getSession(); httpSession.setAttribute("memberDTO", mto); forwardDTO = new ForwardDTO("/res/login_success.jsp", false); } else{//아이디는 맞고 비밀번호는 틀린경우
import member.dto.ForwardDTO; //FrontController 서블릿 public class MemberFrontController extends HttpServlet { private static final long serialVersionUID = 1L;
public MemberFrontController() { super(); // TODO Auto-generated constructor stub }
import member.dto.ForwardDTO; //FrontController 서블릿 public class MemberFrontController extends HttpServlet { private static final long serialVersionUID = 1L;
public MemberFrontController() { super(); // TODO Auto-generated constructor stub }
시작 : modify_form.jsp - 주민번호 입력 부분 수정 Controller : ModifyMemberServlet Service : MemberManageService.modifyMember(MemberDTO) DAO : DAO.updateMember(MemberDTO) 응답 : 성공 : member_list.jsp 실패 : login안되서 - login_form.jsp exception - error.jsp
<%@page import="member.dto.MemberDTO"%> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!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=UTF-8"> <title>Insert title here</title> </head>
public class MemberManageService { //회원 관리 비지니스 로직을 처리하는 Business Service 클래스 private static MemberManageService instance = new MemberManageService(); private MemberDAO dao; private MemberManageService(){ dao = MemberDAO.getInstance(); } public static MemberManageService getInstance(){ return instance; } //가입 처리 메소드 public void registerMember(MemberDTO mto)throws SQLException, DuplicatedIdException, DuplicatedRegisterNumberException{
//1. 등록된 ID가 있는 지 체크 // - 이미 등록된 ID라면 DuplicatedIdException를 발생시킨다. if(dao.selectMemberById(mto.getId())!=null){ throw new DuplicatedIdException(mto.getId()+"는 이미등록된 아이디 입니다.");
} //2. 등록된 주민번호가 있는 지 체크 // - 이미 등록된 주민번호라면 DuplicatedRegisterNumberException 발생시킨다. if(dao.selectMemberByregisterNumber(mto.getRegisterNumber1(), mto.getRegisterNumber2())!=null){ throw new DuplicatedRegisterNumberException("는 이미 가입된 주민번호 입니다."); } //3. 디비에 회원정보 등록 처리 dao.insertMember(mto);
} //전체 회원목록 조회 public ArrayList<MemberDTO> getMemberList() throws SQLException{ return dao.selectAllMember(); } //마일리지 범위로 조회 public ArrayList<MemberDTO> selectMemberByMileageRange(int startMileage, int endMileage)throws SQLException { return dao.selectMemberByMileageRange(startMileage, endMileage); } //ID로 회원 목록조회 public MemberDTO getMemberById(String id) throws SQLException{ return dao.selectMemberById(id); } public void modifyMember(MemberDTO mto) throws SQLException{ dao.updateMember(mto); } public void removeMemberById(String id)throws SQLException { dao.deleteMemberById(id);
public class MemberManageService { //회원 관리 비지니스 로직을 처리하는 Business Service 클래스 private static MemberManageService instance = new MemberManageService(); private MemberDAO dao; private MemberManageService(){ dao = MemberDAO.getInstance(); } public static MemberManageService getInstance(){ return instance; } //가입 처리 메소드 public void registerMember(MemberDTO mto)throws SQLException, DuplicatedIdException, DuplicatedRegisterNumberException{
//1. 등록된 ID가 있는 지 체크 // - 이미 등록된 ID라면 DuplicatedIdException를 발생시킨다. if(dao.selectMemberById(mto.getId())!=null){ throw new DuplicatedIdException(mto.getId()+"는 이미등록된 아이디 입니다.");
} //2. 등록된 주민번호가 있는 지 체크 // - 이미 등록된 주민번호라면 DuplicatedRegisterNumberException 발생시킨다. if(dao.selectMemberByregisterNumber(mto.getRegisterNumber1(), mto.getRegisterNumber2())!=null){ throw new DuplicatedRegisterNumberException("는 이미 가입된 주민번호 입니다."); } //3. 디비에 회원정보 등록 처리 dao.insertMember(mto);
} //전체 회원목록 조회 public ArrayList<MemberDTO> getMemberList() throws SQLException{ return dao.selectAllMember(); } //마일리지 범위로 조회 public ArrayList<MemberDTO> selectMemberByMileageRange(int startMileage, int endMileage)throws SQLException { return dao.selectMemberByMileageRange(startMileage, endMileage); } //ID로 회원 목록조회 public MemberDTO getMemberById(String id) throws SQLException{ return dao.selectMemberById(id); } public void modifyMember(MemberDTO mto) throws SQLException{ dao.updateMember(mto);
} public void removeMemberById(String id)throws SQLException { dao.deleteMemberById(id); } }
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!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=UTF-8"> <title>Insert title here</title> </head> <jsp:include page="/menu.jsp"/> <body> <font size="2" color="red">${requestScope.error_message }</font><br> 마일리지 검색하기<hr><p> <form action="/${initParam.context_root }/searchByMileageRange" method="post"> 범위 : <input type = "text" name="startMileage">~<input type = "text" name="endMileage"> <input type="submit" value="검색"> </form><br><br> 이름으로 검색하기<hr><p> <form action="/${initParam.context_root }/searchByName" method="post"> 검색할 이름 : <input type="text" name="searchName"> <input type="submit" value="검색"> </form> </body> </html>
java Resources src member.dto
package member.dto;
public class MemberDTO { private String id; private String password; private String name; private String registerNumber1; private String registerNumber2; private int mileage; public MemberDTO() { super(); } public MemberDTO(String id, String password, String name, String registerNumber1, String registerNumber2, int mileage) { super(); this.id = id; this.password = password; this.name = name; this.registerNumber1 = registerNumber1; this.registerNumber2 = registerNumber2; this.mileage = mileage; } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getRegisterNumber1() { return registerNumber1; } public void setRegisterNumber1(String registerNumber1) { this.registerNumber1 = registerNumber1; } public String getRegisterNumber2() { return registerNumber2; } public void setRegisterNumber2(String registerNumber2) { this.registerNumber2 = registerNumber2; } public int getMileage() { return mileage; } public void setMileage(int mileage) { this.mileage = mileage; } @Override public String toString() { return "MemberDTO [id=" + id + ", password=" + password + ", name=" + name + ", registerNumber1=" + registerNumber1 + ", registerNumber2=" + registerNumber2 + ", mileage=" + mileage + "]"; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((id == null) ? 0 : id.hashCode()); result = prime * result + mileage; result = prime * result + ((name == null) ? 0 : name.hashCode()); result = prime * result + ((password == null) ? 0 : password.hashCode()); result = prime * result + ((registerNumber1 == null) ? 0 : registerNumber1.hashCode()); result = prime * result + ((registerNumber2 == null) ? 0 : registerNumber2.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; MemberDTO other = (MemberDTO) obj; if (id == null) { if (other.id != null) return false; } else if (!id.equals(other.id)) return false; if (mileage != other.mileage) return false; if (name == null) { if (other.name != null) return false; } else if (!name.equals(other.name)) return false; if (password == null) { if (other.password != null) return false; } else if (!password.equals(other.password)) return false; if (registerNumber1 == null) { if (other.registerNumber1 != null) return false; } else if (!registerNumber1.equals(other.registerNumber1)) return false; if (registerNumber2 == null) { if (other.registerNumber2 != null) return false; } else if (!registerNumber2.equals(other.registerNumber2)) return false; return true; }
}
member.exception
package member.exception;
public class DuplicatedIdException extends Exception{ public DuplicatedIdException(){} public DuplicatedIdException(String message){ super(message); } }
package member.exception;
public class DuplicatedRegisterNumberException extends Exception{ public DuplicatedRegisterNumberException(){} public DuplicatedRegisterNumberException(String message){ super(message); } }
//디비 관련과 커넥션을 만들어 놓은 클래스 //싱글톤 패턴을 사용해서 커넥션이 한번만 되도록 설정. public class DatabaseUtility { //싱글톤 패턴 - 생성자에서 DataSource객체를 생성해서 instance변수에 할당. private BasicDataSource dataSource; private static DatabaseUtility instance = new DatabaseUtility();
private DatabaseUtility(){ dataSource = new BasicDataSource();//객체 생성 //프라퍼티 설정 //1. 연결할 DB와 관련된 설정 dataSource.setDriverClassName("oracle.jdbc.driver.OracleDriver");//BasicDataSource를 사용하면 따로 드라이버 로딩을 해줄 필요가 없다. 바로 처리가능 dataSource.setUrl("jdbc:oracle:thin:@127.0.0.1:1521:XE"); dataSource.setUsername("scott"); dataSource.setPassword("tiger");
public class MemberManageService { //회원 관리 비지니스 로직을 처리하는 Business Service 클래스 private static MemberManageService instance = new MemberManageService(); private MemberDAO dao; private MemberManageService(){ dao = MemberDAO.getInstance(); } public static MemberManageService getInstance(){ return instance; } //가입 처리 메소드 public void registerMember(MemberDTO mto)throws SQLException, DuplicatedIdException, DuplicatedRegisterNumberException{
//1. 등록된 ID가 있는 지 체크 // - 이미 등록된 ID라면 DuplicatedIdException를 발생시킨다. if(dao.selectMemberById(mto.getId())!=null){ throw new DuplicatedIdException(mto.getId()+"는 이미등록된 아이디 입니다.");
} //2. 등록된 주민번호가 있는 지 체크 // - 이미 등록된 주민번호라면 DuplicatedRegisterNumberException 발생시킨다. if(dao.selectMemberByregisterNumber(mto.getRegisterNumber1(), mto.getRegisterNumber2())!=null){ throw new DuplicatedRegisterNumberException("는 이미 가입된 주민번호 입니다."); } //3. 디비에 회원정보 등록 처리 dao.insertMember(mto);
} //전체 회원목록 조회 public ArrayList<MemberDTO> getMemberList() throws SQLException{ return dao.selectAllMember(); } //마일리지 범위로 조회 public ArrayList<MemberDTO> selectMemberByMileageRange(int startMileage, int endMileage)throws SQLException { return dao.selectMemberByMileageRange(startMileage, endMileage); } //ID로 회원 목록조회 public MemberDTO getMemberById(String id) throws SQLException{ return dao.selectMemberById(id); } public ArrayList<MemberDTO> selectMemberByName(String searchName) throws SQLException{
public class MemberManageService { //회원 관리 비지니스 로직을 처리하는 Business Service 클래스 private static MemberManageService instance = new MemberManageService(); private MemberDAO dao; private MemberManageService(){ dao = MemberDAO.getInstance(); } public static MemberManageService getInstance(){ return instance; } //가입 처리 메소드 public void registerMember(MemberDTO mto)throws SQLException, DuplicatedIdException, DuplicatedRegisterNumberException{
//1. 등록된 ID가 있는 지 체크 // - 이미 등록된 ID라면 DuplicatedIdException를 발생시킨다. if(dao.selectMemberById(mto.getId())!=null){ throw new DuplicatedIdException(mto.getId()+"는 이미등록된 아이디 입니다.");
} //2. 등록된 주민번호가 있는 지 체크 // - 이미 등록된 주민번호라면 DuplicatedRegisterNumberException 발생시킨다. if(dao.selectMemberByregisterNumber(mto.getRegisterNumber1(), mto.getRegisterNumber2())!=null){ throw new DuplicatedRegisterNumberException("는 이미 가입된 주민번호 입니다."); } //3. 디비에 회원정보 등록 처리 dao.insertMember(mto);
} //전체 회원목록 조회 public ArrayList<MemberDTO> getMemberList() throws SQLException{ return dao.selectAllMember(); } //마일리지 범위로 조회 public ArrayList<MemberDTO> selectMemberByMileageRange(int startMileage, int endMileage)throws SQLException { return dao.selectMemberByMileageRange(startMileage, endMileage); } //ID로 회원 목록조회 public MemberDTO getMemberById(String id) throws SQLException{ return dao.selectMemberById(id); }
//이름으로 회원 목록 조회 public ArrayList<MemberDTO> selectMemberByName(String searchName) throws SQLException{ return dao.selectMemberName(searchName); } }
public class MemberManageService { //회원 관리 비지니스 로직을 처리하는 Business Service 클래스 private static MemberManageService instance = new MemberManageService(); private MemberDAO dao; private MemberManageService(){ dao = MemberDAO.getInstance(); } public static MemberManageService getInstance(){ return instance; } //가입 처리 메소드 public void registerMember(MemberDTO mto)throws SQLException, DuplicatedIdException, DuplicatedRegisterNumberException{
//1. 등록된 ID가 있는 지 체크 // - 이미 등록된 ID라면 DuplicatedIdException를 발생시킨다. if(dao.selectMemberById(mto.getId())!=null){ throw new DuplicatedIdException(mto.getId()+"는 이미등록된 아이디 입니다.");
} //2. 등록된 주민번호가 있는 지 체크 // - 이미 등록된 주민번호라면 DuplicatedRegisterNumberException 발생시킨다. if(dao.selectMemberByregisterNumber(mto.getRegisterNumber1(), mto.getRegisterNumber2())!=null){ throw new DuplicatedRegisterNumberException("는 이미 가입된 주민번호 입니다."); } //3. 디비에 회원정보 등록 처리 dao.insertMember(mto);
// 전체 회원 목록 조회
} public ArrayList<MemberDTO> getMemberList() throws SQLException{ return dao.selectAllMember(); } }
* 결과 보기
* 검색 : 마일리지 범위로 회원정보 조회하기
search_form.jsp(검색 조건 입력페이지) - 요청 파라미터 : 시작~끝 마일리지 ->SearchByMileageRangeServlet() - url : /searchByMileageRange ->MemberManagerService.searchMemberByMileageRange(int start, int end) : ArrayList<MemberDTO> ->MemberDAO.selectMemberByMileageRange(int start, int end) : ArrayList<MemberDTO>
응답 -> search_result.jsp, error.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!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=UTF-8"> <title>Insert title here</title> </head> <body> <font size="2" color="red">${requestScope.error_message }</font><br> 마일리지 검색하기<hr><p> <form action="/${initParam.context_root }/searchByMileageRange" method="post"> 범위 : <input type = "text" name="startMileage">~<input type = "text" name="endMileage"> <input type="submit" value="검색"> </form> </body> </html>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ 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=UTF-8"> <title>Insert title here</title> </head> <body> <jsp:include page="/menu.jsp"/>
public class MemberManageService { //회원 관리 비지니스 로직을 처리하는 Business Service 클래스 private static MemberManageService instance = new MemberManageService(); private MemberDAO dao; private MemberManageService(){ dao = MemberDAO.getInstance(); } public static MemberManageService getInstance(){ return instance; } //가입 처리 메소드 public void registerMember(MemberDTO mto)throws SQLException, DuplicatedIdException, DuplicatedRegisterNumberException{
//1. 등록된 ID가 있는 지 체크 // - 이미 등록된 ID라면 DuplicatedIdException를 발생시킨다. if(dao.selectMemberById(mto.getId())!=null){ throw new DuplicatedIdException(mto.getId()+"는 이미등록된 아이디 입니다.");
} //2. 등록된 주민번호가 있는 지 체크 // - 이미 등록된 주민번호라면 DuplicatedRegisterNumberException 발생시킨다. if(dao.selectMemberByregisterNumber(mto.getRegisterNumber1(), mto.getRegisterNumber2())!=null){ throw new DuplicatedRegisterNumberException("는 이미 가입된 주민번호 입니다."); } //3. 디비에 회원정보 등록 처리 dao.insertMember(mto);
}
// 전체 회원 목록 조회 public ArrayList<MemberDTO> getMemberList() throws SQLException{ return dao.selectAllMember(); }
//마일리지 범위로 조회 public ArrayList<MemberDTO> selectMemberByMileageRange(int startMileage, int endMileage)throws SQLException { return dao.selectMemberByMileageRange(startMileage, endMileage); } }
* 결과보기
* 쿼리에서 문자열 더하고 넣는 방법.
select * from member where name like '%'||?||'%';
pstmt.setString(1,name);
"a"+"b" 'a'||'b'
-> 주말에 위에것 사용해서 이름으로 모든 정보 조회하기 해보기!
* 로그인 처리 login_form.jsp -> LoginServlet - Business Logic처리, session처리 ->Service.getMemberById(String id) : MemberDTO ->DAO.selectMemberbyId(String id) : MemberDTO
BasicDataSource ? - org.apache.tomcat.dbcp.dbcp.BasicDataSource - tomcat에서 제공하는 Connection Pool
BasicDataSource의 메서드 DB Connection 관련 설정 - setDriverClassName(String className) // DB Driver를 className으로 설정 - setUrl(String url) // DB 연결정보 URL을 url으로 설정 - setUsername(String user) // DB 연결에 필요한 Username을 user로 설정 - setPassword(String password) // DB 연결에 필요한 Password를 password로 설정
Connection Pool 관련 설정 - setInitialSize(int initialSize); // 초기에 생성될 커넥션 객체의 수. default : 0 - setMaxActive(int maxActive); // 최대 몇개의 커넥션 객체를 만들 것인지 설정. default : 8 - setMaxIdle(int maxIdle); // 사용되지 않고 대기하는 커넥션 객체의 최대 개수. maxIdle보다 많이 대기시 maxIdle수에 맞게 Connection을 close. default : 0 - setMinIdle(int minIdle); // 사용되지 않고 대기하는 커넥션 객체의 최소 개수. default : 0
Connection Pool ? Connection Pool의 필요성 - DBMS로의 연결이 오래걸림 - DB 작업을 할 때마다 Connection ~ Close 까지의 반복 작업이 비효율적 - Connection Pool에 Connection 객체를 생성해 놓고 DB 작업시 Pool에서 빌려 사용후 다시 반납
Connection Pool의 개념 - Connection을 관리하는 객체 Pool - Connection들을 미리 생성하여 Pool에 저장한 뒤 필요시 빌려쓰는 개념 - 사용 후에는 다시 Connection Pool에 반납
Connection Pool의 사용 - 직접 제작하여 사용 / 제공되는 API를 이용 - 대표적인 API : org.apache.tomcat.dbcp.dbcp.BasicDataSource
DataSource ? - Connection Pool을 구현하기 위한 스펙을 정해놓은 Interface - Connection Factory (Connection 객체를 생성해 주는 역할) - javax.sql.DataSource를 import 해서 사용
DataSource의 장점? - Connection Pool 지원 - 객체가 DB 연결에 필요한 정보를 알고 있어 DB연결시 URL, ID, Password를 입력해야 하는 번거로움 해소