spring프레임워크를 처음 접할 때 당황하게 되는 부분이
'무슨 설정이 이렇게 많어?'이다.
xml 지옥을 몸소 체험하는 느낌이랄까.

하지만 사실 알고보면 그냥 좀 많을 뿐. 그렇게 복잡한 것은 아니다.
샘플 프로젝트인 jpetstore(samples 밑에 있다)를 기준으로 상콤하게 정리해보자.

크게 설정할 부분은 6개이다.
  1. web.xml 설정
  2. 프로퍼티 파일 설정 (jdbc.properties, log4j.properties, mail.properties)
  3. applicationContext.xml 설정
  4. petstore-servlet.xml 설정
  5. ibatis의 dataAccessContext.xml 설정
  6. ibatis의 sql-map-config.xml 설정

자 그럼 하나씩 더 자세히 살펴보자.

1. web.xml 설정
  1. 웹루트 키 정의 => log4j.properties에서 로그파일의 생성 경로에 이용된다.
  2. log4j.properties 경로 지정
  3. applicationContext.xml, dataAccessContext.xml 등의 경로 지정
    (여기서 petstore-servlet.xml 는 제외한다. 어플리케이션이 구동 시에 자동으로 서블릿이름-servlet.xml이 로딩된다.)
  4. spring 서블릿 등록, 스프링에서 처리할 url 패턴 지정
    (네이버의 .nhn 도 이렇게 구현할 수도 있다. 아마 아파치 모듈을 썼다거나.. )
  5. 기타 서블릿 등록 (axis 등)
  6. 우리나라 필수!!! utf-8 인코딩 필터 지정

2. 프로퍼티 파일 설정
  1. jdbc.properties
  2. log4j.properties
  3. mail.properties

3. applicationContext.xml 설정
  1. 프로퍼티 파일들의 경로 지정(jdbc 등)
  2. 비즈니스 오브젝트 정의 - 벨리데이터, petStore(dao를 통합하고 있는 퍼사드 패턴으로 된 대표 클래스)
  3. Aspect 설정(AOP) - 트랜잭션
  4. 기타 - emailAdvice 나 RMI 익스포터 등 (쓸일은 있는 사람만 있는..)

4. petstore-servlet.xml 설정
  1. viewResolver 설정
    - web.xml에 설정된 spring의 컨트롤러에서 처리할 때 필요한 jsp 파일들의 경로 지정이다.
    - 파일의 앞 경로는 prefix에 쓰고 확장자는 suffix에 쓴다.
  2. 컨트롤러 정의
    - 여러가지 url 매핑핸들러에 따라, 컨트롤러를 연결시켜 준다.
    - Interceptor 지정을 통해서 url을 낚아채서 먼저 처리할 수도 있다
    - petStore, 각종 벨리데이터 등을 컨트롤러에 주입시키는 정의를 한다.

5. ibatis의 dataAccessContext.xml 설정
  1. dataSource 설정 - 위에 설정한 jdcb.properties의 속성들을 사용한다
  2. transactionManager 설정 - dataSource의 트랜잭션 매니저를 설정한다
  3. sqlMapClient - sqlmap의 경로를 지정한다
  4. Dao 정의 - ibatis의 DAO들을 정의한다

6. ibatis의 sql-map-config.xml 설정
  1. 실제 사용되는 쿼리들이 적힌 개별 xml 파일들의 경로를 정의한다.

이 정도면 기본적인 것들을 진행하는데 큰 무리가 없으리라 본다.
도움이 되길 바라며..


저작자 표시 비영리 변경 금지
신고
Posted by 시난
TAG Spring

일단 기선님의 AOP를 설명하는 그림 두 장을 보자.
AOP 적용 전, AOP 적용 후



무엇인고 하니.. 예를 들어 메소드의 수행 시간을 확인할 일이 있다고 하자.
그럼 일일히 하나하나 메소드에 시작과 끝 부분에 ms를 구하고 그 차이를 구하고 하는 방법이
바로 첫 번째 그림이다.

그걸 AOP를 사용하면 2번째 그림처럼 된다. 어떻게 이런 일이? 소스코드를 수정하지 않고
메소드에 저런 마법이 가능하단 말인가!!!!!!?????

그것은 바로 AOP(Aspect-Oriented Programming)의 마법이다!
AOP에 대해선 다음 글을 읽어보자

