반응형
트랜잭션과 DI/AOP로 깔끔한 코드 만들기
핵심 개념 한눈에 보기
- 트랜잭션 분리: 비즈니스 로직과 환경 의존 코드를 분리해 책임을 명확히 한다.
- DI(의존성 주입): 객체 간 유연한 연결로 코드 변경을 최소화한다.
- AOP: 트랜잭션 같은 공통 기능을 모듈화해 관리한다.
- 프록시: 비즈니스 로직에 부가 기능을 추가하는 중개자 역할.
- 테스트: 로직과 환경이 분리되어 단위 테스트가 쉬워진다.
트랜잭션 설계 단계별 정리
- 트랜잭션 코드 분리
- 왜?: 비즈니스 로직과 트랜잭션 처리(시작, 커밋, 롤백)를 분리하면 책임이 명확해진다.
- 어떻게?:
- 트랜잭션 처리를 전담하는 별도 클래스를 만든다.
- 비즈니스 로직과 동일한 인터페이스를 구현한다.
- DI를 통해 클라이언트 코드 수정 없이 트랜잭션 기능을 추가한다.
- 분리의 장점
- 비즈니스 로직이 외부 리소스(DB 등)에 의존하지 않아 순수해진다.
- 테스트가 쉬워진다.
- 목(Mock) 객체로 의존성을 대체해 고립된 단위 테스트 가능.
- 예: DB 연결 없이 로직 검증.
- 디자인 패턴 연결
- 데코레이터: 트랜잭션으로 비즈니스 로직을 감싼다.
- 프록시: 트랜잭션 처리를 대신 수행한다.
- DI로 프록시와 실제 객체를 유연하게 연결한다.
프록시와 스프링 활용
- 프록시 구현
- 수동: 프록시 클래스를 직접 작성 (비효율적).
- JDK 다이내믹 프록시: 동적으로 프록시를 생성해 간소화.
- 단점: 스태틱 팩토리 메소드로 빈 등록이 복잡.
- 해결: 스프링의 팩토리 빈으로 처리 위임.
- 스프링의 프록시 팩토리 빈
- 다이내믹 프록시를 빈으로 쉽게 등록.
- 문제: 여러 클래스 적용 시 설정 반복 필요.
- 해결:
- 자동 프록시 생성기: 초기화 시 프록시를 자동 생성.
- 포인트컷(Pointcut): 적용 대상을 정의 (AspectJ 표현식 추천).
AOP로 한 단계 업그레이드
- AOP란?
- 트랜잭션 같은 부가 기능을 모듈화.
- OOP와 달리 공통 관심사(횡단 관심사)를 분리.
- 스프링에서 <aop:> 태그로 설정 간소화 및 트랜잭션 속성 지정 가능.
- 트랜잭션 속성 부여
- 방법 1: 포인트컷과 메소드 이름 패턴으로 설정.
- 방법 2: @Transactional 애노테이션 사용.
- 장점: 직관적이고 간단하며, 롤백으로 DB 연동 테스트도 쉽게 검증.
전체 흐름 요약
- 문제 인식: 트랜잭션과 로직이 섞이면 관리가 어렵다.
- 분리: DI로 트랜잭션 코드를 독립시켜 프록시 패턴 적용.
- 간소화: 다이내믹 프록시와 팩토리 빈 활용.
- 자동화: 자동 프록시 생성기와 포인트컷으로 관리.
- AOP 도입: 부가 기능을 모듈화.
- 완성: @Transactional로 깔끔한 트랜잭션 관리.
핵심 키워드와 한 줄 정리
- DI: 객체를 유연하게 연결한다.
- 프록시: 부가 기능을 대신 처리한다.
- AOP: 공통 로직을 모아 관리한다.
- 포인트컷: 부가 기능 적용 대상을 정의한다.
- @Transactional: 트랜잭션 설정을 간단히 마무리한다.
반응형
'public void static main > Book' 카테고리의 다른 글
[토비의스프링] 8장-스프링이란 무엇인가? (0) | 2025.02.28 |
---|---|
[토비의스프링] 7장-스프링 핵심 기술의 응용 (1) | 2025.02.28 |
[토비의스프링] 5장-서비스 추상화 (1) | 2025.02.21 |
[토비의스프링] 3장-템플릿 (0) | 2025.02.21 |
[토비의스프링] 2장-테스트 (1) | 2025.01.29 |
댓글