[Spring][국비교육] Day 97

Ga02·2023년 5월 17일

국비교육

목록 보기
82/82

🔍 스프링 트랜잭션 관리

스프링에서는 트랜잭션 관리를 서비스가 담당하도록 설정해야 함

  • 서비스의 메소드를 트랜잭션 관리 단위로 설정
  • 메소드 내에서 수행된 DML 코드들이 전부 에러없이 성공했을 때만 commit 되도록 설정

➰ 설정 사항

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 어노테이션을 적용
트랜잭션 관리가 필요한 서비스 메소드의 정의 부분에 적용


🔍 AOP, Aspect Oriented Programming

관점 지향 프로그래밍

  • OOP(객체 지향 프로그래밍)처럼 개발 방식을 의미하는 것은 아님
  • OOP를 대체하지 않음
  • OOP로 개발된 코드에 추가개념으로 적용됨
  • 객체 단위로 개발된 프로그램에서 서로 다른 객체 또는 메소드에 구현된 중복된 코드들을 관점(Aspect)로 정의
  • 관점으로 정의할 수 있는 코드들을 별도의 객체로 구현하는 프로그래밍 기법
  • 로그 남기기, 예외처리, 트랜잭션 관리, 권한 체크 등을 구현할 때 사용

    로그인 기능, 게시글 작성 기능, 회원가입 기능에서 모두 메소드 시작 부분에서 로그를 남김
    ➡ 모든 기능에서 "시작 로그 남기기" 코드를 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>	

➰ AOP 용어

  • 조인포인트, Joinpoint
    • AOP 코드를 적용할 수 있는 모든 위치 👉🏻 메소드
  • 포인트컷, Pointcut
    • AOP 코드를 적용하기 위해 지정된 조인포인트
  • 어드바이스, Advice
    • 공통 기능으로 적용할(구현된) 코드
  • 애스팩트, 관점, Aspect
    • 포인트컷 + 어드바이스의 결합
    • 어드바이저(Advisor)라고도 부름
    • 공통으로 들어갈 코드와 어디에 적용될 것인가를 합쳐서 부르는 용어 (== 관점)
  • 위빙, Weaving
    • 포인트컷에 어드바이스가 삽입되는 과정을 뜻함
    • 애스팩트가 적용되는 것을 뜻함

➰ 어드바이스가 동작하는 시점

-Before

  • 포인트컷 수행 전에 실행
    -After
  • 포인트컷 수행 후에 실행
    -After Returning
  • 성공적인 리턴 후에 실행
    -After Throwing
  • 예외가 발생했을 경우 실행
    -Around
  • 실행 전후에 처리될 로직을 직접 조율하여 작성하고 실행되도록 함

➰ execution 명시자

포인트컷을 설정할 때 사용하는 지정자

  • 형식 : execution(접근제한자 리턴타입 패키지.클래스명.메소드명(파라미터 종류))
  • 접근제한자는 public만 허용하며 생략 가능
  • 모든 데이터타입은 패키지포함 풀네임으로 작성
  • * : 모든 단어
  • .. : 0개 이상의 모든 단어 표현

✔ execution 대신 beanName을 이용하여 객체(스프링빈) 단위로 포인트컷을 적용할 수 있음

@PointCut("bean(*Controller)")
@Before("bean(*ServiceImpl)")
profile
IT꿈나무 댓츠미

0개의 댓글