AOP (Aspect-Oriented Programming)
1. 개념
AOP는 공통 관심사(예: 로깅, 보안, 트랜잭션 관리 등)를 모듈화하여 코드의 중복을 줄이고,
코드의 가독성과 유지보수성을 향상시키는 프로그래밍 패러다임이다.
이를 통해 애플리케이션의 비즈니스 로직과 공통 관심사를 분리할 수 있다.
2. 주요 구성 요소
- Aspect : 공통 관심사를 정의하는 모듈. 예를 들어, 로깅 기능을 Aspect로 구현할 수 있다.
-Join Point : AOP가 적용될 수 있는 지점. 일반적으로 메서드 호출이나 객체 생성 등이 해당된다.
- Advice : Join Point에서 실행되는 코드. 다양한 종류가 있으며, 예를 들어, 메서드 호출 전후 또는 예외 발생 시 실행된다.
- Before : Join Point 전에 실행
- After : Join Point 후에 실행
- Around : Join Point 전후에 실행 (가장 유연한 방식)
- Pointcut : 어떤 Join Point에 Advice를 적용할지 정의하는 표현식. 예를 들어, 특정 패키지 내의 모든 메서드에 대해 적용할 수 있다.
3. AOP의 장점
- 코드 재사용성: 공통 관심사를 한 곳에서 관리하므로 코드 중복을 줄일 수 있다.
- 유지보수 용이성: 관심사를 분리함으로써 코드의 가독성을 높이고, 변경 시 영향을 최소화한다.
트랜잭션(transaction)
트랜잭션(transaction)은 데이터베이스에서 수행되는 작업의 단위를 의미하며,
여러 데이터베이스 조작을 하나의 원자적 작업으로 묶는 개념이다.
트랜잭션은 다음과 같은 중요한 네가지의 속성을 만족해야 한다.
ACID 속성
1. 원자성 (Atomicity) : 트랜잭션 내의 모든 작업이 성공적으로 완료하거나, 실패하면 모든 작업이
취소되어야 한다는 의미이다. 즉, 부분적으로 수행되는 것이 허용되지 않는다.
2. 일관성 (Consistency) : 트랜잭션이 수행되기 전과 후에 데이터베이스의 일관성이 유지되어야 한다.
데이터의 상태가 규칙에 맞아야하며, 트랜잭션이 끝난 후에도 일관성을 유지해야 한다.
3. 고립성 (Isolation) : 동시에 실행되는 트랜잭션은 서로 영향을 미치지 않아야 하며, 각 트랜잭션은
독립적으로 수행되어야 한다. 이를 통해 여러 트랜잭션이 동시에 실행될 때 발생할 수 있는 문제를 방지한다.
4. 지속성 (Durability) : 트랜잭션이 성공적으로 완료되면 그 결과는 영구적으로 데이터베이스에
반영되어야 하며, 시스템 장애가 발생하더라도 유지되어야 한다.
예시
// 예를 들어, 은행 계좌 간의 송금 과정이 트랜잭션의 좋은 예이다.
- A 계좌에서 B 계좌로 돈을 송금할 때,
1. A 계좌에서 금액을 차감하는 작업
2. B 계좌에 금액을 추가하는 작업
- 이 두 작업이 모두 성공적으로 완료되어야만 송금이 이루어지며, 중간에 오류가 발생하면
두 작업 모두 취소되어야 한다. //
@Transactional 어노테이션을 사용하여 트랜잭션을 관리할 수 있다.
사용법은 뒤에 나올 @Transactional 파트에서 설명하도록 한다.
@Transactional
1. 개념
@Transactional은 Spring에서 트랜잭션을 관리하기 위해 사용하는 어노테이션이다.
이 어노테이션을 사용하면 메서드나 클래스에 대해 트랜잭션을 설정할 수 있다.
2. 사용 방법
@Transactional을 메서드 또는 클래스에 붙이면, 해당 메서드 또는 클래스 내의 모든 데이터베이스 작업이 하나의 트랜잭션으로 묶인다.
기본적으로 트랜잭션의 시작은 메서드가 호출될 때이며, 모든 작업이 성공적으로 완료되면 커밋되고, 오류가 발생하면 롤백된다.
3. 속성
@Transactional은 여러 속성을 설정할 수 있다:
propagation : 트랜잭션 전파 방식 설정 (예: REQUIRED, REQUIRES_NEW 등).
isolation : 트랜잭션 고립 수준 설정 (예: READ_COMMITTED, SERIALIZABLE 등).
timeout : 트랜잭션 타임아웃 설정.
readOnly : 트랜잭션이 읽기 전용인지 여부 설정.
4. 사용 예
@Service
public class UserService {
@Transactional
public void transferMoney(Long fromAccountId, Long toAccountId, Double amount) {
// A 계좌에서 금액 차감
accountRepository.withdraw(fromAccountId, amount);
// B 계좌에 금액 추가
accountRepository.deposit(toAccountId, amount);
}
}
위의 예제에서 transferMoney 메서드는 A 계좌에서 금액을 차감하고 B 계좌에 추가하는 작업을 수행한다.
이 두 작업이 모두 성공해야만 트랜잭션이 커밋되며, 중간에 오류가 발생하면 롤백된다.
요약
- AOP는 코드의 중복을 줄이고 관심사를 분리하는 데 도움을 준다.
- 트랜잭션은 데이터베이스에서 수행되는 작업의 단위로, 여러 데이터 조작을 원자적으로 처리하여 데이터의 일관성을 보장한다.
쉽게 말해 데이터베이스 작업을 안전하게 묶은다음, 모두 성공하거나 모두 실패하게 만드는 개념.
- @Transactional은 데이터베이스 작업을 안전하게 처리하기 위해 트랜잭션 관리를 제공하며, 해당 메서드 내의 모든 데이터 베이스 작업을 하나의 트랜잭션으로 묶는다.
'Spring' 카테고리의 다른 글
[Spring] 단위 테스트, JUnit, 테스트 코드 (2) | 2024.10.29 |
---|---|
[Spring] RestTemplate (2) | 2024.10.14 |
[Spring] Filter (@Slf4j, @Order) (1) | 2024.10.14 |
[Spring] JWT (1) | 2024.10.10 |
[Spring] 쿠키와 세션 (0) | 2024.10.08 |