basic/jsp

[jsp13] Web server, WAS, Servlet, MVC 패턴

못지(Motji) 2021. 7. 21. 16:12

Web Service의 기본적인 동작 과정

Web Server와 WAS의 차이

웹서버 (정적인 웹사이트 구축시 사용)

☑ 개념

  • 하드웨어 : Web 서버가 설치되어있는 컴퓨터
  • 소프트웨어 : 클라이언트로부터 HTTP요청을 받아 정적인 컨텐츠 html, jpg, css 등을 제공하는 컴퓨터 프로그램

☑ 기능

HTTP 프로토콜 기반으로 클라이언트의 요청을 서비스하는 기능담당

  • 정적인 컨텐츠 제공, WAS를 거치지 않고 바로 자원 제공
  • 동적인 컨텐츠 제공을 위한 요청 전달
    클라이언트 요청을 WAS에 보내고, WAS가 처리한 결과를 클라이언트에게 전달(응답)한다.
  • Ex) Apache server, Ngnix, IIS

WAS Web Application Server (동적인 웹사이트 구축시 사용)

☑ 개념

  • DB조회나 다양한 로직 처리를 요구하는 동적 컨텐츠를 제공하기 위해 만들어지 Application Server로 미들웨어(소프트웨어 엔진) 이다.
  • 웹 컨테이너 == 서블릿컨테이너 라고 불림

☑ 역할

  • 웹 서버 기능들을 구조적으로 분리하여 처리할 목적으로 제시됨

☑ 기능

  • 프르그램 실행 환경과 DB 접속기능 제공
  • 여러개의 트랜잭션 관리 기능
  • 업무 처리하는 비지니스 로직 수행
  • Ex) Tomcat, JBoss, Jeus, Web sphere

💡

웹 서버가 필요한 이유

▸웹서버에서는 정적 컨텐츠만 처리하도록 기능을 분배하여 서버 부담을 줄일 수 있다.

WAS가 필요한 이유

▸WAS를 통해 요청에 맞는 데이터를 DB에서 가져와 비지니스 로직에 맞게 그때 그때 결과를 만들어 제공함으로서 자원을 효율적으로 사용할 수 있다.

WebService Architecture

client ▹ web server ▹db

client ▹ WAS ▹ db

client ▹web serer ▹ WAS ▹db

서블릿 Servlet

∙ JSP 표준이 나오기 전에 만들어진 표준

∙ 자바로 웹어플리케이션 개발 위해 만들어짐

∙ 서블릿은 자바 클래스 이용하여 개발함

∙ 서블릿은 자바 파일

∙ 웹서버+에플릿(프로그램의 가장 작은 단위/소규모의 프로그램) = 서블릿

개발과정

  1. 서블릿 규약에 따라 자바 코드 작성 .java
  2. 자바 코드 컴파일 ▹ 클래스 파일 생성 .class
  3. /WEB-INF/classes 폴더에 클래스파일을 패키지에 맞게 위치 시킴
  4. web.xml 파일에 서블릿 클래스 설정
  5. 톰캣등 컨테이너를 실행
  6. 웹 브라우저에서 결과 확인

서블릿 생성방식

  • 이클립스(컴파일러 자동으로 해주고 실행까지 해줌) JvaEE 버전
  • javax.servlet.http.HttpServlet 클래스 상속
  • HttpServlet 클래스의 doGet/doPost/service의 3개 메소드중 처리하고자하는 HTTP 방식(method(get/post))에 따라 알맞은 메소드를 오버라이딩하여 구현해야 한다.

서블릿 메소드

  • doGet : GET방식 처리시 사용 메소드
    ▸ HttpServletRequest, HttpServletResponse 두개의 파라미터 존재
    ▸ HttpServlet 클래스의 doGet메소드는 아무것도 하지 않아 개발자가 오버라이딩해서 처리를 작성
  • ▸ doPost : POST방식 처리시 사용 메소드 (get과 동일)
  • service : 서비스를 해주는 시작 메소드라 볼 수 있다.
    ▸ GET/POST 방식 모두 받을 수 있음
    ▸ GET방식인지 POST방식인지에 따라 맞는 메소드를 호출하게 만들어져 있음
    ▸ 개발자가 service 메소드를 오버라이딩 하면 이미 만들어져 있는 기능은 무시됨 (doGet/doPost 호출안됨)

서블릿과 JSP 관계

✔ JSP만 이용하는 모델 (MVC 모델1)

JSP가 사용자 요청을 받아 JavaBean(DTO, DAO)을 호출하여 적절한 동적인 페이지를 생성함

☑ 특징

개발 속도 빠르고 배우기 쉽다

