본문 바로가기
java spring/servlet&jsp

서블릿4(application, session, cookie)

by 킹차니 2021. 4. 1.

전까지 클라이언트에서 값 2개 또는 그 이상을 한번에 날려서 덧셈을 하고 그 값을 클라이언트에게 뿌려주었다.

이제 클라이언트에서 날라오는 값을 서버에 저장해보자.

 

Servlet Context

서블릿 컨텍스는 저장소다. 여기에 클라이언트에서 날린 데이터를 저장할 수 있다.

파란 박스가 저장소

servlet context에 값을 저장하는방법에는 몇 가지가 있는데, 첫번째로 applicrion 객체를 사용하는 방법을 알아보자.

 

1. application 객체를 이용한 값 저장

전체적인 흐름은 계산기에서 사용자가 박스에 5을 입력하고 (+)버튼을 클릭하면 5는 application 저장소에 저장되고,

다시 사용자가 3을 입력하고 (=)버튼을 클릭하면 서버에서 application저장소에 저장된 3을 찾아서! 

5+3의 결과를 클라이언트에게 뿌려주는 것이다.

5입력하고 +클릭
3입력하고 = 클릭
결과

application 저장을 위한 html과 자바 코드를 보자.

1.사용자가 처음에 5를 입력하고 (+)버튼을 누른 상황.

 

19line: 서블릿 컨텍스트. 즉 application 저장소를 생성한다.

25, 26line: 입력으로 날라온 값을 v_ , op에 저장하고 op는 "="이 아닌 "+"이므로 else문으로 고고

(30line: 키가 v로 날라온 값(사용자가 연산을 위해 입력한 값)이 null이거나 빈문자열이 아니면 int로 바꾸기)

52line이하: application저장소에 "value"라는 이름으로 v(=5)를 저장하고, "op"라는 이름으로 op(="+")를 저장한다.

현재 서블릿 컨텍스트에 << value : 5, op: "+" >>가 저장되어 있다.

 

2.사용자가 3을 입력하고 (=)을 입력한 상황

 

25, 26line: 입력으로 날라온 값을 v_ , op에 저장하고 op는 "="이므로 if문으로 고고~

(30line: 키가 v로 날라온 값(사용자가 연산을 위해 입력한 값)이 null이거나 빈문자열이 아니면 int로 바꾸기)

34line: 컨텍스트에 저장된 값중 << value >>라는 이름을 가진 값을 찾고, 그걸 int형으로 바꿔서 x에 저장.

38line: 사용자가 방금 입력한 값 즉 3을 y에 저장.

40line: 컨텍스트에 저장된 값중 << op >>라는 이름을 가진 값을 찾고, 그걸 String형으로 바꿔서 operator에 저장.

44line이하: opeartor가 "+"라면 덧셈 결과 출력. "-"라면 뺄셈 결과 출력.

 

 

2. Session 저장소를 활용하는 방법

application 저장소는 모든 서블릿의 공용 저장소이다. 즉 A사용자가 있고, B사용자가 있을 때 A는 덧셈을 위해 1을 덧셈을 위해 3을 날렸다면 서버는 같은 이름의 다른 값의 데이터를 서블릿 컨체이너에서 어떻게 찾아서 누구에게 줘야할까?

이러한 문제 때문에, 사용자마다 다른 session을 사용하여 값을 저장하고 돌려줘야 한다. session은 각각의 이름이 적힌 사물함과 같다.

A사용자의 요청은 사물함 번호101에 저장하고, B사용자의 요청은 102번호 사물함에 저장하는 것이다.

처음에 처음보는 사용자가 요청을 보내면 서버(WAS)에서 예를 들어 세션번호: SID101 를 만들어 줘서 돌려 보낸다. 그렇게 되면 SID101을 가진 사용자는 같은 서버에 또 요청을 보내면 서버는 사용자가 들고있는 SID번호를 확인하고, 해당 seesion저장소에 있는 데이터를 기반으로 로직을 처리하게 된다.

이것의 코드는 application과 거의 같은데, 다만 application이 아닌 seesion을 만들어주면 된다.

거의 모든 코드가 application에서 session으로 바뀌었을 뿐이다.

다만 58line에서 정보를 session에저장만 하는 것이 아니라 SID를 만들어서 클라이언트에 돌려주기까지 수행한다.

왼쪽은 사파리 오른쪽은 크롬 브라우저를 사용하여 실험해봤다. 각 두개의 브라우저마다의 session저장소가 생겨서 입력을 다르게 했더니 저마다 다른 결과를 출력한다.

 

 

 

3. Cookie이용해서 상태 값 저장

 

session을 사용하면 클라이언트의 데이터를 서버에 저장한다. cookie는 데이터를 클라이언트가 저장하게 한다.

 

