Notice
Recent Posts
Recent Comments
Link
«   2026/06   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
Tags more
Archives
Today
Total
관리 메뉴

개발공부 일지

학원수업_48day [JSP,Servlet(15day) - Front Controller 1 ] 본문

학원수업/Web(HMTL,CSS,JSP,Servlet)

학원수업_48day [JSP,Servlet(15day) - Front Controller 1 ]

짜몽- 2022. 10. 11. 17:15

매일 Github 수업 1시간씩 진행.

앞으로 세미프로젝트가 얼마 안남았기 때문에

깃헙이 익숙해져야 한다.

add to index : 모든 파일 및 하위 디렉토리를 준비상태(staged:형상관리대상)로 처리

add to index -> commit -> push

 

gitgnore → 형상관리에서 제외 시키겠다.


Front Controller

  - Front Controller Design Pattern

  : 모든 클라이언트의 요청을 하나의 진입점으로 통합하여 처리하는 설계 패턴
    
    웹 어플리케이션 서비스의 공통 정책을 일관성 있고 효과적으로 처리할 수 있다
    → 인코딩 ,  인증 ,  예외처리 ,  데이터 수집 등 

 

FrontController 적용전 Web MVC 구조

 

FrontController 적용 후 Web MVC 구조 Version1

 

* 하나의 Front Controller Servlet 이 여러 요청을 구분하기 위해 hidden 방식을 이용한다!!

 

여기서 hidden 이란?

<input type=“hidden”>  

<input type=“hidden”>은 사용자에게는 보이지 않는 숨겨진 입력 필드를 말한다.

 

숨겨진 입력 필드는 렌더링이 끝난 웹 페이지에서는 전혀 보이지 않으며,

페이지 콘텐츠 내에서 그것을 볼 수 있게 만드는 방법도 없다.

따라서 숨겨진 입력 필드는 폼 제출 시 사용자가 변경해서는 안 되는 데이터를 함께 보낼 때 유용하게 사용된다.

이러한 입력 필드는 업데이트 되어야 하는 데이터베이스의 레코드를 저장하거나, 고유한 보안 토큰 등을 서버로 보낼 때 

주로 사용한다.

ex ) 사용자가 접속한 IP, 로그인 상태에서의 계정 정보, 게시물의 답글 인 경우 게시물의 ID 등

다른 type 의 input 과 동일하게 이름은 name, 값은 value로 정한다.

<form action="/examples/media/action_target.php" method="get">
    아이디 : <input type="text" name="user_id"><br>
    비밀번호 : <input type="password" name="user_pw"><br>
    <input type="hidden" id="gameToken" name="game_token" value="xm234jq">
    <input type="submit">
</form>

하나의 FrontControllerServlet 으로 여러 폼에서 요청이 전달될 경우,
이를 구분하기 위한 방법 중 하나는 hidden tag 를 이용한 방법이 있다
<input type="hidden" name="command" value="fincustomerById">
or
<input type="hidden" name="command" value="registercustomer">



 client
 <input type="hidden" name="command" value="find">
    
 FrontControllerServlet 에서는 command 정보를 이용해 요청을 구분한다
 String command=request.getParameter("command");
 if(command.equals("find"){
 }else if(command.equals("update"){
    
 }


 위와 같은 구조로 여러 클라이언트의 요청을 하나의 진입점으로 모아보았다.
이 경우 FrontControllerSevlet의 doDispatch 메서드의 코드량이 요청이 늘어날수록

비대해질 수 밖에 구조로 refactoring(내부구조개선)이 필요하다


refactoring : 입 출력은 동일하나 시스템의 내부 구조를 개선하는 활동
가독성, 재사용성, 유지보수성 향상이 목적

 refactoring 안 : 1. 요청에 대한 처리를 메서드 별로 분화
                                    2. 메서드 별로 분화하는 1안을 FrontControllerServlet class 자체가
                                    커지므로 요청 처리를 전담할 Controller class를 별도로 생성해서 관리

 

1안 - 메서드별로 분화 FrontControllerServletVer2
2안 - 클래스별로 분화 FrontControllerServletVer3

 

Front Controller Design Pattern Version 3

모든 클라이언트의 요청을 하나의 진입점으로 모은다 -> 공통 정책 수행 ( 인코딩, 인증, 예외처리 .. )
클라이언트 요청을 처리할 별도의 Controller 클래스로 분화하여 서비스 한다
 
토론점 : doDispatch 내부에서 개별 컨트롤러 객체 생성 후 실행 시 
각 컨트롤러 객체의 내부 구현부를 확인해서 각각 다르게 실행해야 한다는 단점이 존재함
→ 인터페이스를 통한 표준화, 다형성 적용 환경을 마련하면 됨 
    Controller interface 의 handleRequest(reqeust,response) : String 


간단하게 예제로 버전1, 버전2, 버전3 을 적고,  본격적인 버전4를 만들어 보자.

구현할 기능은 고객검색 과, 고객등록인데 버전에 따라 다른 서블릿을 만든다. 

 

● 고객 검색

<form action="FrontControllerServletVer3" method = "get">
	<input type="hidden" name="command" value="findCustomerById">
	<input type="text" name="customerId" placeholder="고객아이디" required="required">
	<button>검색</button>
</form>
<br><br>

index.jsp <form> 결과

 


● 고객 등록

<form action="FrontControllerServletVer3" method = "post">
	<input type="hidden" name="command" value="registerCustomer">
	<input type="text" name="customerId" placeholder="고객아이디" required="required"><br>
	<input type="text" name="customerName" placeholder="고객이름" required="required"><br>
	<input type="text" name="customerAddress" placeholder="고객주소" required="required"><br>
	<button>검색</button>
</form>

index.jsp <form> 결과

 


* startsWith 란?

- boolean startsWith(String prefix)

startsWith() 함수는 대상 문자열이 특정 문자 또는 문자열시작하는지 체크하는 함수이다.

- 해당 문자열로 시작되는지 여부를 확인하고 boolean에 맞춰 true/false 값을 리턴한다.


command.equals("registerCustomer"))


(path.startsWith("redirect:"))


차이점이뭔지?


redirect:register=result.jsp 무슨뜻?