MVC 회원관리 (2) - 회원가입
- DBCP 방식
- request, session 객체 공유 설정
- Controller 클래스 : Java Servlet
- Service, DTO, DAO 클래스, Model (Service + DAO)
- View (화면 인터페이스) : EL, JSTL 사용
프로그램 구조
Java Resources > src | Controller 클래스 | Controller | MemberController.java | |
DTO 클래스 | model | MemberDTO.java | ||
DAO 클래스 | dao | MemberDAO.java | ||
Action 인터페이스 | service | Action.java | 인터페이스 | |
ActionForward 클래스 | ActionForward.java | |||
회원가입 | MemberInsert.java | Action 상속 | ||
ID중복검사 | IdCheck.java | Action 상속 | ||
로그인 | Login.java | Action 상속 | ||
로그아웃 | Logout.java | |||
정보수정 폼 | UpdateMember.java | |||
정보수정 | Update.java | Action 상속 | ||
회원탈퇴 폼 | DeleteMember.java | |||
회원탈퇴 | Delete.java | Action 상속 | ||
WebContent > member | 메인 페이지 | main.jsp | ||
회원가입 폼 | memberform.jsp | member.js | ||
ID 중복검사 | idcheck.jsp | |||
로그인 폼 | loginform.jsp | login.jsp | login.js | |
수정 폼 | updateform.jsp | |||
삭제 폼 | deleteform.jsp | |||
로그아웃 | logout.jsp | |||
WebContent > WEB-INF > lib |
라이브러리 | cos.jar | jstl-1.2jar | ojdbc6.jar |
WebContent > META-INF | 커넥션 풀 | context.xml | ||
WebContent > sql | DB | member.sql | ||
WebContent | 인덱스 | index.jsp |
MVC 구조

MemberController.java의 doProcess 메소드 하단에 Action과 ActionForward를 불러온다.
패키지가 다르기 때문에 import도 해야 한다.

Action action = null;
ActionForward forward = null;
/****************************포워딩처리****************************/
if(forward != null) {
if(forward.isRedirect()) { // redirect 방식으로 포워딩
response.sendRedirect(forward.getPath());
} else { // dispatcher 방식으로 포워딩
RequestDispatcher dispatcher =
request.getRequestDispatcher(forward.getPath());
dispatcher.forward(request, response);
}
}

service > MemberInsert.java 생성
클래스로 생성하고 Action을 상속한다.
초기에는 오류가 나는데 아직 메소드 오버라이딩을 하지 않아서 그렇다

오류 마크를 더블클릭해서 오버라이딩을 완료하고,
추후 오류 발생 시 발생 위치를 알기 쉽도록 콘솔창에 자기 자신을 출력하는 코드를 작성한다.

메소드 안에 이름이 forward인 ActionForward 객체를 생성하고 return 값은 forward로 설정한다.

package service;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class MemberInsert implements Action {
@Override
public ActionForward execute(HttpServletRequest request, HttpServletResponse response) throws Exception {
System.out.println("MemberInsert");
ActionForward forward = new ActionForward();
return forward;
}
}
MemberController.java에 다음과 같은 내용을 작성한다.
memberform.jsp의 Action값 MemberInsert.do 값이 들어올 경우 true/false 여부에 따라 실행될 내용이다.
if(command.equals("/MemberInsert.do")) {
try {
action = new MemberInsert();
forward = action.execute(request, response);
} catch (Exception e) {
e.printStackTrace();
}
}

memberform.jsp
html 시간부터 생성한 내용을 계속 디벨롭 해오면서 새로운 내용을 공부하고 있다.
이번에는 일전에 model 1에서 했던 내용을 그대로 가져왔다.
유효성 검사를 하기 위해 같은 폴더의 member.js 파일을 불러오도록 되어 있는데,
여러 문서를 왔다갔다 하다보면 다음과 같은 형식의 상대 경로는 찾아가지 못할 수도 있다.

그래서 현재 프로젝트 명을 구해주는 get.ContextPath()를 사용하여
절대 경로로 수정해준다.
<script src="<%= request.getContextPath() %>/member/member.js"></script>
폼 태그는 post 방식으로 전달하도록 설정되어 있고,
action 값은 여태까지 ~~.jsp 파일로 다이렉트 연결 했지만
앞으로는 컨트롤러 파일의 어노테이션 값을 찾아가도록 설정한다.
<form method="post" action="<%=request.getContextPath() %>/MemberInsert.do">
프로젝트 명을 직접 적게 된다면 지금 당장은 상관없으나,
서버 배포시 문제가 발생할 수 있다.
그러니 request.getContextPath() 를 적극 활용하도록 한다.
MemberInsert.java
회원가입 폼의 값을 받아온다.

intro 값 아래에 DAO 객체를 생성해 DB를 연결한다.
DAO 문서의 insert 메소드를 매개변수 member를 통해 호출하며,
만약 결과값으로 1을 돌려받으면 콘솔창에 "회원가입 성공"이라는 메시지를 띄운다.
(아직 insert 메소드를 생성하지 않아 오류가 발생한다.)

아까 생성한 forward 객체 하단에
포워드 방식과 포워딩 할 페이지 명을 작성한다.
실제 포워딩은 Controller에서 수행하게 된다.

MemberDAO.java > insert 메소드

memberform.jsp를 실행해 회원가입을 진행해본다.
캡쳐는 못했지만 회원가입 폼을 submit으로 넘기자마자 alert 알림창이 떴고,
확인을 눌렀더니 MemberInsert.do로 페이지 이동했다.
콘솔창에 메시지가 잘 뜨고, DB에도 데이터가 잘 넘어갔다.


ID를 test로 설정했는데,
ID 중복검사가 되지 않고 있다.
primary key로 설정해서 ID 컬럼에는 test 라는 값이 더 이상 들어가서는 안되는데
사용 가능한 ID 라고 출력이 된다.

service.Idcheck.java를 생성
Action 클래스를 상속 받고,
메소드 오버라이딩한다.
request.getParameter로 id 값을 전달받고
System.out.println으로 클래스명과 id 값을 출력하도록 한다.
이렇게 하면 에러 발생시 어디까지는 잘 진행되고 어디서부터 에러 발생으로 진행이 막혔는지
잘 알 수 있게 된다.

MemberController.java 로 이동
기존에 작성한 회원가입 if문에
else if로 블록처리한 부분을 이어서 작성한다.

IdCheck.java에 DAO 객체를 생성해 DB와 연결한다.

DAO클래스 > IdCheck 메소드 생성

서버를 재구동해서 memberborm.jsp를 실행하여
중복 아이디를 입력 후 중복검사 실행을 해본다.
