달력

1

« 2025/1 »

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
드는 생각이 꼭.. 도촬 사진들 올려 놓은거 같은 생각이 마구 들었다.. ㅋㅋㅋ


사용자 삽입 이미지

'생활 > 잡담' 카테고리의 다른 글

오랜만의 주말 외출~  (0) 2007.11.27
PC 조립하다..  (0) 2007.11.08
구글 메일 확장 계획 ㅋㅋ  (0) 2007.10.31
아후~~  (0) 2007.10.04
드림걸즈 OST 가사  (0) 2007.08.10
:
Posted by 뽀기
2007. 10. 31. 14:51

구글 메일 확장 계획 ㅋㅋ 생활/잡담2007. 10. 31. 14:51

http://www.palgle.com/2007/10/05/exactly-3-giga-time-of-gmail-storage/
http://southstep.egloos.com/1650623


구글 사람들의 생각이 참 재밌다.
신기하기도 하고. 특이하기도 하고.

'생활 > 잡담' 카테고리의 다른 글

PC 조립하다..  (0) 2007.11.08
동호회 홈페이지 첫 페이지를 보는데.....  (0) 2007.10.31
아후~~  (0) 2007.10.04
드림걸즈 OST 가사  (0) 2007.08.10
기쁨  (1) 2007.08.06
:
Posted by 뽀기
2007. 10. 31. 11:37

[Network] OSI 7 Layer 그거/Tech2007. 10. 31. 11:37

두 시스템간의 복잡한 통신과정을 여러개의 프로토콜로 나누어 동시에 수행하도록 제안한 컴퓨터 통신 아키텍쳐이다. 프로토콜의 계층화는 상위 계층이 하위 계층의 서비스를 제공받는다는 원리에 근거하며, 계층별로 작업을 분산시킴은 물론, 각 계층이 독립적으로 구현될 수 있도록 해준다.

OSI Reference Model

Layer 7 Application
Layer 6 Presentation
Layer 5 Session
Layer 4 Transport
Layer 3 Network
Layer 2 Data Link
Layer 1 Physical
* OSI : Open System Interconnection

■ Physical Layer (물리 계층)
1과 0의 연속으로 이루어진 비트의 전송에 관여하며, 다음의 4가지 사항에 관한 규정을 다룬다.
□ 기계명세 (mechanical specification) : 통신 장비의 모양 및 치수를 정의
□ 전기적 특성 (electrical characteristic) : 비트 1은 -3V 이하의 전압을, 비트 0은 +3V 이상의 전압을 규정하는 것과 같은 전기적인 성질을 정의
□ 기능명세 (functional specification) : 접속 회로에 데이터, 제어, 타이밍, 접지 등의 의미를 부여
□ 절차명세 (procedural specification) : 기능명세에 근거하여 데이터 전송에 필요한 사건의 순서를 정의

X.21, RS-232C, RS-449/422-A/423-A 등이 물리계층 프로토콜의 예이다.

■ Data Link Layer
통신 경로상의 지점간 (link-to-link)의 오류없는 데이터 전송에 관한 프로토콜이다.
전송되는 비트의 열을 일정 크기 단위의 프레임으로 잘라 전송하고, 전송 도중 잡음으로 인한 오류 여부를 검사하며, 수신측 버퍼의 용량 및 양측의 속도 차이로 인한 데이터 손실이 발생하지 않도록 하는 흐름제어 등을 한다.

HDLC, CSMA/CD, ADCCP, LAP-B 등이 데이터 링크 계층 프로토콜의 예이다.

■ Network Layer
패킷이 송신측으로부터 수신측에 이르기까지의 경로를 설정해주는 기능과 너무 많은 패킷이 한쪽 노드에 집중되는 병목 현상을 방지하기 위한 밀집제어 (Congest control) 기능을 수행한다. 또한 이질적인 네트워크를 연결하는 데서 발생하는 프레임의 크기나 주소 지정방식이 다른 데서 발생하는 문제를 극복해 주는 기능을 수행한다.

IP, X.25 등이 네트워크 계층 프로토콜의 예이다.

■ Transport Layer
수신측에 전달되는 데이터에 오류가 없고 데이터의 순서가 수신측에 그대로 보존되도록 보장하는 연결 서비스 (Connection oriented service) 의 역할을 하는 종단간 (end-to-end) 서비스 계층이다. 한편, 패킷의 순서에 무관하게 수신되며, 에러 처리도 하지 않는 비연결 서비스 (Connectionless service) 와 다중 목적지에 메시지를 전송하는 서비스도 있다.

TCP 와 UDP 는 각각 연결지향 및 비연결지향 트랜스포트 프로토콜의 예이다.

■ Session Layer
두 응용프로그램 (Applications) 간의 연결설정, 이용 및 연결해제 등 대화를 유지하기 위한 구조를 제공한다. 또한 분실 데이터의 복원을 위한 동기화 지점 (sync poing) 을 두어 상위 계층의 오류로 인한 데이터 손실을 회복할 수 있도록 한다.

LU6.2는 잘 알려진 세션 계층 프로토콜이다.

■ Presentation Layer
전송되는 정보의 구문 (syntax) 및 의미 (semantics)에 관여하는 계층으로, 부호화 (encoding), 데이터 압축 (compression), 암호화 (cryptography) 등 3가지 주요 동작을 수행한다.

ANSI.1, XDR 등이 프로토콜의 예이다.

■ Application Layer
네트워크 이용자의 상위 레벨 영역으로, 화면배치, escape sequence 등을 정의하는 네트워크 가상 터미널 (network virtual terminal), 파일전송, 전자우편, 디렉토리 서비스 등 하나의 유용한 작업을 할 수 있도록 한다.

FTAM, TELNET, FTP, SMTP 등이 응용계층 프로토콜의 예이다.

OSI 모델에서의 데이터 전송

사용자 삽입 이미지


송신 측의 프로세스는 전송 데이터를 애플리케이션 계층에 보내고 애플리케이션 계층에서는 여기에 헤더 (null 이 될 수 있다)를 맨 앞에 첨가하여 다시 프레젠테이션 계층에 전달한다. 이때 프레젠테이션 계층에서는 애플리케이션 계층으로부터 보내진 데이터의 어떤 부분이 헤더이고 어떤 부분이 데이터 인지를 알 필요가 없다.

데이터가 물리계층에 도달할 때까지 이러한 과정이 되풀이 되며, 물리계층에서 실제로 수신장치에 데이터가 전송된다. 수신측에서는 전송 데이터가 맨 위의 수신 프로세스에 도달 될 때까지 여러가지 헤더 정보가 하나씩 벗겨져 나가는 과정을 거치게 된다.


