본문 바로가기

IT/Spring + iBatis

2013.04.08. Spring-1 기초, DI, AOP, 프록시



 2013.04.08. Spring-1 기초, DI, AOP, 프록시


스프링의 핵심기술

- DI / AOI / MVC


Model 1. 설계방식

- JSP or JSP+JavaBean을 활용하여 개발

- 모델2에서의 Controller 개념이 모호

- pros : 개발속도가 빠르고, 요구되는 기술숙련도 낮음

- cons : JSP가 너무 많은 일을 담당(presentation logic + business logic)

            로직의 혼재로 인해 개발과 디자인의 작업분리가 어려움

            JSP코드의 복잡도로 인해 유지보수가 어려워짐


Model 2. 설계방식 (MVC방식)

- Application을 Model / View / Controller로 분리하는 방식

- 1) Model : Business Logic을 담당 – Java Bean

- 2) View : Client를 위한 응답을 처리함 – JSP or Html

- 3) Controller : Model과 View의 사이에서 조정 – Servlet

① Browser로부터 request를 받음

② Business Logic을 호출하여 작업을 수행하도록 지시

③ Viewer에게 fowarding하여 결과를 출력하도록 지시

- pros : PL과 BL의 분ㄹ로 인한 개발 / 디자인 작업의 분리, 코드의 명료화와 유지보수의 간편화

- cons : 아키텍쳐 디자인을 위한 개발 초기단계 소요시간 증가, MVC구조에 대한 추가지식이 요구됨


라이브러리와 프레임워크의 차이점

- 라이브러리는 개발과정에서 개발자의 필요에 따라 자율적으로 적용하는 추가기술

- 프레임워크는 아예 짜여진 프로세스의 과정을 제시함으로써 개발의 부담을 덜어줌


 스프링(Spring)이란?

- Rod Johnson 창시 : 《 J2EE Development without EJB, 2004 》

- 기존 EJB의 대체를 위해 개발됨 : EJB로 수행되던 모든 기능을 일반POJO(Plain Old Java Object)만으로 가능케함

- 주요개념 : DI – 의존성 주입(lightweight Dependency Injection)

                  AOP – 관점 지향 프로그래밍(Aspect-Oriented Programming)

- 장점 :1) DI와 AOP의 지원

2) POJO(Plain Old Java Object) 지원 : 기존 EJB기반에서 사용했던 JavaBean 객체들 호환가능

3) Transaction처리를 위한 일관된 방법을 제공

4) JDBC를 위한 다양한 API 지원, 타 API와의 연동을 지원


Getting Started!

- 이클립스Indigo, Help탭 → Install New Software..항목 선택, 사이트명으로 ‘http://springide.org/updatesite’ 입력 후 목록에서 core체크 후 설치

- Java Project 생성 후 우클릭 → Build Path → Libraries탭 → Add External JARs 선택하여 JAR파일 추가


의존성 주입 (Dependency Injection, DI)

- 기존에는 클래스의 메서드를 사용하려면 해당 클래스의 객체가 생성되어있어야 했다.

   이 때문에 필연적으로 메서드가 존재하는 클래스와 로직을 수행하는 서비스 클래스 간 높은 결합도가 동반되며,

   이는 곧 작은 수정 하나가 프로젝트 전체의 코드를 변경해야하는 결과를 가져오기 쉽다.

- 메서드 클래스와 서비스 클래스 간 객체를 넘겨주는 작업을 해당 클래스끼리가 아닌 외부의 조립기(Assembler)

   메서드 클래스 간의 작업으로 일임함으로써, 메서드 클래스와 서비스 클래스의 결합도를 낮추거나 혹은 제거할 수 있다.

- 의존(dependency)하는 객체를 조립기가 삽입해주기 때문에 이 방식을 DI(Dependency Injection) 패턴이라 부른다.


Spring Container의 종류

- Bean객체를 생성/저장 및 관리하고 각 객체간의 의존관계를 관리해주는 역할을 수행. 설정파일로 XML을 사용한다.

- BeanFactory : 객체 관리 및 의존관계 설정 등의 기능을 제공하는 기본 컨테이너.

- ApplicationContext : BeanFactory의 기능에 AOP, 메시지, 국제화 등을 추가로 지원하는 컨테이너.

- WebApplicationContext : WebApplication용 컨테이너. WebApplication당 하나씩 생성된다.


