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

40. 서블릿에서 뷰 분리하기 (1)

by Jint 2022. 6. 9.

본격적으로 MVC 아키텍처를 경험하기 위한 첫 작업으로 기존 서블릿으로부터 뷰(View) 역할을 분리한다.

그림 1 (뷰 컴포넌트 도입)

클라이언트로부터 요청이 들어오면 서블릿은 데이터를 준비(모델 역할)하여 JSP에 전달(컨트롤러 역할)한다. JSP는 서블릿이 준비한 데이터를 가지고 웹 브라우저로 출력할 화면을 만든다(그림 1).

 

1. 값 객체(VO) = 데이터 수송 객체(DTO)

데이터베이스에서 가져온 정보를 JSP페이지에 전달하려면 그 정보를 담은 객체가 필요한데, 이렇게 값을 담는 용도로 사용하는 객치를 '값 객체(value object)'라고 부른다. 값 객체는 계층 간 또는 객체 간에 데이터를 전달하는데 이용하여 '데이터 수송 객체(data transfer object)'라고도 부른다. 또한, 값 객체는 업무영역(business domain)의 데이터를 표현하기 때문에 객체지향 분석 및 설계 분야에서 '도메인 객체(domain object)'라고도 한다(그림 2).

그림 2 (값 객체)

 

2. 뷰 분리하기 실습

이전 실습에서 작성한 회원 목록 서블릿(MemberListServlet)은 컨트롤러 역할 뿐 아니라 모델과 뷰의 역할도 담당하였다. 이번엔 회원 목록 서블릿(MemberListServlet)으로부터 출력 부분을 분리하여 JSP 페이지(MemberList.jsp)로 만드는 것이다. 출력은 이 JSP에서 맡게될 것이다. 이를 통해 서블릿에서 JSP 페이지로 요청을 위임하는 방법과 서블릿에서 준비한 데이터를 JSP에 전달하는 방법을 배운다(그림 3).

그림 3 (뷰의 분리 - Model-Controller + View)

 

3. 값 객체 생성

web05 프로젝트의 src/main/java에서 spms.vo 패키지를 만들고, 여기에 값 객체 역할을 수행할 Member 클래스를 생성한다.

package spms.vo;

import java.util.Date;

public class Member {
	protected int 		no;
	protected String 	name;
	protected String 	email;
	protected String 	password;
	protected Date		createdDate;
	protected Date		modifiedDate;
	
	public int getNo() {
		return no;
	}
	public Member setNo(int no) {
		this.no = no;
		return this;
	}
	public String getName() {
		return name;
	}
	public Member setName(String name) {
		this.name = name;
		return this;
	}
	public String getEmail() {
		return email;
	}
	public Member setEmail(String email) {
		this.email = email;
		return this;
	}
	public String getPassword() {
		return password;
	}
	public Member setPassword(String password) {
		this.password = password;
		return this;
	}
	public Date getCreatedDate() {
		return createdDate;
	}
	public Member setCreatedDate(Date createdDate) {
		this.createdDate = createdDate;
		return this;
	}
	public Date getModifiedDate() {
		return modifiedDate;
	}
	public Member setModifiedDate(Date modifiedDate) {
		this.modifiedDate = modifiedDate;
		return this;
	}
}

Member 클래스는 회원 목록 출력에 필요한 데이터 뿐만 아니라 등록이나 변경할 때 사용하는 데이터도 포함한다. 보통 데이터베이스 테이블에 대응하여 값 객체를 정의한다(그림 4).

그림 4 (값 객체와 데이터베이스 테이블)

Member 클래스를 보면 특이한 점이 있는데 셋터(Setter) 메서드의 리턴값이 void가 아닌 Member 이다. 이렇게 한 이유는 셋터 메서드를 연속으로 호출하여 값을 할당할 수 있게하기 위함이다(그림 5).

그림 5 (객체 생성하고 값을 할당하는 코드)

(그림 5)의 코드를 풀이하면 Member 객체를 만들고, 번호는 1, 이름은 홍길동, 이메일은 hong@test.com으로 설정하겠다는 것이다. 코드의 실행 경로를 따라가 보면 다음과 같다(그림 6).

그림 6 (셋터 메서드의 연속 호출 원리)

① (그림 6)의 new Member()는 인스턴스를 생성하고 나서 그 주소를 리턴한다. 주소를 0x200이라고 가정한다.

② 0x200 인스턴스에 대해 setNo()를 호출한다. setNo()의 반환값이 this이므로, 결국 이 메서드를 호출할 때 사용한 인스턴스 주소 그대로 0x200이다.

③ 이런식으로 셋터 메서드를 계속 호출해 나가더라도 결국 반환되는 값은 처음 new Member()가 반환한 인스턴스다.

처음에는 이런 식으로 객체를 생성하고 값을 할당하는 것이 낯설게 느껴질 것이지만 이 방식에 한 번 적응하고 나면 코드를 작성하고 해석하기가 훨씬 쉬워진다. 자바스크립트와 같은 스크립팅 언어로 작성된 소스에서 이런 식의 코드를 자주 볼 수 있다.

 

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

 

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

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

freelec.co.kr

댓글