AOP란?


AOP의 개요와 용어

AOP의 특징 및 구현방식

Aspect와 SpringAOP설치


AOP의 개요와 용어

- 핵심기능(Core Concerns)

업무로직을 포함하는 기능이다.

- 부가기능(Cross-cutting Concerns)

로깅,보안등 부가기능이다.


객체지향의 기본 원칙을 적용하여도 핵심기능에서 부가기능을 분리해서 모듈화하는것은 어렵다.

하지만 AOP 개념을 적용하면 부가기능을 쉽게 분리할 수 있다.


AOP 개요

- 애플리케이션에서의 관심사의 분리(기능의분리)를 말한다.

- 즉, 핵심적인 기능에서 부가적인 기능을 분리하는 것.

- 분리한 부가기능을 애스펙트(Aspect)라는 독특한 모듈형태로 만들어서 설계하고 개발하는 방법이다.

- OOP를 적용하여 핵심기능에서 부가기능을 쉽게 분리된 모듈로 작성하기 어려운 문제점을 AOP가 해결해준다.

- 핵심기능과 부가기능을 분리하여 객체지향적인 가치를 지킬수 있도록 도와주는 개념이다.


Aspect란?

- 부가기능을 정의한 코드 어드바이스이다.(Advice와 어디바이스를 어디에 적용할지 정하는 포인트컷(PointCut)을 합친개념)

- Advice + PointCut = Aspect

- 핵심기능 코드 사이에 침투된 부가기능을 독립적인 애스펙트로 구분가능하다.

- 런타임시점에 필요한 부분에 동적으로 참여하게 가능이다.


AOP용어

- 타겟Target(핵심기능)

핵심기능을 담고 있는 모듈로, 타겟은 부가기능을 부여할 대상이 된다.

- 어드바이스(Advice)

어드바이스는 타겟에 제공할 부가기능을 담고 있는 모듈이다.

- 조인 포인트(Join Point)

어드바이스가 적용될 수 있는 위치를 말한다.

즉, 타겟 객체가 구현한 인터페이스의 모든 메서드는 조인 포인트가된다.

- 포인트 컷(PointCut)

어드바이스를 적용할 타겟의 메서드를 선별하는 정규표현식이다.

포인트컷 표현식은 execution으로 시작하고, 메서드의 Signature를 비교하는 방법을 주로 이용한다.

- 애스펙트(aspect)

애스펙트는 AOP의 기본 모듈이다.

애스펙트 = 어드바이스 + 포인트컷

애스펙트는 싱글톤 형태의 객체로 존재한다.

- 어드바이저(Advisor)

어드바이저 = 어드바이스 + 포인트컷

어드바이저는 Spring AOP에서만 사용되는 특별한 용어이다.

- 위빙(Weaving)

위빙은 포인트컷에 의해서 결정된 카겟의 조인포인트에 부가기능(어드바이스)를 삽입하는과정이다.

위빙은 AOP가 핵심기능(타겟)의 코드에 영향을 주지않으면서 필요한 부가기능(어드바이스)을 추가할 수 

있도록 해주는 핵심적인 처리과정이다.


기존(핵심,부가기능이 같이잇음)

한 로직 안에 PrimaryConcern,(핵심기능),Cross_cutting(부가기능) 두가지 모두 같이 있다

ex)로그인체크(부가기능), 회원리스트가져오기(핵심기능)


AOP

Weaving(핵심기능에 적용하는과정)

Pointcout (advice를 적용할 대상을 선별하는식) --------------> PrimaryConcern(핵심기능)

↑(advice)<=부가기능지칭

Cross_cutting(부가기능)


위에 Pointcut+advice = Aspect


로그인체크와 회원리스트가져오기를 분리한다.

회원리스트가져오기(핵심기능)

로그인체크(부가기능)

두가지로 분리하게된다.


Spring AOP의 특징

- Spring은 프록시(Proxy)기반 AOP를 지원한다.

