티스토리 뷰

WEB/DynamicWeb

[MVC] MVC의 이해

춘햄 2021. 5. 26. 14:21

굉장히 오랜만에 포스팅을 하는 거 같다. 세미프로젝트를 준비하느라 바쁘기도 했고, 정신적으로도 좀 많이 힘들어서 여유가 생기질 않았다. 

아무튼, 이번 포스팅은 MVC 패턴에 대한 포스팅이다. 


그 동안 나는 MVC 패턴이 JSP => Servlet => DAO or DTO(VO) 순으로  request에 따라 실행되는 것으로만 알고, 프로젝트도 이러한 기법으로 진행하고 있었지만, 실은 그게 아니었다...

 

정확히는 위 과정이 맞긴하나, 이렇게 프로젝트를 구성하다보면

이와 같이 Controller가 미쳐 날뛰는 경우가 생긴다...(이런 관점에선 이 프로젝트는 이미 글러먹었다...ㅎ)

 

이 경우는 Servlet이 너무 많아서 애초에 코딩을 하기가 좀 빡세기 때문에 Servlet을 나누는 것이 아닌, Action이라는 이름의 인터페이스를 구성하고, 해당 인터페이스를 구현받는 일반 클래스를 생성하여 DAO를 제어하는 것이 좀 더 알맞는 의미의 MVC 패턴이라고 할 수 있다.


즉, Action 인터페이스와 이를 제어할 ActionFactory 클래스를 다음과 같이 구성해야한다. 

 

◎Action.java (interface)

package com.choonham.controller.action;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public interface Action {
	
	public void execute(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException; 

}

 

◎ActionFactory.java

package com.choonham.controller;

import com.choonham.controller.action.Action;
import com.choonham.controller.action.BoardListAction;

public class ActionFactory {

	private static ActionFactory instance = null;
	
	public ActionFactory() {
	}
	
	public static ActionFactory getInstance() {
		if(instance == null) {
			instance = new ActionFactory();
		}
		return instance;
	}
	
	public Action getAction(String command) {
		Action action = null;
		System.out.print(command);
		
		if(command.equals("board_list")) {
			System.out.print("요청사항에 대한 객체 생성 ~");
			action = new BoardListAction();
		}
		
		return action;
	}

}

사실상 위 두개의 객체가 cotroller의 전부이다.  즉, ActionFactory에서 getAction 메서드가 command 값을 인자로 받아 Action 인터페이스를 구현 받은 action 클래스들 중 알맞은 기능을 가진 Action을 호출하여 각 기능을 수행할 수 있게끔 해주는 것이다.

 

위 방법을 사용하면, 굳이 복잡한 servlet을 많이 생성하지 않고, 자바의 일반 클래스로 생성하여 동작을 전부 구현해줄 수 있다.

 

패키지 구성을 보면 좀 더 이해가 빠를 것이다.

action 패키지 안에 구성해놓은 것이 전부 command 인자에 따라 호출되는 클래스들이다.


전체적인 로직은 이와 같으며, 이후에 이 패턴을 사용한 예제를 하나 포스팅할 예정이다.

 

Comments