System.out.println("Hello, World");

ServletContext를 이용한 회원검색 서비스



위와 같은 사진처럼 ID, 이름, 나이, 성별을 입력하고 전송을 누르면 회원정보들이 출력되는 서비스를 만들 것이다.


<html>

request_member_form.html


<Listener>

SaveRequestMemberListener.java


ShowAllReqMemberServlet.java


SaveReqMemberServlet.java


<MemberDTO>

MemberDTO.java



Posted by 김마농

Session 관리

-Http프로토콜은 stateless한 특징을 가진다.

-stateless -상태유지를 못한다 -> 클라이언트의 데이터를 유지하지 못함


-Session

○하나의 클라이언트가 프로그램을 시작해서 종료할때까지

○하나의 세션동안 여려번의 요청과 응답이 반복 될 수 있다.

○하나의 세션동안 클라이언트의 데이터는 유지되어야 한다.


-Session 관리 개념

○HTTP 프로토콜의 특징은 클라이언트의 상태를 유지 못하므로 CGI에서 지원

○방식

-Cookie를 이용

-Session을 이용

-URLRewriting을 이용


-Cookie를 이용한 Session관리

○쿠키

- 서버가 브라우저(client)로 전송하는 text 데이터

- 쿠키는 클라이언트의 정보를 유지하기 위한 데이터로 Web Browser에 저장된다.

->클라이언트 단에 저장

- key-value 형태로 관리된다.

- 저장 데이터의 종류는 문자열만 가능

-Web Browser는 쿠키를 사이트 별로 관리한다.

-웹브라우저가 종료되면 쿠키는 죽어버린다.


○장점

-서버에 부하를 줄일 수 있다.


○단점

-관리 할 수 있는 데이터의 종류, 크기에 제약이 있다.

-보안상 문제가 있다.


○구문

-쿠키 생성

-javax.servlet.http.Cookie 사용 - 하나의 쿠키 값을 가지는 객체

-HttpServletResponse.addCookie(Cookie c) : 쿠키를 client로 전송

ex)Cookie c = new Cookie("name","value");

response.addCookie(c);


-쿠키값 조회

-HttpServletRequest.getCookies() : Cookie[]

ex)Cookie[] c = request.getCookies();


- Cookie 클래스 주요 메소드

-getName() : String  - name 값 조회

-getValue() : String  -value 값 조회

-setMaxAge(int 초(sec)) - 쿠키가 웹 브라우저에 저장될 시간 설정

- 초: 양수 = 지정될 시간

: 음수 = web browser가 살아있는 동안까지만

: 0초 = 삭제

- 한글 encode처리




<Cookie 예제>

개요

- SetCookie로 현재 시간을 알아내서 cookie에 저장한다. 

- GetCookie로 SetCookie에서 넘겨준 값을 출력한다.

Servlet

folder : servlet.cookie

GetCookieServlet.java

SetCookieServlet1.java

url : /getServlet

/setServlet


HTML

folder : cookie

cookie.html


[GetCookieServlet.java]


[SetCookieServlet1.java]


[cookie.html]


결과화면

1. SetCookie를 실행한다.


2. GetCookie요청을 누르면 getCookie가 실행되어 set에서 넘겨준 값을 출력한다.


SetCookieServlet을 통해 쿠키 정보를 전송하고 GetCookieServlet을 조회하면 전송된 쿠키가 출력된다. 하지만 GetCookieServlet을 통해 서버를 재 시작하면 request.getCookie()를 통해 조회한 값이 없어진다. 즉, 웹브라우저가 살아 있는 동안만 쿠키 정보를 조회할 수 있다.


Posted by 김마농

○ Multi-thread상황에서 Data 동기화(Synchronized)

- 데이터를 공유하는 상황에서 한 클라이언트가 데이터 사용중인 다른 클라이언트가 이 데이터를 수정했을때 데이터의 무결성이 깨져 버린다.


○ Multi thread 상황에서 Data동기화 문제의 소지(synchronized)

- Local 변수 (X)

- Instance 변수 (O) : 동시에 변경을 시도 할때

- Static 변수 (O)

- Attribute

◎ request scope (X)

◎ session scope 이론적으로는 가능(O), 실제로는 불가능(X)

◎ application scope (O)


○ Data 동기화 처리 개념

