MVC 패턴 : 서블릿 Controller 구성 방법

Jay_u·2023년 4월 6일
0

JSP, 서블릿

목록 보기
4/5

구성 방법

MVC 패턴을 활용해서 서블릿을 구성해보고자 합니다.
지난 글에서는 AbstractController의 대해서 나중에 만들것이라 하고 끝냈습니다.
그 부분을 이 글에서 마저 설명하겠습니다.

일반적으로 다양한 JSP 하나의 서블릿 컨트롤러에서 조작하고 모델(DB: DAO, DTO, VO 등)에서
디비 정보를 조작하는 것을 MVC 패턴이라고 합니다.

오늘은 그 시작을 다루는 서블릿 Controller 구성 방법에 대해서 작성해보고자 합니다.

인터페이스인 InterCommand가 추상 클래스인 AbstractController에게 HttpServletRequest, response에 대한 구성을 짜달라고 하네요.

Http의 요청과 그에 대한 반응을 구현하는 메소드를 우리는 모든 Controller 클래스에서 구성해야 합니다.

하지만 그때마다 각기 다른 메소드명으로 메소드를 작성하다면 비효율적이라고 할 수 있겠죠.

따라서 인터페이스를 활용해 기본 설계도를 작성하고 이를 다른 클래스에서 구현할 수 있도록 하면 좋겠습니다.

그런데 인터페이스랑 추상클래스랑 비슷한게 아닌가요? 라는 질문이 있을 수 있습니다.

인터페이스 하나로만 여러 Controller 클래스를 다룬다면 공통된 기능에 대해서도 각각의 Controller에서 재정의 해야 하는 번거로움이 생깁니다. 예를 들자면 로그인 기능 말이죠.

그렇다고 추상 클래스만으로 구성하기에는 자바는 하나의 클래스만 상속이 가능하기에 공통된 기능 => http의 요청, 반응에 대한 점은
인터페이스로 관리하는게 편하겠습니다.

네, 그래서 저희는 인터페이스로 execute(HttpServletRequest request, HttpServletResponse response) 메소드를
자식 Controller 클래스에서 알아서 구현하도록 할 것입니다.


public interface InterCommand {
	
	public abstract void execute(HttpServletRequest request, HttpServletResponse response) throws Exception;
	
}

이러한 InterCommand 인터페이스
추상 클래스 AbstracController 를 통해 구현해줍니다.


public abstract class AbstractController implements InterCommand {

	public abstract void execute(HttpServletRequest request, HttpServletResponse response);
	
}

그리고 이러한 추상 클래스 AbstracController자식 Controller에 상속해주는 것입니다.

그러면 부모 클래스에서 준다는 공통된 기능은 무엇이 있을까요?
예를 들면 우리는 dispatcher를 활용한 forward 기능과 redirect 기능을 부모클래스에서 미리 구현해줄 수 있습니다.

public abstract class AbstractController implements InterCommand {

	public abstract void execute(HttpServletRequest request, HttpServletResponse response);
    
	private boolean isRedirect = false; // 기본적으로 포워드를 할 것입니다.
	private String viewPage; 			// 전송할 페이지입니다.

	public boolean isRedirect() {
		return isRedirect;
	}

	public void setRedirect(boolean isRedirect) {
		this.isRedirect = isRedirect;
	}

	public String getViewPage() {
		return viewPage;
	}

	public void setViewPage(String viewPage) {
		this.viewPage = viewPage;
	}
	
}

이렇게 구성하면 자식 컨트롤러 클래스에서는
단 두줄로 이 클래스에서는 redirect를 할 것인지 forward를 할 것인지 알 수 있습니다

super.setRedirect(false);
super.setViewPage("/WEB-INF/SDKAS/LD");

=> 이건 forward 방식으로 전달되고


super.setRedirect(true);
super.setViewPage("registerMember.up");

=> 이건 redirect 방식으로 전달됩니다.

그리고 결국 여기서 설정해준 값으로 우리의 메인 서블릿 ViewController에서 자식 컨트롤러의 설정을 토대로
redirect 해줄 것인지 forward로 전달해줄지 실행해주게 됩니다.


현재 구성 현황

profile
정확한 정보를 전달할려고 노력합니다.

0개의 댓글