다음의 예는 미국에 있는 친구에게 편지 보내는 일을 OSI 7 Layer를 적용시켜서 설명한 것이다. 미국에 있는 친구는 불행하게도 한국어를 모르며, 편지를 보내는 나 또한 영어를 모른다(이 예제는 대학교 시험에 나왔던 문제이기도 하다).

Sending

Receiving

 

Application Layer (Layer 7)

편지를 쓰는 것을 의미한다. 본인이 편지를 읽는다.

Presentation Layer (Layer 6)

한글로 작성한 편지를 미국 친구가 알아 볼 수 있게 영어로 변역하는 작업이다. 편지를 보내는 과정에서 이미 작업을 하였을 경우에는 이과정은 필요가 없다. 만약에 작업을 하지 않았을 경우에는 한국어로 된 편지를 영어로 번역하는 작업을 해야 한다.

Session Layer (Layer 5)

미국 친구의 집 주소를 적는 일이다. 우체부에 의해서 배달되는 작업을 의미한다.

Transport Layer (Layer 4)

우체국에 편지를 접수시키기 위한 절차, 즉 배 또는 비행기 등의 운송수단을 결정하는 등의 일이다. 각 우체국에서 주소에 따라 분류하는 작업을 의미한다.

Network Layer (Layer 3)

우체국에 있는 여러 편지들을 같은 목적지별로 분류하는 작업이다. 해당 주소지에 따라 각각의 편지를 각 우체국으로 분류하는 작업을 의미한다.

Data Link Layer (Layer 2)

해당되는 목적지와 운송 방법에 따라 분류하며, 해당되는 목적지와 직접 연결이 되지 않는 경우 중간 경 유지를 선택하여 분류하는 작업이다. 중간 경유지를 거친 운송물과 그렇지 않은 운송물을 분류한다.

Physical Layer (Layer 1)

실제적으로 편지가 배, 비행기, 자동차 등의 운송순단에 의하여 운송되는 것을 의미한다. 실제적으로 편지가 배, 비행기, 자동차 등의 운송순단에 의하여 운송되는 것을 의미한다.

사용자 삽입 이미지


OSI 모델 계층 구조

OSI 계층

정의

기능

Application Layer

사용자가 OSI 환경을 억세스 할 수 있는 능력을 제공

응용 프로세스간의 정보교환

Presentation Layer

데이터 표현에 차이가 있는 응용 프로세스들에게 연결 제공

정보의 형식설정과 코드변환

Session Layer

응용간 통신에 대한 제어구조를 제공

응용 프로세스간의 송신권 및 동기제어

Transport Layer

노드 대 노드 간의 신뢰성있고 투명한 데이터 전송 제공

송수신 시스템간의 논리적인 접속과 균일한 서비스 제공

Network Layer

상위 계층에게 시스템을 연결하는데 필요한 데이터 전송과 교환 기능 제공

정보교환과 중계기능

Data link Layer

물리적인 링크를 통하여 신뢰성 있는 정보를 전송하는 기능 제공

인접장치간의 정보전송

Physical Layer

구조화되지 않는 비트스트림을 물리적 매체를 통하여 전송

전송매체로의 전기적 신호전송


 




















출처 : 네이버
:
Posted by 뽀기
2007. 10. 26. 15:26

AJAX 사이트 그거/기타2007. 10. 26. 15:26

케이(lee256)님께서 추천      http://wwwm.meebo.com/index-ko.html
재미이써(vnfldp1)님께서 추천     http://www.flickr.com
세상살이(simsking)님께서 추천     http://www.dhtmlgoodies.com/index.html
bj1603님께서 추천       http://cgv.co.kr(그런데 여긴....ajax가 아니라 플레쉬로 되어있는거 같은데요..제가 잘못봤나?)
맥(mac00sd)님께서추천      http://www.tattertools.com/ko/
우리나라(bluedew1)님께서추천     http://ajax.asp.net
펜리르(baldr46)님께서추천      http://www.challenger.se/
승햐(seunghaa02)님께서 추천     http://www.panic.com/goods/(저희사이트에서 저도 처음봤었던...사이트네요..^^)
shsdol님께서 추천       http://www.modernmethod.com/sajax
huni1067님께서 추천       http://www.pageflakes.com
수보이(sidney77)님께서 추천     http://earth.google.com/(젤 유명한곳이죠..ㅋㅋ)
hackingstar님께서 추천      http://www.backbase.com/demos/explorer/#examples/fx-move.xml[55]
hpycom님께서 추천       http://www.asp.net(유명한 사이트죠....밑에 사이트랑 링크만 틀림)
devzzaang님께서 추천      http://ajax.asp.net
tigastyle님께서 추천       http://www.ohpy.com
연남남(yjheum)님께서 추천      http://jquery.com/demo/thickbox/
머리통(head1ton) 님께서 추천     http://extjs.com/
아서(dlwnsrjs6421) 님께서 추천     http://www.fxug.co.kr/live/index.html
wannapure 님께서 추천      http://kr.sun.com/developers/ajax/
러뱀씨(luvmc4u) 님께서 추천     http://www.gucci.com/
수연사랑(artes),사삭(ziniboy) 님께서 추천   http://www.wzd.com/
newport1179 님께서 추천      http://cafe.naver.com/ajaxdev.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=29(다른카페네요..ㅋㅋ 이쪽도 좋은글이 많네요...^^)
freehyun 님께서 추천       http://www.likejazz.com/29692.html
써니(pretty9967) 님께서 추천     http://www.challenger.se/
무지개(mindware) 님께서 추천     http://mochikit.com/
오비완(tow5532)  님께서 추천     http://javacan.madvirus.net/
독고릴라(angelos1127) 님께서 추천    http://www.netvibes.com/
장훈(whoney) 님께서 추천      http://meebo.com
학부모씨(ybnakira) 님께서 추천     http://www.cnn.com
애플(apple9575) 님께서 추천     http://dnshop.daum.net/
디지맥(ghochujang) 님께서 추천     http://www.watercafe.co.kr
홍세진(passion_25),뷁쉃(bumpkinr) 님께서 추천  http://www.ajaxian.org
앙마닷(zupper) 님께서 추천      http://www.hotscripts.com/
조조할인(updols) 님께서 추천     http://kr.sun.com/developers/ajax/
잠수부(csi_stone) 님께서 추천     http:www.goby.pe.kr
노력가(sevenwind) 님께서 추천     http://www.dhtmlgoodies.com
제제(monjeje) 님께서 추천      http://www.ajaxrain.com
데이지(minhyades) 님께서 추천     http://blog.naver.com/jinoxst/140021707807
떵려니(head1ton) 님께서 추천     http://Extjs.com