타겟객체에 대한 프록시를 만들어 제공한다.

타겟을 감싸는 프록시는 실행시간(runTime)에 생성된다.

프록시는 어드바이스를 타겟객체에 적용하면서 생성되는 객체이다.    

- 프록시(Proxy)가 호출을 가로챈다.

프록시는 타겟 객체에 대한 호출을 가로챈 다음 어드바이스의 부가기능 로직을 수행하고

난 후에 타겟의 핵심기능 로직을 호출한다.(전처리 어드바이스)

또는 타겟의 핵심기능 로직 메서드를 호출한 후에 부가기능(어드바이스)를 수행하는 경우도 있다.(후처리어드바이스)


- 메서드 조인 포인트만 지원한다.

Spring은 동적 프록시를 기반으로 AOP를 구현하므로 메서드 조인 포인트만 지원한다.

즉, 핵심기능(타겟)의 메서드가 호출되는 런타임 시점에만 부가기능(어드바이스)을 적용할 수 있다.

반면에 AspectJ 같은 고급 AOP 프레임워크를 사용하면

객체의 생성, 필드값의 조회와 조작,static메서드 호출 및 초기화 등의 다양한 작업에 부가기능을 적용할 수 있다.


Spring AOP의 구현방식

XML의 기반의 POJO 클래스를 이용한 AOP구현

-부가기능을 제공하는 Advice클래스를 작성한다.

-XML 설정 파일에 Maop:config>를 이용해서 애스펙트를 설정한다.

(즉,어드바이스와 포인트컷을 설정함)

@Aspect 어노테이션을 이용한AOP 구현

-@Aspect어노테이션을 이용해서 부가기능을 제공하는 Aspect클래스를 작성한다.

Aspect클래스는 어드바이스를 구현하는 메서드와 포인트컷을 포함한다.

