스프링에서는 트랜잭션 관리를 서비스가 담당하도록 설정해야 함
1. @Transactional 어노테이션 기능 활성화
** spring-tx 라이브러리에 존재
[servlet-context.xml에 설정]
** tx namaspace 추가 필요
<tx:annotation-driven/>
2. 트랜잭션 매니저 클래스를 스프링 빈으로 등록
[root-context.xml에 설정]
<bean id="TransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
3. Service 클래스의 메소드에 @Transactional 어노테이션을 적용
트랜잭션 관리가 필요한 서비스 메소드의 정의 부분에 적용
관점 지향 프로그래밍
로그인 기능, 게시글 작성 기능, 회원가입 기능에서 모두 메소드 시작 부분에서 로그를 남김
➡ 모든 기능에서 "시작 로그 남기기" 코드를 Aspect로 정의
➡ Aspext 객체를 적용할 시점을 설정
➡ 각 기능을 구현할 때에는 "시작 로그 남기기" 코드를 구현하지 않음
➡ 각 기능이 실행될 때 Aspect도 자동으로 실행됨
aspectjrt, AspectJ RunTime
AspectJ 기능을 활성화하는 라이브러리
aspectjweaver, AspectJ Weaver
AspectJ 라이브러리의 정보를 이용하여 Aspect 코드를 생성하는 라이브러리
AspectJ RunTime은 Legacy Project에 이미 추가되어 있음
pom.xml 파일에 AspectJ Weaver Dependency를 추가
현재(23.05/17) 버전은 1.9.19
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>${org.aspectj-version}</version>
</dependency>
포인트컷 + 어드바이스의 결합-Before
포인트컷을 설정할 때 사용하는 지정자
execution(접근제한자 리턴타입 패키지.클래스명.메소드명(파라미터 종류))* : 모든 단어.. : 0개 이상의 모든 단어 표현✔ execution 대신 beanName을 이용하여 객체(스프링빈) 단위로 포인트컷을 적용할 수 있음
@PointCut("bean(*Controller)")
@Before("bean(*ServiceImpl)")