BeanFactory) 생성자(Constructor)를 통한 객체의 주입

- 생성자를 통해 객체의 의존성을 주입하므로 해당 클래스에 넘겨줄 클래스의 Bean객체와 같은 타입의 멤버변수가

   우선 생성되어있어야 하고, 넘겨받은 Bean객체를 초기화하는 생성자 메서드가 존재해야한다.

- 설정파일에서 <bean>태그로 객체를 생성한 다음, <constructor-arg>태그의 ref속성에 주입할 객체의 BeanId를

   넣어줌으로써 해당 Bean객체에 Constructor방식으로 의존성 주입이 완료된다.


 


BeanFactory) Property(setter메서드)를 통한 객체의 주입

- setter메서드를 통해 객체의 의존성을 주입하는 방식. Bean객체와 같은 타입의 멤버변수가 존재해야함은 동일하다.

   여기에 더해 넘겨받은 Bean객체를 초기화하는 setter메서드를 설정해준다.

- 마찬가지로 <bean>태그로 객체를 생성한 다음 <property>태그의 name속성에 setter메서드로 초기화되는 멤버변수명,

   ref속성에 주입할 객체의 BeanId를 넣어줌으로써 해당 Bean객체에 Property방식으로 의존성 주입이 완료된다.



Main클래스 메서드 실행


관점 지향 프로그래밍 (Aspect Oriented Programming)

- 이슈를 바라보는 관점을 기준으로 프로그래밍 하는 기법. 개별적인 로직을 구분하는 핵심관심사항과 프로그램 전반에 걸쳐

   공통으로 적용되는 로직인 공통관심사항으로 분리적용함으로써 프로젝트가 커져감에 따라 과도하게 늘어나는 중복되는

   코드를 줄이거나 혹은 제거할 수 있으며, 이를 통해서 전반적인 유지보수관리비용을 크게 줄일 수 있다.

- 핵심관심사항(core concern)과 공통관심사항(cross-cutting concern)

   핵심관심사항 : 개개의 Business Logic에서 각 BL을 특정지어주는 해당 BL만의 작업.

   공통관심사항 : BL의 종류에 상관없이 공통적으로 요구되는 작업.


Spring AOP의 용어 개요

- Aspect (what) : 여러 객체에서 공통으로 적용되는 공통관심사항. (ex: 트랜잭션, 로그인, 보안)

- JoinPoint (who) : 각 BL에서 공통관심사항(Aspect)이 적용될 수 있는 지점. (ex: 메서드, 필드)

- PointCut (whos) : Aspect들이 적용될 JoinPoint들의 그룹.

- Advice (when) : 어느 시점에 Aspect를 적용할지 정의한 것. (ex: before, after, around 등)

- Advisor : 어떤 Aspect를 어떤 PointCut에 적용할지에 대한 통합설정. xml설정파일에서 <aop:config>태그로 표현됨.


AOP 1) Aspect

- 기본적으로 모든 클래스가 Aspect의 대상이 될 수 있다.

- ref속성으로 Aspect로 삼고자 하는 클래스의 id나 name을 입력한다.


AOP 2) Pointcut : expression

- Aspect가 적용될 위치를 expression속성에 고유 형태를 지니는 표현식을 입력함으로써 설정해준다.

- 표현식의 기본Form : “명시자(접근제어자 리턴타입 패키지패턴 클래스명패턴 (패러미터패턴))”

- *로 하나의 대상을 표현할 수 있으며, ..으로 0개 이상의 대상을 표현할 수 있다.

- 교재 p181 : chap07 ‘AspectJ의 PointCut표현식’의 예제목록을 참고할 것.


AOP 3) Around (+ after, before 등)

- 핵심로직이 호출되기 전과 후 각각 원하는 공통관심사항을 할당할 수 있기 때문에 Advice 중 가장 많이 쓰임.

- <aop:Aspect>태그의 하위요소로 위치하며 pointcut-ref속성의 값으로 Pointcut을 할당하고, method속성의 값으로

   클래스 내 공통관심사항으로 적용할 메서드를 호출함으로써 AOP의 설정이 완성된다.

   Aspect메서드는 반드시 인자로 ProceedingJoinPoint객체를 가지며, 해당 객체를 proceed()메서드로 호출하는 시점

   전후로 핵심로직이 호출되기 전에 적용할 공통로직, 핵심로직이 처리된 후 적용할 공통로직을 구분할 수 있다.