소프트웨어공학

AOP_관점 지향 프로그래밍, Advice, Target, Joinpoint, Pointcut, Weaving, Spring 스프링

스윙스윙 2021. 11. 15. 16:57

▣ AOP(Aspect Oriented Programming)_관점 지향 프로그래밍, Advice, Target, Joinpoint, Pointcut, Weaving, Spring 스프링

기능을 핵심 비즈니스 로직과 공통 모듈로 구분하고 핵심 로직에 영향을 미치지 않고 사이사이에 공통 모듈을 효과적으로 잘 끼워 넣어 중복성을 감소시킬 수 있는 개발 방법

 

■ AOP 목적 및 장점

  • "중복을 줄여서 적은 코드 수정으로 전체 변경을 할 수 있게하자"라는 목적에서 출발
  • AOP의 필요성을 이해하는 가장 기초가 되는 개념은 '관심의 분리(Separation of Concerns)' 임
  • 핵심관점(업무로직) + 횡단관점(트랜잭션/로그/보안/인증 처리 등) 으로 관심의 분리를 실현
  • 중복되는 코드 제거, 효율적인 유지보수, 높은 생산성, 재활용성 극대화, 변화 수용이 용이 등의 장점

 

구분 내용

 Advice

Joinpoint에서 실행되어야 하는 프로그램 코드
독립된 클래스의 메소드로 작성함
실질적으로 어떤 일을 해야할 지에 대한 것, 실질적인 부가기능을 담은 구현체
관심사를 구현한 소스코드
BEFORE, AROUND, AFTER의 실행 위치 지정

Joinpoint

메소드를 호출하는 '시점', 예외가 발생하는 '시점'과 같이 애플리케이션을 실행할 때 특정 작업이 실행되는 '시점'을 의미
Advice를 적용할 수 있는 후보 지점 혹은 호출 이벤트
Advice가 적용될 위치, 끼어들 수 있는 지점. 메서드 진입 지점, 생성자 호출 시점, 필드에서 값을 꺼내올 때 등 다양한 시점에 적용가능
관심사를 구현한 코드를 끼워 넣을 수 있는 프로그램의 이벤트를 말하며, 예로는 call events, execution events, initialization events 등이 있음

Pointcut

여러 Joinpoint의 집합체로 언제 Advice를 실행할지를 정의
Target 클래스와 Advice가 결합(Weaving)될 때 둘 사이의 결합규칙을 정의
예로 Advice가 실행된 Target의 특정 메소드등을 지정
JoinPoint의 상세한 스펙을 정의한 것. 'A란 메서드의 진입 시점에 호출할 것'과 같이 더욱 구체적으로 Advice가 실행될 지점을 정할 수 있음
관심사가 주프로그램의 어디에 횡단될 것인지를 지정하는 문장이며, 에로는 before call(public void update*(...))등이 있음

Target

실질적인 비지니스 로직을 구현하고 있는 코드
핵심관점에 해당함 (업무로직)

Aspect

Advice + Pointcut
즉 일정한 패턴을 가지는 클래스에 Advice를 적용하도록 지원할 수 있는 것을 Aspect

Weaving

Aspect를 해당 지점에 주입하는 과정
AOP에서 Joinpoint들을 Advice로 감싸는 과정을 Weaving

Weaving 하는 작업을 도와주는 것이 AOP 툴이 하는 역할

 

 

■ JoinPoint Interface

어드바이스 메소드를 의미 있게 구현하려면 클라이언트가 호출한 비즈니스 메소드의 정보가 필요함

스프링에서는 어떤 메소드에서 어떤 동작이 이루어졌는지 알수 있도록 JoinPoint 인터페이스를 제공

 

  메소드 명    설명 
