현재까지 작업한 프런트 컨트롤러는 안타깝게도 페이지 컨트롤러 추가할 때마다 코드를 변경해야 한다. 특히 매개변수 값을 받아서 VO 객체를 생성하는 부분에 많은 손이 간다.
if("/member/add.do".equals(servletPath)) {
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 객체를 생성한 후 Map 객체에 저장한다.
회원 정보를 변경하는 경우에는 MemberUpdateController 클래스를 위해서 다음과 같이 Member 객체를 준비해야 한다. 앞의 신규 회원 등록과 다른 점은 password 매개변수 값은 설정하지 않고 no 매개변수 값을 추가로 설정했다.
else if("/member/update.do".equals(servletPath)) {
if(request.getParameter("email") != null) {
//Map 객체에 VO 객체 준비
model.put("member", new Member().setNo(Integer.parseInt(request.getParameter("no")))
.setEmail(request.getParameter("email"))
.setName(request.getParameter("name")));
}else {
model.put("no", new Integer(request.getParameter("no")));
}
}
매개변수 값에 대해 이런식으로 VO 객체를 준비하게 되면, 데이터를 사용하는 페이지 컨트롤러를 추가할 때마다 계속 프런트 컨트롤러를 변경해야 하는 문제가 발생한다. 이것은 유지 보수를 매우 어렵게 만든다.
이번 절의 목표는 이 부분을 개선하는 것이다. 리플랙션 API를 활용하여 인스턴스를 자동 생성하고, 메서드를 자동으로 호출하는 방법을 배울 것이다.
1. 신규 회원 정보 추가 자동화
다음 그림은 신규 회원 정보를 추가할 때의 시나리오이다. 이전과 다른 점은 데이터를 준비하는 부분을 자동화하는 것이다(그림 1).
① 웹 브라우저는 회원 등록을 요청한다. 사용자가 입력한 매개변수 값을 서블릿에 전달한다.
② 프런트 컨트롤러 'DispatcherServlet'는 회원 등록을 처리하는 페이지 컨트롤러에게 어떤 데이터가 필요한지 물어본다. 페이지 컨트롤러 'MemberAddController'는 작업하는데 필요한 데이터의 이름과 타입 정보를 담은 배열을 리턴한다.
③ 프런트 컨트롤러는 ServletRequestDataBinder 클래스를 이용하여, 요청 매개변수로부터 페이지 컨트롤러가 원하는 형식의 값 객체(예 : Member, Integer, Date 등)를 만든다.
④ 프런트 컨트롤러는 ServletRequestDataBinder 클래스가 만들어준 값 객체를 Map에 저장한다.
⑤ 프런트 컨트롤러는 페이지 컨트롤러 'MemberAddController'를 실행한다. 페이지 컨트롤러의 execute() 메서드를 호출할 때, 값이 저장된 Map 객체를 매개변수로 넘긴다.
이제 시나리오 대로 동작하는 코드를 작성한다.
2. DataBinding 인터페이스 정의
실행 시나리오에서 프런트 컨트롤러가 페이지 컨트롤러를 실행하기 전에 원하는 데이터가 무엇인지 묻는다고 했다. 이것에 대해 호출 규칙을 정의해 놓는다. 프런트 컨트롤러 입장에서는 이 규칙을 준수하는 페이지 컨트롤러를 호출할 때만 VO 객체를 준비하면 된다.
spms.bind 패키지를 생성한 뒤, 이 패키지에 DataBinding 인터페이스를 생성한다.
package spms.bind;
public interface DataBinding {
Object[] getDataBinders();
}
페이지 컨트롤러 중에서 클라이언트가 보낸 데이터가 필요한 경우 이 DataBinding 인터페이스를 구현한다. getDataBinders() 메서드의 반환값은 데이터의 이름과 타입 정보를 담은 Object의 배열이다. 배열을 작성하는 형식은 다음과 같다.
new Object[] {"데이터이름", 데이터타입, "데이터이름", 데이터타입, ...}
데이터 이름과 데이터 타입(Class 객체)이 한 쌍으로 순서대로 오도록 작성한다. 따라서 배열의 크기는 항상 짝수여야 한다.
참고도서 : https://freelec.co.kr/book/1674/
[열혈강의] 자바 웹 개발 워크북
[열혈강의] 자바 웹 개발 워크북
freelec.co.kr
'교재 실습 > 자바 웹 개발 워크북' 카테고리의 다른 글
87. 리플랙션 API를 이용하여 프런트 컨트롤러 개선하기 (3) (0) | 2022.08.06 |
---|---|
86. 리플랙션 API를 이용하여 프런트 컨트롤러 개선하기 (2) (0) | 2022.08.04 |
84. DI를 이용한 빈 의존성 관리 (3) (0) | 2022.08.02 |
83. DI를 이용한 빈 의존성 관리 (2) (2) | 2022.08.01 |
82. DI를 이용한 빈 의존성 관리 (1) (0) | 2022.07.31 |
댓글