처음 요청에 클라이언트는 쿠키가 없다. 먼저 서버쪽에서 addCookie메소드로 쿠키를 심어주면 그때 부터 클라이언트는 쿠키를 ㄱ지고 들고 다닐 수 있게 된다.

클라이언트서버에게 header설정, (쿠키가 있다면)쿠키 설정, 사용자 데이터를 보낼 수 있다. 이때 각각의 데이터를 서버에서는 

getHeader(), getCookies(), getParameter()(지금까지 get, post데이터를 얻는데 사용했음)를 통해 얻을 수 있다.

 

Cookie Path

또한 우리는 쿠키의 경로를 설정할 수 있다. 만약 클라이언트가 A servlet을 사용하고 쿠키를 발급받았는데, 이 쿠키를 들고 B servlet을 가려고 한다면? 

아직 B servlet에는 방문하지 않았으므로 B servlet에 대한 쿠키도 따로 발급 받아야 하는 것이다. 이를 위해 서블릿에 

쿠키객체.setPath("url")을 통해서 여기서 만든 쿠키로는 명시한 url에서만 가능해! 라고 할 수 있다.

1.사용자가 처음에 5를 입력하고 (+)버튼을 누른 상황.

 

처음 요청이 들어왔을 시 사용자가 입력값을 바탕으로 쿠키를 만들어준다. 위 코드의 65라인 else문 이하이다.

67, 68line: 사용자가 입력한 값 v, op를 바탕으로 new Cookie()를 통해 새로운 쿠키 객체를 valueCookie, opCookie가 참조하게 한다.

69, 70line: setPath를 통해 위에서 찍은 쿠키 객체들이 /calc 의 경로에서만 유효하다는  경로를 설정한다.

71, 72line: 그 쿠키 객체를 토대로 addCookie를 사용하여 쿠키를 만들어서 응답으로 돌려준다.

 

2.사용자가 3을 입력하고 (=)을 입력한 상황

현재 클라이언트는 valueCookie와 opCookie를 가지고 있다.

이 쿠키를 가지고서 3을 입력하고, (=)을 클릭하여 쿠키의 정보까지 서버에게 준다.

21line: 요청으로 날라온 쿠키를 받아서 쿠키형 배열에 데이터들을 저장한다. getCookies:배열로 반환

23~33은 다 똑같고.

38ine부터: 쿠키배열 cookies에 들어있는 쿠키의 이름을 쿠키객체.getName으로 뽑고, 쿠키에 들어있는 값을 쿠키객체.getValue로 뽑는다.

이와 같은 방법으로 클라이언트가 데이터를 가지고 다니게 하고, 서버는 이 데이터를 뽑아서 로직을 수행한다. 

 

개발자 도구나 크롬의 설정에서 쿠키들이 주고 받아 지고, 브라우저에 저장되는 것을 볼 수 있다.

 

 

Cookie Maxage

 

추가로 서버에서 쿠키를 만들고 쿠키의 유효시간을 지정할 수 있다.

위에서 만든 valueCookie에다가 하루의 만요일을 설정하였다. (디폴트로 지정되는 유효시간은 브라우저가 꺼질 때까지 이다.)

valueCookies.setMaxAge(초단위)

위처럼 쉽게 설정할 수 있다. 초단위 이기 때문에 60초 * 60 = 1시간이므로 여기에 24를 곱하면 하루이므로 60*60*24로 했다.

이렇게 쿠키를 지정하고 계산기에서 3을 입력하여 (+)을 눌러서 서버로 요청하고, 크롬 설정에서 발급된 쿠키의 정보를 봐보자.

 

만료를 보면 쿠키의 유효시간이 발급 시간과 하루 차이인 것을 볼 수 있다! 이렇게 되면 브라우저를 껏다 켜도 쿠키가 유지된다.

 

 

 

+추가))) 내용이 짧아서 여기에 추가.

redirect

지금까지 3을 입력하고 (+) 또는 (-)를 누르면 화면이 하얗게 질리게 되었었다,,(유튜브 뉴렉처님 표현ㅋㅋㅋㅋㅋㅋ)

그래서 우리는 사용자가 버튼을 누르고 난뒤 바로 계산기 화면을 보여주기 위해 redirect를 사용할 수 있다. 

아주 간단한데, 서블릿에다가 redirect코드를 url 추가해서 적어주면 된다.

redirect추가

response.sendRedirect("보낼 url");

이렇게 되면 맨 마지막에 서블릿 코드가 끝나기 전에 사용자는 뒤로가기 버튼을 누르지 않고도 계산기 화면을 볼 수 있을 것이다.

 

 

 

'java spring > servlet&jsp' 카테고리의 다른 글

서블릿, jsp 6  (0) 2021.04.03
서블릿 5( 동적 페이지의 필요성)  (0) 2021.04.01
서블릿3(여러 개의 버튼 post보내기)  (0) 2021.03.31
서블릿 2 (post, 필터)  (0) 2021.03.30
서블릿 1  (0) 2021.03.30