1. IBM 개발자네트워크의 Aspect-Oriented Programming: AOP에 대한 실제적 접근방식

2. 다음 dna의 기술노트  AOP 용어들과 DynamicProxy를 사용한 간단한 예제 - 구준근(기술위원회 PiLab팀), 2006년 11월
(요게 각종 개념들은 아주 쉽게 정리되어있다.)


http://dna.daum.net/wiki/imgs/custom/aop.jpg
  • Target : 주가 되는 비지니스 로직을 구현하고 있는 클래스를 말합니다.

  • JointPoint : Target 즉, 주가 되는 비지니스 로직을 가지는 인스턴스에 이벤트가 발생하는 시점을 말합니다.
    예를 들면 인스턴스가 생성되거나, 인스턴스의 특정 메소드가 호출되는 시점 또는 Exception이 발생하는 시점 등이 예가 됩니다.

  • Advice : target의 주된 비지니스 로직에 추가로 실행되어질 로직이 구현된 부분 입니다.

  • PointCut : Target의 JointPoint에 Advice를 결합하기 위해서 필요한 패턴을 말합니다.

  • Weaving : Target에 Advice 기능을 결합시키는 것을 말합니다. JAVA JDK에서는 1.3 버전부터 reflect API를 사용한
    DynamicProxy 클래스를 지원하여 부분적인 AOP를 구현하고 있으며, AspectJ 등의 툴은 바이너리 파일을 재 컴파일하여 AOP를 완벽히 지원하고 있습니다.

  • Aspect : Target의 JointPoint에 Advice 기능이 Weaving 되어 Target에 주된 비지니스 로직에 Advice 기능을 지원할 수 있도록 하는 완성된 클래스 입니다.


좋은 자료들을 봤으니 이해가 쏙쏙 될 것이다.
즉, 스프링의 AOP를 사용하면 DB의 트랜잭션 처리나, 로깅 등을 설정을 통해 수행할 수 있게 된다.
소스코드를 적지 않고도!

일일히 메소드에 정의하지 않고
죄다 어딘가 정의해놓으면 간단히 된다는 사실!!









 

저작자 표시
신고
Posted by 시난
TAG AOP, Spring

영어가 편한 사람이라면 아주아주 유명한 마틴파울러라는 사람이 쓴 글을 참고하자.
http://www.martinfowler.com/articles/injection.html

벗뜨. 영어가 그닥 편하지 않다면 잘 정리한 국내 글을 읽어보자.

IoC 컨테이너와 의존성 삽입 패턴
http://wiki.javajigi.net/pages/viewpage.action?pageId=68

Spring Core API 및 IoC-DI
http://wiki.javajigi.net/pages/viewpage.action?pageId=281

자 읽었으면 정리해보자.


1.
IOC란 Inversion of Control 로 주로 IOC라고만 하지 않고
컨테이너를 붙어 Inversion of Control Containers 라고 보통 쓴다.
IOC 컨테이너란 IOC를 구현하는 프레임워크를 뜻한다.

2.
IOC를 우리말로 번역하면 '제어 역행화'라고 한다.
제어의 흐름이 반대로 흐른다는 것이다.
즉, 구현 객체에 대한 정보가 프레임워크에서 관리되는 것.

3.
마틴 파울러는 IOC보다는 DI라는 개념을 사용하길 권장한다.
DI는 Dependency Injection라고 '의존성 주입'이라고 한다.

4.
public class MovieLister{

    public void list() {
        MovieFinder finder = new SFMovieFinderImpl();
    }
}
이런 클래스가 있다고 했을 때 ( MovieFinder 는 인터페이스 )
new SFMovieFinderImpl(); 부분을 변경하여
다른 곳에 떠 넘긴다.

public class MovieLister{

    public void list() {
        MovieFinder finder = Assember.getBean("movieFinder");
    }
}
요렇게 하고.. getBean을 사용하기 위해 bean설정을 한다.


5. 왜 그렇게 해야했나?
그냥 딱 저걸로만 개발하고 아무일도 없으면 그냥 저냥 쓰는데 별 무리가 없다.
그러나 SF영화를 찾는게 아니라. 액션 영화를 찾는다면!?!
처음 클래스였다면..
MovieFinder finder = new ActionMovieFinderImpl(); 로 고쳐야 했었을 것이지만..

