본문 바로가기

Languages/JSP

JAVA Bean과 Session, 그리고 Cookie

 


 

  • 이 내용들은 제가 대학 재학 시절, 전공 연구 동아리에서 활동하며 만들었던 발표자료를 배포하는 것입니다.

 

 

 

 

제가 발표할 내용은 자바빈, 그리고 세션과 쿠키에 대한 것들입니다.

자바빈이라는 것과, 그리고 세션. 쿠키에 대한 발표를 준비해보았습니다.

 

 

 

일반적으로 웹사이트를 개발한다는 것은 디자이너와 프로그래머가 협력하여 개발하게 됩니다.

그런데 프로그래머가 JSP 페이지의 이곳 저곳에 자바코드를 입력하게 되면,

소스가 매우 지저분해지며, 디자이너가 JSP 페이지를 수정하고자 할 때 페이지를 해석하기가 힘들어 개발 효율이 매우 떨어집니다.

그렇다고 프로그래머가 JAVA를 사용하지 않을 수는 없는 노릇이지요.

그래서 등장한 것이 JAVA Bean입니다.

이 자바빈은 JSP페이지의 디자인 부분과 로직부분을 나눔으로써

디자이너와 프로그래머간의 일의 분리가 명확해지게 하고, 복잡한 코드들을 줄이며

프로그램의 효율을 높일 수가 있습니다.

 

 

 

위의 코드를 보면 자바 코드가 상단에는 물론 하단에 있는 HTML 코드 내에도 코딩 되어 있습니다.

이렇게 되면 프로그래머는 이해할 수 있더라도 디자이너는 이해하기 어렵기 때문에, 디자인 작업이 불가능하게 될 수도 있습니다.

이때에는 디자이너가 자바 개발자에게 도움을 요청해야 하지만 이 방법 또한 매우 비효율적입니다.

그만큼 생산성이 떨어지게 되는 것이지요.

자바빈을 사용한다면, 앞에서 말했듯이, 디자이너는 디자인을, 프로그래머는 자바 코딩만을 할 수 있게 됩니다.

적어도 위의 코드처럼 지저분한 코드를 작성하진 않을 것입니다.

 

 

 

 

즉 부품이란 의미를 가지고 있다.

부품이란 만들어 놓으면 필요한 곳에 가져다가 제품을 완성시킬 수 있듯이 프로그램도 부품 형태로 만들어 놓고 필요할 때 재 사용할 수 있게 하는데요,

이렇게 JAVA로 만들어진 빈을 이용하면, 어디든 사용할 수가 있겠지요! ^^

 

 

 

 

 

 

 

 

 

 

위의 규약은 JAVA Bean 클래스 파일, 즉 .java 빈을 만들 때에 지켜야 하는 규약들입니다.

 

 

 

위의 예제설명:

Test 라는 패키지내에 beanTest 라는 클래스를 만듭니다.

그리고 사용할 변수를 선언한 후에, 규약에 맞는 get/set 메소드를 생성시킵니다.

Get 메소드는 파라미터가 존재하지 않으며, set 메소드에는 하나 이상의 파라미터가 존재해야 합니다.

또한, name 멤버변수의 get 메소드 이름이 멤버 변수와 일치하도록 하는 것이 중요하고,

Name 멤버변수의 set 메소드 이름 또한 멤버변수와 일치하도록 해야 합니다.

 

 

 

예제소스에서 굵은 글씨로 설정된 부분이 JSP에서 Bean을 사용하는 방법입니다.

자바소스를 직접 작성하는 것보다 훨씬 간결해진걸 볼 수 있습니다.

Bean 패키지내의 BeanTest 클래스로 beantest 라는 이름의 객체를 생성합니다.

그리고 JSP 문서 내에서 <%= %> 형태의 태그로 사용을 할 수 있습니다.

이처럼 보다 간결하게 Bean을 이용하여 효율적인 프로그래밍이 가능합니다.

 

 

 

