레이어                                      책임                                                   구현 기술

프리젠테이션                 사용자 인터페이스                                 jsp,html,javascript,swing/awt중
                                                                                             일반 component 계열
애플리케이션                유스케이스,워크플로,입력검증,                 servlet,<usebean>타겟,swing/awt중
                                  서비스와 상호 작용                                 frame,panel등 component 계열

서비스                         트랜잭션 제어하기,비지니스/워크플로        ejb 세션빈
                                  로직호출,facade로 역할
                             
도메인                         도메인모델,도메인/비지니스로직/입력         ejb엔티티빈, 일반 자바 객체
                                  검증


퍼시스턴스                   도메인 객체 상태의 영속적인 저장소            o/r매퍼(object,relation,mapping),oodbms,ejb
                                                                                               엔터티빈 bmp(bean manage persistance)
                                                                                               엔터티빈 cmp(container m p)

**********************************************************
서비스 레이어: 유스케이스와 비지니스 로직을 호출하는 방법을 제공한다.
즉.. 유스케이스가 실행하는 트랜잭션(계좌이체:pk조회,계좌정보조회,잔금
확인...)을 제어하고, 유스케이스가 충족되는데 필요한 도메인 객체들 사이의
워크플로와 도메인 객체로의 위임을 다룸.(도메인객체가 유스케이스를 다룰
수 있게끔)

음.. 예전에 파일 시스템에서.. 내부의 복잡한 작업용 객체, 각종 비지니스
를 감추고 클라이언트(사용자)에 대해 copy,delete,rename등을 인터페이
스를 제공한 느낌이랄까? 한마디로 클라이언트측에 대해 서브시스템들을
캡슐화 + 단순 인터페이스로 제공함으로서.. 뭐랄까.. 의존성을 줄인다?
내 경운 클라에게 노출되는 개념은 최대한 직관적,현실적으로 제공하자는
생각였었음..(채팅프로그램이라면.. 클라이언트라면.. client 객체 생성후
start()만 제공..즉 서브시스템들을 클라이언트로부터 감춘다는 의미~)

즉.. 사용자가 이 파일들을 이 디렉토리에서 저 디렉토리로 옮겨라는 
비지니스에 대해.. copy(srcPath, destPath)만 받고.. 내부에서 작업할
copy용 워커를 팩토리에서 생성하고, 파일 작업을 워크 팩토리에서
생성하고.. 워커에게 실제 작업을 시키고.. 이런 과정은 클라에게서 
숨겨졌었음. 역할별로 분리하고, 캡슐화하고.. 소통의 창구를 단일화한다.. 
이 개념들이 디자인 패턴에서 복잡성,의존성을 줄여주는데 사용되는 여러 
패턴들의 기본 컨셉이라 생각함. 

ejb의 경우.. 도메인 레이어에 업무(비지니스)를 의미하는 객체(빈)들이
존재함.(일반적으론 풀을 사용) 빈을 이용해 각 도메인의 처리 결과를
얻고, 그것을 조합해 전체 서비스를 구성하는 것이.. 서비스 레이어의 역할인
듯..  

글고 도메인영역.. ejb등은 app로부터 독립적임 = 재사용
(계좌이체 빈이라면.. 이 빈은 .. 여러 다양한 비지니스에서 사용이 가능)

순수 자바라면 이부분이 지난번 배웠던 dao들의 영역인듯.. 

물론 하이버네이트,아이바틱스의 경우 아직 거의 모르지만, 선생님 말씀으론
도메인과, 퍼시스턴스(db) 사이에 끼어서.. db종류별, 도메인 종류별.. 의존성
및 .. 반복되는 작업을 처리해주는 미들웨어인듯..

******************************************************

동시 트랜잭션의 문제.. 버전 번호

상황:여러사람이 동시에 접근해 수정이 가능한 게시판이 있을때
a라는 사람이 작업하는 도중 b라는 사람도 작업을 하게 되었고
a가 작업완료후 b가 작업을 완료했으면?

1.서버에서 읽기를 통해 엔터티 빈에서 데이터를 가져오면서 버전번호를
같이 가져온다.

2.갱신한 데이터(편집한 게시판 내용을 의미하는 엔터티빈)와 버전 번호를 
서버로 돌려보낸다.

3.서버에서 갱신을 수행할때 1에서 발송한 버전 번호와 같은지 판단해서
같을 경우만 갱신한다.

4.버전 번호가 다를경우 갱신을 거부한다.(물론 뒤에 작업 하던 사람의
데이터를 완전히 날려버리지 않고.. 새로운 버전번호를 보내주어 재갱신
시도를돕는다)