# FROM 네이버 카페(aspajax)

'그거 > 기타' 카테고리의 다른 글

HP 이벤트 진행중~~  (0) 2008.07.02
IDE & ATA & SCSI  (0) 2007.11.05
15 Exercises for Learning a new Programming Language  (0) 2007.07.24
FUD(Fear, Uncertainty, Doubt)  (0) 2007.05.31
당신의 블로그는 얼마짜리 입니까?  (0) 2007.05.03
:
Posted by 뽀기
2007. 10. 26. 11:30

JSP & Servlet 교육 Day 5th. 그거/Seminar2007. 10. 26. 11:30

장소 : 썬 교육센터
날짜 : 10.22 ~ 10.26
시간 : 09:30 ~ 17:30
내용 : Web Component Developement with Servlet and JSP Technologies


# Day 5

Session Bean 과 Entity Bean(BMP)을 이용해서 게시판 작성

DTO (Data Transfer Object)
  - BoardData.java
    Board Table의 각 column에 대응하는 변수에 대한 getter/setter 정의

Entity Bean(BMP)
  - Board.java
    실제 client(jsp)가 호출할 method들 정의
  - BoardBean.java
    Board Table의 한 row에 대한 CRUD 로직 정의
  - BoardHome.java
    Board 객체 생성을 위한 method 정의

Session Bean
  - BoardManager.java
    client(jsp)가 호출하여 사용할 BoardData 객체를 사용하는 method 정의
  - BoardManagerBean.java
    BoardData 객체를 사용하여 Board Table에 CURD 하는 로직 정의
  - BoardManagerHome.java
    BoardManager 객체 생성을 위한 method 정의

Client(JSP)
  - delete.jsp
    BoardManager.isWriter(int, String), BoardManager.deleteBoardData(int) 사용
  - deleteform.jsp
    삭제위한 비밀번호 입력
  - list.jsp
    BoardManager.getBoardDataList(int) 사용하여 BoardData 객체의 Collection 얻어와서 화면에 Display
  - read.jsp
    BoardManager.updateReadCount(int), BoardManager.getBoardData(int) 사용
  - update.jsp
    BoardManager.isWriter(int, String), BoardManager.updateBoardData(int) 사용
  - updateform.jsp
    BoardManager.getBoardData(int) 사용하여 화면에 정보 보여주고, 수정 정보 입력
  - write.jsp
    BoardManager.addBoardData(BoardData) 사용
  - writeform.html
    글 입력

  * DTO에 값을 설정하고, 해당 DTO를 Session Bean을 이용해서 넘기면
    Session Bean 에서는 DTO의 각 값들을 이용해서 Entity Bean 을 호출한다.

'그거 > Seminar' 카테고리의 다른 글

제 10회 한국 자바 개발자 컨퍼런스  (2) 2009.02.18
제9회 한국 Java 개발자 컨퍼런스  (0) 2008.01.22
JSP & Servlet 교육 Day 4th.  (0) 2007.10.25
JSP & Servlet 교육 Day 3rd.  (0) 2007.10.24
JSP & Servlet 교육 Day 2nd.  (0) 2007.10.23
:
Posted by 뽀기
2007. 10. 25. 09:55

JSP & Servlet 교육 Day 4th. 그거/Seminar2007. 10. 25. 09:55


장소 : 썬 교육센터
날짜 : 10.22 ~ 10.26
시간 : 09:30 ~ 17:30
내용 : Web Component Developement with Servlet and JSP Technologies

# Day 4

# Web Application 에서 EJB 사용하기

<%@ page contentType="text/html; charset=euc-kr" %>
<%@ page import="javax.rmi.*" %>
<%@ page import="javax.naming.*" %>
<%@ page import="javax.transaction.*" %>
<%@ page import="kr.co.ejb.examples.*" %>

<%
 Context ctx = null;

 try {
  ctx = new InitialContext();
  Object h = ctx.lookup("HelloWorldBean");
  HelloWorldHome home = (HelloWorldHome)PortableRemoteObject.narrow(h, HelloWorldHome.class);
  HelloWorld helloWorld = home.create();

  out.println(helloWorld.helloWorld());
 } catch(Exception e) {
  out.println(e);
 }
%>


1. 위 내용의 jsp 파일을 생성하여 web application 디렉토리 위치(C:\bea\user_projects\domains\mydomain\applications\webtest)에 복사한다.
2. jsp 페이지에서 helloworld.jar 내용을 import하여 사용하기 위해서
   helloworld.jar 파일을 C:\bea\user_projects\domains\mydomain\applications\webtest\WEB-INF\lib 에 복사한다.
   (classpath 잡아주기 귀찮으니까 WebLogic 서버가 시작하면서 알아서 jar 파일 물고 올라오도록 설정한 것이다.)