Id는 JSP에서 자바빈 객체를 생성하기 위해 사용되며, class 는 자바빈의 설계규약에 맞게 작성된 클래스명(즉, 주소)을 적어주어야 합니다.

이 주소라는 것의 의미는 패키지 단위로 관리되는 bean의 위치를 지정해주라는 뜻이 되는데, 패키지 안에 작성되어 있는 Bean은 패키지 경로까지

적어주어야 합니다.

Scope 는 사용범위를 뜻하는데, request, page, session, application으로 4종류가 있으며 기본값은 page 입니다.

사용범위는 곧 생명주기를 뜻하기도 합니다.

 

 

 

이전에 test 라는 빈의 값은 "바보"였으나, setProperty 를 사용하게 되면 "바보"가 "미남"으로 바뀐 것을 알 수 있습니다.

setProperty 태그를 사용하면 test 빈에 접근하여 name 변수를 변경한 것이 됩니다.

그렇게 보이는 거죠.

 

 

 

하지만 자바빈을 보게 되면 name 은 private 로 선언되어 있어서 외부에서 직접 변경이 불가능합니다.

그런데 값이 바뀌는데 이것은 setProperty 태그가 직접 빈 객체의 변수를 수정하는 것이 아니고, set 메소드를 호출하여

멤버 변수를 수정하게 되는 것입니다.

 

 

 

이것을 보게 되면, test 라는 빈의 속성 중 name 속성인 "바보"를 불러오는 것입니다.

getProperty 속성도 마찬가지로 private 로 선언되어있는 자바빈 클래스로는 직접 접근이 불가능합니다.

그렇다면 어떻게 불러오게 되는 걸까요?

 

 

 

setProperty 와 마찬가지로, getProperty는 getName() 메소드로만 접근하여 값을 받아옵니다.

즉, getProperty 는 getName()메소드를 호출하는 역할을 하는 것입니다.

 

 

 

자바빈의 영역은 앞에서 봤던 <jsp:useBean/> 태그와 관련이 있습니다.

<jsp:useBean/> 태그를 공부했다면 scope 속성이 있었는데, 그것이 바로 자바빈의 객체가 저장될 영역을 뜻합니다.

<jsp:useBean/> 태그를 사용하게 되면 자바빈 클래스가 지정한 빈 이름으로 객체 생성이 되는데,

이 객체 생성은 scope에 지정된 곳으로 생성이 됩니다. 이 영역은 4가지(위에 있다). 기본값은 page 입니다.

일반적으로 특별히 객체를 보관해 놓고 계속 사용하지 않는 경우는 page 또는 request 영역을 자주 이용합니다. Session 또는 Application 영역의 경우는 서버 메모리를 사용하기 때문에,

꼭 필요한 경우만 사용해야 하며, 4개의 scope 내용을 모두 알고 알맞게 사용하여야 합니다.

 

 

 

웹 서핑을 하다 보면 며칠 전 들렸던 사이트에서 입력했던 회원아이디가

여전히 저장되어 있는 것을 볼 수 있습니다.

또는 웹 브라우저를 종료시킬 때까지 여전히 로그인이 된 상태로 유지되어 편리하게 사이트를 이용해본 경험이 있을 것입니다.

화면에서 보는 것처럼, 간단하게 세션은 > 서버 측에서 관리되는 정보이고, 쿠키는 클라이언트(사용자PC)에서 관리되는 정보입니다.

이러한 것은 세션과 쿠키라는 기능이 있어 가능한 것인데요, 이번에는 세션과 쿠키에 대해 설명하겠습니다.

 

 

 

그럼 쿠키에 대해 먼저 설명하겠습니다.

이 쿠키는 먹는 것이 아니구요, 물론 먹는 쿠키도 있긴 해요.

쿠키(Cookies)는 웹 사이트를 만드는 쪽에서 사용자와 관련된 정보를 사용자의 하드디스크에 저장해 둔 것을 뜻합니다.

