관점지향프로그래밍,,
트랜잭션 공부하다가 튀어나왔는데
자바를 역시 공부해야할 것 같다
aop검색하니까 스프링 aop가 가장 먼저 튀어나온다
자바.. 그는 도대체 얼마나 엄청난 친구인 것인가
어느날 그냥 궁금증이 들었다
라라벨에서 여러 데이터 커넥션 별로 트랜잭션을 설정하고 중간에 터지게되면
여러 데이터 커넥션이 다 롤백이 될까? 하고 이런 코드를 단톡에 날렸는데,,
public function funcName()
{
DB::connection('connA')->beginTransaction();
DB::connection('connB')->beginTransaction();
DB::connection('connC')->beginTransaction();
try {
DB::connection('connA')->table('tableA')->insert($dataA);
DB::connection('connB')->table('tableB')->insert($dataB);
DB::connection('connC')->table('tableC')->insert($dataC); // 예외 발생
DB::connection('connA')->commit();
DB::connection('connB')->commit();
DB::connection('connC')->commit();
} catch (\Exception $e) {
DB::connection('connA')->rollBack();
DB::connection('connB')->rollBack();
DB::connection('connC')->rollBack();
throw $e;
}
}
지인 개발자 왈 : 님 aop 모름?
그게 먼데,,
사실 라라벨에선 트랜잭션을 이렇게 쓴다
use Illuminate\Support\Facades\DB;
public function funcName()
{
DB::transaction(function () {
DB::table('tableA')->insert(['columnA' => 'valueA']);
DB::table('tableB')->insert(['columnB' => 'valueB']);
DB::table('tableC')->insert(['columnC' => 'valueC']); // 예외 발생 가능
});
}
굳이 저렇게 begin 해주고 rollback처리해줄 필요가 없다 이거야
서비스 로직에서의 핵심 관심사는 도메인 로직을 조정하고 수행시키는것이고
트랜잭션은 핵심 기능이 아니라서 분리하기때문에 저 코드는 그런 개념에서 어긋나서,,
aop라는 단어가 튀어나온것 같다
그래서 aop를 정리해본다...
1. AOP 란?
- Aspect-Oriented Programming 라는 약자로, 관점지향프로그래밍이라고 한다.
- 소프트웨어 개발 패러다임 중 하나로, 프로그램의 관심사를 분리하여 코드의 모듈성을 향상시키는 데 중점을 둔다.
주요 개념
1) 관점(Aspect) : 프로그램의 특정 관심사나 기능을 나타낸다. 예를 들어) 로깅, 보안, 트랜잭션 관리 등이 관점이 될 수 있다.
2) 조인 포인트(Join Point) : 프로그램 실행 중 특정 지점, 예를 들어 메소드 호출이나 객체 생성등이 이에 해당된다.
3) 어드바이스 (Advice) : 특정 조인 포인트에서 실행된 코드이다.
4) 포인트컷 (Point) : 어드바이스가 적용될 조인 포인트를 정의하는 표현식이다.
5) 위빙 (Weaving) : 관점을 주요 비즈니스 로직 코드에 적용하는 과정입니다. 위빙은 컴파일 시, 로드 시, 또는 런타임 시에 이루어 질 수 있다.
.
.
라는 내용도 있긴 한데, 사실 왜 쓰는지 아는게 가장 중요한 것 같다. 그냥 관점지향으로 프로그래밍 하는거고,
보통 로그를 주로 그 예시로 드는 듯 하다. 여러 도메인을 관통하는 관점을 두고 프로그래밍 하는 것.
그것이 관점지향프로그래밍이 아닌가 하는 생각이 든다.
AOP를 통해 프로그래밍을 하게 된다면,
모듈성이 향상되고, 유지보수성이 향상되고, 코드 가독성이 향상된다! (다좋다)
말 그대로 특정 기능(로깅,보안)들을 한 곳에 모아서 코드 중복을 줄이고, 각 관심사 별로 코드가 명확하게 분리되니깐,,,
관점도 독립적으로 관리할 수 있어서 유지보수도 쉽고,, 비즈니스 로직과 부가적인 기능을 분리해서 개발하니까 코드 가독성도 확장된다.
예시 코드는 아래와 같다
Spring Framework 프레임 워크는 AOP를 지원하는 대표적인 프레임워크당,, PHP,,, 화이팅,,(PHP도 있긴함)
@Aspect
public class LoggingAspect {
@Before("execution(* com.example.service.*.*(..))")
public void logBefore(JoinPoint joinPoint) {
System.out.println("Method called: " + joinPoint.getSignature().getName());
}
}
'CS 정리' 카테고리의 다른 글
SQL에서 explain 사용해보기 (1) | 2024.06.27 |
---|---|
모노레포, 멀티레포란? (1) | 2024.06.23 |
DI, IOC 란? (0) | 2024.05.27 |
트랜잭션이란? (0) | 2024.05.26 |
캐시란? (1) | 2024.05.22 |