=>이문제는..jsp에서 트랜잭션 처리에 대해.. http가 상태를 갖지 않는다는
특성때문에.. 브라우저 에서 하나의 요청후 f5등 새로고침, 뒤로가기 등을 하면 
요청이 2번 되는 문제를 해결하기 위한.. token 발행/검증 기법과 같은
개념일 것이다. (한번에 하나의 처리만 하게끔..) jsp 교재에선 클라이언트
의 request 아이디,현재 시간(timestamp)를 md5를 통해 토큰을 만들었다.
(서블릿or 스클립틀릿으로 지속성 있는 세션에 토큰을 심어놓고.. 리퀘스트/
리스폰스를 통해 토큰을주고 받아가며.. 세션에 있는 토큰과 비교하는 방식이었는듯?)

ejb에선 과연 어떤 방법을 쓸라나? 흥미 진진..

아 글고.. dto factory,session facade(결합성 분리)를 사용하는 의미를 잊지말것..
(ejb 패턴책 너무 어렵 ㅠㅠ)

발췌:
public void setMessagDTO(MessageDTO messageDTO) throws NoSuchMessageException
{
  if(messageDTO.getVersion() !=  this.getVersion() )
    throw new NoSuchMessageException();
   
  this.setSubject( messageDTO.getSubject() );
  this.setBody(messageDTO.getBody() );
}

하지만, DTOFactory 패턴에서도 설명했듯이, 엔티티 빈에 직접 접속하는 방법으로 DTO를 사용
하게 되면 EJB 2.0처럼 기능이 저하된다. 대신 DTOFactory/Session Facade는 엔티티 빈에서
데이터를 얻어 엔티티 빈의 로컬 인터페이스를 통해 get/set 메소드를 직접 호출하는 방법으로
엔티티 빈을 갱신하는 작업을 한다. (reflection 중 getDeclateMethode()로 얻고.. 반복문에서
get/set 문자열로 게터,세터 찾아내고 , invoke 활용하겠지? 아님 말고 -_-;)

이런 패러다임을 사용하면, 세션 빈이 set 메소드를 통해 직접 엔티티 빈을 갱신하게 되어
엔티티빈이 더이상 갱신하기 전에 데이터의 버전을 자동으로 검사할수 없게됨으로.. 개발자가 
갱신절차 전에 갱신할 데이터의 버전을 넘겨야한다.

public void updateMessage(MessageDTO messageDTO) //서비스 영역중 세션빈 메서드임? 헷갈려 죽겟네..
{
  Message message = null;
  try
  {
     mesage = this.messageHome.findByPrimaryKey( new MessagePK(messageID) );
     message.checkAndUpdateVersion( messageDTO.getVersion() ); //불일치시 익셉션 발생 가능
     //메세지 갱신
     message.setBody( messageDTO.getBody() );
     message.setSubject( messageDTO.getSubject() );
   }
   catch(IncorrectVersionException e)
   {
      //트랜젝션 롤백.. 저 위의 b님.. 죄송합니다;;
      this.ctx.setRollbackOnly();
      throw new StaleupdateException(); //상위 콜러측에 알림
    } 
    catch(...)
  ...
}

public void checkAndUpdateVersion(long version) throws IncorrectVersion...
{
  long currentVersion = this.getVersion();
  
  if(version != currentVersion)
    throw new IncorrectVersion...();
  else
    this.setVersion(++currentVersion);  //초단순.. +1
}

=>위의 처리가 전문용어로.. 낙관적(optimistic) 동시성(concurrency) 획득이라함 -_-;;
(타임스탬프 쓰는 방식도 거론하는데.. 서버 시계 멈추거나, 시간 오차등.. 태클걸고 있음..)



*****************************************************

아이바틱스 - 하이버네이트 개념 이해..(한번 봣던 문서같은데..그새 생소해짐..)


******************************************************

bmp vs cmp(추가로 cmp에서 자동으로 값을 read/write하기 위해 reflection 개념을 사용.. 메서드중 setXXX만
추출등.. 글고 전문가들은 bmp 사용하지 말것을 권고.. cmp가 트랜잭션 처리도 알아서 해주고.. 요즘은 어떤지
모르겠음.. 하도 옛날 자료라..)


*******************************************************
이번에 ejb 실습하면서 추가한 외부 라이브러리.. (선에서 자바ee 다운및 설치후)

C:\glassfish4\glassfish\modules\javax.ejb-api.jar 를 외부 라이브러리로 추가함..
그외에도 엄청 많은 jre 파일이 있는데.. 구분을 못할 정도임..

*********************************************************8

java ee 용어;;(스윙에,xml에,ejb에.. 머리가 흡수를 거부하고 있음 OTL)

****************************************************8
중국산? 자바 코드 모음...


http://www.pudn.com/downloads3/ebook/detail10484.html


*******************************************************8

상태/무상태 세션빈(초 간단 결론?static으로 처리만 하면 무상태, 세션에 대해 로그인 정보등 의미있는 정보를 유지하고 
있으면 상태)


by givingsheart 2014. 1. 2. 09:33