기존의 웹 프로그래밍의 구조
클라이언트의 요청
-> WAS 의 web-server 가 요청을 받고, 요청을 다시 container 에게 할당
-> container 는 내부에 servlet instance 가 있는지 확인한 후, 없다면 project 내에 있는 servlet class 를 가지고 instance 를 생성
-> container 는 생성된 servlet instance 를 inti() 메소드를 통해 초기화
-> 요청과 결과에 대한 객체를 각각 생성(httpRequest, httpResponse)
-> (was 가 가지고 있을) Thread Invoker 에 의해 하나의 쓰레드가 생성되고, 그 쓰레드
에 의해 service(request, response) 메소드가 호출
-> request 의 method 타입에 따라 doGet, doPost, doPut, doDelete 메소드가 호출되어 입력-로직-출력 처리 실시
-> 작업이 종료된 쓰레드가 종료되고, 마찬가지로 시용이 끝난 request, response 객체 역시 메모리영역에서 사라진다. 최종적으로는 container 내부에 servlet instance 만 남아있게 된다.
servlet 은 stateful 형태로 사용하지 않는다.
만약 stateful 을 사용하려면 singleton 패턴이라는게 전제되어야 한다.
실제 웹 프로그래밍이 운영될 때, 한 번에 많은 요청이 오다보니 때떄로 singleton 에 어긋나게 되는 경우가 생겨날 수 있다.
그렇기 때문에 servlet 은 stateless 형태로 사용한다.
하지만, 서블릿 역시 공통적으로 공유하고자 하는 데이터가 존재할 수 있다.
이 때 사용할 수 있도록 container 내부에 존재하는 공유 저장 공간의 개념이 servlet context
이다.
🚨 즉, servlet context 란 hashMap 의 형태로 존재하는 저장공간 이다.
client thread 가 호출하는 doGet(doPost..) 안에서 이 객체의 referece 를 얻어서 사용이 가능하다.
따라서 servlet Context
란 container 가 가동됨과 동시에 생성되고 container 가 종료될 때 죽게 되는, 모든 servlet instance 내에서 사용 가능할 만큼의 넓은(준 글로벌한) scope 를 가진 객체이다.
scope는 결국 가용한 변수 사용 범위, 변수의 라이프 사이클..
ServletContext context = this.getServletContext()
// context는 container 와 함께 생성되기 때문에 new 가 아닌, get 을 통해 가지고 온다.
context.setAttribute("key", value);
// context 는 key-value 형태, 맵에 값을 넣을 때에는 `set Attribute` 를 사용한다.
dataType identifier = (dataYype) context.getAttribute("key");
// context의 value 는 기본적으로 object 형태로 저장되어 있기 때문에 원하는 형태로 사용하기 위해서는 강제적으로 데이터 형 변환을 진행해주는게 바람직하다.
다만, servlet context 는 어디까지나 모든 client 가 공유할 수 있는 container 가 가진 객체이기 때문에, client 의 개인식별정보를 저장하는 것은 절대 올바른 방법이 아니다.
이와 같이 클라이언트 개인의 정보를 담기 위해 container 가 제공하는 객체를 아래에서 설명할 session
객체이다.
web 을 사용할 떄에는 http protocol
을 사용한다.
http protocol 은 상대적으로 간단하고, 동작 방식도 단순한 편에 속한다.
client 가 요청이 오면 server 가 요청에 대한 처리를 한 뒤 응답을 보내고, 연결을 종료하는 구조.
즉 통신을 예시로 들면,
client 가 server에게 전화를 건 뒤 "안녕하세요" 라고 말하면, server 는 "네 안녕하세요" 라고 말 한 뒤 전화를 종료하는 것과 마찬가지인 셈이다.
이러한 구조는 클라이언트가 서버 대비 절대 다수를 차지하기 때문에 무수히 많은 클라이언트와의 연결을 항상 열어놓고 대기하면 메모리에 과부하가 오기 때문이다.
때문에 클라이언트와 서버 간의 연결성이 없어지게 되고, 서버 쪽에 클라이언트의 state
, 정보가 남아 있지 않게 된다.
http protocol
은 결국 stateless
구조이기 떄문이다.
그러다보면 발생하는 문제가 있다. 일반적으로 웹사이트를 이용하다보면, 로그인
을 하게 된다. 즉 처음 통신을 통해 서버에게 전달한 state, 정보를 서버가 저장하지 못하는 상태가 되어버리는 것이다.
이를 해결해보기 위해, 등장한 개념이 Session
이다. 서버 측에서 client 에 대해 인식 할 수 있도록 돕는 것이다.
session 객체는 container 내부에 존재하는 객체이다. container 는 새로운 클라이언트가 접속할 때, session 내부에 id=??
값을 할당하고, container 가 할당한 고유한 id 값을 가지고 사용할 수 있다. 즉 session 객체는 servlet instance 와 함께 컨테이너 내부에서 유지된다.
다만 session 객체는 가장 마지막 requet 요청으로부터 30분
간 유지된다. 30분 중, 29분 동안 요청이 없다가 마지막 1분 남았을 때 요청이 한 번 들어왔다면, 다시 session 객체는 그 시간으로부터 30분 간 유지되게 된다.
또한 response 객체에 의해 클라이언트로 응답객체가 전달 될 때, 자동적으로 cookie 가(그 내부에는 session id 가 포함) 함께 전달된다. 따라서 클라이언트가 한 번 갖게 된 session id 는, 다시 was 에 request 를 요청할 때, 함께 session id 가 전달된다.
이후에는, 컨테이너가 request 객체 내부에 있는 session id 를 가지고 1:1 매핑을 실시한다.
세션은 세션 트래킹, 즉 이 클라이언트의 행위들을 추적하기 위해 사용하게 된다.
Session 을 사용하기 위해서는 request.getSession() 메소드를 이용한다.
HttpSession session = request.getSession(true);
- HttpSession이 존재하면 현재 HttpSession을 반환하고 존재하지 않으면 새로이 세션을 생성합니다
HttpSession session = request.getSession(false);
- HttpSession이 존재하면 현재 HttpSession을 반환하고 존재하지 않으면 새로이 생성하지 않고 그냥 null을 반환합니다
즉 최초에 session을 만들고, 값을 넣기를 원한다면 getSession(true) 를 활용하고,
단순히 session 객체 내부에 data 를 조회하는 것을 목적으로 한다면 getSession(false) 를 활용하는 것이 효율적이다.
client
의 단위같은 브라우저 내에서도 같은 tap 으로 묶여 있다면 같은 client 로 인식된다.
하지만 크롬-사파리 와 같이 서로 다른 브라우저일 때,
크롬의 새 탭과 새 시크릿 탭과 같이 탭의 종류가 달라지게 되면
서로 다른 client 로 인식되게 된다.
Java server page(jakarta server page)의 약자로 servlet을 통해 http 통신을 하는 과정에서 PrintWriter.println() 을 통해 html 를 만드는 것이 비효율적이기 때문에
보다 편리하게 사용할 수 있도록 등장한 형식이다.
따라서
⭐️ JSP
= html + jsp요소(java code+특수한 표기법) ⭐️
JSP는 servlet 과 동일한 것이다. 컨테이너가 jsp 를 servlet, 즉 java 코드로 바꾸어 주기 때문이다.
jsp 파일 내에서 html 파일 내용들은 각 행마다 out.println() 메소드의 인자로 다 들어가게 된다.
jsp 파일 내에서 <% %>
안에 입력하는 코드는 일반 자바 코드로 인식된다.
<% %>
: ScriptLet
스크립트릿 이라고 부르며, _jspService() 메소드 안의 실행코드로 들어간다.
표현식 태그(expression) : <%= %>
안에는 문자열로 표현할 수 있는 값
이 들어갈 수 있다.
설정 태그 : <%@ %>
import 구문들..
일반적으로 웹페이지를 만들어가는 방식에는 3가지가 있다.