## 엔티티 빈
  Home Interface
    javax.ejb.EJBHome 또는 javax.ejb.EJBLocalHome 를 상속받는다.
    빈 클래스를 생성, 검색, 삭제할 수 있는 메소드를 선언한다.

    public interface XXX extends EJBHome {
      // insert 담당
      public XXX create(xx) throws CreateException, RemoteException;  
      // PK를 이용하여 table에서 한 row 가져옴
      public XXX findByPrimaryKey(xx) throws FinderException, RemoteException;
    }


  Remote Interface
    javax.ejb.EJBObject 또는 javax.ejb.EJBLocalObject를 상속받는다.
    클라이언트가 호출할 비즈니스 메소드를 정의하고 있다.

    public interface XXX extends EJBObject {
      // Table의 특정 column에 대해 접근할 수 있도록 하는 getter/setter
      public XXX getXX() throws RemoteException;
      public void setXX(xx) throws RemoteException;
    }


  Bean class
    javax.ejb.SessionBean 인터페이스를 구현한다.
    원격 인터페이스에서 선언한 비즈니스 메소드를 구현해야 한다.
    (EJB 클래스는 원격 인터페이스를 구현하지 않는다.)

    public abstract class XXX implements EntityBean {
      private EntityContext context;
      // Home Interface에 있는 getter/setter method 추상화 선언
      public abstract XXX getXX() throws RemoteException;
      public abstract void setXX(xx) throws RemoteException;

      // Table에 한 row를 insert 하는 역할을 담당
      public String ejbCreate(xx) throws CreateException {
        setXX(xx);
      }

      // CMP 에서는 method의 몸체 없이 정의, BMP 에서는 각 method 몸체 구현
      // ejbCreate, ejbPostCreate -> insert 구현
      // ejbRemove -> delete 구현
      // ejbStore -> update 구현
      // ejbLoad -> where 조건을 이용한 특정 한 row select 구현
      // ejbFindByPrimaryKey -> PK를 이용한 특정 한 row select 구현
      public void ejbPostCreate(XX) throws CreateException {}
      public void ejbStore() {}
      public void ejbLoad() {}
      public void ejbRemove() {}

      public void ejbActivate() {}
      public void ejbPassivate() {}
      public void setEntityContext(EntityContext ctx) { context = ctx; }
      public void unsetEntityContext() { context = null; }
    }


  CMP 개발 (Container Managed Persistence)
    Source에 SQL 이 보이지 않는다.
    create(), findByPrimaryKey() method 등 Spec에 정의된 사항을 이용하여 DB 작업을 한다.
    WebLogic Builder에서의 설정
      1. Persistence 설정
      2. CMP fields 각각에 대해서 type 설정
      ( 3. Resources -> Resource References에 Add를 해줘야 한다는데, 안해도 잘된다.
           이유....는 나도 모른다 -_-;
           물어보니... 소스에 해당 resource에 대해서 lookup이 박혀있음 안해도 된단다.
           그래도 모르겠다 ㅜㅜ.
      )
      3. 저장하여 descriptor 파일 생성
      4. jar cvf xxxx.jar * 해서 class 파일과 META-INF 디렉토리를 jar로 압축

  BMP 개발 (Bean Managed persistence)
    Source(Bean)에 SQL을 직접 사용한다.
    WebLogic Builder에서의 설정
      1. Persistence 설정
      2. CMP fields 각각에 대해서 type 설정
      ( 3. Resources -> Resource References에 Add를 해줘야 한다는데, 안해도 잘된다.
        이유....는 나도 모른다 -_-; )
      3. 저장하여 descriptor 파일 생성
      4. jar cvf xxxx.jar * 해서 class 파일과 META-INF 디렉토리를 jar로 압축


  * EntityBean 에는 Persistence Data 그 자체에 대해서만 구현
    SessionBean 에는 EntityBean에서의 Data에대한 가공 및
    각종 Business Logic 을 구현
  * EJB 는 MVC 패턴에서 Model 이다.
    Model 은 Data와 Business Logic 역할로 구성되어 있다.

## 메세지 드리븐 빈
    Source(Bean)에 SQL을 직접 사용한다.
    WebLogic Builder에서의 설정
      1. Persistence 설정
      2. CMP fields 각각에 대해서 type 설정
      ( 3. Resources -> Resource References에 Add를 해줘야 한다는데, 안해도 잘된다.
        이유....는 나도 모른다 -_-; )
      3. MessageDrivenBean에 대해서 Destination Type & JNDI Name을 설정한다.
      4. MessageDrivenBean에 대해서 Resource -> EJB Refs 설정
      5. 저장하여 descriptor 파일 생성
      6. jar cvf xxxx.jar * 해서 class 파일과 META-INF 디렉토리를 jar로 압축
   
   


EJB 복잡하다.. 헷갈린다..  해야 될 것들이 너무 많다..
SessionBean, EntityBean, MessageDrivenBean
대체 이런건 왜 만든거여. -_-; ㅜㅜ
어흑. 먼 Spec이 이모양이야!!!!!!!!!!!!!!!!!
메세지 드리븐 빈은 더 복잡하네 -_-;

'그거 > Seminar' 카테고리의 다른 글

제9회 한국 Java 개발자 컨퍼런스  (0) 2008.01.22
JSP & Servlet 교육 Day 5th.  (0) 2007.10.26
JSP & Servlet 교육 Day 3rd.  (0) 2007.10.24
JSP & Servlet 교육 Day 2nd.  (0) 2007.10.23
JSP & Servlet 교육 Day 1st.  (0) 2007.10.22
:
Posted by 뽀기
2007. 10. 24. 14:22

JSP & Servlet 교육 Day 3rd. 그거/Seminar2007. 10. 24. 14:22


장소 : 썬 교육센터
날짜 : 10.22 ~ 10.26
시간 : 09:30 ~ 17:30
내용 : Web Component Developement with Servlet and JSP Technologies

# Day 3


## EJB
  SessionBean -+- Stateful, Stateless
               |
  EntityBean  -+- CMP(Container Managed Persistence) -+- CMR
               |                                      |
               |                                      +- EJB-QL
               +- BMP(Bean Managed Persistence)
  Message Driven Bean


## JMS (Java Message Service)
  : 비동기 메시지 처리
  : Mail, Log 기록에서 유용
  : P2P(Peer-to-Peer)
    message 생산자 여러개, message 소비자 한개
  : pub/sub (publisher/subscriber)
    message 생산자 한개, message 소비자 여러개

   * 동기 메시지 처리
     메세지 생산자가 메시지 소비자의 응답을 기다린다.
     ex) HTTP 웹 프로그램
   * 비동기 메시지 처리
     메시지 생산자가 메시지 소비자의 응답을 기다리지 않는다.
     ex) AJAX

운영도구
  : WebLogic 콘솔 관리자

Connection Factory
  : P2P => javax.jms.QueueConnectionFactory
  : pub/sub => javax.jms.TopicConnectionFactory

목적지
  메세지를 처리하기 위한 자원
  : P2P -> Queue
  : pub/sub -> Topic

Connection
  : P2P -> QueueConnection
  : pub/sub -> TopicConnection

Session(통신 라인)
  메시지를 생성하고 소비하기 위한 단일 스레드 환경
  : P2P -> QueueSession
  : pub/sub -> TopicSession

메시지 생산자
  : P2P -> QueueSender.send()
  : pub/sub -> TopicPublisher.publish()

메시지 소비자
  : P2P -> QueueReceiver.receive()
  : pub/sub -> TopicSubscriber.setMessageListener()

메시지
  Header, Porperty, Body
  TextMessage
  MapMessage
  ByteMessage
  StreamMessage
  ObjectMessage
  Message