JoinPoint.getThis( ) AOP 프록시 객체를 반환한다.
JoinPoint.getTarget( ) AOP가 적용된 대상 객체를 반환한다. 프록시가 벗겨진 상태의 객체이다.
JoinPoint.getArgs( ) JointPoint에 전단된 인자를 배열로 반환한다. (인자는 AOP 를 사용하는 메소드의 인자를 말함)
JoinPoint.getKind( ) 어떤 종류의 JoinPoint인지 문자열로 반환한다. 보통은 메소드 호출이므로 "method-execution"
JoinPoint.getSignature( ) Signature 객체 반환
getName( ) JointPoint의 이름을 반환한다. 메소드 JoinPoint이면 메소드 이름
getDeclaringType( ) JointPoint를 선언하고 있는 타입을 반환한다. 즉, JoinPoint가 메소드이면, 해당 메소드의 클래스를 반환한다.
getDeclaringTypeName( ) JoinPoint를 선언하고 있는 타입의 이름을 반환한다. 
즉, JoinPoint가 메소드이면, 해당 메소드의 클래스 이름을 반환한다.
Signature를 상속받은 MethodSignature 인터페이스의 구현체인 경우, 조인 포인트로 지정된 메소드를 바로 받을 수 있다.
MethodSignature.getMethod( ) JoinPoint가 메소드일 경우 해당 JoinPoint에 대한 java.lang.reflect.Method 객체 확보하기

 

* 예제

public class BeforeAdvice {

          public void beforeLog(JoinPoint jp) {

                    String method = jp.getSignature().getName();

                    Object[] args = jp.getArgs();

 

                    System.out.println(생략...);

          }

}

 

■ 스프링 AOP특징

  • 프록시 패턴 기반의 AOP 구현체, 프록시 객체를 쓰는 이유는 접근 제어 및 부가기능을 추가하기 위해서임
  • 스프링 빈에만 AOP를 적용 가능
  • 모든 AOP 기능을 제공하는 것이 아닌 스프링 IoC와 연동하여 엔터프라이즈 애플리케이션에서 가장 흔한 문제(중복코드, 프록시 클래스 작성의 번거로움, 객체들 간 관계 복잡도 증가 ...)에 대한 해결책을 지원하는 것이 목적

■ 어드바이스(Advice) 동작시점에 따른 세분화

@Before (이전) : 메소드 실행전에 실행됨

@After (이후) : 메서드 실행후에 실행됨

@AfterReturning (정상적 반환 이후) : 메소드 실행 후 정상 종료시 삽입

@AfterThrowing (예외 발생 이후) : 메서드 실행 후 예외 발생 시 삽입

@Around (메소드 실행 전후,예외) : 메서드 실행 전과 실행 후, 예외 발생시에도 삽입

 

 


2021년 34번

정답 : 1번

@Before (이전) : 메소드 실행전에 실행됨

@After (이후) : 메서드 실행후에 실행됨

@AfterReturning (정상적 반환 이후) : 메소드 실행 후 정상 종료시 삽입

@AfterThrowing (예외 발생 이후) : 메서드 실행 후 예외 발생 시 삽입

@Around (메소드 실행 전후,예외) : 메서드 실행 전과 실행 후, 예외 발생시에도 삽입

 

 


2012년 29번

정답 : 3번

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

  • "중복을 줄여서 적은 코드 수정으로 전체 변경을 할 수 있게하자"라는 목적에서 출발
  • AOP의 필요성을 이해하는 가장 기초가 되는 개념은 '관심의 분리(Separation of Concerns)' 임
  • 핵심관점(업무로직) + 횡단관점(트랜잭션/로그/보안/인증 처리 등) 으로 관심의 분리를 실현
  • 중복되는 코드 제거, 효율적인 유지보수, 높은 생산성, 재활용성 극대화, 변화 수용이 용이 등의 장점

 


2013년 33번

정답 : 2번

Spring 프레임워크 개념

자바 플랫폼을 위한 오픈소스 애플리케이션 프레임워크로서 동적인 웹 사이트를 개발하기 위한 여러가지 서비스를 제공하고 있으며 전자정부 표준프레임워크의 기반 기술로서 사용되고 있음

▶ 특징

- 경량 컨테이너로 자바 객체를 직접 관리

- POJO(Plain Old Java Object)방식의 프레임워크

- 제어 반전(IoC: Inversion of Control)을 지원

- 의존성 주입(DI : Dependency injection)을 지원

- 관점 지행 프로그래밍(AOP)을 지원

- 영속성과 관련된 다양한 서비스를 지원

- 확장성이 높음

 


2014년 29번

정답 : 4번

 

구분 내용

 Advice

Joinpoint에서 실행되어야 하는 프로그램 코드
독립된 클래스의 메소드로 작성함
실질적으로 어떤 일을 해야할 지에 대한 것, 실질적인 부가기능을 담은 구현체
관심사를 구현한 소스코드
BEFORE, AROUND, AFTER의 실행 위치 지정

