Java EE7:DayTrader 분석

0

개발지식공부

목록 보기
6/6

DayTrader 분석

최근에 연구를 진행하면서 실험 대상 웹 앱들을 분석해야할 일이 생겼다. 사실 말이 분석이지 어떠한 기준이나 툴을 가지고 분석한 것은 아니고, 정적 분석으로 소스 코드 흐름과 어떤 기술이 어떠한 방식으로 적용되고 있는지 정도를 분석하였다. JPetStore(https://github.com/mybatis/jpetstore-6) 같은 경우에 소프트웨어 공학 수업을 들으면서 Reengineering과 관련한 게시글을 썼기 때문에 이번에는 DayTrader에 대해서 작성을 해보려고 한다. DayTrader의 경우 클래스가 100개 이상이며 JSP 컴포넌트들까지 개수에 센다면 150개가 넘는다. DayTrader의 경우 다음 깃 주소에서 코드를 확인할 수 있다. https://github.com/WASdev/sample.daytrader7

서론

DayTrader에는 여러가지 기술들이 적용되고 있다. 이것이 개발자의 의도인지는 모르겠으나, JSF(Java Server Faces)가 Servlet-JSP와 같이 사용되고 있다. 하지만 본 게시글은 JSF보다는 사용자의 요청에 의한 흐름이 어떻게 진행되는지를 완벽하게 클래스 단위보다는 살짝 추상화하여 설명하고자 한다. 또 DayTrader의 경우 EJB(Enterprise Java Bean)을 사용하여 객체를 관리하기도 하는데 마찬가지로 이러한 기술적인 부분에 대해 자세하게 다루지는 않는다.

전체 흐름도

처음 살펴보면 많이 복잡하게 느껴질 수 있다. DayTrader는 온라인 주식 거래 웹 앱이며, 해당 인프라를 이용하여 벤치마크를 할 수 있도록 설계되어 있다.

Entry Point

그림에 보이는 TradeAppServlet이 Entry Point이며 요청의 종류에 따라(Login, Logout, Register 등..) TradeServletAction의 어떤 메소드가 실행되는지가 달라진다.

Service

TradeService가 인터페이스로서 해당 인터페이스를 구현하는 녀석이 서비스가 된다. 첫번째는 TradeAction클래스이며, 마찬가지로 요청에 따라 DAO를 사용하여 데이터베이스에 접근한다.
두번째는 TradeSLSBBean이다. EJB를 이용하여 Bean에 접근하여 Database로부터 정보를 가져온다.
TradeAction에서 TradeDirect DAO를 사용하여 JDBC 라이브러리로 바로 데이터베이스에 접근을 할 수도 있고, 여기서 다시 TradeSLSBBean을 이용하여 EJB를 거쳐 ~Bean클래스에서 데이터베이스로 접근을 하도록(two Phase)로 구성할 수 있다.

TradeSLSBBean의 경우 부모클래스로 TradeSLSBLocal과 TradeSLSBRemote를 가지는데, 이것은 TradeSLSBBean을 로컬 jvm에서만 호출이 되도록 할지 다른 jvm에서도 호출이 되도록 할지 두 가지 방식으로 사용할 수 있도록 한다. 이후, EntityManager를 이용해서 요청에 따라 필요한 Bean 클래스를 가지고 와서 데이터베이스에 접근하여 정보를 가지고 온다.

DAO

TradeDirect와 EJB에서 관리되는 Persistent 객체를 생성할 수 있는 ~Bean 클래스들이 비슷한 역할을 할 수 있다. TradeDirect의 경우 기본적으로 JDBC 라이브러리를 이용하여 데이터베이스 테이블에 접근한다. 하지만 예외적인 흐름으로 주식구매, 판매에서 비동기 처리를 할 수 있도록 JMS(Java Message Service)를 사용한다. 이러한 경우 Listener 클래스가 JMS를 받아서 TradeSLSBBean클래스를 사용해서 앞 단락의 Service에서 말한 것과 같이 EntityManager을 이용해서 DB에 접근하게 된다.

그림에서 보이듯이 호가는 Streamer이용해서 소통하며, 오더는 Broker를 이용해서 소통한다. 따라서 알 수 있듯이 JMS에는 리스너 또는 컨슈머와 소통하는 방식이 두 가지가 존재한다.

WebSocket

마지막으로 웹 소켓을 통해 작동되는 기능이 존재한다. 바로 MarketSummary 기능이다. 주가 정보가 변경되거나 사용자가 시장 요약 페이지에 접근할 때 웹 소켓으로 주가 변동 정보를 받아온다. 마찬가지로 웹 소켓 역시 리스너 클래스가 존재하며 해당 클래스가 MarketSummaryDataBean을 사용하여 데이터베이스 테이블에 접근한다.

그 외

앞에서 설명한 것과 별개로 Thread를 사용해서 주문을 처리하거나, 해당 기능들을 사용하여 벤치마크를 진행하는 기능들이 존재하지만 해당 내용은 다루지 않았다.

소감

클래스가 너무 많아서 분석을 하는데에 오래 걸렸다. 그리고 웹 앱의 작동방식이 굉장히 복잡했다. 본문에서 다루지 않은 JSF 역시 위에서 설명한 방식과 비슷하다. EntryPoint가 JSF 용으로 존재하며 Service Dao는 똑같이 사용되는 것으로 파악했다. 기본의 EntryPoint가 JSP나 HTML의 뷰를 사용자에게 띄워준다면 JSF의 EntryPoint는 xhtml을 띄워주게 된다.

profile
최악의 환경에서 최선을 다하기

0개의 댓글