## JMS 서비스 설정
 
  Store 설정
    WebLogic 콘솔 -> Services -> JMS -> Stores -> create new File Store
    디렉토리명 : myjmsfilestore
    위치       : C:\bea\user_projects\domains\mydomain\myjmsfilestore
    store name : MyJMSFileStore
  Server 설정
    WebLogic 콘솔 -> Services -> JMS -> Servers -> create new server
    Persistence Store : 위에서 생성한 Store 명 지정
    server name : MyJMSServer
  Server에 목적지(Destination - queue/topic) 설정
    WebLogic 콘솔 -> Services -> JMS -> Servers -> 위에서 생성한 Server -> Destination -> configure new JMS Queue
    queue name : MyJMSQueue
    WebLogic 콘솔 -> Services -> JMS -> Servers -> 위에서 생성한 Server -> Destination -> configure new JMS Topic
    topic name : MyJMSTopic


    * JMS Server -> Destination (queue/topic) -> File Store -> myjmsfilestore(C:\bea\user_projects\domains\mydomain\myjmsfilestore)
    * 생산자 --> JMS Server
                    |
                    +---> Destination ( queue / topic )
                             |
                             +---> File Store
                                     |
                                     +---> myjmsfilestore
                                              |
                                              +---> 소비자


## Queue에 메세지 보내기

import java.io.*;
import javax.jms.*;
import javax.naming.*;
import java.util.Properties;

public class MessageQueueSender {
 public static void main(String[] args) {
  if( args.length != 1 ) {
   System.out.println("Usage : java MessageQueueSender [Message]");
   System.exit(0);
  }

  try {
    // HTTP protocol을 이용하여 WegLogic에 접근하는 것이 아니기 때문에
    // java application에서 WegLogic을 사용하기 위해 설정하는 부분

   Properties p = new Properties();
   p.put(Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.WLInitialContextFactory");
   p.put(Context.PROVIDER_URL, "t3://localhost:7001");

   Context ctx = new InitialContext(p);

   QueueConnectionFactory factory = (QueueConnectionFactory)ctx.lookup("weblogic.jms.ConnectionFactory");

   Queue queue = (Queue)ctx.lookup("jmsqueue");
   QueueConnection con = factory.createQueueConnection();
   QueueSession session = con.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
   QueueSender qsender = session.createSender(queue);

   TextMessage message = session.createTextMessage();
   message.setText(args[0]);
   qsender.send(message);
   qsender.send(session.createMessage());

   con.close();
  } catch(Exception e) {
   e.printStackTrace();
  }
 }
}


# Queue에서 메세지 읽어오기

import java.io.*;
import javax.jms.*;
import javax.naming.*;
import java.util.Properties;

public class MessageQueueReceiver {
 public static void main(String[] args) {
   Queue queue = null;
   QueueConnection con = null;
   QueueSession session = null;
   QueueReceiver qreceiver = null;
   
  try {
   Properties p = new Properties();
   p.put(Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.WLInitialContextFactory");
   p.put(Context.PROVIDER_URL, "t3://localhost:7001");

   Context ctx = new InitialContext(p);

   QueueConnectionFactory factory = (QueueConnectionFactory)ctx.lookup("weblogic.jms.ConnectionFactory");

   queue = (Queue)ctx.lookup("jmsqueue");
   con = factory.createQueueConnection();
   session = con.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
   qreceiver = session.createReceiver(queue);
   
   con.start();
   
   while(true) {
    Message msg = qreceiver.receive(1);
   
    if( msg != null ) {
     if( msg instanceof TextMessage ) {
      TextMessage tmpMsg = (TextMessage)msg;
      System.out.println("읽어온 메시지 : " + tmpMsg.getText());

      if( "exit".equals(tmpMsg.getText()) ) {
       break;
      }
     }
    } else {
     Thread.sleep(500);
    }
   }
  } catch(Exception e) {
   e.printStackTrace();
  } finally {
   try {
    con.close();
   } catch(Exception e) {
   }
  }
 }
}


# Topic 에 발행하기

import java.io.*;
import javax.jms.*;
import javax.naming.*;
import java.util.Properties;

public class MessageTopicPublisher {
 public static void main(String[] args) {
  BufferedReader br = null;

  try {
   Properties p = new Properties();
   p.put(Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.WLInitialContextFactory");
   p.put(Context.PROVIDER_URL, "t3://localhost:7001");

   Context ctx = new InitialContext(p);
   TopicConnectionFactory factory = (TopicConnectionFactory)ctx.lookup("weblogic.jms.ConnectionFactory");

   Topic topic = (Topic)ctx.lookup("jmstopic");
   TopicConnection con = factory.createTopicConnection();
   TopicSession session = con.createTopicSession(false, Session.AUTO_ACKNOWLEDGE);
   TopicPublisher publisher = session.createPublisher(topic);

   String line = null;
   br = new BufferedReader(new InputStreamReader(System.in));

   while( (line = br.readLine()) != null ) {
    TextMessage message = session.createTextMessage();
    message.setText(line);
    publisher.publish(message);

    if( "exit".equals(line) ) {
     break;
    }

    message = null;
   }

   con.close();

  } catch(Exception e) {
   e.printStackTrace();
  }
 }
}



# Topic 에서 구독하기

import java.io.*;
import javax.jms.*;
import javax.naming.*;
import java.util.Properties;

public class MessageTopicSubscriber {
 public static void main(String[] args) {
  BufferedReader br = null;

  try {
   Properties p = new Properties();
   p.put(Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.WLInitialContextFactory");
   p.put(Context.PROVIDER_URL, "t3://localhost:7001");

   Context ctx = new InitialContext(p);
   TopicConnectionFactory factory = (TopicConnectionFactory)ctx.lookup("weblogic.jms.ConnectionFactory");

   Topic topic = (Topic)ctx.lookup("jmstopic");
   TopicConnection con = factory.createTopicConnection();
   TopicSession session = con.createTopicSession(false, Session.AUTO_ACKNOWLEDGE);
   TopicSubscriber subscriber = session.createSubscriber(topic);
   subscriber.setMessageListener(new MessageListener() {
    public void onMessage(Message message) {
     try {
      if( message instanceof TextMessage) {
       TextMessage m = (TextMessage)message;
       System.out.println("구독 내용 > " + m.getText());
      }
     } catch(Exception e) {
      e.printStackTrace();
     }
    }

   });

   con.start();
   while(true) {
    char c = (char)System.in.read();
    if( c == 'q') break;
   }
   con.close();

  } catch(Exception e) {
   e.printStackTrace();
  }
 }
}


 # 세션 빈의 구성과 용도

