- 어플리케이션에 필요한 기능 중에서 공통적으로 적용되는 공통 기능에 대한 관심
- 로깅, 보안, 트랜잭션 등
- 애플리케이션의 핵심 업무 로직에서 공통 기능 로직들을 분리하는 것
사용이유
- 코드의 간결성유지
- 객체 지향 설계 원칙에 맞는 코드 구현
- 코드의 재사용
트랜잭션
- 데이터를 처리하는 하나의 작업 단위
- 커밋
모든 작업이 성공적으로 수행되었을 경우 수행한 작업을 데이터베이스에 반영하는 것
- 롤백
작업이 하나라도 실패한다면 이전에 성공한 작업들을 작업 수행 이전 상태로 되돌리는 것
AOP 사용 이전
public class Example2_11 {
private Connection connection;
public void registerMember(Member member, Point point) throws SQLException {
connection.setAutoCommit(false);
try {
saveMember(member);
savePoint(point);
connection.commit();
} catch (SQLException e) {
connection.rollback();
}
}
private void saveMember(Member member) throws SQLException {
PreparedStatement psMember =
connection.prepareStatement("INSERT INTO member (email, password) VALUES (?, ?)");
psMember.setString(1, member.getEmail());
psMember.setString(2, member.getPassword());
psMember.executeUpdate();
}
private void savePoint(Point point) throws SQLException {
PreparedStatement psPoint =
connection.prepareStatement("INSERT INTO point (email, point) VALUES (?, ?)");
psPoint.setString(1, point.getEmail());
psPoint.setInt(2, point.getPoint());
psPoint.executeUpdate();
}
}
- registerMember() 메서드는 커피 주문 애플리케이션을 사용할 회원 정보를 등록하는 기능을 합니다. 회원 정보와 회원 포인트를 저장하는 것을 알 수 있다.
- (1)의 connection.setAutoCommit(false)이나 (3)의 connection.commit(), (4)의 connection.rollback()은 saveMember()와 savePoint() 작업을 트랜잭션으로 묶어서 처리하기 위한 기능들임.
AOP 사용 이후
@Component
@Transactional
public class Example2_12 {
private Connection connection;
public void registerMember(Member member, Point point) throws SQLException {
saveMember(member);
savePoint(point);
}
private void saveMember(Member member) throws SQLException {
}
private void savePoint(Point point) throws SQLException {
}
}
- 순수하게 비즈니스 로직을 처리하기 위한 saveMember(member)와 savePoint(point)만 남음
- (1)의 @Transactional 애노테이션 하나만 붙이면 Spring 내부에서 이 애노테이션 정보를 활용해서 AOP 기능을 통해 트랜잭션을 적용한다.