본문 바로가기
교재 실습/자바 웹 개발 워크북

81. 페이지 컨트롤러의 진화 (3)

by Jint 2022. 7. 30.

6. 회원 등록 페이지 컨트롤러에 Controller 규칙 적용하기

MemberListController 클래스 처럼 MemberAddServlet 클래스에 대해서도 적용한다.

spms.controls 패키지에 MemberAddController 클래스를 생성한다.

package spms.controls;

import java.util.Map;

import spms.dao.MemberDao;
import spms.vo.Member;

public class MemberAddController implements Controller {
	@Override
	public String execute(Map<String, Object> model) throws Exception {
		if(model.get("member") == null) {//입력폼을 요청할 때 - GET
			return "/member/MemberForm.jsp";
		}else {//회원 등록을 요청할 때 - POST
			MemberDao memberDao = (MemberDao)model.get("memberDao");
			Member member = (Member)model.get("member");
			memberDao.insert(member);
			return "redirect:list.do";
		}
	}
}

 

MemberAddServlet 클래스는 서블릿이기 때문에 GET 요청과 POST 요청을 구분하여 처리할 수 있었다. 그러나 MemberAddController 클래스는 일반 클래스이기 때문에 클라이언트 요청에 대해 GET과 POST를 구분할 수 없다. 그래서 Map 객체에 VO 객체 "member"가 들어 있으면 POST 요청으로 간주하고, 그렇지 않으면 GET 요청으로 간주하였다.

Map 객체에 "member" 인스턴스가 없으면, 입력폼을 위한 JSP URL을 반환한다.

if(model.get("member") == null) {//입력폼을 요청할 때 - GET
    return "/member/MemberForm.jsp";
}

 

Map 객체에 "member" 인스턴스가 있으면, MemberDao를 통해 데이터베이스에 저장한다.

else {//회원 등록을 요청할 때 - POST
    MemberDao memberDao = (MemberDao)model.get("memberDao");
    Member member = (Member)model.get("member");
    memberDao.insert(member);
    return "redirect:list.do";
}

데이터를 저장한 후에는 회원 목록 페이지로 리다이렉트 할 수 있도록 반환 URL 앞에 "redirect:"를 붙인다.

 

7. 회원 등록 요청을 처리하기 위해 DispatcherServlet 변경

MemberListController 클래스 때와 마찬가지로 MemberAddController 클래스를 사용하도록 DispatcherServlet 클래스를 변경해야 한다.

spms.servlets.DispatcherServlet 클래스의 service() 메서드에서 회원 등록을 처리하는 조건문을 수정한다.

else if("/member/add.do".equals(servletPath)) {
    pageController = new MemberAddController();
    if(request.getParameter("email") != null) {
        //Map 객체에 VO 객체 준비
        model.put("member", new Member().setEmail(request.getParameter("email"))
                                        .setPassword(request.getParameter("password"))
                                        .setName(request.getParameter("name")));
    }
}

MemberAddController 클래스의 인스턴스를 생성한다. 이전에는 사용자가 입력한 데이터에 대해 Member 객체를 만든 후 ServletRequest 보관소에 담았지만, 이제는 Map 객체에 담는다.

 

8. 회원 등록 페이지의 실행 테스트

톰캣을 재시작하고, 웹 브라우저에서 http://localhost:9999/web06/member/list.do 를 요청한다. 회원 목록 페이지에서 '신규 회원' 링크를 클릭한다. 회원 정보를 입력하고 나서 '추가' 버튼을 클릭한다(그림 1).

그림 1 (회원 정보 입력)

회원 목록 페이지로 리다이렉트 될 것이다. 회원 목록을 보면 새로 등록한 회원 정보를 확인할 수 있다(그림 2).

그림 2 (회원 목록 페이지)

 

새로운 기능을 추가하거나 기능을 변경할 때는 한꺼번에 모든 것을 작성하지 말고, 이렇게 조금씩 추가하고 테스트하는 방식으로 프로그래밍 하는 것이 좋다. 디버깅하기도 쉽고 마음의 부담도 줄일 수 있다.

 

회원정보 상세조회, 변경, 삭제, 로그인, 로그아웃에 대해서도 Controller 인터페이스를 적용한다. 특히 DispatcherServlet 클래스에서 세션 객체를 Map 객체에 담아 로그인 및 로그아웃 페이지 컨트롤러에서 세션 객체를 사용할 수 있도록 구현했다.

 

참고도서 : https://freelec.co.kr/book/1674/

 

[열혈강의] 자바 웹 개발 워크북

[열혈강의] 자바 웹 개발 워크북

freelec.co.kr

 

댓글