Annotation(@)
스프링에서 AOP를 구현하기 위해 @Aspect 어노테이션 기반 방식을 사용하였습니다.
참고: https://velog.io/@gillog/Spring-Annotation-%EC%A0%95%EB%A6%AC
관점지향 프로그래밍(AOP_Aspect Oriented Programming)
객제지향 프로그래밍(OOP_Obect Oreinted Programming)을 더욱 발전시키기 위한 개념이다. 하나의 소프트웨어가 하나의 거대한 OOP로써 설계, 프로그래밍 되었다면 이것을 각 기능별로 모듈화 해서 분리 시키는 개념이다.
다시말해 AOP는 OOP를 보완하는 수단으로, 흩어진 Aspect를 모듈화 할 수 있는 프로그래밍 기법이다. 즉, 여러 곳에서 쓰이는 공통 기능을 모듈화하고, 쓰이는 곳에 필요할 때 연결함으로써, 유지 보수 혹은 재사용에 용이하도록 프로그래밍 하는 것이다.
AOP의 구성 요소
용어 | 설명 |
Aspect | (공통 기능) JointPoint(when) + PointCut(where) |
Advice | (Aspect의 기능 자체) 무엇(what)을 삽입할건지. <aop:before> : 메소드 실행 전에 advice실행 <aop:after-returning> : 정상적으로 메소드 실행 후에 advice 실행 <aop:after-throwing> : 메소드 실행중 exception 발생시 advice실행 <aop:after> : 메소드 실행중 exception 발생하여도 advice실행 <aop:around> : 메소드 실행 전/후 및 exception 발생시 advice실행 |
Joinpoint | (Advice를 적용해야 되는 부분_method) 횡단 관심(Crosscut Concern)을 삽입할 시점(when) i.e. 함수가 Before(실행 전), After(실행 후), AfterReturning(반환 후), AfterThrowing(예외 발생시), Around(실행 전과 후) |
Pointcut | (Joinpoint의 부분으로 실제로 Advice가 적용된 부분) 어떤 클래스의 어떤 함수에 삽입할건지. 삽입할 위치(where). |
Weaving | (Advice를 핵심 기능에 적용하는 행위) Aspect(when + where) + Advice(what). 위빙을 통해 지정된 객체를 새 Proxy 객체로 생성한다. |
Proxy | Crosscut Concern(횡단 관심)이 Core Concern(핵심 관심)에서 직접 실행되지 않고 Proxy(대리인)을 생성해 실행된다. |
참고:
https://greendreamtrre.tistory.com/601
https://yssa.tistory.com/entry/Java-%EC%8A%A4%ED%94%84%EB%A7%81Spring-AOPAspect-Oriented-Programming
스프링에서 Aspect를 사용하기 위해서는 몇가지 준비사항이 필요합니다.
그 다음 pom.xml에서 Aspect를 사용할 수 있도록 해줘야합니다.
<!-- AspectJ -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>${org.aspectj-version}</version>
</dependency>
쉽게 생각해서 JSP에서 jar파일을 사용하려면 lib폴더안에 필요한 jar파일을 넣어서 사용했다면 스프링에서는 jar파일을 사용하기 위해서는 pom.xml에 dependency로 입력해주기만 하면 됩니다.
이렇게 pom.xml에 추가된 내용이 정상적으로 반영되었는지 확인하기 위해서는 Maven Dependencies폴더 안에서 확인이 가능합니다.
테스트를 위해 polymorphism이라는 패키지를 생성했습니다.(생성위치 src/main/java)
SamsungTV.java
package polymorphism;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;
@Component("tv") //Annotation(id설정)
public class SamsungTV implements TV {
@Autowired
@Qualifier("apple")
private Speaker speaker;
//getter, setter
public SamsungTV() {
//파라미터가 없는 생성자.
}
public SamsungTV(Speaker speaker) {
this.speaker = speaker;
}
public Speaker getSpeaker() {
return speaker;
}
public void setSpeaker(Speaker speaker) {
this.speaker = speaker;
}
@Override
public void powerOn() {
System.out.println("SamsungTV 전원 켠다.");
}
@Override
public void powerOff() {
System.out.println("SamsungTV 전원 끈다.");
}
@Override
public void volumeUp() {
speaker.volumeUp();
}
@Override
public void volumeDown() {
speaker.volumeDown();
}
}
TV.java (인터페이스)
package polymorphism;
public interface TV {
public void powerOn();
public void powerOff();
public void volumeUp();
public void volumeDown();
}
Speaker.java (인터페이스)
package polymorphism;
public interface Speaker {
void volumeUp();
void volumeDown();
}
추가로 AppleSpeaker를 만들었습니다.
package polymorphism;
import org.springframework.stereotype.Component;
@Component("apple")
public class AppleSpeaker implements Speaker {
@Override
public void volumeUp() {
System.out.println("Apple Speaker 소리 올린다.");
}
@Override
public void volumeDown() {
System.out.println("Apple Speaker 소리 내린다.");
}
}
이제 컨트롤러로 이동하여 설정해줍니다.
AbstractApplicationContext factory = new GenericXmlApplicationContext("applicationContext.xml");
TV tv = (TV) factory.getBean("tv");
tv.powerOn();
tv.volumeUp();
tv.volumeDown();
tv.powerOff();
그 다음 applicationContext 파일을 작업해줍니다.
<context:component-scan base-package="polymorphism"/>
applicationContext 파일에서 이런식으로 context를 입력하게 되면 polymorphism이라는 패키지를 읽어 안에 있는 Annotation으로 설정된 것들을 스캔하겠다고 선언하는 것입니다.
그 다음 서버 가동을 시켜주면 콘솔창에
SamsungTV 전원 켠다.
Apple Speaker 소리 올린다.
Apple Speaker 소리 내린다.
SamsungTV 전원 끈다.
이런 식으로 값이 나온다면 성공~
어떤 방식으로 프로세스가 진행되는지는 이해가 되지만 아직까지는 AOP방식에 대해 와닿지는 않는 것 같다.
프로젝트 진행하고 스프링에 대해 더 공부를 하며 AOP방식에 대해 이해해봐야겠다.
'BackEnd > Spring' 카테고리의 다른 글
스프링 5일차(데이터베이스 단일 테이블에서 카테고리를 이용해 여러 게시판 사용하기) (0) | 2021.08.27 |
---|---|
스프링 4일차(CRUD_입력, 수정, 삭제, 조회) (0) | 2021.08.26 |
스프링 3일차(DB연결) (0) | 2021.08.25 |
스프링 1일차 (0) | 2021.08.23 |
스프링 시작전 준비단계 (0) | 2021.08.23 |