프레젠테이션로직(VIEW)과 비지니스로직(Cotroller...)이 혼재함

JSP 코드가 복잡해져 유지 보수가 어려움

 

✔ JSP와 Servlet을 모두 이용하는 모델 (MVC Architecture, MVC 모델2)

JSP와 Servlet을 모두 사용하여 프레젠테이션 로직과 비지니스 로직을 분리

❗❗

M : JavaBeans로 DTO, DAO 등등 처리를 담당

V : 화면에 보여지는 부분을 HTML이 중심이 되는 JSP를 사용

C : servlet 자바 코드가 중심이 되어 다른 자바 클래스에 데이터를 넘겨주는 부분

MVC (MVC 패턴, MVC Architecture)

모델2 구조 기반의 MVC 패턴

☑ 모델1 VS 모델2

  • 모델 1
    jsp만 이용한 단순한 모델, 브라우저의 요청을 jsp가 직접처리
    ------------------------------------------------------------------------
    Model : JavaBeans
    View : jsp + Controller역할
    ------------------------------------------------------------------------
  • 모델 2
    요청을 서블릿(Controller)이 받는다
    Model, View, Controller의 역할을 분리 > 유지보수 좋게 하기 위해
    ------------------------------------------------------------------------
    Model : 비즈니스로직처리 : JavaBean dao, dto, action
    View : 화면 내용 보여주기 : jsp
    Controller : 요청을 받아 View와 Model 사이 흐름 제어 : Servlet
    ------------------------------------------------------------------------

☑ 작업 단계 개념으로 다시 흐름보기

  1. 클라이언트가 요청을 하면 컨트롤러가 요청을 받는다
  2. 요청 분석(URI 분석) : 모든 요청은 다 컨트롤러로 집중되고, 그 컨트롤러는 요청을 분석해야함
  3. 비지니스 로직을 처리하기 위해 분석된 요청에 맞는 Model(자바빈)을 활용
  4. 결과를 다시 컨트롤러에 보내고, 컨트롤러는 결과를 request 등과 같은 객체 속성에 저장한다.
  5. 컨트롤러가 다시 적당한 view를 찾아 포워딩시킨다.
  6. view로 사용자에게 응답함

MVC 패턴 작성

Controller(sevlet) 작성 방법

  • HttpServlet 클래스 상속
  • init() 오버라이팅 (초기화)
  • service() 오버라이딩

web.xml 세팅

	<servlet>
		<servlet-name>mvc</servlet-name> // servlet 태그에 이름짓기
		<servlet-class>web.jsp13.servlet.HelloController</servlet-class> // servlet 클래스 경로 지정
	</servlet>
    
	<servlet-mapping> // url 요청되면 동일 servlet-name으로 맵핑
		<servlet-name>mvc</servlet-name> // servlet 태그 이름
		<url-pattern>/hello.naver</url-pattern> // url 주소 패턴 지정, 확장자명만 지정해줘도 됨
	</servlet-mapping>
    
    // 위 두개가 세트

* url-pattern 매핑 규칙

서블릿 규약에 따른 url 패턴 규칙

  • 경로 매핑 : / 로 시작하고 * 끝날때
  • 확장자 매핑 : *. 으로 시작
  • 기본서블릿 매핑 : / 만 작성

    ex) 예시 매핑
    /foo/bar/* servlet1
    /baz/* servlet2
    /catalog servlet3
    *.nhn servlet4

    요청 경로 요청 서블릿
    /foo/bar/index.html servlet1
    /foo/bar/index.nhn servlet1
    /baz servlet2
    /baz/index.html servlet2
    /catalog servlet3
    /catalog/car.nhn servlet4
    /index.nhn servlet4

컨트롤러 활용

WebContent > jsp13 폴더 > hello.jsp 파일 만들기

* RequestDispatcher

클라이언트로부터 최초에 들어온 요청을 넘기는 역할을 수행하거나 (forward()), 특정 자원에 처리를 요청하고 처리 결과를 얻어오는 기능을 수행(include())

💡

HttpServletResponse.sendRedirect() vs RequestDospatcher.forward()

sendRedirect() HTTP리다이렉션을 이용하여 브라우저에게 response 한후 브라우저측에서 지정받은 요청 경로로 재요청을 하는 방식으로 HTTP 트랜젝션 두번 발생

최초에 받은 요청중에 처리한 내용을 리다이렉트된 요청안에 공유할 수 없는 문제가 있음

 

Dispatcher는 현재 처리중인 서블릿에 속해있는 웹 어플리케이션 범위 내에서만 요청 제어가능

forwrad() : 넘어가는 페이지로 제어를 넘김 (jsp:forward)