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 표준이 나오기 전에 만들어진 표준
∙ 자바로 웹어플리케이션 개발 위해 만들어짐
∙ 서블릿은 자바 클래스 이용하여 개발함
∙ 서블릿은 자바 파일
∙ 웹서버+에플릿(프로그램의 가장 작은 단위/소규모의 프로그램) = 서블릿
개발과정
- 서블릿 규약에 따라 자바 코드 작성 .java
- 자바 코드 컴파일 ▹ 클래스 파일 생성 .class
- /WEB-INF/classes 폴더에 클래스파일을 패키지에 맞게 위치 시킴
- web.xml 파일에 서블릿 클래스 설정
- 톰캣등 컨테이너를 실행
- 웹 브라우저에서 결과 확인
서블릿 생성방식
- 이클립스(컴파일러 자동으로 해주고 실행까지 해줌) 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
------------------------------------------------------------------------
☑ 작업 단계 개념으로 다시 흐름보기
- 클라이언트가 요청을 하면 컨트롤러가 요청을 받는다
- 요청 분석(URI 분석) : 모든 요청은 다 컨트롤러로 집중되고, 그 컨트롤러는 요청을 분석해야함
- 비지니스 로직을 처리하기 위해 분석된 요청에 맞는 Model(자바빈)을 활용
- 결과를 다시 컨트롤러에 보내고, 컨트롤러는 결과를 request 등과 같은 객체 속성에 저장한다.
- 컨트롤러가 다시 적당한 view를 찾아 포워딩시킨다.
- 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)
'basic > jsp' 카테고리의 다른 글
[jsp 15] MVC - properties 파일 이용한 통합 controller 만들기 (0) | 2021.07.26 |
---|---|
[jsp 14] EL(표현언어), JSTL (0) | 2021.07.22 |
jsp[12] - 회원가입 + 게시판 연결하기 (0) | 2021.06.17 |
jsp[10] - 파일 업로드 (0) | 2021.06.16 |
[jsp] java.sql.SQLException: Cannot load JDBC driver class 'oracle.jdbc.driver.OracleDriver' 에러 (0) | 2021.06.10 |