여기서 주의할 단어는 '하드디스크'입니다. 사용자의 하드디스크에 작은 텍스트 파일로 저장을 해두기 때문에 사용자가 컴퓨터를 껐다가

켜더라도 언제든지 하드디스크에 저장된 쿠키 파일을 읽어와서 거기에 기록해 놓은 내용을 활용할 수가 있습니다.

 

 

 

그렇다면 왜 다른 곳도 아닌 사용자의 하드디스크에 정보를 저장할까요?

그것은 HTTP 프로토콜이 'stateless' 프로토콜이기 때문입니다. 웹 브라우저가 웹 서버에 접속을 해서 어떤 문서나 파일을 요청하면 웹 서버는 요청 받은 내용을 보내준 다음 접속을 끊습니다.

 

즉, 접속을 한 '상태(state)'가 지속되지 않고 요청된 것만 처리한 뒤 연결을 끊는 거죠. 그러므로 웹 서버는 일단 요청된 내용들을 클라이언트에 보내고 나면 그 뒤 사용자가 접속을 하고 있는지 어떤지 알 수가 없습니다.

나아가, 예전에 접속했던 클라이언트가 또 접속을 한 것인지 아닌지 등은 더더욱 알 수 없습니다. 그런데 웹 사이트를 운용하는 측에서는 어떤 사용자가 다시 방문을 했는지 와 같은 정보가 절실히 필요했고 바로 이런 점을 해결하기 위해, 즉 stateless한 http의 특징을 커버하기 위해 등장한 아이디어가 쿠키(Cookie)입니다.

쿠키의 아이디어는 간단합니다. 접속한 클라이언트의 하드디스크에 적당한 정보를 저장해 둠으로써 또 그 클라이언트가 접속한 경우 언제든지 하드디스크에 저장된 정보를 읽어 들여서 그 사용자를 인식할 수 있는 것입니다. '

상태'에 관한 점검을 언제든지 할 수 있는 것이죠.

쿠키에 저장되는 내용은 천차만별입니다. 간단하게는, 사용자가 어떤 페이지를 읽었고, 로그인 아이디가 뭐고, 이 메일 주소가 뭐고 등을 기록할 수도 있고, 사용자가 어떤 물품을 주문했는지, ip 주소가 뭐고, 어떤 사이트를 거쳐서 우리 사이트로 왔는지, 또는 서버에서 각 클라이언트를 식별할 특별한 정보를 기록하는 등, 거의 모든 형태의 정보를 저장할 수 있습니다.

사용자 처지에서는 사실 기분 나쁠 수 있습니다. 나도 모르게 나의 행동이 하나하나 기록되어 '파일'로 저장되고 있고, 그 파일이 다른 곳도 아닌 '내' 컴퓨터에 나도 모르게 저장된다는 것은 별로 좋은 느낌은 아니죠.

하지만, 쿠키 파일은 사용자가 컴퓨터를 끄든 켜든 하드디스크에 (상당 기간) 저장되어 있기 때문에, 언제든지 사용자가 다시 어떤 웹 사이트에 접속하면 쿠키에 저장해 놓은 정보를 읽어 들여서 여러 형태의 '맞춤화된' 서비스를 제공할 수 있습니다. 이를 테면, 로그인을 한 번만 하면 그 다음부터 안 해도 된다든지, 어떤 페이지를 "몇 번 보셨군요" 라고 알려준다든지 등이 가능합니다.

 

 

 

쿠키의 이런 독특한 점은 결국 개인 정보 유출에 관한 문제를 불러 일으킵니다.

왜냐하면, 사용자 하드디스크에 그 사용자가 어떤 식으로 웹 서핑을 하고 있는지, 어떤 물건을 구입했는지, 이 메일 주소는 무엇인지 등의 개인정보까지 저장될 수도 있기 때문에 누군가 악한 마음을 품고 쿠키를 뒤지면 민감한 정보가 유출될 수도 있을 것이기 때문입니다.

