일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- SpringSecurity 로그인
- 연산자
- 자바의정석
- @PreAuthorize("isAuthenticated()")
- 논리 연산자
- StringBuffer
- java
- 객체지향
- 산술 연산자
- 친절한 SQL 튜닝
- 인텔리제이 Web 애플리케이션
- SQL 튜닝
- 이클립스 설치
- 예약어
- 반복문
- SQL튜닝
- SQL
- 객체
- 상속
- 식별자
- 비교 연산자
- spring 게시판 삭제
- 오버라이딩
- 스프링시큐리티 로그아웃
- 함수
- 배열
- 오버로딩
- SpringSecurity 로그아웃
- join
- 친절한 SQL
Archives
- Today
- Total
gi_dor
Spring AOP 본문
관점 지향 프로그래밍 , 공통관심사의 분리
💡AOP
여러클래스에 분산되고 중복되어있는 공통 관심사항을 별도의 모듈로 작성해서 핵심관심 사항과 분리시킨다
여러 공통 관심사항을 AOP를 활용하면 기존의 비즈니스 로직에 영향을 주지않고
모듈화된 공통관심사항을 적용할 수 있다
1. 직접 코드를 추가하지 않아도 코드를 추가한 것처럼 실행되는 것
2. 추가할 코드를 따로 분리해서 작성해놓고 기존 비즈니스 로직에 영향을 주지않게그 코드가 마치 추가된 것처럼 하려고 하는 게 AOP다.
어노테이션과 XML 비교
AOP 적용 전 과 적용 후
AOP 적용 전
package com.smple.services;
public class UserService{
public void insertUser(User user) {
// 공통 관심사항
logger.debug("로그출력");
// 핵심관심사항 - 메서드의 고유한 기능
userDao.insert(user)
}
public void getUserDetail(String id) {
// 공통 관심사항
logger.debug("로그출력");
// 핵심관심사항 - 메서드의 고유한 기능
User user = userDao.getUserById(id);
return user;
}
}
AOP 적용 후
package com.smple.services;
public class UserService{
public void insertUser(User user) {
userDao.insert(user) // 고유한 핵심 기능
}
public void getUserDetail(String id){
User user = userDao.getUserById(id); // 고유한 핵심 기능
return user;
}
}
@Aspect
public class LoggerAop {
@Before(pointcut= "within(com.sample.*)")
public void logging() {
logger.debug("로그출력");
}
}
AOP를 사용하면 횡단 관심사를 분리하여 코드의 재사용성과 모듈화를 높일 수 있다
UserService에 대한 Proxy 객체
UserService를 상속받아서 만든다
스프링 컨테이너
AOP 용어
용어 설명
target | advice가 추가될 객체, 핵심 기능 |
advice | target에 동적으로 추가될 코드, 부가 기능 |
join point | advice가 추가(join)될 대상(메서드) |
pointcut | join point들을 정의한 패턴.예) execution(* com.fastcampus..(..))특정 메서드에만 부가 기능 적용 |
proxy | target에 advice가 동적으로 추가되어 생성된 객체 |
weaving | target에 advice를 추가해서 proxy를 생성하는 것 |
(pointcut = “within(com.sample.* )” )
within 표현식은 특정 패키지(com.sample)의 하위 패키지에 속한 모든 클래스를 대상으로 지정
@Before
@Before 어노테이션은 메서드 실행 전에 실행되는 Advice(어드바이스)를 정의하는 데 사용 Advice는 특정한 시점에 실행되는 코드로서, 메서드 실행 전, 후, 예외 발생 시 등 다양한 시점에서 실행될 수있다
@Aspect
@Aspect 해당 클래스가 Aspect로 사용됨을 나타내는 어노테이션 Aspect는 횡단 관심사(cross-cutting concern)를 모듈화하고, 해당 관심사를 여러 개의 객체에 적용할 수 있는 기능을 제공
Advice 종류
advice 메서드 실행 전후에 추가적인 기능을 제공하는 부분
핵심 비즈니스 로직과는 독립적으로, 공통적으로 사용되는 기능을 모듈화하여 재사용성과 유지보수성을 높인다
종류 애너테이션 설명
around advice | @Around | 메서드의 시작과 끝 부분에 추가되는 부가 기능 |
before advice | @Before | 메서드의 시작 부분에 추가되는 부가 기능 |
after advice | @After | 메서드의 끝 부분에 추가되는 부가 기능 |
after returning | @AfterReturning | 예외가 발생하지 않았을 때, 실행되는 부가 기능 |
after throwing | @AfterThrowing | 예외가 발생했을 때, 실행되는 부가 기능 |
Pointcut 표현식의 와일드카드
- any
- .. all
- 매개변수 - 매개변수 상관없이
- 패키지경로 - 현재 패키지 및 모든 하위 패키지
`(“within(com.sample.* )” )`
`(pointcut = “within(com.sample..* )” )`
within(com.xyx.service.*)
com.xyx.service 패키지에 위치한 Any 클래스
within(com.xyz.service..*)
com.xyx.service 패키지 및 하위 패키지의 Any 클래스
within(com.xyz.service.*ServiceImpl)
com.xyx.service 패키지에서 클래스명이 ServiceImpl로 끝나는 Any 클래스
execution(* com.xyz.service.*.*(..) )
com.xyx.service 패키지의 Any 클래스의 Any 메서드
execution(* com.xyz.service.*.*(*) )
com.xyx.service 패키지의 Any 클래스의 매개변수가 하나뿐인 메서드
bean(*Dao)
스프링 컨테이너에 등록된 빈의 이름(객체의 식별자)이 Dao로 끝나는것
728x90
'Back_End > Spring' 카테고리의 다른 글
Spring MVC , Controller (1) | 2024.03.12 |
---|---|
MyBatis (4) | 2024.03.12 |
빌드도구 Maven (0) | 2024.03.11 |
Spring Framework (0) | 2024.03.11 |
Maven이 뭔데 ? (1) | 2024.02.27 |