교재 실습/자바 웹 개발 워크북

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

Jint 2022. 7. 30. 11:48

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