- 사용중인 데이터에 Lock을 건다.


구문

synchronized(this){


데이터 사용


} //데이터 사용 끝(Lock 해제)


◆ synchronized 사용전

- 동시에 두 클라이언트가 접속을 시도하면 5초후 둘다 같은 숫자를 부여 받는다.


◆ synchronized 사용후

- 동시에 두 클라이언트가 접속을 시도하면 조금이라도 먼저 시도한 클라이언트가 5초 후 앞 번호를 가져간다. (다른 숫자 부여)

  그리고 2번쨰 클라이언트는 총 10초의 sleep time을 갖는다.(앞 클라이언트의 작업이 끝날 동안 Lock이 걸리기 때문)

Posted by 김마농

리다이렉트(Redirect)방식

- 응답시 클라이언트에게 요청할 url을 알려주어 다시 요청하도록 하는 방식

- 요청과 응답이 한번 더 일어난다.

- Request Scope를 이용한 데이터(Attribute) 공유를 할 수 없다.

-HttpServletResponse 객체를 이용하여 처리




-구문

response.sendRedirect("url");

- 웹브라우저를 기준으로 해야 하기 때문에 절대경로를 쓰지 않는다.

 

<요청 리다이렉트 예제>

개요

 - 체크박스를 선택하면 정상적으로 화면이 출력된다.

 - 만약 체크박스를 선택하지 않았다면 error.jsp로 이동하여 에러화면이 출력된다.


Servlet

package : servlet.redirect

name : ErrorPronServlet

url :/error_pron


html

folder : /redirect/req.html

                 error.jsp


[ErrorPronServlet.java]


[req.html]


[error.jsp]


결과 화면

1. 체크를 선택했을 경우




2. 체크를 선택하지 않았을 경우



위 화면과 같이 출력되면 성공이다.


Posted by 김마농

Attribute(속성)

-Attribute(속성)이란?

Web Application 구성 컴포넌트들(Servlet,m JSP, Listener)이 공유하는 객체



-scope(적용영역)

- Attribute들을 공유하기 위한 공유 장소의 영역(저장장소)

- 공유 범위에 따라 3가지 영역이 있다.


1. requset scope : HttpServletRequest 이용

-요청 ~ 응답까지 공유


2. session scope : HttpSession 이용

-한명의 클라이언트(웹브라우저)가 로그인 ~ 로그아웃

3. application scope : ServletContext 이용

-Application 시작 ~ 종료시까지 공유


- 관련 메소드

Attribute는 key-value쌍으로 관리된다.

*setAttribute(String key, Object value) : 공유영역에 Attribute 저장 [Binding]


*getAttribute(String key) : Object value : 저장된 Attribute 조회 [lookup]


*removeAttribute(String key) : 저장된 Attribute 삭제


*getAttributeNames() : Enumeration : Attribute들에 연결된 name들 조회



<예제>

[SetAttributeServlet.java]


[GettAttributeServlet.java]


결과




Posted by 김마농

Event 모델

- Event : 컴포넌트에 가해진 동작, 변화

- Event Listenter

1. 컴포넌트에서 Event가 발생하는 것을 감시하는 Container.

2. 발생한 Event를 처리하는 동작을 가진 객체(Listener class)

- Event Handler : 발생한 Event를 처리하는 동작(메소드)

- Event Source : Event가 발생한 컴포넌트 

ex)버튼을 클릭하면 안녕이라고 출력한다.


Event Source : 버튼

Event : 클릭

Event Handler : 안녕을 출력하는 동작


ServletContextEvent

시작하고 종료될때 2번 생성된다.


<예제>

1. Listener를 다음과 같이 추가한다.


2. 패키지와 클래스 이름은 다음과 같이 작성해준다. 그리고 Next를 선택한다.


3. LiftCycle 체크박스를 체크를 해주고 Finish를 선택하여 완료한다. 


4. Listener코드는 다음과 같이 작성한다. 우리는 이 코드로 Listener가 언제언제 작동하는지 확인할 것이다.



5. 그리고 서버를 올리게 되면 contextInitialized가 작동하여 다음과 같이 출력된다.


6. 서버를 stop하면 contextDestroy가 작동하여 다음과 같이 출력한다.


Posted by 김마농

