메모장

FrontController 본문

JSP/개념정리

FrontController

Itchild 2024. 4. 29. 11:50
728x90
반응형

 

java 에서 mvc를 적용한것 처럼,

jsp 에서 프레임 워크 구조를 적용할 예정!

-> Controller 파트를 수정한다.

 

Controller 를 수정하게 된 이유

 

1. controller.jsp는 어차피 java밖에 없는데 굳이 .jsp에서 작업해야될까 ?

2. .jsp -> .java에서 작업하자 !

 

3. jsp가 컴파일이 되면 서블릿 파일이 된다.

★ 서블릿(servlet).java 파일이 된다. !!

★★★★★ jsp는 컴파일 되면 java 다 !

package controller;

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;

//not pojo 라는 증거 얘네들이 없으면 실행 할 수 없어 
/**
 * Servlet implementation class Controller
 */
// ★★★★★
@WebServlet("/Controller") 
// 어노테이션 덕분에 특정 요청에 대해 반응 할 수 있다. 
// 특정 Client(브라우저,사용자)의 요청에 대해 반응할 수 있음
// 필터, 리스너에서 사용한 어노테이션 이다 -> 애초에 서블릿을 상속받은 특수한 서블릿이다. 
public class FrontController extends HttpServlet {
	private static final long serialVersionUID = 1L; // 직렬화 라는것을 할 때 필요한것 (몰라도 되는 부분) 
       
    public FrontController() { 
// 생성자 : 클래스와 이름이 같고 output없다. 기본생성자이다. 웹에서는 기본생성자가 default 로 사용된다. 그래서 꼭 필요하다.  
        super();
    }

    private void doAction(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    	// 여기에 기능을 코딩 
    	// 임의로 실행될 메서드를 만들어 놓음 
    }
    
    
	// get요청으로 들어오면 수행 해줘 
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doAction(request,response); // doAction 함수 실행시켜줘
	}

	// post요청으로 들어오면 수행 해줘 
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doAction(request,response);  // doAction 함수 실행시켜줘
	}
}
 

4. 일반 .java(POJO)로는 작업 xxx

5. Servlet(서블릿)NOT POJO이기 때문에 으로 작업 o ( 가능 )

 

사용자가 특정 요청을 한다. 특정요청을 하게되면 do Action 을 하게 만듬

get으로 할지 post 로 할지 아직 모른다.

index도 Controller 의 부분이고 controller도 Controller의 부분 이다.

 


index.jsp 에서

// URL :main.do

< 이렇게 구분할 예정 >

// .do로 끝남 -> FrontController(FC)로 가주세요! 컨트롤러로 이동

// .jsp로 끝남 -> 해당 페이지(view)를 보여주세요 ! 페이지로 이동

 

// main.do VS controller.jsp?action=main

 

// .do VS .jsp

[C] [V]

이게 더 가벼움

 

 

6. (①단계) cotroller.jsp 내용을 ====> controller.java(Servlet)로 이동 한다.

 

                                                                                ↓ ↓ ↓ ↓ ↓

7. (②단계) 현재의 Controller.java는 모----든 코드를 다 하나의 .java파일에서 관리하는 중 1개의 action에만 이상이 발생해도 전체가 동작안됨 => 그래서 필요한 것 모듈화 (유지보수 ) 용이 // 모듈화를 해보자

모듈화할 코드는 POJO로 작성할 수 있다.

 

보드 내용 모듈화 - 모듈화 pojo 클래스 만들고 이름을 execute로 통일

Board 내용 시에 필요했던 로직 만들기

없는것은 선언! BoardDAO, BoardVO 만들기 객체화 시켜주기

 

 

여기서 잠깐 ! 그러면 매번 선언 객체화를 해야 되는것 인가 ?

 

상단에 선언을 해놓으면 알아서 작동 하는 것 처럼 보이지만

원래 controller.jsp 방문시 마다 다 객체를 생성해왔었다....

이것만 할려해도 이걸 다 만들고 이것만 할려해도 이걸 다 만들고 ..

난 main 액션만 수행 하면되는데 controller.jsp 에 들어오면

bDAO,mDAO,mVO,bVO를 다 객체 생성해왔었던 것이다......

그래서 이제 FrontController로 전환하고 index 에서 main.do 로 보내면

지금은 main 액션만하려고한다면 bDAO만 객체 생성한다.

 

따라서 ,

객체가 너무 많이 생성된다고 이해 했지만 알고보면 이렇게 선언 해놓는게 더 적은 사용이라서 매번 해야된다.

 
 
 

Board 내용 모듈화 - 모듈화 pojo 클래스 만들고 이름을 execute로 통일

Board 내용 시에 필요했던 로직 만들기

없는것은 선언! BoardDAO, BoardVO 만들기 객체화 시켜주기

 

xxxAction 클래스 + execute(req,res) 메서드

 

doAction의 인자 따와서 붙여넣기

(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException

 

out과 세션은 리퀘스트로 부터 뽑아낼 예정

 

 

8. (③단계) : execute() 라는 메서드 시그니처가 동일한 메서드를 구현해야하는 xxxAction 류의 클래스 들을 정의할 필요가 생겼다!

(정의하지 않으면 클래스 생성과정에서 코드 실수를 발생할 수도 있다. 사람인지라 )

 

추상메서드는 메서드 body가 없다. 그래서 추상메서드를 가지려면 클래스도 추상 클래스를 가져야 한다.

1) xxx Action 이라는 부모클래스를 작성하고

