업무처리 (Business Logic Layer)  


업무처리 레이어는 업무 프로그램의 업무 로직을 담당하는 레이어로서, 업무 흐름 제어, 에러 처리 등의 기능을 제공합니다.  

<그림> 업무처리 레이어 구성  



업무처리 레이어는 Spring Web Flow, Spring 이상 2가지 오픈소스를 사용합니다.  

프로세스 제어(Process Control)을 담당하는 웹 플로우는 페이지 흐름(flow)의 정의와 수행을 처리합니다.  

에러 처리(Exception Handling)는 표준프레임워크 기반의 시스템 개발시 Exception에 따라서 특정 로직을 실행하여 Exception에 따라 적절한 대응을 할 수 있습니다.  



데이터처리 (Persistence Layer)  

데이터처리 레이어는 데이터를 다루는 역할을 전담하며, 데이터베이스에 대한 연결 및 영속성 처리, 선언적인 트랜잭션 관리를 제공합니다. 데이터처리 레이어의 구성은 다음과 같습니다.  

<그림> 데이터처리 레이어 구성  



데이터소스(DataSource)와 트랜잭션(Transaction)은 스프링을 사용합니다.  
데이터 접근(Data Access)는 iBatis를 사용하고 있으며, SQL Mapper를 통해서 XML로 정의된 SQL을 활용합니다.  
ORM(Object-Relational Mapping)은 하이버네이트(Hibernate)를 사용하고 있습니다. 하이버네이트는 자바 객체와 관계형 데이터 모델 간의 매핑을 위한 도구이며, 자동 생성된 쿼리 서비스를 지원하는 강력한 고성능의 퍼시스턴스 프레임워크입니다.


연계통합 (Integration Layer)  

연계통합 레이어는 다른 시스템과 데이터 교환을 지원하는 역할을 합니다. 연계통합 레이어의 구성은 다음과 같습니다.  

<그림> 연계통합 레이어 구성  



Naming Service, Integration Service, Web Service 등 총 3개 서비스를 제공합니다.  
네이밍 서비스(Naming Service)는 스프링을 이용합니다.  
인테그레이션 서비스(Integration Service)는 표준프레임워크 기반의 시스템이 다른 시스템과의 연계를 위해 사용하는 Interface의 표준을 정의한 것입이다.  
웹 서비스(Web Service)는 아파치 CXF를 사용합니다. 공개되어 있는 웹 서비스를 호출하고, 처리 결과를 돌려줍니다. 개발한 업무 모듈을 웹 서비스로 공개할 수 있도록 프록시(Proxy) 등을 제공하고, 완성된 웹 서비스로 공개합니다.

제일 처음 자바를 시작했을 때, 에러(Error와 Exception 나뉘지만 에러로 표기합니다)화면을 보고 깜짝 놀랬습니다.

2008-10-06 13:27:06 ApplicationDispatcher[/] Servlet.service() for servlet download threw exception
java.lang.IllegalStateException: getWriter() has already been called for this response
        at org.apache.coyote.tomcat5.CoyoteResponse.getOutputStream(CoyoteResponse.java:568)
        at org.apache.coyote.tomcat5.CoyoteResponseFacade.getOutputStream(CoyoteResponseFacade.java:148)
        at kr.pe.okjsp.DownloadServlet.doGet(Unknown Source)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:689)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:237)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)
        at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:704)
        at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:474)
        at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:409)
        at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:312)
        at kr.pe.okjsp.ControllerServlet.doGet(Unknown Source)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:689)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:237)
... 중략 ...
        at org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:160)
        at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:799)
        at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:705)
        at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:577)
        at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:683)
        at java.lang.Thread.run(Thread.java:619)

저런 식으로 우수수 떨어지는 에러메시지는 초보에게는 공포감을 일으키기 충분합니다. "내가 그 정도로 잘못했는지 정말 몰랐어요"라는 감정이 생기죠. 사실 에러메시지의 상단 2~3줄만 봐도 문제의 원인을 파악할 수 있는데, 스택트레이스(Stack Trace)라 불리는 사정없는 에러메시지는 정말 "안 좋아"였습니다.

try{...} catch(Exception e) { System.out.println(e.getMessage()); }

저런 메시지 폭탄을 피하기 위해서 위 코드를 통해 핵심 메시지만 봅니다. 이 포스팅의 핵심은 저기서 나온 메시지들과 친해지라는 것입니다. 아마 자주 보일 것입니다.

가까이 하기 어려운 사실 하나는 "영어"로 된 메시지라는 것이겠죠. 영어는 못해도 자바는 좀 하신다면 공개된 소스나 디컴파일을 통해서 저 메시지 생성부분을 찾아볼 수 있습니다. 더구나 자바의 기본 라이브러리는 공개되어 있습니다. src.zip 파일이 그것이죠.

이클립스 툴이나 텍스트 에디터 등을 통해서 에러 메시지를 검색해보면 해당 부분의 소스를 볼 수 있을 것입니다.

또 다른 방법은 구글링을 통해서 소스를 검색해 볼 수도 있습니다. 위 메시지의 경우 검색어를 다음과 같이 넣습니다.


따옴표("")로 감싼 이유는 단어 구분해서 찾지 말고 문구 그대로 검색하라는 의미이고 filetype:java 는 확장자가 java인 파일만 검색하라는 뜻입니다.

이런 식으로 소스를 찾아서 에러원인을 볼 수 있다면, 아마 문제해결(Troubleshooting) 능력이 많이 좋아질 것입니다.

버그와 에러는 다르죠. 에러 메시지! 사라지지 말고 함께 해요.

ps. 공통 프레임워크 만드시는 분들 에러 씹지 말고 보내주세요. ^^;

+ Recent posts