-XML설정파일에 (aop:aspectj-autoproxy />를 설정한다.



AspectJ와 SpringAOP 라이브러리 설치

Pom.xml에 추가



jdbc환경설정(mysql)이란?


JDBC 실행

실행전 환경설정(드라이버설치,라이브러리설치,Bean설정)


pom.xml(mysql과Spring-jdbc추가)




프로퍼티파일에 추가하기.


bean.xml에 추가하기.


Test 클래스 코드작성.


연결된것 확인방법.

콘솔로그에 com.mysql.jdbc.JDBC4Connection@31368b99 출력되는 것 확인한다.

데이터엑세스개념(jdbc,springjdbc)이란?


데이터엑세스공통개념

SpringJDBC


DAO(data access Object)패턴

- 데이터 액세스 계층은 DAO 패턴을 적용하여 비지니스 로직과 데이터엑세스 로직을 분리하는것이 원칙이다.

- 비지니스로직이 단순하다면 DAO와 Service를 통합할수도있지만 비지니스로직을 가지고있다면 반드시 분리한다.

- 서비스계층에 영향을 주지않고 데이터엑세스 가능하다.


컨넥션 풀링을 지원하는 DataSource

컨넥션풀링이란?

-미리정해진 개수만큼의 DB 컨넥션을 풀(Pool)에 준비해두고, 애플리케이션이 요청할때마나 꺼내서 할당하고 돌려받아 Pool에 넣는 기법이다.

다중사용자를 갖는 엔터프라이즈시스템 즉 웹어플리케이션에서는 반드시 DB컨넥션 풀링 기능을 지원하는DataSource를 사용해한다.

(실제 SQL실행시간보다 컨넥션객체 생성시간이 더걸리게됌)

스프링에서는 DataSource를 공유가능한 SpringBean으로 등록해 주어 사용할 수 있도록 해준다.


DataSource 구현클래스 종류

테스트환경을 위한DataSource

-SimpleDriverDataSource

스프링이 제공하는 가장 단순한 DataSource구현클래스이다.

getConnection()을 호출할 때마다 배번 DB 컨넥션을 새로만들고 따로 풀(pool)을 관리하지 않으므로

단순한 테스트용으로만 사용해야 한다.

-SingleConnectionDriverDataSource

순차적으로 진행되는 통합테스트에서는 사용가능하다.(멀티스레드 적합하지않음)

매번 생성하지않게때문에 SimpleDriverDataSource보단 빠르다.


DataSource종류

오픈소스 DataSource

-Apache Commons DBCP

가장유명한 오픈소스 DB커넥션 풀 라이브러리이다.

-c3p0 jdbc

c3p0는 jdbc3.0 스펙을 준수하는 Connection 과 Statement풀(pool)을 제공하는 라이브러리 이다.


두가지 모두 수정자(setter)메서드 제공 SpringBean으로 등록해서 사용하기편리하다.



JDBC란?

- 모든 자바의 데이터 액세스 기술의 근간이된다.

- 엔티티클래스와 애노테이션을 이용하는 최신 ORM기술이다.(Mybatis,hibernate등)

내부적으로는DB와 연동을 위해 JDBC를 이용한다.

- 안정적이고 유연한 기술이지만, 로우레벨기술이다.

    (WHY? 중복된 코드가 반복적으로 사용,DB에따라 일관성없는 정보를 가진채로 Checked Exception로 처리)



SpringJDBC란?

- JDBC의 장점과 단순성을 그대로 유지하면서도 기존JDBC의 단점을 극복한다.

- 단순한,간결한 형태의 API사용법을 제공한다.

- JDBCAPI에서 지원되지않는 편리한기능이다.

즉, JDBC를 개발자들이 사용하기쉽게 만든라이브러리


반복해야하는 작업을 대신 처리해준다.(실행할 SQL정의,실행될시 바인딩될 파라미터,넘겨받을 객체만설정해주면된다)

사용하려면 먼저 DB컨넥션을 가져오는 DataSource를 Bean으로 등록한후 사용해야한다.



Spring JDBC가해주는 작업

- Connection열기와 닫기

예외발생해도 Connection을 닫아준다.

- statement준비와 닫기

SQL정보가 담기는 Statement또는 PreparedStatement를 생성하고 필요한 준비작업을 해주는것도 해준다.

statement도 알아서 닫아준다.

- statament실행

sql던지고 다양한객체로 받아올수있게해준다.

- ResultSetLoop처리

ResultSet에 담김 쿼리 실행결과가 한건 이상이면 ResultSet루프를 만들어 반복해준다.

- Exception 처리와 반환

작업중 발생되는 모든 예외는 SpringJDBC예외변환기가 처리해준다.

즉 DataAccessException타입으로 변환해준다.

jdbc는 반드시 맞는 예외처리를 해주어야하는데 SpringJDBC는 안해도된다.

- Transaction처리

transaction와 관련된 작업을 알아서해준다.(커밋,롤백)


jdbcTemplate클래스

SpringJDBC의 모든 기능을 최대한 활용할 수 있는 유연성을 제공한다.

- 실행,조회,배치 세가지 작업이 있다.

실행

-INSERT UPDATE

조회

-SELECT

배치

-여러개의 쿼리를 한꺼번에 수행하게해준다.


JdbcTemplate클래스생성

- DataSource는 보통 Bean으로 등록해서 사용하므로 jdbcTemplate이 필요한 DAO클래스에서 DataSourceBean을 DI받아서

jdbcTemplate을 생성할때 인자로 넘겨주면된다.

- 멀티스레드환경해서도 안전하게사용가능하다.


업데이트 메서드

파라미터갯수는 가변인자(한개든 여러개든)가능하다.

결과값은 반영된 갯수이다.



queryForObject()메서드 (SELECT)

여러개의 칼럼,한개의 로우로 반환될때 사용한다.


query()

여러개의 칼럼,여러개의 로우로 반환될때 사용한다.



+ Recent posts