  원격 인터페이스
    javax.ejb.EJBObject 또는 javax.ejb.EJBLocalObject를 상속받는다.
    클라이언트가 호출할 비즈니스 메소드를 정의하고 있다.

  홈 인터페이스
    javax.ejb.EJBHome 또는 javax.ejb.EJBLocalHome 를 상속받는다.
    빈 클래스를 생성, 검색, 삭제할 수 있는 메소드를 선언한다.

  빈 클래스
    javax.ejb.SessionBean 인터페이스를 구현한다.
    원격 인터페이스에서 선언한 비즈니스 메소드를 구현해야 한다.
    (EJB 클래스는 원격 인터페이스를 구현하지 않는다.)



# 세션 빈 테스트

package kr.co.ejb.examples;

/**
 * Remote Interface
 *
 * Client가 호출할 원격 인터페이스
 * Client가 호출할 메소드만 정의함
 *
 * @author Lucky
 */

import java.rmi.RemoteException;
import javax.ejb.EJBObject;

public interface HelloWorld extends EJBObject {
 public String helloWorld() throws RemoteException;
 public String hello(String param) throws RemoteException;
 public String getTime() throws RemoteException;
}



 

package kr.co.ejb.examples;

/**
 * Bean Class
 */

import javax.ejb.SessionBean;
import javax.ejb.SessionContext;

public class HelloWorldBean implements SessionBean {
 private SessionContext ctx;

 public void setSessionContext(SessionContext c) {
  ctx = c;
 }

 public String helloWorld() {
  return "Hello World";
 }

 public String hello(String param) {
  return "Hello " + param;
 }

 public String getTime() {
  return (new java.util.Date().toString());
 }

 public void ejbCreate() {}
 public void ejbRemove() {}
 public void ejbActivate() {}
 public void ejbPassivate() {}
}



 

package kr.co.ejb.examples;

/**
 * Home Interface
 *
 * Client가 EJB를 생성시킬 때 사용하는 메소드 정의
 *
 *
 * @author Lucky
 */


import java.rmi.RemoteException;
import javax.ejb.CreateException;
import javax.ejb.EJBHome;

public interface HelloWorldHome extends EJBHome {
 public HelloWorld create() throws CreateException, RemoteException;
}


# 위 java 파일들을 compile 한 후에 WebLogic Builder를 이용해서 descriptor file 작성
# package 가 시작하는 폴더에서 META-INF 폴더와 같이 jar 생성
   c:\> cd c:\java\classes\helloworld
   c:\java\classes\helloworld> dir
   kr     META-INF
   c:\java\classes\helloworld> jar cvf helloworld.jar *
   c:\java\classes\helloworld> dir
   kr     META-INF     helloworld.jar
# WebLogic 관리 콘솔에서 EJB 로 배포함
   mydomain -> Deployments -> EJB Modules -> Deploy a new EJB Modules
:
Posted by 뽀기
2007. 10. 24. 11:13

참, 자바란 것이 어렵다 ㅜㅜ 그거/Java2007. 10. 24. 11:13

class Test {
 public static void swap(int x, int y) {
  int temp;
  temp = y;
  y = x;
  x = temp;
 }

 public static void swap(Number n) {
  int temp;
  temp = n.x;
  n.x = n.y;
  n.y = temp;
 }

 public static void objRef(Number n) {
  n = null;
 }

 public static void main(String[] args) {
  int a = 10;
  int b = 20;

  System.out.println(a + ", " + b);
  swap(a, b);
  System.out.println(a + ", " + b);

  String str1 = "1234";
  String str2 = "1234";
  Integer int3 = new Integer(1234);
  String str4 = new String("1234");

  System.out.println(str1 == str2);
  System.out.println(str1.equals(int3));
  System.out.println(str1 == str4);
  System.out.println(str1.equals(str4));

  Number n = new Number();
  n.x = 10;
  n.y = 20;

  System.out.println(n.x + ", " + n.y);
  swap(n);
  System.out.println(n.x + ", " + n.y);
  objRef(n);
  System.out.println(n.x + ", " + n.y);

 }
}

class Number {
 int x;
 int y;
}



위 결과가 어찌 될 것인가......


10, 20
10, 20
true
false     <--- equals(Object) method라서 "1234".equals(new Integer(1234)) 하면
               new Integer(1234)가 toString() 되서 true가 될 줄 알았는데 false 다.
false
true
10, 20
20, 10
20, 10    <--- 분며이 objRef(Number n)에서 n = null; 을 했는데 왜 값이 찍히지?
               NullPointerException 나야 되는거 아녀? -_-;


이렇단다.
아.. Java를 몇년을 해도 저게 헷갈리는 이유가 대체 무엇이란 말인가.
아.. 돌머리.. ㅡ,.ㅡ;

'그거 > Java' 카테고리의 다른 글

Java Heapsize 관련 참조  (0) 2008.10.21
eclipse TPTP update  (0) 2008.10.08
WebLogic 8.1 SP6 Download URL  (0) 2007.09.17
[JavaQuiz] 3n+1  (0) 2007.09.12
[JavaQuiz] 셰익스피어-원숭이 문제  (0) 2007.09.12
:
Posted by 뽀기
2007. 10. 23. 10:24

JSP & Servlet 교육 Day 2nd. 그거/Seminar2007. 10. 23. 10:24


장소 : 썬 교육센터
날짜 : 10.22 ~ 10.26
시간 : 09:30 ~ 17:30
내용 : Web Component Developement with Servlet and JSP Technologies

# Day 2

Developing View Component

## Use Case
         Actor                           Use Case
   ---------------------------------------------------------
   Player                         List all avaliable leagues
                                  Register for a league

   League Administrator           Add a new league
     

## View 설계 및 구현 (List all avaliable leagues : Player)
   index.html
   list_league.view

   * html 파일은 더 이상 수정하지 않을 페이지
   * view 파일은 개발자가 계속 수정하면서 사용할 페이지

   League Bean 생성
   ListLeagueServlet 생성

