AOP(Aspect Oriented Programming)

이정연·2023년 1월 30일
0

기본지식

목록 보기
5/10
  • 어플리케이션에 필요한 기능 중에서 공통적으로 적용되는 공통 기능에 대한 관심
  • 로깅, 보안, 트랜잭션 등
  • 애플리케이션의 핵심 업무 로직에서 공통 기능 로직들을 분리하는 것

사용이유

  • 코드의 간결성유지
  • 객체 지향 설계 원칙에 맞는 코드 구현
  • 코드의 재사용

트랜잭션

  • 데이터를 처리하는 하나의 작업 단위
  • 커밋
    모든 작업이 성공적으로 수행되었을 경우 수행한 작업을 데이터베이스에 반영하는 것
  • 롤백
    작업이 하나라도 실패한다면 이전에 성공한 작업들을 작업 수행 이전 상태로 되돌리는 것

AOP 사용 이전

public class Example2_11 {
    private Connection connection;

    public void registerMember(Member member, Point point) throws SQLException {
        connection.setAutoCommit(false); // (1)
        try {
            saveMember(member); // (2)
            savePoint(point);   // (2)
            
            connection.commit(); // (3)
        } catch (SQLException e) {
            connection.rollback(); // (4)
        }
    }

    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 // (1)
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 {
        // Spring JDBC를 이용한 회원 정보 저장
    }

    private void savePoint(Point point) throws SQLException {
        // Spring JDBC를 이용한 포인트 정보 저장
    }
}
  • 순수하게 비즈니스 로직을 처리하기 위한 saveMember(member)와 savePoint(point)만 남음
  • (1)의 @Transactional 애노테이션 하나만 붙이면 Spring 내부에서 이 애노테이션 정보를 활용해서 AOP 기능을 통해 트랜잭션을 적용한다.
profile
반갑습니다.

0개의 댓글