의식의 흐름대로 정리
클라이언트의 요청은 기본적으로 정적인 요청이다. 따라서 웹서버에서 동적인 요청을 수행 할 수 있도록 만들어진 프로그램이 Servlet
Servlet : 자바 언어로 웹 개발을 하기 위해 만들어졌음. 컨테이너가 이해할 수 있게 순수 자바 코드로만 구성됨. 자바 코드 안에 HTML 태그가 삽입됨
서블릿 컨테이너는 웹서버로 요청이 들어왔을 때 init(), service(), distroy() 메소드 등을 이용해 서블릿을 관리하는 역할을 한다.
JSP (Java Server Page) : html 기반에 자바 코드를 블록화하여 삽입한 것. Servlet을 좀 더 쉽게 접근할 수 있도록 만들어짐
서블릿에서 HTML 코딩이 어렵고 불편해서 단점을 보완하고자 만든 서블릿 기반의 스크립트 기술이다.
초기의 자바 웹개발은 서블릿을 이용한 개발이었고, 이후 JSP가 개발이 되면서 JSP를 이요한 개발이 유행했다. 지금에 와서는 각각의 역할을 나누어 Servlet+JSP 형태의 개발이 이루어지고 있다.
MVC 패턴에서 모델1 방식은 JSP만 이용한 개발이고, 모델2는 서블릿과 JSP를 동시에 사용하여 개발하는 방식이다. JSP는 HTML 태그 사용이 용이하고 자바코드 사용이 불편하기 때문에 view를 담당하고, Servlet은 자바모드 작성이 편리하기 때문에 주로 화면과 통신하여 자료를 받아 가공하고, 가공한 자료를 다시 화면에 전달하는 Controller 역할을 하고 있다.
Model에는 비즈니스 로직을 처리하는 모든 것이 모델에 속한다. 컨트롤러로부터 특정 로직에 대한 처리 요청이 들어오면 이를 수행하고 수행 결과를 컨트롤러에 반환한다.
JSP를 구동하기 위해 서버를 구축하는 과정
자바 인스톨, JDK 인스톨(JRE는 JDK를 설치하면 설치되므로 따로 설치할 필요 없음)
환경변수 세팅
JSP를 웹으로 변환해 줄 수 있는 톰캣 설치
서블릿의 실행과정
서버에 클라이언트의 요청을 받으면, 컨테이너는 연결 요청 정보를 담고 있는 Request 객체와 연결 응답 정보를 담고 있는 Respose 객체를 생성하고, 사용자의 요청을 처리하기 위해 스레드를 생성 후 service() 메서드에 인자 값을 담아 호출. 들어온 요청 방식에 따라 get방식은 doGet() 메소드, post 방식은 doPost() 메소드를 호출하여 처리함. response 객체에 정보를 담아 클라이언트에게 결과를 보여줌. 요청을 처리하기 위해 생성한 스레드는 소멸됨
서블릿에서 데이터를 처리하는 방법
GET
- 서버에 있는 정보를 가져오기 위해 설계되었고, 240바이트까지 전달 할 수 있음
- POST 방식에 비해 속도가 빠르고 검색 엔진에서 검색 단어 전송에 많이 이용
- URL 노출로 보안성이 요구되는 경우엔 사용할 수 없음
POST
- 서버로 정보를 올리기 위해 설계됨
- URL에 파라미터가 표시되지 않음
- 내부적으로 데이터가 이동함
- GET 방식에 비해 속도가 느리고 데이터 크기에 제한이 없음
JSP에서 페이지 이동 방법
Forward 방식
- url이 바뀌지 않음
- 요청 객체와 응답 객체가 유지됨
- 속도가 빠르며 요청 객체에 소속되어 있음
- 요청이 들어오면 서블릿이 받고, 요청에 알맞은 페이지를 찾음. 알맞은 페이지가 있다면 응답하고 없다면 요청객체와 응답객체를 포함해 포워딩 방식으로 알맞은 페이지로 넘긴다.
- 클라이언트와 통신 없이 서버에서만 처리되는 것이어서 리다이렉트보다 좋은 성능을 보여준다.
Redirect 방식
- 요청에 알맞은 페이지를 찾고 알맞은 페이지가 있다면 응답
- 알맞은 페이지가 없다면 알맞은 페이지로 다시 요청하게끔 응답을 보냄
- 클라이언트는 응답을 받고, 다시 그 요청의 맞는 url로 요청함
- Request와 Response 객체가 새롭게 생성된다
- 추가적으로 발생하는 처리에 의해 포워딩보다 성능이 느리다.
한 줄 정리
클라이언트의 요청이 웹서버에 들어왔을 때 자바 언어로 동적인 처리를 하기 위해 개발된 것이 Servlet입니다.
서블릿은 HTML in Java
서블릿에서 HTML 코딩이 어렵고 불편해 단점을 보완하고자 나온 것이 JSP(Java Server Page) 입니다.
JSP는 Java in HTML. 자바를 기반으로 하는 스크립트 언어입니다.
MVC 모델1 방식에서는 JSP가 View와 Controller의 역할을 모두 수행합니다.
MVC 모델2 방식에서는 HTML 작업이 편리한 JSP가 View의 역할을 하고, Servlet은 자바 작성이 편리하기 때문에 뷰단과 통신하여 자료를 받고 다시 화면에 전달하는 Controller의 역할을 합니다.
참고로 Model에는 비즈니스 로직을 처리하는 모든 것이 속합니다. 컨트롤러로부터 특정 로직에 대한 처리 요청이 들어오면 이를 수행하고 결과를 다시 컨트롤러에 반환합니다.
MVC 패턴은 애플리케이션을 크게 Model, View, Controller로 구분하여 영역 간의 결합도를 최소화한 패턴입니다.
비즈니스로직과 프레젠테이션로직이 분리됨으로써 작업의 분업화를 할 수 있으며, 유지보수에도 용이합니다.
개발에 소요되는 시간을 현저하게 줄여줍니다.
Model : 데이터의 처리와 접근 담당
View : 사용자에게 보여지는 화면 담당
Controller : Model과 View 사이를 연결하고 정보를 교환
Request 전송방식의 종류(서블릿에서 데이터를 처리하는 방법)에는 Get, Post, Put/Patch, Delete가 있습니다.
Get 방식
- 주로 웹 브라우저가 서버에 데이터를 요청할 때 사용됩니다.
- url에 데이터를 같이 전달하므로 데이터 길이에 제한이 있고 보안에 취약합니다. Post 방식에 비해 빠릅니다.
Post 방식
- 주로 웹 브라우저가 서버에 데이터를 전달할 때 사용됩니다.
- 헤더에 데이터를 전달하는 방식으로 데이터 길이 제한이 없고 보안에 유리하지만 다소 느립니다.
Put/Patch 방식
- Restful에서 수정 작업을 할 때 주로 사용됩니다. Put은 전체 수정, Patch는 일부 수정에 사용됩니다.
Delete 방식
- Restful에서 삭제 작업을 할 때 주로 사용됩니다.
Restful : Rest의 규칙을 지켜 제공하는 웹 서비스 방식으로, Rest는 url만 보더라도 어떤 작업을 하는 지 알 수 있도록 데이터의 이름으로 상태를 구분하여 전송하는 방식입니다.
Rest의 원칙
1. Unifrom Interface : url만 보고도 데이터의 전송 방법과 방식을 구분 가능하게 해야 한다.
2. Client Server : 클라이언트와 서버는 반드시 분리되어야 한다.
3. Stateless : HTTP 프로토콜을 따르기 때문에 같은 특징을 갖는다. 상태를 저장하지 않으며, 요청에 모든 정보가 담겨 한 번에 전송되어야 한다.
4. Cacheable : 요청을 통해 보내는 자료들은 저장되어야 한다.(저장된 자료를 주고받으며 속도 향상의 장점이 있다)
5. Layered System : 요청된 정보를 검색하는데 계층 구조로 분리되어 있어야 한다. 중간 서버 등을 둬 서버 확장성을 보장한다
6. Code on Demand : 보통 서버는 XML이나 JSON으로 응답하지만, 필요한 경우 코드 자체를 데이터로 클라이언트에 전달 할 수 있다.
Restful한 서비스 제공을 위한 url 네이밍 규칙
- 명사 사용
- 복수형 사용
- 소문자 사용
- 구분자는 '-(하이픈)' 사용
- url 마지막에 슬래쉬를 포함하지 않는다.
- 파일 확장자는 포함하지 않는다.