   * eclipse에 tomcat을 연동한 후에
     Dynamic Web Project를 생성하여 위 작업을 할 경우
     eclipse에서 src, build. webContent 디렉토리가 생성된다.
     src 에서 생성된 java 파일의 class 파일들이 build/classes 에 생성이 되는데
     흔히 알고 있는 WEB-INF\classes 밑에 servlet의 class 파일들이 없어도 servlet이 잘된다.
   * tomcat에서 web.xml에 있는 invoker servlet에 대해서 주석을 해제시키지 않아도
     servlet이 잘 된다.(이건 왜 그런지 참 신기허다. 알고 있기로는 주석을 빼줘야 하는데..)
   * tomcat에 context를 추가할 때 $TOMCAT_HOME/conf/Catalina/localhostxml 파일을 추가해줘야
     context가 추가되는 걸로 알고 있었는데, $TOMCAT_HOME/webapps/ 밑에는 그냥 디렉토리 만들고
     WEB-INF, WEB-INF/classes, WEB-INF/web.xml 들만 추가해주면 context가 추가된다.


## 웹로직 설치 & 환경 설정

웹로직 설치
  server812_win32.exe

WebLogic 설정
  시작->프로그램->Bea weblogic platform 8.1 ->
Configuration Wizard
  작업 도메인을 mydomain 으로 한다.

환경설정
  user_projects\mydomain\startWebLogic.cmd 수정
    set CLASSPATH=.;%WEBLOGIC_CLASSPATH%.....

  user_project\mydomain\setEnv.cmd 수정
    set CLASSPATH=.;%WEBLOGIC_CLASSPATH......

  path에 수정
    C:\bea\user_projects\domains\mydomain
추가


## 서블릿과 JSP 운용

  디렉토리 구조
    webtest -+--- WEB-INF ------------- classes  (java class file : 서블릿, DTO)
             |         |
             |         +--------------- lib      (class library   : .jar 파일)
             |         |
             |         +--------------- src      (java sourc file : .java 파일)
             |         |
             |         +--------------- web.xml, weblogic.xml
             |
             +---- html 파일, jsp 파일
    required -> WEB-INF, web.xml, weblogic.xml


## Packaging Applications

  File Contents                                   Type of File
  --------------------                            -------------------
  EJB Component JAR                              
  Helper Classes JAR File          ----->         EAR file ( .ear )
  WAR File
  RAR File

  Bean Implementation Class
  Helper Classes                   ----->         EJB Component JAR file ( .jar )
  Interfaces
  Deployment Descriptor

  HTML
  JSP
  Servlets                         ----->         Web Component or Web Archive ( .war )
  Helper Classes
  Deployment Descriptor


## 웹로직에 Web Application 배포

  C:\bea\user_projects\domains\mydomain\applications

  폴더 밑에 작업한 디렉토리(webtest)를 복사하거나 위 경로에 webtest 디렉토리를 만들고 작업을 한다.

  WebLogic Server Console에서 확인한다.

  mydomain -> Deployments -> Web Application Modules

  위 메뉴를 따라가서 보면 _appsdir_webtest_dir 라는 이름으로 webtest가 Web Application이 Deploy 됐음을 확인할 수 있다.

  http://localhost:7001/webtest/index.html 을 브라우저에서 실행해서 제대로 보이는지 확인한다.

  C:\bea\user_projects\domains\mydomain\config.xml 파일에 아래 내용이 추가됐음을 확인할 수 있다.
      <Application Name="_appsdir_webtest_dir"
        Path="C:\bea\user_projects\domains\mydomain\applications"
        StagingMode="nostage" TwoPhase="true">
        <WebAppComponent Name="webtest" Targets="myserver" URI="webtest"/>
      </Application>


weblogic.xml 를 아래처럼 수정
<weblogic-web-app>
 <context-root>/</context-root>
</weblogic-web-app>


위와 같이 하면 http://localhost:7001/webtest/index.html 이렇게 하지 않고
http://localhost:7001/index.html 이렇게 호출하여 사용할 수 있다.

HelloWorldServlet.java, CounterServlet.java 파일을 생성하고
WEB-INF\classes 에 위 java 파일들을 컴파일 하여 class 파일을 위치시킨 후에
web.xml 파일에 아래 내용을 추가한다.

 <servlet>
  <servlet-name>HelloWorld</servlet-name>
  <servlet-class>examples.HelloWorldServlet</servlet-class>
 </servlet>

 <servlet>
  <servlet-name>Counter</servlet-name>
  <servlet-class>examples.CounterServlet</servlet-class>
 </servlet>

 <servlet-mapping>
  <servlet-name>HelloWorld</servlet-name>
  <url-pattern>/hello</url-pattern>
 </servlet-mapping>

 <servlet-mapping>
  <servlet-name>Counter</servlet-name>
  <url-pattern>/counter</url-pattern>
 </servlet-mapping>



