*링크를 참고하여 작성했습니다.
작성하고 나서 생각해보니까,
여러개의 컨트롤러를 합쳐서 관리할 수 있는 예제가 아니듯하다...
예를들어 URL 패턴이 *.do일때
login.do, logOut.do처럼 URL패턴은 일치하지만, 각각 요청이 다를때 처리하는것같음....ㅠ............
=>Spring을 배우고 나서는 또 달라집니다. 아래의 예제는 Spring안쓸때 Spring이랑 비슷한 로직을 구현 할 수 있게 하는것 같음.
프로젝트를 진행하면서 여러개의 컨트롤러를 생성했다.
요청이 들어왔을때,
여러개의 컨트롤러중 어떤 컨트롤러를 태울지 판단하는 로직이 필요했다.
검색을 통해 '프런트 컨트롤러' 라는 디자인 패턴이 있다는것을 알게됐고.
위의 자료를 참고하여 테스트 예제를 돌려봤다.
*나의 문제
'로그아웃' 요청이 들어왔을때,
사용자가 외부계정을 사용했는지, 내부계정을 사용했는지
판단하는 로직이 필요하다.
(내부계정과 외부계정에서 로그아웃했을때 처리해줘야 하는 로직이 다르기 때문이다)
하지만, 외부계정과 내부계정 처리는 각각의 다른컨트롤러를 사용하고 있다.
= 프런트 컨트롤러에서 외부계정인지, 중앙에서 모든 요청을 받을 수 있는 컨트롤러가 필요하다!
1)Servlet 하나를 생성한다. Servlet파일을 생성하면 이클립스가 자동으로 HttpServlet 상속을 해준다.
+ 위의 가이드에서는 web.xml에 직접 URL맵핑하는 부분을 작성해주던데.. 이클립스에서는 아래와 같은 창에서 맵핑하게 해준다..
web.xml에 작성하는 방법도 알아두자.(아직은 잘 모르겠다 ㅜ.ㅜ)
<!-- 프런트 컨트롤러 서블릿 등록 -->
<
servlet
>
<
servlet-name
>front</
servlet-name
>
<
servlet-class
>com.dev.controller.FrontController</
servlet-class
>
</
servlet
>
<!-- URL패턴 맵핑-->
<
servlet-mapping
>
<
servlet-name
>front</
servlet-name
>
<
url-pattern
>*.do</
url-pattern
>
</
servlet-mapping
>
+가이드와 마찬가지로 service메서드만 오버라이딩..
+Finish를 누르면 완성!
지금 만든것이 모든 요청을 받을 프론트 컨트롤러가 된다.
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class FrontController
*/
@WebServlet("*.login")
public class FrontController extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public FrontController() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#service(HttpServletRequest request, HttpServletResponse response)
*/
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
}
}
아직은 아무런 코드도 없지만
로그아웃 요청을 받았을때 내부회원로그아웃컨트롤러를 태울껀지! 외부회원로그아웃컨트롤러를 태울껀지!
판단하는로직을 작성할 예정.
2) 서브 컨트롤러 생성
(실제 서비스를 처리하는 컨트롤러가 된다)
서브 컨트롤러를 작성하기 전에,
프런트 컨트롤러에서는
모든 서브컨트롤러를 '통일된 방법'으로 실행 할 수 있어야 한다.
= 따라서 컨트롤러 인터페이스를 작성하고,
서브컨트롤러는 이 컨트롤러 인터페이스를 구현하도록 한다.
2-1) 컨트롤러 인터페이스 작성
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public interface Controller {
public void execute(HttpServletRequest request, HttpServletResponse response);
}
2-2) 작성한 컨트롤러 인터페이스를 구현해서 최종적으로 sub컨트롤러 작성
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class KakaoOauthController implements Controller {
@Override
public void execute(HttpServletRequest request, HttpServletResponse response) {
System.out.println("KakaoOauthController!");
}
}
3) 프런트 컨트롤러에서 서브 컨트롤러 연결
프런트 컨트롤러 실행이 완료 된 후, 서브 컨트롤러가 실행되게 하려면,
프런트 컨트롤러는 어떤 요청에 대하여 어떤 서브 컨트롤러가 실행되어야 하는지에 대한 정보를 알고 있어야한다.
= 이러한 정보는 주로 map객체에 저장하여 저장된 정보에서 서브 컨트롤러를 찾아서 실행합니다.
(잘은 모르겠는데, 지금까지 나는 front컨트롤러를 생성했던 방식으로 HttpServlet을 상속받아서 컨트롤러를 구현해왔다.
지금 생각해보면, Static도 아니고 내가 객체를 생성 해 준 적도 없는데 어떻게 메모리에 올라갔지? 라고 의아해왔는데 아마 내부적으로 해주는것 같다.
하지만 프론트컨트롤러 방법은, 지금까지 내가 사용해온 방법이 아니라 Controller객체를 생성하는것이다. 그것을 Front컨트롤러에서 관리할 뿐이고.
어떤게 나은방법인지는 더 고민을 해 봐야 겠다.)
작성하고 나서 생각해보니까,
여러개의 컨트롤러를 합쳐서 관리할 수 있는 예제가 아니듯하다...
예를들어 URL 패턴이 *.do일때
login.do, logOut.do처럼 URL패턴은 일치하지만, 각각 요청이 다를때 처리하는것같음....ㅠ............
'Today I learned' 카테고리의 다른 글
1월25일 (0) | 2019.01.25 |
---|---|
1월24일 봄이오나봄, Spring 프레임워크 (0) | 2019.01.24 |
Ajax & Javascript 정리 (0) | 2019.01.21 |
12월17일 (0) | 2019.01.17 |
코드를 작성할때, 코드의 이해를 돕기위해 반드시 주석을 달아야 한다. (0) | 2019.01.16 |
댓글