본문 바로가기
public void static main/Book

[토비의스프링] 6장-AOP

by 햄리뮤 2025. 2. 26.
반응형

 

 

트랜잭션과 DI/AOP로 깔끔한 코드 만들기

핵심 개념 한눈에 보기

  • 트랜잭션 분리: 비즈니스 로직과 환경 의존 코드를 분리해 책임을 명확히 한다.
  • DI(의존성 주입): 객체 간 유연한 연결로 코드 변경을 최소화한다.
  • AOP: 트랜잭션 같은 공통 기능을 모듈화해 관리한다.
  • 프록시: 비즈니스 로직에 부가 기능을 추가하는 중개자 역할.
  • 테스트: 로직과 환경이 분리되어 단위 테스트가 쉬워진다.

트랜잭션 설계 단계별 정리

  1. 트랜잭션 코드 분리
    • 왜?: 비즈니스 로직과 트랜잭션 처리(시작, 커밋, 롤백)를 분리하면 책임이 명확해진다.
    • 어떻게?:
      • 트랜잭션 처리를 전담하는 별도 클래스를 만든다.
      • 비즈니스 로직과 동일한 인터페이스를 구현한다.
      • DI를 통해 클라이언트 코드 수정 없이 트랜잭션 기능을 추가한다.
  2. 분리의 장점
    • 비즈니스 로직이 외부 리소스(DB 등)에 의존하지 않아 순수해진다.
    • 테스트가 쉬워진다.
      • 목(Mock) 객체로 의존성을 대체해 고립된 단위 테스트 가능.
      • 예: DB 연결 없이 로직 검증.
  3. 디자인 패턴 연결
    • 데코레이터: 트랜잭션으로 비즈니스 로직을 감싼다.
    • 프록시: 트랜잭션 처리를 대신 수행한다.
    • DI로 프록시와 실제 객체를 유연하게 연결한다.

프록시와 스프링 활용

  1. 프록시 구현
    • 수동: 프록시 클래스를 직접 작성 (비효율적).
    • JDK 다이내믹 프록시: 동적으로 프록시를 생성해 간소화.
      • 단점: 스태틱 팩토리 메소드로 빈 등록이 복잡.
      • 해결: 스프링의 팩토리 빈으로 처리 위임.
  2. 스프링의 프록시 팩토리 빈
    • 다이내믹 프록시를 빈으로 쉽게 등록.
    • 문제: 여러 클래스 적용 시 설정 반복 필요.
    • 해결:
      • 자동 프록시 생성기: 초기화 시 프록시를 자동 생성.
      • 포인트컷(Pointcut): 적용 대상을 정의 (AspectJ 표현식 추천).

AOP로 한 단계 업그레이드

  1. AOP란?
    • 트랜잭션 같은 부가 기능을 모듈화.
    • OOP와 달리 공통 관심사(횡단 관심사)를 분리.
    • 스프링에서 <aop:> 태그로 설정 간소화 및 트랜잭션 속성 지정 가능.
  2. 트랜잭션 속성 부여
    • 방법 1: 포인트컷과 메소드 이름 패턴으로 설정.
    • 방법 2: @Transactional 애노테이션 사용.
      • 장점: 직관적이고 간단하며, 롤백으로 DB 연동 테스트도 쉽게 검증.

전체 흐름 요약

  • 문제 인식: 트랜잭션과 로직이 섞이면 관리가 어렵다.
  • 분리: DI로 트랜잭션 코드를 독립시켜 프록시 패턴 적용.
  • 간소화: 다이내믹 프록시와 팩토리 빈 활용.
  • 자동화: 자동 프록시 생성기와 포인트컷으로 관리.
  • AOP 도입: 부가 기능을 모듈화.
  • 완성: @Transactional로 깔끔한 트랜잭션 관리.

핵심 키워드와 한 줄 정리

  • DI: 객체를 유연하게 연결한다.
  • 프록시: 부가 기능을 대신 처리한다.
  • AOP: 공통 로직을 모아 관리한다.
  • 포인트컷: 부가 기능 적용 대상을 정의한다.
  • @Transactional: 트랜잭션 설정을 간단히 마무리한다.
반응형

댓글