Joinpoint

메소드를 호출하는 '시점', 예외가 발생하는 '시점'과 같이 애플리케이션을 실행할 때 특정 작업이 실행되는 '시점'을 의미
Advice를 적용할 수 있는 후보 지점 혹은 호출 이벤트
Advice가 적용될 위치, 끼어들 수 있는 지점. 메서드 진입 지점, 생성자 호출 시점, 필드에서 값을 꺼내올 때 등 다양한 시점에 적용가능
관심사를 구현한 코드를 끼워 넣을 수 있는 프로그램의 이벤트를 말하며, 예로는 call events, execution events, initialization events 등이 있음

Pointcut

여러 Joinpoint의 집합체로 언제 Advice를 실행할지를 정의
Target 클래스와 Advice가 결합(Weaving)될 때 둘 사이의 결합규칙을 정의
예로 Advice가 실행된 Target의 특정 메소드등을 지정
JoinPoint의 상세한 스펙을 정의한 것. 'A란 메서드의 진입 시점에 호출할 것'과 같이 더욱 구체적으로 Advice가 실행될 지점을 정할 수 있음
관심사가 주프로그램의 어디에 횡단될 것인지를 지정하는 문장이며, 에로는 before call(public void update*(...))등이 있음

 

 


2015년 29번

정답 : 1번

의존성 주입(DI, Dependency Injection)은 프로그램밍에서 구성요소간의 의존 관계가 소스코드 내부가 아닌 외부의 설정파일 등을 통해 정의되게 하는 디자인 패턴 중의 하나임

의존성 주입의 이점으로는 의존 관계 설정이 컴파일시가 아닌 실행시에 이루어져 모듈들간의 결합도를 낮출 수 있고, 코드 재사용율을 높여서 작성된 모듈을 여러 곳에서 소스코드의 수정없이 사용할 수 있으며, 모의 객체 등을 이용한 단위 테스트의 편의성을 높여줄 수 있음

 

스프링 프레임워크(Spring Framework)는 자바 플랫폼을 위한 오픈소스 애플리케이션 프레임워크로서 동적인 웹 사이트를 개발하기 위한 여러가지 서비스를 제공하고 있음

공공기관 웹 서비스 개발시 사용을 권장하고 있는 전자정부 표준프레임워크의 기반 기술임

 

  • POJO(Plain Old Java Object) 방식: POJO는 Java EE의 EJB 를 사용하면서 해당 플랫폼에 종속되어 있는 무거운 객체들을 만드는 것에 반발하며 나타난 용어다. 별도의 프레임워크 없이 Java EE를 사용할 때에 비해 특정 인터페이스를 직접 구현하거나 상속받을 필요가 없어 기존 라이브러리를 지원하기가 용이하고, 객체가 가볍다.
  • 관점 지향 프로그래밍(Aspect Oriented Programming, AOP): 로깅, 트랜잭션, 보안 등 여러 모듈에서 공통적으로 사용하는 기능을 분리하여 관리할 수 있다. AspectJ를 포함하여 사용할 수 있고, 스프링에서 지원하는 실행에 조합하는 방식도 지원한다. 이 분리관리한다는게 개념이 처음에 이해해기가 어려운데, 추상/부모/클래스나 인터페이스로 관리된다는게 아니라 모듈을 관리해주는 모듈을 상하/인터페이스 관계없이 따로 마련한다는 개념에 가깝다. 더 쉽게 이야기하자면 군대에서 보급품을 받는다고 가정하자. 상급부대(연대, 사단)에서 보급품을 내려받는게 아니라. 국군복지단이나/군수사령부 아저씨가 직접 가져오는것을 생각해보면 쉽다. 당연히 군수사령부 여하부대 아저씨도 대대소속이므로 상하관계가 없지만 보급품에 한해서만 배부해주는 것이다. 전공자들을 위해서 더 쉽게 설명하자면 C언어에서는 중복할당을 줄이기 위해서 간접적으로 값을 가리키는 포인터로 가리키는데, Spring에서는 반복할당을 줄이기 위해 포인터를 대신하여 스프링 어노테이션을 사용하는 것이라고 보면 된다.
  • 의존성 주입(Dependency Injection, DI): 프로그래밍에서 구성요소 간의 의존 관계가 소스코드 내부가 아닌 외부에서 설정을 통해 정의되는 방식이다. 코드 재사용을 높여 소스코드를 다양한 곳에 사용할 수 있으며 모듈간의 결합도도 낮출 수 있다. 계층, 서비스 간에 의존성이 존재하는 경우 스프링 프레임워크가 서로 연결시켜준다.
  • 제어 역전(Inversion of Control, IoC): 전통적인 프로그래밍에서는 개발자가 작성한 프로그램이 외부 라이브러리의 코드를 호출해서 이용했다. 제어 역전은 이와 반대로 외부 라이브러리 코드가 개발자의 코드를 호출하게 된다. 즉, 제어권이 프레임워크에게 있어 필요에 따라 스프링 프레임워크가 사용자의 코드를 호출한다.
  • 생명주기 관리: 스프링 프레임워크는 Java 객체의 생성, 소멸을 직접 관리하며 필요한 객체만 사용할 수 있다.

 