2) 이 부모클래스는 객체생성 가능

메서드 오버라이딩 강제 xx

↓ abstract 추상화 필요 !

3) 이 부모클래스를 추상 클래스로 변경

추상 클래스로 변경하면 객체생성 불가능

★ 메서드 오버라이딩 강제 o (가능)

 

근데 , 강제하는 메서드 오버라이딩만 따로 빼볼수 없을까 ?

"메서드 오버라이딩 강제" 만 따로 문법 사용 할 수는 없을까?

4) ★★★ 인터페이스 ★★★

인터페이스는 implements

 

https://tjdals9219.tistory.com/25

 

add 하면 execute 해준다는 점(메서드 시그니처를 지켜서 만들어 준다는 점 )

public 키워드도 자동으로 해주고 있다는 점 (모든 인터페이스 메서드 들은 전부 public 임에 유의 !)

오버라이딩 해주고 있다는 점 @ 어노테이션

 

✔️ 여기서 정리해보고 가자

1) 모듈화를 해볼까?

일반 클래스 POJO 로 모듈화 해보자

2) 메서드 시그니처가 같네 ? 인터페이스 사용해보자


 

9. Controller.java 가 하는일 <------ 드디어 메인

1) Client(브라우저, 사용자) 가 보낸 요청을 추출하기 get action

 

어떤 요청(액션)을 하고 싶었던 건지 파악한다.

 

2) 추출한 요청에 맞는 Action 클래스의 execute() 메서드를 호출

요청을 처리함

 

MainAction은 따로 클래스를 만든다.

Action 이라는 인터페이스를 상속받아 메서드를 오버라이딩 강제 한다.

 

✔️ 우리가 알아야 할 점

(④단계) : ActionForward 클래스 생성

===============================================

자바는 절대로 output을 2개이상 전달 xxx

그럴때 마다 vo를 만들어서 묶음으로 전달 ( vo 니까 private )

멤버변수로 여러개를 심어서 한번에 보낼 수 있으니까

===============================================

데이터를 가져가야하는지 말아야 하는지 ----> boolean

어디로 이동 해야하는지 ----> String

getter,setter

 

 

★★★ 그래서 , 우리가 고려해야하는점 ★★★

반환 output은 ActionForward 이다 !!!

controller 로 보낼때는 ,

1. 데이터 정보를 보내줘야 하는지 , 아닌지 ----> vo 가 필요해졌다

Forward VS sendRedirect

 

forward.setRedirect(false); ----> Redirect 가 false 라는 것은 Foward 를 의미

 

2. 어디로 가야하는지

forward.setPath("main.jsp"); ----> 경로

 

 

 

3) 요청 처리가 완료되면 사용자에게 응답하기

view로 이동 (데이터 유무를 파악 유 ->포워드, 무-> 샌드 리다이렉트)

 

if(데이터를 보낼게 있니?){

 

}else{

response.sendRedirect(action);

}

 

if ( 정보가 null이 아닐때){

if ( 정보가 리다이렉트 니? == 들고온 정보가 없니? ) {

보내줘 ( 그 경로로 )

}

else { // 포워드 구나

보내줘 ( 그 경로로 )

}

}

 

이것을 프론트 컨트롤러 패턴 이라고 한다.

 

✔️ 최종 정리

 

§ FrontController 패턴 §

 

1) Action 인터페이스를 상속받아서 execute()로 요청 처리 모듈화 하고

client 가 보낸 요청을 추출 -> 어떤 액션인지 파악

더이상 파라미터를 들고 다니지 않음 !

URL 을 분석해야함

 

2) execute()의 output 이 ActionForward

추출한 요청에 맞는 Action 클래스의 execute()메서드를 호출

경로와 데이터 여부를 받아 올수 있다.

 

④단계 : ActionForward 클래스 생성

응답용 vo --> ActionForward 클래스 생성 경로와 유무

 

포워드 인지 sendRedirect

어디로 가야하는지

 

3) 응답 !!! 을 해야함

 

프론트 컨트롤러만 NOT POJO 서블릿이다.

이제 프론트 컨트롤러 패턴 부터는

회원가입이 안돼 ------> 회원가입 컨트롤러 봐봐

전달이 안돼 ------> 프론트 컨트롤러 봐봐 FC 봐봐

 

.do VS .jsp

[C] [V]

보다 가벼움

 

- 인터페이스 Action 은 request , response 넣어서

ActionFoward 로 반환 해야돼

 

- ActionFoward 는 최초에 null 이었는데

정상 수행 되었을때만 ! new가 되고

정상 수행 되지 않았을땐 ! null이 반환

 

 

 

 

 

 

728x90
반응형

'JSP > 개념정리' 카테고리의 다른 글

비동기 처리  (0) 2024.04.29
Set 기법 (글 + 댓글 , 공지 + 답변)  (0) 2024.04.29
커스텀 태그  (0) 2024.04.29
리스너 ( jsp 크롤링 )  (0) 2024.04.29
필터 (.java 클래스)  (0) 2024.04.26