  * java 파일을 컴파일 할 경우 컴파일을 실행할 도스창(cmd)에서
   C:\bea\user_projects\domains\mydomain
밑에 있는 setEnv.cmd 파일을 실행하여
    컴파일에 필요한 classpath 등에 대해서 자동으로 설정하도록 한다.

추가한 후에 webtest application을 재배포한 후에 브라우저에서
http://localhost:7001/hello, http://localhost:7001/counter 를 호출하여 페이지를 확인한다.

:
Posted by 뽀기
2007. 10. 22. 12:27

JSP & Servlet 교육 Day 1st. 그거/Seminar2007. 10. 22. 12:27


장소 : 썬 교육센터
날짜 : 10.22 ~ 10.26
시간 : 09:30 ~ 17:30
내용 : Web Component Developement with Servlet and JSP Technologies


# Day 1

기본 환경 설정 및 설정 환경 테스트


프로그램 설치 및 설정 >
  JDK 1.5.0_12 설치
  PATH 설정
  CLASSPATH 설정
  Tomcat 5.5 설치
  Eclipse 3.2 설치
  Eclipse Project 만들기
  Eclipse + Tomcat 연동 (plug-in 복사 :
http://www.eclipsetotale.com/tomcatPlugin.html)
  Eclipse + Oracle 연동 (eclipse->window->show view->Data Explorer)

주의 >

  Kill Apache Server Process
  Oracle HttpService 중지(속성->수동 으로 변경)
  Tomcat bin (start server)

테스트 >
  HTML 페이지
  JSP 페이지
  Servlet 페이지

Introduction Web Application Technologies

## MVC 패턴

모델
  -> 비즈니스 데이터와 그 데이터를 다루는 연산의 집합
  -> 자바 객체와 데이터베이스 간의 매핑을 통해 자바 객체에 접근하듯이 데이터베이스에 접근할 수 있도록 하는 프레임워크 필요.
    : ejbStore(), ejbLoad()
  -> 모델의 구현
    : 어떤 방식으로 접근할 것인가
    : 어느 정도 규모의 애플리케이션인가?
    : 개발자들의 기술 수준이 어느 정도인가?


  -> 디자이너의 역할이 더 큰 영역
  -> 비지니스 로직과 프레젠테이션 로직의 분리
  -> JSP

컨트롤러
  -> 흐름을 관리하는 역할
  -> 모델과 뷰 간의 조정 역할

MVC 모델 1, 모델 2
 => 사용자의 요청을 받아 흐름을 제어하는 일을 누가 하는가?

모델 1 : JSP
모델 2 : Servlet

## 프레임워크

 -> 사전적 의미 : 무언가를 이루는 뼈대나 기반 구조
 -> Java에서의 의미
   : 소프트웨어의 특정 문제 영역을 해결하기 위한 뼈대를 이루는 클래스와 인터페이스의 집합
 -> 프레임워크는 내가 만든 프로그램을 끼워 넣는 것이고, 유틸리티는 필요한 프로그램을 갖다 쓰는 것이다.
 -> 프레임워크는 extends, 유틸리티는 import
 -> 디자인 패턴의 집합이다.
 -> 어떻게 하면 이전에 만들어 놓은 코드를 다시 사용할 수 있을까?
   : 얼마나 재사용성이 높은 프로그램을 만드는가?
   : 재사용에 적합한 구조로 잘 설계 되었는가?

## 수준별 재사용 방식


 - Copy & Paste 방식
  -> 복사한 소스에서 버그가 발견되거나, 기능을 추가해야 한다면,
     모든 소스를 일일이 찾아서 수정,
     복사한 소스의 위치와 횟수를 기억해야 한다.
  -> 유지보수가 매우 곤란해진다.
 - 함수 재사용
  -> 코드의 양을 줄일 수 있다.
  -> 공유되고 있는 소스에 버그가 있다면 한 곳에서 고치면 된다.
 - 클래스 상속과 재정의를 통한 재사용
  -> 객체의 상호 작용 중심의 사고로 개발자의 사고방식을 전환
  -> 상속과 인터페이스 구현
  -> 다형성
- 디자인 패턴, 프레임 워크
  -> 잘못된 클래스의 정의 시 문제 발생
    : 디자인 패턴과 프레임워크 적용
  -> 디자인 패턴
    : 개발자들이 오랫동안 고민해서 얻은 설계 노하우를 쉽게 자신의 것으로 재사용 할 수 있다.
    : 하나의 상황에 초점을 맞춘 것.


## 웹

Java
  -> 정적 + 동적
     HTML + <% %>
            Servlet
            JavaBeans
            EJB
.NET
  -> 정적(ASP.NET) + 동적(C#.NET, VB.NET)

Java Web Application
  -> HTML (정적)에 프로그램 기술을 접목시킴
  -> CGI (Common Gateway Interface) 기술
    : 사용자의 요청에 매번 새로운 프로세스가 생성
    : 어느 정도의 한계를 벗어난 동시 접속자가 발생하면 서버 전체가 다운되는 경우가 많다.
    : 다른 프로세스와의 정보 공유가 쉽지 않다.
  -> 1997년 서블릿의 소개

서블릿
  -> 서버 측 프로그램
  -> 서블릿 라이프 사이클(Life Cycle)
    : init(), service(), destroy()
  -> 하나의 JVM 안에서 Multi Thread로 동작
    : 서블릿이 한번 적재되면 동시 접속자가 몇 명이든 하나의 프로세스 안에서
      접속자 당 하나의 Thread가 생성되어 서비스
    : 자원을 효율적으로 나누어 사용하면서 서비스를 제공
  -> 서블릿의 생성과 초기화는 최초에 단 한번만 이루어진다.
  -> 모든 사용자 요청을 처리하면, 서블릿 컨테이너는 해당 서블릿을 소멸

                        요청1       요청2       요청3       요청4
    ================================================================
    서블릿 컨테이너 -- init()
    요청/응답       -- service()
    요청/응답       -------------- service()
    요청/응답       -------------------------- service()
    요청/응답       -------------------------------------- service()
    요청/응답       -------------------------------------- destroy()


  -> init() method
    : 서블릿이 처음 적재될 때 호출된다.
      실제로 서비스가 이루어지기 전에 호출 => 초기화 작업 가능
    : init(ServletConfig config)
        init(config) method에서 super.init(config)가 호출되어야 함
    : init()
        getServletConfig() method를 이용하여 ServletConfig 가져올 수 있음

  -> service() method
   : 사용자의 요청이 있을 때마다 호출
   : 서블릿 컨테이너는 GenericServlet에 정의된 service() 만 호출
     HttpServlet 에서는 service() method가 호출되면 요청 정보를 분석해서
     HTTP 명령에 따라 doGet() 또는 doPost() method를 호출하도록 재정의하고 있다.

  -> destroy() method
   : 서블릿 컨테이너가 서블릿을 소멸시키기 직전에 호출
     자원 반납하는 역할 구현

  -> ServletRequest
   : 사용자의 IP 주소나 호스트 명, 사용하는 프로토콜, 포트 번호,
     요청 파라미터 등 요청에 관련된 많은 정보를 제공
   : String getParameter(String name);
     String[] getParameterValues(String name);
     위 method를 이용하여 프로그램에 전송된 요청 파라미터를 확인할 수 있다.

  - ServletResponse
   : response.setCharacterEncoding(String enc)
     파라미터의 값이 한글일 경우, 한글 설정(euc-kr)
   : java.io.PrintWriter getWriter()
     Html 과 같은 텍스트 형식일 경우, getWriter()를 통해 PrintWriter를 생성하여 출력할 수 있다.
   : ServletOutputStream getOutputStream()
     바이너리(이미지, PDF 등등) 파일일 경우, getOutputStream()을 통해 SerlvetOutputStream을 이용할 수 있다.

서블릿에서 멀티 쓰레드에 대한 고려
  : concurrency, synchronization 문제
    사용자 1        사용자 2
    ===============================
    count++
    -------------------------------
                    count++
    -------------------------------
                    println(count)
    -------------------------------
    println(count)
    synchronized(this) {
      count++;
      out.println(count);
    }

멀티 쓰레드
  - Virtual CPU
  - Code
  - Class Variables
  위 3가지를 공유함

  하나의 process가 생성이 된 후에 Thread가 여러개 생성이 되면
  process가 사용하는 CPU를 각 Thread가 공유하게 된다(Virtual CPU)

  class variables는 process 범위에서 생성 & 유지되는 변수이고, 각 thread에서 공유한다.
  doGet(), doPost() 등은 각 thread 에서 각자 실행되는 부분이다.

 
:
Posted by 뽀기