레이어                                      책임                                                   구현 기술

프리젠테이션                 사용자 인터페이스                                 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
JDesktopPane 메디에이터 패턴에 대해 좀 더 이해를 해보려다 찾게된 블로그
(웬지 메디에이터 클래스에 메서드가 무지하게 많더라니 ... 이런 심오한 이유가..)

http://www.buggymind.com/27


생각난 김에 예전 데브피아 디자인패턴 강의도 봐야겟음..

스윙에서 ContainPane인가 하는 메디에이터를 고민하다가.. 퍼사이드(facade)와 
구분이 제대로 안되고 있음.. 

(추가)
디자인 패턴이란, 특정한 문제 영역을 해결하기 위한 원리 이다. 장-단점과 , 이것이 활용될 상황을 기억하는게
중요하다. 


by givingsheart 2014. 1. 2. 09:31
어제도 이벤트 디스패치 스레드 구현 코드를 보던중.. 망할 시큐리티 매니저..   내 app의 입장을 넘어
jvm(여러 자바기반 app의 관리자 객체)의 입장에서 생각해 보았다.


내 app에서  클래스에 static을 사용한다는 의미, 클래스의 인스턴스(물론 refelct 관점에서 보면 클래스도 인스턴스(static

영역에 생성되는 object.. Class.forName("xxx.xx.a").newInstance)지만..논외) 를 static으로 접근하게 제공한다는것..

음.. 이해가 부족해 표현이 쉽지 않은데..

public class 계좌  //내 app의 모든 .class 파일에서 전역적으로 사용하기 위해 public 키워드
{
    public static 계좌 instance = new 계좌();
    public void 출금(){}
}

계좌클래스의 인스턴스는 어디에서건 계좌.instance로 "전역적=공유적"으로 접근및 계좌.instance.work() 서비스를 사용할수 
있다.(물론 패키지 선언및 다른 .class 파일에서 접근할땐 import를 하던지.. 아니면 패키지명.클래스명으로 사용하던지)

import 패키지.A;
public class 장호
{
   void 출금()
   {
       계좌.instance.출금();
    }
}


import 패키지.B;
public class 가짜장호
{
   void 출금()
   {
        계좌.instance.출금();
    }
}

물론 일반적으로 로그인 처리단계 -> 로그인 정보에 따라 서버단에서 db에 조회해서 dao를 통해 사용자의 
계좌 객체를 얻고 그것을 "서버단의 계좌 매니저" 객체에 보관하며, 로그인 결과에 따라 "검증하는 작업후" 인증된 사용자에 
대해 설정된 권만 만큼의 계좌 정보를 보여주고-> 사용자의 비지니스 로직(입금,출금,조회) 선택에 따라 다시 서버단에서 트랜
잭션및 예외등을 컨트롤해 가면서 dao를 통해 db단에 쿼리를 전달하고 -> 결과를 받아 사용자에게 피드백을 할것이다.
(뭐랄까.. 예전에 쇼핑몰 로그인 처리 구현했을때.. 19세 이상, 회원, 비회원 등으로 인증및 권한 설정을 통해 분기를 나누고 사용
자에 대한 view를 다르게 했던 것처럼..)

즉.. 장호의 계좌에 대해선 여러가지 비지니스 로직용 클래스의 객체가 공유할수 있지만.. 
장호의 계좌에 대해 "인가되지 않은 가짜장호가 접근"을 해서는 안될것이다.

아직 개념이 제대로 안섰는데.. 이걸 jvm과 여러 app 의 관계로 생각해보면
jvm은 서버의 입장, app는 클라이언트의 입장이 될것이다.
즉 jvm으로선 여러개의 app(app자체도 스레드를 여러개 사용가능)를 관리하게 되고.. 각각의 app는 서로에 대해 
"데이터에 대해 독립성 = heap 메모리, class 인스턴스라면 static 메모리 + 코드의 독립성 = stack 메모리"이 보장되어야 할 
것이다.

보안 개념(인증및 권한설정)을 좀 더 상위단에서 관리하기 위해.. 각 appcontext라는 걸 만들었고.. 각각을 컨테이너에
구성 요소로 관리함으로서 독립성을 보장할 것이다. (물론 이래야.. 여러 app들에 대해 시분할 처리가 될것이고..)
app라는건 jsp에 비유하면.. session의 개념이고 app내에서 발생하는 여러 이벤트(입,출력등 각종 처리)은 request의 개념일 
것이다.(정신이 점점 안드로메다로...OTL)

아직 시큐리티 매니저, appcontext, app의 eventQueue, 전체 시스템(os(jvm포함))의 eventQueue 에 대한 이해가
거의 없다. 또 한번 뜬구름을 잡는구나 ㅠㅠ


JNDI


JDBC와 JNDI

***** 
생각난 김에 예전에 보안문서중 자바 관련파트 확인 1회, java.security패키지와 관련 패키지 한번 더 체크


by givingsheart 2014. 1. 2. 09:30