초기 파라미터

 - 서버단 컴포넌트(Servlet, JSP, Listener등)이 사용하는 문자열중 나중에 변경 될 수 있는 문자열을 web.xml에 등록해 놓고 컴포넌트에서는 호출하여 사용

 - 나중에 변경시 설정에서만 바꾸면 컴포넌트의 수정없이 변경 가능

 - 초기 파라미터 2가지

* 특정 서블릿 JSP만 사용할 수 있는 초기 파라미터

 - ServletConfig 사용

* Application내 모든 Servlet이 사용할 수 있는 초기 파라미터 - ServletContext 이용


 * javax.servlet.ServletConfig

 - Servlet 객체가 일하는데 필요한 정보를 가지고 있는 객체

 - WebContainer가 생성하여 Servlet()의 init() 호출시 중집

 - Servlet 객체당 하나씩 생성


*ServletConfig를 이용한 초기 파라미터 처리

1. Web.xml에 초기 파라미터 설정

<servlet>

<servlet-name>서블릿 객체 이름</servlet-name>

<servlet-class>서블릿 클래스 이름</servlet-class>

<init-param>

<param-name>초기파라미터 이름</param-name>

<param-value>초기 파라미터 값</param-value>

</init-param>

</servlet>

-초기 파라미터가 여러개인 경우 <init-param>을 반복

ex)

2. 코드상에서 조회

ServletConfig 객체.getInitParameter(String paramName) : String paramValue

주석처리한것처럼 해도 되지만 2줄을 써서 할바에야 한줄로 간단히 하는게 더 빠르다.


ex)예제 만들기

1. greeting_form.html을 다음과 같이 만들어주고 서버를 올려서 결과처럼 나오는지 확인한다.


2. 그리고 web.xml에서 초기파라미터를 설정해줘야 하니 다음과 같이 작성한다.


3. web.xml도 설정해줬으니 여기서 파라미터를 받는 GreetingServlet를 설정한다.



4. greeting_form.html에서 이름 텍스트 박스에서 이름을 작성한후 영어 전송을 했을떄 다음과 같이 나오면 성공적으로 한 것이다.


5. 이번에는 web.xml에서 서블릿을 한개 더 만들어서 서블릿을 2개 이용해보겠다. web.xml에 다음과 같이 더 추가한다.


6. 이제 greeting_form.html에서 밑에 있는 한글전송을 눌러봐서 다음과 같이 나오나 확인한다. 




*javax.servlet.ServletContext

-web Application이 자체 또는 일하는데 필요한 정보를 가지고 있는 객체

-web Component는 Web Application과 관련된 정보를 조회하거나 업무를 처리할 때 ServletContext type객체를 이용

-web Applictaion이 시작할 때 Web container에 의해 생성된다.

-Servlet의 getServletContext()를 통해 조회

-ServletContext ctx - getServletContext();

-web Application 당 하나가 생성됨


*ServletContext를 이용한 초기 파라미터 처리

1. web.xml에 초기 파라미터 설정

<web-app>

<context-param>

<param-name>초기파라미터이름</param-name>

<param-value>초기파라미터 값</param-value>

</context-param>


2. 코드상에서 조회

ServletContext객체.getInitParameter(String paramName) : String paramValue


ex)만들어 보기

1. web.xml에 파라미터를 설정한다.



2. ContextParamServlet 작성


3. 서버를 재가동하여 http://127.0.0.1:8088/myweb/ContextParamServlet 이 제대로 나오는지 확인한다.


○ javax.servlet.ServletConfig vs javax.servlet.ServletContext

확인한다ServletConfig는 서블릿당 하나니며, ServletContext는 웹 어플리케이션 당 하나이다. 

웹 어플리케이션은 오직 하나의 ServletContext으로 전체 웹 어플리케이션에서 정보를 공유한다. 그러나 웹 어플리케이션 안에 있는 서블릿은 자신만의 ServletConfig를 가진다. 컨테이너는 웹 어플리케이션이 배포되는 시점에 ServletContext를 생성하며, 서블릿이나 JSP(서블릿의 일종)에서 이용 가능하도록 한다. 


 - 동일 웹 어플리케이션에서 컨테스트 초기화 파라미터 이름과 서블릿 초기화 파라미터 이름이 같아도 상관없는 이유는 ServletContext와 ServletConfig는 서로 다른 객체며, 

   동일한 이름을 사용하더라도, 서로 다른 이름공간을 사용하기에 충돌이 일어나지 않는다.