그래서 웹 브라우저에는 대개 쿠키를 항상 받아들일 것이냐, 아니면 매번 대화상자를 띄워서 물어보길 원하느냐, 그렇지 않으면 쿠키를 절대 받아들이지 않느냐를 선택하는 부분이 있습니다만, 불행히도 기본 설정은 모든 쿠키를 다 받아들이는 것으로 되어 있고, 또, 대개의 초보 사용자는 쿠키란 것이 있는지도 모른 채 자기 정보를 하드 디스크에 저장을 하고 있습니다.

게다가, 쿠키를 꺼놓으면 사이트 내용을 보는데 지장을 초래하게 하는 사이트도 아주 많죠

 

 

 

그렇다면 쿠키는 어디 있을까요?

windows 2000 유저는 C: 안의 "Documents and Settings" 폴더 속에 들어 있는 "사용자 폴더"(로그인 유저 폴더) 안에 보면, "Cookies"라는 폴더가 있습니다. 열어 보면 이상한 .txt 파일들이 많이 들어 있습니다. 윈98 은.. 잘 생각이 안 나는데, 아마 C:의 System 폴더인가, System32이던 가에 "Cookies" 폴더가 있을 것입니다.

이 쿠키 파일들은 인터넷익스플로러에서 지울 수 있습니다.

[도구] --> [인터넷옵션] 메뉴를 선택해보면 그림처럼 쿠키를 지울 수 있는 부분이 나옵니다.

★어쨌든 이러한 쿠키는 클라이언트에서만 사용될 데이터를 보관하고 그 데이터는 보안적으로 문제를 일으키지 않는 데이터여야 합니다.

 

 

 

쿠키를 설정하는 방법에는 HTTP 헤더를 이용한 쿠키 설정 방법과 서블릿 API를 이용한 쿠키 설정 방법이 있습니다.

우선 HTTP 헤더를 이용한 쿠키 설정방법은 다음과 같습니다.

여기서 필수적으로 요구되는 속성은 name 속성과 value 속성인데요, 이 두 가지의 값만 설정하여도 문제 없이 쿠키를 사용할 수 있습니다. Name 속성과 value 속성 외에

자주 사용되는 속성은 expires 정도이며, 이것은 만료기간을 의미합니다. 이 만료 기간을 설정하지 않을 경우 쿠키는 파일로 저장되지 않습니다. 그렇기 때문에 브라우저를 종료하게 될 경우 저장된 정보는 사라지게 됩니다.

 

 

 

이번에는 서블릿 API를 이용한 쿠키 설정 방법입니다.

서블릿 API를 이용해서 쿠키를 설정하는 것은 간단하고 쉽습니다.

HTTP 헤더를 이용해서 쿠키를 설정할 때처럼 복잡하게 한 줄로 나열하는 것이 아니며, 쿠키 객체에서 사용할 메소드만을 골라서 사용하면 됩니다.

먼저 서블릿 API로 쿠키를 사용하기 위해서는 표1과 같이 객체를 생성해야 합니다. 객체를 생성하면서, 바로 쿠키의 이름과 값을 입력할 수도 있습니다.

하지만, 생성하면서 값을 입력하였다고 쿠키가 메모리 또는 하드디스크에 저장된 것은 아닙니다. 쿠키를 생성하였으면 생성한 쿠키를 클라이언트로 전송을 해주어야 하는데

이것은 표2와 같은 방법으로 하면 됩니다.

Response 객체의 setCookie 메소드를 이용하면 생성한 쿠키 값을 클라이언트로 전송할 수 있는데요, 이 코드까지 처리하게 되면 클라이언트에 전송된 것이며,

메모리에 쿠키 값이 저장됩니다.

 

 

 

다음으로 세션에 대해 설명하겠습니다.

인터넷 사전에서 세션은 다음과 같이 설명하고 있습니다.

