Loading...

Web / / 2022. 2. 23. 23:23

Web 14강. FrontController 패턴

반응형

 

package site.metacoding.servletproject.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;

// http 프로토콜 최초 버전 (GET)
// http1.0 프로토콜 (GET, POST)
// http1.1 프로토콜 -> 지금 일반적으로 사용하는 디폴트 프로토콜 (GET(주소요청), POST(폼태그), DELETE(자바스크립트), PUT(자바스크립트))

// http://localhost:80/front
@WebServlet("/front")
public class FrontController extends HttpServlet {
	private static final long serialVersionUID = 1L;

	public FrontController() {
		// 진짜 메모리에 한번만 뜨는지 검증 -> 계속 uri 요청(엔터)해도 하나만 메모리에 뜬다.
		System.out.println("나 메모리에 떴어 : FrontController");
	}

	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		// 삭제코드, 인서트 코드 다 짤 수 있음. 대신 협업하기가 힘들다.
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

	}

}

 

 

여러 번 주소를 요청해도 메모리에 하나만 떠서

출력은 한 번만 되는 것을 확인할 수 있다.

 

 


 

 

 

 

 

 

사실 새로운 파일 만들었을 때만 restart 하면 됨

저장만 해도 바로 적용됨!

restart : 코드가 바뀐 사항을 다시 읽어주는 것

package site.metacoding.servletproject.controller;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

// http 프로토콜 최초 버전 (GET)
// http1.0 프로토콜 (GET, POST)
// http1.1 프로토콜 -> 지금 일반적으로 사용하는 디폴트 프로토콜 (GET(주소요청), POST(폼태그), DELETE(자바스크립트), PUT(자바스크립트))

// http://localhost:80/front
@WebServlet("/front")
public class FrontController extends HttpServlet {
	private static final long serialVersionUID = 1L;

	public FrontController() {
		// 진짜 메모리에 한번만 뜨는지 검증 -> 계속 uri 요청(엔터)해도 하나만 메모리에 뜬다.
		System.out.println("나 메모리에 떴어 : FrontController");
	}

	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		// 삭제코드, 인서트 코드 다 짤 수 있음. 대신 협업하기가 힘들다.
		System.out.println("front 컨트롤러로 요청 들어옴");
		// 1. 쿼리 스트링으로 주소를 분기시키는 라우터 만들기
		String path = request.getParameter("path");
		System.out.println(path);

	}
}

 

 

자바 코드에 직접 html을 구현했다.

package site.metacoding.servletproject.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;

// http 프로토콜 최초 버전 (GET)
// http1.0 프로토콜 (GET, POST)
// http1.1 프로토콜 -> 지금 일반적으로 사용하는 디폴트 프로토콜 (GET(주소요청), POST(폼태그), DELETE(자바스크립트), PUT(자바스크립트))

// http://localhost:80/front
@WebServlet("/front")
public class FrontController extends HttpServlet {
	private static final long serialVersionUID = 1L;

	public FrontController() {
		// 진짜 메모리에 한번만 뜨는지 검증 -> 계속 uri 요청(엔터)해도 하나만 메모리에 뜬다.
		System.out.println("나 메모리에 떴어 : FrontController");
	}

	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		// 삭제코드, 인서트 코드 다 짤 수 있음. 대신 협업하기가 힘들다.
		// System.out.println("front 컨트롤러로 요청 들어옴");

		// 공통로직 처리!!

		// 1. 쿼리 스트링으로 주소를 분기시키는 라우터 만들기
		String path = request.getParameter("path");
		System.out.println(path);

		if (path.equals("login")) {
			// 로그인페이지를 응답
			PrintWriter out = response.getWriter();
			out.println("<!DOCTYPE html>");
			out.println("<html>");
			out.println("<head>");
			out.println("<meta charset=\"UTF-8\">");
			out.println("<title>Insert title here</title>");
			out.println("</head>");
			out.println("<body>");
			out.println("<h1>LoginPage</h1>");
			out.println("</body>");
			out.println("</html>");

		} else if (path.equals("join")) {
			// 조인페이지를 응답
			PrintWriter out = response.getWriter();
			out.println("<!DOCTYPE html>");
			out.println("<html>");
			out.println("<head>");
			out.println("<meta charset=\"UTF-8\">");
			out.println("<title>Insert title here</title>");
			out.println("</head>");
			out.println("<body>");
			out.println("<h1>JoinPage</h1>");
			out.println("</body>");
			out.println("</html>");
		}
	}
}

 

FileReader로 읽어와서 버퍼로 응답해주는 것보다 편한 기술이 있다.

 

클라이언트가 프론트 컨트롤러로 요청하면

서버 내부에서 최초의 요청 방식이 다시 일어나는 것이다.

 

response.sendRedirect() 메서드를 이용하면 된다.

메서드 내부에는 재요청될 파일의 경로를 지정해준다.

 

슬래시를 안 적어주면 web_app 내부에서만 찾는다.

절대 경로를 사용해주자.

 

package site.metacoding.servletproject.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;

// http 프로토콜 최초 버전 (GET)
// http1.0 프로토콜 (GET, POST)
// http1.1 프로토콜 -> 지금 일반적으로 사용하는 디폴트 프로토콜 (GET(주소요청), POST(폼태그), DELETE(자바스크립트), PUT(자바스크립트))

// http://localhost:80/front
@WebServlet("/front")
public class FrontController extends HttpServlet {
	private static final long serialVersionUID = 1L;

	public FrontController() {
		// 진짜 메모리에 한번만 뜨는지 검증 -> 계속 uri 요청(엔터)해도 하나만 메모리에 뜬다.
		System.out.println("나 메모리에 떴어 : FrontController");
	}

	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		// 삭제코드, 인서트 코드 다 짤 수 있음. 대신 협업하기가 힘들다.
		System.out.println("front 컨트롤러로 요청 들어옴");

		// 공통로직 처리!!

		// 1. 쿼리 스트링으로 주소를 분기시키는 라우터 만들기
		String path = request.getParameter("path");
		System.out.println(path);

		if (path.equals("login")) {
			// 로그인페이지를 응답
			response.sendRedirect("/login.jsp");

		} else if (path.equals("join")) {
			// 조인페이지를 응답
			response.sendRedirect("/join.jsp");
		}
	}
}

 

 

그리고 주소창에 http://localhost/front?path=join 검색하고

브라우저에서 F12를 눌러 network탭으로 가보자.

302가 떴다는 것은 redirection, 재요청이 되었다는 것이다.

redirection을 하면 파일을 읽어서 버퍼로 응답해주지 않아도 된다!

 

 

 

 

[출처]

https://cafe.naver.com/metacoding

 

메타코딩 : 네이버 카페

코린이들의 궁금증

cafe.naver.com


메타 코딩 유튜브
https://www.youtube.com/c/%EB%A9%94%ED%83%80%EC%BD%94%EB%94%A9

 

메타코딩

문의사항 : getinthere@naver.com 인스타그램 : https://www.instagram.com/meta4pm 깃헙 : https://github.com/codingspecialist 유료강좌 : https://www.easyupclass.com

www.youtube.com

 

반응형