Posted by 김마농

GetMessage와 PeekMessage

- GetMessage는 메세지 큐에서 메세지 정보(msg)를 가져오는 작업을 한다. 

  여기서 약간 특이한 작업을 하는데, 메세지가 있으면 TRUE, 없으면 FALSE가 아닌 비활성화(대기상태)가 된다. 한마디로 메세지가 

  올때까지 대기한다. 대기상태가 되면 프로그램을 메모리를 최소화하며 <데드타임>에 들어가게 된다.

 

- PeekMessage는 GetMessage와 비슷한 일을 처리하지만 메시지가 있으면 True를, 없다면 FALSE를 반환하는게 큰 차이점이다.


프레임 스킵

 - PC사양이 딸려서 계속 화면에 그리기가 어렵다면 그리는 것을 포기하여 렉걸린것처럼 보이게 하는걸 의미한다.


다이렉트는 가상의 공간(백버퍼)에 그리고 프론트버퍼로 출력한다. 이것을 더블 버퍼링이라 하며 이유는 장치와 장치사이 연산속도가 제일 느리기 때문이다.


다이렉트 객체 생성 -> 디아비스 생성 -> 그릴준비 완료(back 버퍼) ->BeginScene이 그려야 한다. ->EndScene-> 화면 출력 - >백어퍼 삭제 ->Loop돔


UpdateData()와 Render()는 서로 분리시켜야 한다.

 - UpdateData는 좌표계산을 하며, Render는 그려주는 역할을 한다. 이 둘을 따로 분리하면 프레임속도가 높아지며 게임속도가 빨라진다. 



Posted by 김마농

○ 카메라

 - 3차원 게임에서 카메라는 시점을 의미한다. 3D게임의 화면에 보이는 모든 것은 카메라를 통해서 보여지는 것이다.

    3자의 입장에서 바라보면 캐릭터의 눈 위치에 카메라가 위치하여 캐릭터의 움직임에 따라 카메라의 방향과 위치가 변하는 것이다.


○ 변환 파이프 라인

 - 변환파이프라인의 목적은 하나의 이미지를 만들고 게이머의 화면에 그것들을 보여주기 위한 것이다.

    파이프 라인은 기하적인 데이터를 하나의 물체나 장면으로 표현하는 역할을 하며, 그것들로부터 2차원의 이미지를 만들어낸다.



○ 모델 공간(Model Space)

 - 일반적으로 하나의 캐릭터를 표현할 때 모델공간이라 불리는 하나의 좌표계에서 정점의 위치를 저장한다.

 - 로컬 좌표계를 이야기한다.


○ 전역공간(World Space)

 - 3차원 공간상의 최종적인 원점의 좌표계

 - 게이머의 화면에 보여질 모든 물체들을 위한 절대적인 레퍼런스 역항을 수행

 - 게임의 오브젝트들은 월드 공간의 좌표를 가지고 있다.


☆ 월드 변환(World Transform)

- 박스와 실린더가 각각 존재한다.

- 따로 따로 모델링된 실린더와 박스는 각각의 좌표계를 갖는다. 이것이 로컬 좌표계이다.

  이것들은 그냥 3차원 공간상에 배치하게 되면 원점을 공유한다.

- 2개의 물체를 따로따로 출력하기 위해서는 물체가 사용하는 로컬 좌표계가 아닌 월드 좌표계를 도입해야 한다.

- 즉 '실린더의 로컬좌표계 -> 월드 좌표계"와 "박스의 로컬 좌표계 -> 월드 좌표계"라는 2개의 변환이 필요하다.

- 일반적으로 3차원 그래픽에서 변환을 행렬을 사용한다고 해으니 로컬 좌표계->월드 좌표계는 행렬 변환이라는 것을 알 수 있다.

- 이런식으로 로컬 좌표계를 월드 좌표계로 변환하는 행렬을 변환 행렬(Transform Matrix)이라 한다. 


○ 시점공간(Eye Space)

 - 카메라가 바라보는 공간을 시점공간이라고 한다.

 - 시점이 그 공간 좌표계의 원점이 된다.