①망 환경에서 사용자 간 또는 컴퓨터 간의 대화를 위한 논리적 연결.
②프로세스들 사이에서 통신을 하기 위해 메시지 교환을 통해 서로를 인식한 이후부터 통신을 마칠 때까지의 기간이라고 설명하고 있습니다.

즉, 하나의 로그인 정보가 들어오면, 그 정보를 서버 측의 컨테이너라는 곳에서 관리하고, 접속 시간에 제약을 둘 수 있는 것이 세션이고,

이 세션은 브라우저로 어떠한 사이트의 접속이 종료될 때까지(즉, 브라우저를 종료할 때까지) 유지됩니다.

 

 

 

세션이란 무엇일까? 

쿠키를 설명하면서 서버와 클라이언트가 웹에서는 계속적으로 연결되어 있는 것이 아니고 페이지에 대한 요청과 전송이라는 Stateless 상태라고 하였습니다.

세션이란 이러한 상황을 해결하기 위해 쿠키를 확장하여 개발한 웹에서의 연결관리 기능입니다.

클라이언트와 서버가 통신할 때 서버에서 세션을 생성하면 클라이언트에선 이 세션의 ID만을 쿠키 등으로 저장합니다.

이 세션 ID는 서버에서 접속한 각 클라이언트마다 유일하게 생성하여 중복되는 일이 없고, 이렇게 세션을 생성한 후 정보를 기록할 때는 클라이언트에서 서버로 한번만 전송되고 서버에 저장됩니다.

 그러므로 세션을 종료하기 전까지는 더 이상 서버로 아이디나 패스워드를 전송할 필요가 없습니다. 단지 세션 ID만 전송하면 되고, 서버에선 세션 ID에 해당되는 세션정보를 가져오면 됩니다.

 

 

 

JSP 에서 세션을 관리하기 위해서는 우선 사용하는 메소드들을 알아봐야겠지요~

우선 [표1]을 한번 보세요, 이 코드는 세션 객체에 minam 이라는 값이 들어있는 name 속성을 저장하는 역할을 합니다.

물론 이 값은 동적으로도 변화가 가능하지요. 그리고~~~~~~~

세션은 유지 시간을 초과하지 않는 한 브라우저를 종료하지 않게 되면 name 속성은 계속해서 유지될 수 있습니다.

현재 저장한 속성 minam 은 String 형이지만, 저장 속성의 형태는 제한되어 있지 않습니다. 즉, 문자, 불린, 숫자 등 모든 클래스들을 저장할 수 있습니다.

[표2]의 코드는 세션 객체에서 name 속성을 얻어오는 역할을 합니다. setAttribute 메소드를 사용할 때 String 형태로 값을 입력했기 때문에, 받을 때에도 String 형태로 선언한 name 변수에 대입합니다.

getAttribute 인자는 하나 뿐이며, 그 인자 값은 속성 명을 의미합니다. 또한 getAttribute의 기본적인 반환 값 타입은 Object 형이므로, String 형태로 형 변환이 필요합니다.

 

 

 

[표1]의 코드는 저장되어 있는 속성 값을 제거할 때 사용합니다. 세션에 저장해둔 속성을 모두 사용하였고 더 이상 사용할 필요가 없을 때 주로 제거하게 됩니다.

[표2]의 코드는 세션의 유지시간을 설정하는 역할을 하며, 초 단위로 인자 값을 설정할 수 있습니다.

 

 

 

[표1]은 세션의 유지시간을 반환합니다.

[표2]는 세션의 모든 속성을 제거하는 역할을 하는데요, 세션을 모두 비울 것이라 removeAttribute로 속성 값들을 하나씩 지울 필요가 없습니다. 그리고 또 invalidate() 메소드는 모든 속성을

제거하기 때문에 세션 유지 시간이 지났을 때 세션이 초기화되는 것과 같은 효과를 가져옵니다.

 


첨부: 위 내용들을 PDF로 배포합니다.



Mine2007.pdf