두번째 처럼 수정했다면
MovieFinder 를 구현한 SFMovieFinderImpl 였기에 ActionMovieFinderImpl를 구현하면 된다.
그리고 bean 설정을 변경하면 xml설정의 변경만으로 소스 수정없이 편리하게 쓸 수 있다.


간단히 이렇게 이해하고..
다른 예로는 MSSQL을 사용하는 DAOImpl와 Oracle을 사용하는 DAOImpl이 있겠다.
처음 개발할 때 인터페이스를 정의하고 MSSQL용으로 DAO클래스를 구현한 다음
필요에 따라 oracle을 사용하는 DAO클래스를 구현하면 되는 것이다.


6. 이런 방법은 인터페이스를 이용하는 방법 외에 2가지 더 존재한다.

  • 유형 1. 생성자를 이용한 의존성 삽입 (Constructor Injection : type 1 IoC)
  • 유형 2. Setter() 메소드를 이용한 의존성 삽입 (Setter Injection : type 2 IoC)
  • 유형 3. 초기화 인터페이스를 이용한 의존성 삽입 (Interface Injection : type 3 IoC)
  • 덧.
    DI를 사용했을 때 또 좋은 점은 단위 테스트 할 때 용이하다.
    가짜 객체를 사용하여 직접 DB를 사용하지 않고도 테스트를 해볼 수 있다.


    후기:
    오랜만에 spring의 기초부터 처음 정리해보았다.
    역시 자바지기 위키는 짱임. ^^

    저작자 표시
    신고
    Posted by 시난
    TAG DI, IOC, Spring

    일단 framework란 무엇인가?
    전혀 모르는 비전공자에게 설명을 한다고 생각하고 설명을 해보겠습니다.

    신입사원: "프레임워크가 뭔데요?"

    시난: "벽돌집을 짓는다고 했을 때, 벽돌을 쌓는 규칙이랄까? 무작정 쌓는 방법도 있지만 지그재그로 시멘트 칠해서 쌓는 방법도 있고.. 그런게 프레임워크라고 생각하면 될거야."


    신입사원: "라이브러리는 뭐죠?"

    시난: "프레임워크랑 라이브러리를 헷깔리는 경우가 있는데.. 라이브러리는 하나의 유용한 클래스 집합이라고 생각하면 돼.
    예를 들어 XML을 처리해주는 라이브러리가 있다고 하면, 네가 짠 클래스에서 그 라이브러리를 사용하여 XML을 만들어낼 수도 있고 XML을 파싱해서 쓸 수도 있지.
    네가 직접 짤 수도 있겠지만, 잘 찾아보면 거의 없는게 없어. 라이브러리는 방대하지!!
    프레임워크는 라이브러리를 포함하기도 하고!"


    신입사원: "스프링 프레임워크는 뭐예요?"

    시난: "스프링 프레임워크는.. 기존의 MVC 모델을 알지? 그것도 포함하고, 사실 깊게 들어가면 좀 복잡하고 어려울 수도 있는데 쉽게 말해서 아주 편하게 이 MVC 패턴도 쓰고.. 로깅이나 트랜잭션 처리, 각종 ORM 이랑 연동도 할 수 있는 만능 키트!?"


    신입사원: "스프링 프레임워크의 다양한 기능에 대해 알려주세요."

    시난: "일단.. MVC 패턴을 xml 설정으로 정의가 가능해. 기존의 서블릿 프로그래밍을 했을 때 보면 xml 에서 서블릿 등록하고 url 적고 그런거 하잖아? 그런 설정도 있고 스프링 자체의 xml 설정을 통해 객체의 생성에서부터 소멸까지 모두 관리할 수 있어. xml에서 Foo foo = new Foo() 같은 것들을 다 처리해줘서 인스턴스의 생성을 전담하고, 필요한 객체들에 잘 넣어주기도 하고.."
    시난: "또, AOP(Aspect Oriented Programming)이라는 걸 지원해서 메소드의 시작과 끝 부분을 후킹해서 다른 메소드를 실행할 수도 있지. 시작과 끝 부분에 소스에 직접 타이핑해서 넣는게 아니라 바이너리 코드 사이에 직접 넣는 개념이야. 이러면 일일히 소스코드 수정을 하지 않고 트랜잭션이나 로깅 처리 등을 전부 설정할 수 있지."
    시난: "xml 설정을 처음에 보면 좀 어지러울 수도 있는데, 자바 5.0의 어노테이션을 사용해서 직접 클래스에 정의해서 xml을 간략화 할 수도 있고.."
    시난: "그리고 JDBC를 사용할 수도 있지만 다른 훌륭한 프레임워크(iBATIS나 Hibernate, JPA, JDO 등)을 쉽게 연동할 수도 있어. 정말 최고지!!"
    시난: "그리고.. 메일이나 스케쥴링을 쉽게 정의할 수도 있어서. 참 편해!! 직접 해보는게 제일 좋아!!"

    (헉헉.. 힘들군요;; )

    저작자 표시
    신고
    Posted by 시난
    기간: 오늘까지

    1. IOC에 대해 정리
    2. AOP에 대해 정리


    이해하기 쉽게,
    그림을 곁들여서


    수행후기:
    헉헉. 1시간 30분에 걸쳐서 스프링에서 쓰이는 IOC,DI,AOP 개념을 정리해보았다.
    좋은 글들이 있어서 쉽게 정리할 수 있었다.

    다음에는 비트연산자를 정복해보자.
    나는 늘 해야하는데 하면서 필요성이 없어서 넘어갔었던..!!!
    저작자 표시
    신고

    '퀘스트 > 완료된 퀘스트' 카테고리의 다른 글

    직장생활 시작하기  (0) 2009.03.04
    Java 기본 다시보기  (0) 2009.01.19
    XP(eXtream Programing)에 대해 설명하기  (0) 2009.01.12
    비트연산 완전정복  (0) 2009.01.12
    spring의 IOC와 AOP에 대해 정리  (2) 2009.01.11
    2009 대한민국 매쉬업 경진대회  (0) 2009.01.06
    Posted by 시난
    TAG AOP, DI, IOC, Spring
    스프링 2.5 책을 오늘 구입하고 천천히 살펴보았다.
    벗뜨.. 왜 어노테이션 기반의 컨트롤러가 있는데
    인터셉터는? (?? DefaultAnnotationHandlerMapping )

    이상해서 검색해보니
    누군가 이미 구현한 것이 있었다. 역시~

    코드:
    http://code.google.com/p/springplugins/

    사용법:
    http://www.scottmurphy.info/spring_framework_annotation_based_controller_interceptors



    국내에서 비슷한 고민을 하신 분의 글
    http://yunsunghan.tistory.com/185
    신고
    Posted by 시난
    토요일을 맞이하여
    그 동안 미루어왔던 Spring2.5의 Annotation기능을 이용한
    Hibernate 연동을 해보았다.
    (XML 설정 지옥에서 벗어날 수 있다!)

    기억과 공유차원으로
    글을 정리한다.


    샘플 프로젝트:




    환경

    1. JDK 1.6
    2. tomcat 6.0.16
    3. 이클립스 (eclipse-jee-ganymede-win32.zip)
    4. MySQL (mysql-5.0.51b-win32.zip)


    준비물

    1. Spring 2.5.5
    - filename: spring-framework-2.5.5-with-dependencies.zip
    - download: http://www.springframework.org/download)
    => spring.jar

    2. Hibernate Core
    - filename: hibernate-3.2.6.ga.zip
    - download: http://www.hibernate.org/6.html

    3. Hibernate Annotations
    - filename: hibernate-annotations-3.3.1.GA
    - download: http://www.hibernate.org/6.html

    3. MySQL
    - filename: mysql-5.0.51b-win32.zip
    - download: http://dev.mysql.com/downloads/

    4. MySQL JDBC
    - MySQL Connector/J 5.1


    웹프로젝트의 lib에 넣어줄 라이브러리들

    hibernate-annotations-3.3.1.GA\hibernate-annotations-3.3.1.GA\lib 하위에 존재
    - ejb3-persistence.jar
    - hibernate-commons-annotations.jar

    hibernate-3.2.6.ga\hibernate-3.2\lib 하위에 존재
    - asm.jar
    - cglib-2.1.3.jar
    - commons-collections-2.1.1.jar
    - commons-logging-1.0.4.jar
    - dom4j-1.6.1.jar
    - log4j-1.2.11.jar
    - jta.jar

    - mysql-connector-java-5.1.6-bin.jar (from mysql-connector-java-5.1.6.zip)

    - spring.jar (spring-framework-2.5.5-with-dependencies\spring-framework-2.5.5\dist)
    - spring-test.jar (for JUnit4 Test: spring-framework-2.5.5-with-dependencies\spring-framework-2.5.5\dist\modules)
    - spring-webmvc.jar (spring-framework-2.5.5-with-dependencies\spring-framework-2.5.5\dist\modules)

    이로써 웹프로젝트의 필요한 라이브러리는 모두 모았다.



    1. 웹프로젝트 생성
    Eclipse 에서 Dynamic Web Project 를 생성한다.
    따로 설정한 것은 없고 SpringEx 라는 이름으로 만들어보았다.


    2. web.xml 설정
    WebContent/web.xml 파일을 설정한다.
    (상세한 설명은 패스; )
    3. 다음은 SpringEx-servlet.xml 를 설정한다. (이 파일 이름은 web.xml에서 바꿀 수도 있다. 기본적으로 스프링에선 "서블릿 이름-servlet.xml" 을 자동으로 로딩한다.)

    4. 다음은 applicationContext.xml 를 설정한다. web.xml에 지정된 것 처럼 WEB-INF/conf/ 하위에 만들었다. 일단 여기까지;
    자세한 설명을 하려면 1-2시간은 해야할 것 같으므로.. (벌써 1시; 자야한다;;)
    여기서 일단 대략적인 설명을 마친다;

    호응이 좋으면;; 상세하게 설명할 예정;; ^^;

    신고
    Posted by 시난
    TAG Spring

    스프링 어노테이션 무난히 마치고
    하이버네이트 어노테이션을 설정하고 있었으나..

    문제가 생겨 이래저래 알아보던 차에
    겨우 찾은 사이트[link]에서 얻은 힌트

    Tweaking Hibernate and Spring

    Before we started this conversion, we were using only a Spring configuration file to get our Hibernate session factory. We didn't have a hibernate.cfg.xml file. Unfortunately, Spring doesn't yet know about Hibernate annotations, so we had to spread our configuration across two files. Here's our Spring configuration before we started the conversion:


    ㅠ_ㅠ 아직 방법이 없었던거야?




    신고
    Posted by 시난
    이미 많은 분들이 필요성을 느끼고
    작업을 했던 것 같다.

    일단 자료를 모아보자.

    1. Domain-based Scaffolding with Spring, Hibernate
    2. BeanFactoryPostProcessor
    3. Grails = Groovy + Spring + Hibernate

    3번은 프랑스쪽에서 누군가 RoR에 영감을 얻어 시작한 것 같다.
    제일 먼저 살펴봐야 겠다 ^^
    신고
    Posted by 시난
    TAG Grails, Spring
    최근 미니게임을 개발하는 중에, 서버 사이드를 개발할 필요가 있어서
    예전부터 미루어왔던' Hibernate를 ActiveRecord처럼 쓸 수 없을까?'하는 것에
    대해 살펴보았다.
    그 바람에 밤이 늦었지만..
    Friday Nigth!!!이므로 ^^; (아침엔 7시에 일어나지만 -.-;;;;;)

    Spring이랑 Hibernate를 조금 수정하면
    RoR처럼 쉽게 재밌고 판타스틱하게 될 수 있을텐데..
    스케폴드 기능부터 넣어야겠지만..


    참고로 찾은 자료들:

    1. Ruby ActiveRecord & Java Hibernate
    2. Implementing ActiveRecord in Java
    3. The Ruby vs. Java Experiment
    4. Rails and JPA (Instead of ActiveRecord) - 이건 JPA랑 관련된 것이지만..
    5. Hibernate vs ActiveRecord

    일단 이것만 읽어봤다.
    JRuby는 아직 어디까지 진행된 것인지 모르겠지만..
    업계에서는 JRuby를 쓰려면 몇년은 걸릴테니..
    Java랑 Hibernate를 사용하려고 한다.. ^^;

    덧:
    그냥 Ruby 호스팅으로 변경해버려? -.-; 아니면
    Ruby 호스팅도 신청해/ -.-;;;; 한 달 500원인데. ㅠㅠ
    신고
    Posted by 시난

    티스토리 툴바