○ 절단 공간(Clip Space)

 - 어떤 물체가 보여지는 위치에 있는지, 그렇지 않은지를 판단.

 - 시야 절두체를 통해서 이루어진다.

 - 절단 공간상의 시야 절두체를 표현한 축정렬된 육면체의 크기는 동차 좌표계에서 표현된 4번째 좌표와 관련있다.

 - 카메라가 바라보는 정육면체 안에 잘라서 넣는다.


○ 정규화된 장치 좌표계(Normalized Device Coorinates)

 - 절단 공간에서 추 정렬된 육면체의 크기인 W를 1로 놓으면 정규화된 장치 좌표계를 얻을 수 있다.

 - 정규화된 장치 좌표계를 기준으로 표현된(x,y,z) 좌표에서 z값을 0으로 놓아서 좌표(x,y)를 얻는다.

 - 3D에서 2D로 변환하는 과정을 Z버퍼라고도 하며 스테실버퍼(그림자)에도 쓰인다.


○ 윈도우 좌표계

 - 정규화된 장치 좌표계를 실제 모니터상의 x,y 좌표계로 변환해야 하는데 이를 뷰포트 변환이라고 하며 정규화된 장치 

          좌표계에 게이머가 설정한 뷰포트의 크기를 곱하여 실제 윈도우의 x,y좌표를 얻어 낸다.


☆ 시야 절두체

 -시야 절두체란 하나의 3차원 공간상에서 카메라에 의해 보일 수 있는 것들을 담는 범위

 - 피라미드 형태의 육면체로 구성되어 있다.

☆ 투영

 - 투영은 3차원 장면을 2차원 모니터 화면에 그리기 위해, 장면에 표현되는 캐릭터나 물체들의 각 정점을 화면에 그려지는 

    2차원 좌표를 결정하기 위해 사용한다.

○ 원근 투영

 - 가까운 물체는 크게, 먼 물체는 작게 그려진다. 대부분의 게임에서 사용되는 방법





○ 직교 투영

 - 원금감을 갖지 않는 투영 방법으로 화면에 어떤 물체가 그려질때 원근에 의한 왜곡이 발생하지 않는 방법

 - 캐드 같은 설계 분야에 적용되며, 유명한 디아블로2가 직교 투영 방법을 사용한다.

          


☆ 일인칭 시점 카메라

 - 카메라의 위치는 위치벡터로 표현한다.

 - 시선 방향은 카메라가 바라보는 방향을 나타내는 방향벡터이며 

 - 상향 벡터는 카메라의 위쪽 벡터이다.

○ 카메라 변환(Camera Transform)

- 카메라 변환이란 3차원 월드 좌표계를 카메라를 기준으로 한 카메라 좌표계로 변환하는 것을 의미한다.

- 월드 좌표계를 카메라를 기준점으로 한 좌표계로 변환하는 과정이 카메라 변환이다. 


☆ 3인칭 시점 카메라

 - 3인칭 시점 카메라는 제 3자의 입장에서 내려다보는 시점을 제공한다.

 - 카메라는 게임 내의 캐릭터의 움직임과 무관하게 게이머의 명령에 따라 이동한다.





Posted by 김마농

○ 개요

 - ID, 패스워드, 이름 입력하는 텍스트창을 구현한다. 

 - 성별을 선택할 수 있게 라디오버튼을 구현한다.

 - 생일에서 년도는 텍스트로 입력받고, 월과 일은 select로 구현한다. 

 - 관심있는 항목은 checkbox로 받으면서 여러개 선택가능하니 배열로 받아서 구현한다.

 - 자기소개는 textarea로 구현한다.

 - 가입버튼과 초기화 버튼을 구현한다.


1. LoginServlet를 생성한다.


2. login.html를 구현한다.


3. RegisterServlet은 다음과 같이 코딩한다.

사용자 관심항목에서 여러개를 선택하고 넘겨야 하니까 배열로 받은후 넘겨야 한다.



4. register.html은 다음과 같이 코딩한다.


5. web.xml은 다음과 같이 코딩해준다.

6. 다음과 같이 화면에 출력되어야 정상적으로 된 것이다.


7. 다음과 같이 항목에다가 적당한 값을 입력하고 회원가입을 하면 화면에 출력되어야 한다.


8. 다음과 같이 회원가입할때 입력한 값들이 정상적으로 출력되면

완성한것이다.


Posted by 김마농