2017년 37번

정답 : 1번

@SessionBean은 없음

 

@Controller 해당 클래스가 Controller임을 나타내기 위한 어노테이션
@Service 해당 클래스가 비즈니스 로직이 구현된 Service임을 나타내기 위한 어노테이션
@Repository 데이터 핸들링을 위한 DAO에 사용되며 DB Exception을 DataAccessException으로 변환
@RequestMapping 요청에 대해 어떤 Controller, 어떤 메소드가 처리할지를 맵핑하기 위한 어노테이션
@RequestParam Controller 메소드의 파라미터와 웹요청 파라미터와 맵핑하기 위한 어노테이션
@Required 필수 프로퍼티임을 명시하는 어노테이션, 필수 프로퍼티를 설정하지 않을 경우 빈 생성시 예외 발생
@RequestPart Multipart 요청의 경우, 웹요청 파라미터와 맵핑가능한 어노테이션
@ControllerAdvice Controller를 보조하는 어노테이션으로 Controller에서 쓰이는 공통기능들을 모듈화하여 전역으로 쓰기 위한 어노테이션

 


2020년 43번

정답 : 1번

구분 내용

 Advice

Joinpoint에서 실행되어야 하는 프로그램 코드
독립된 클래스의 메소드로 작성함
실질적으로 어떤 일을 해야할 지에 대한 것, 실질적인 부가기능을 담은 구현체
관심사를 구현한 소스코드
BEFORE, AROUND, AFTER의 실행 위치 지정

Joinpoint

메소드를 호출하는 '시점', 예외가 발생하는 '시점'과 같이 애플리케이션을 실행할 때 특정 작업이 실행되는 '시점'을 의미
Advice를 적용할 수 있는 후보 지점 혹은 호출 이벤트
Advice가 적용될 위치, 끼어들 수 있는 지점. 메서드 진입 지점, 생성자 호출 시점, 필드에서 값을 꺼내올 때 등 다양한 시점에 적용가능
관심사를 구현한 코드를 끼워 넣을 수 있는 프로그램의 이벤트를 말하며, 예로는 call events, execution events, initialization events 등이 있음

Pointcut

여러 Joinpoint의 집합체로 언제 Advice를 실행할지를 정의
Target 클래스와 Advice가 결합(Weaving)될 때 둘 사이의 결합규칙을 정의
예로 Advice가 실행된 Target의 특정 메소드등을 지정
JoinPoint의 상세한 스펙을 정의한 것. 'A란 메서드의 진입 시점에 호출할 것'과 같이 더욱 구체적으로 Advice가 실행될 지점을 정할 수 있음
관심사가 주프로그램의 어디에 횡단될 것인지를 지정하는 문장이며, 에로는 before call(public void update*(...))등이 있음

Target

실질적인 비지니스 로직을 구현하고 있는 코드
핵심관점에 해당함 (업무로직)

Aspect

Advice + Pointcut
즉 일정한 패턴을 가지는 클래스에 Advice를 적용하도록 지원할 수 있는 것을 Aspect

Weaving

Aspect를 해당 지점에 주입하는 과정
AOP에서 Joinpoint들을 Advice로 감싸는 과정을 Weaving

Weaving 하는 작업을 도와주는 것이 AOP 툴이 하는 역할