Flamme Dev
  • IntroduceMyself
  • GOAL
    • 2021년 목표
    • 회고록
      • 2020년
  • COMMON
    • 자료구조
      • 시간복잡도
      • 스택/큐
    • 코드리뷰/스터디/세미나
      • Semina
        • Version control -1 (SVN/GIT)
        • Version control - 2 (GIT)
        • PostMan
        • JMeter
      • 스터디
        • 2021년
          • EffectiveKotlin
          • 이펙티브자바
        • 2020년
          • JPA Study
            • Chap1
            • Chap3
            • Chap4
            • Chap5
            • Chap6
            • Chap7
            • Chap8
            • Chap9
            • Chap10 -1
            • Chap10-2
            • Chap10-3
            • Chap12
            • Chap 13. 웹 애플리케이션과 영속성 관리
            • Chap14
      • 코드리뷰
        • Page 1
        • 개발 생각
        • APNs 라이브러리 교체
        • 파일 삭제 분투기
        • 신입 코드리뷰
          • 2020-09-02
          • 2020-09-03
          • 2020-09-10
        • Repository
          • Repositroy(20201124)
          • Repositroy(20201123)
          • Repositroy(20201120)
          • Repositroy(20201119)
          • Repositroy(20201117)
    • 개발 서적 / 동영상 강의
      • 동영상 강의
        • 진행 중
        • 완주한 것
      • 개발 서적
        • 읽은 것
          • 손에 잡히는 10분 SQL
            • 인덱스
            • 정리 본
        • 진행 중
          • 폴리글랏 프로그래밍
          • DDD-START
            • Chapter5 리포지터리의 조회 기능
            • Chapter4 리포지터리와 모델 구현
            • Chapter3 애그리거트
            • Chapter2 아키텍쳐 개요
            • Chapter1 도메인 모델의 시작
  • INFO
    • 유스콘 준비
    • intellij
      • Command line is too long.
    • 프로그래밍의 종류
      • Async Await
      • Reactive Programming
      • Imperative Programming
      • Functional Programming
        • Naver D2 함수형 프로그래밍 강의
      • Object Oriented Programing
        • 객체지향에 대해서 알아보는 영상
      • ProcedureOriented Programming
      • RX(ReactiveX)
      • OOP VS FP
      • Declarative Programming
    • Language
      • Kotlin
        • 박재성님 강의
        • Kotlin Spring CGLIB Error
        • Kotlin의 사용
        • coroutine
        • Kotlin JVM
      • JavaScript
      • JAVA
        • DefaultNonnull
        • effective78
        • Exception
        • JsonUnWrappers
        • 명명짓기
        • @JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
        • Enc Key
        • ServiceLoader
        • Annotation
        • JVM(Java Virtual Machine)
        • Java8
          • Functional 사용
          • Optional
          • Invalid Key size
        • Java13
          • Text Block
        • Basic
          • Generic
          • JVM
          • Interface, Implements
    • Framework
      • NodeJs
      • Xamarin
      • Vert.x
        • vert.x in action
        • eventbus
      • blockedthreadchecker
      • Why.. not root run..
      • Spring
        • Spring Test
        • Kotlin
        • ControllerAdvice 정리
        • JsonAnnotation
        • Spring Data R2DBC
        • SpringWebFlux
          • login
          • SpringWebFlux란?
        • JPA
          • QueryDSL 객체 주소값 확인할 것
          • SpringData-JPA에서 Save, SaveAll
          • @CompositeKey에 ManyToOne JoinColumn이 있을 경우
          • QueryDSL N+1 문제(@OneToOne)
          • QueryDSL설정
          • CreationTimestamp
          • Enum(@enumerated vs @convert)
        • SpringSecurity
          • aopAlliance
          • csrf 방어
          • antMatcher vs mvcMatcher
          • SpringSecurity를 왜 써야할까?
          • CoreSpringSecurity
            • AuthenticationProvider
            • AuthenticationManager
            • Authentication Flow
            • SecurityContextPersistenceFilter
            • SecurityContextHolder, SecurityContext
            • Authentication
            • 필터 초기화와 다중 보안 설정
            • DelegatingProxyChain, FilterChainProxy
            • 사이트 간 요청 위조 - CSRF, CsrfFilter
            • 예외 처리 및 요청 캐시 필터 : ExceptionTranslationFilter, RequestCacheAwareFilter
            • 인가 API - 권한 설정 및 표현식
            • SessionManagementFilter, ConcurrentSessionFilter
            • 동시 세션 제어 / 세션고정보호/ 세션 정책
            • AnonymousAuthenticationFilter
            • RememberMeAutheticationFilter
            • Logout,LogoutFilter
            • UsernamePasswordAuthenticationFilter
            • Form인증
            • 인증 API - 사용자 정의 보안 기능 구현
            • 인증 API - 스프링 시큐리티 의존성 추가
        • SpringMVC
          • Spring Bean Q&A
          • HttpServletRequest
          • @ControllerAdvice
          • Service와 ServiceImpl은 꼭 있어야할까?
          • SpringMVC-1
          • SpringMVC - validator와 Errors
          • SpringMVC - DispatcherServlet의 URL
          • Spring MVC - 기본설정(2) 및 HandlerInterceptor
          • SpringMVC-3
          • Spring MVC - ViewResolver
          • Spring MVC - XML/JSON
          • Spring MVC - Field Injection & Constructor Injection
        • SpringEtc
          • Transactional
          • @Atowired NullPointer
          • CircleReference
          • Mybatis
            • IBatis - sql에 Map
            • 1:1 Mapping시 Null
            • auto_Increment, selectKey
          • @Transactional
          • JacksonAnnotation
        • SpringAOP
        • SpringDI
    • Server
      • PM2
      • Tomcat
        • jks
        • Virtual Host(Port)
    • OS
      • Window
        • Active directory
      • IOS
      • Linux
        • samba/keroberos
        • Linux
          • unlimit / socket backLog
          • nohup
          • ; , & , &&, {}
          • 쉘
          • rc.local
          • ps aux | grep 프로세스이름
          • Vim
          • Su, Sudo
          • File Directory
        • IdConfig
        • 유용한 커맨드
        • 리눅스 대소문자
        • 소프트링크와 하드링크의 차이
        • ln -Tfs
        • //와 / 의 차이
        • Linux(202003)
          • rm
          • diff
          • cp
          • mv
          • tar 압축 시 어떻게 심볼릭 링크도 같이 압축할까?
          • tar 명령어
          • ln -s 심볼릭 링크
    • Network
      • API Architectural Styles
      • 포트 확인
      • HeartBeat Protocol
      • SSO(Single Sign On)
      • Cookie and Session
      • Tcp HandShake
      • WireShark
        • WireShark 옵션
        • WireShark 패킷분석
    • DataBase
      • DB락에 대해서 알아보기
      • Redis
      • MYSQL
        • Mysql TimeOut 설정
        • MysqlLog
        • SlowQuery Analyzing
        • PushNotification Stress Test
      • MSSQL
      • 데이터베이스 식별자 선택 전략
    • ETC
      • 이름 짓기
      • FFProbe
      • Talk
      • Untitled
Powered by GitBook
On this page

Was this helpful?

  1. INFO
  2. Framework
  3. Spring

SpringAOP

최범균님의 스프링 4.0 책을 쓰고 정리한 글입니다.

Spring에 대한 두 번째 포스팅이다. 요번에는 AOP에 대하여 써보려고 한다.

AOP는 무엇일까? 일단 AOP는 Aspect Oriented Programming의 약자이다.

항상 비즈니스 로직을 구현하다 보면 공통 기능이 하나씩 나올 것이다. 이 공통기능을 한 곳에다가 빼내어 필요한 코드에 넣는 작업을 쉽게 하기 위하여 그리고 코드의 중복을 지우기 위하여 사용하는 것이 바로 AOP이다.

AOP 용어

- JoinPoint : Advice를 적용 가능한 지점을 의미, 메서드 호출, 필드 값 변경

- Pointcut : Joinpoint의 부분 집합으로서 실제로 Advice가 적용되는 Joinpoint를 나타냄. Spring에서는 AspectJ문법을 사용하여 정의

- Advice : 공통 관심 기능을 핵심 로직에 적용 할 지 정의 ex) 트랜잭션

- Weaving : Advice를 핵심 로직 코드에 적용하는 것

- Aspect : 여러 객체에 공통으로 적용되는 기능, 트랜잭션이나 보안등이 Aspect의 예

Weaving 방식

- 컴파일 시 weaving

- 클래스 로딩 시 weaving

- 런타임 시 weaving

Spirng에서 AOP

스프링에서 AOP는 어떻게 쓰일까? 스프링 자체에서는 Proxy기반의 AOP를 지원하고 있다. 즉 JointPoint만 사용할 수 있고, 우리는 이것을 커스텀하기 위하여 AspectJ를 써야 한다고 한다. (스프링은 XML, AspectJ에서의 @Aspect 어노테이션, 스프링 API를 이용한 AOP 구현을 할 수 있다.)

여기서 일반적으로 AspectJ나 xml을 사용하고 프록시 기반이기 때문에 CGLIB 클래스를 사용하여 객체를 만든다고 한다. 하지만 클래스가 final인 경우 프록시를 생성하지 못하여 AOP를 적용하지 못한다고 한다.

스프링에서 구현 가능한 Advice 종류

Before Advice(대상 객체의 메서드 호출 전에 공통 기능 실행)

After Returning Advice(대상 객체의 메서드가 익셉션 없이 실행된 이후 공통기능 수행)

After Throwing Advice(익셉션이 발생한 경우에 공통기능 실행)

After Advice( 익셉션 발생 여부 없이 공통기능 실행 )

Around Advice(실행 전 후 익셉션 발생 시점에 공통기능 실행)

이 중에서 Around Advice를 가장 범용적으로 쓰이는데 이 이유는 캐시 기능 ,성능 모니터링 기능을 추가하여 실행 전/후에 동작 할 수 있기 때문이라고 한다.

XML AOP 태그 정보

- aop:config : AOP 설정 정보임

- aop:aspect : aspect를 설정 (id와 ref(빈Id))

- aop:pointcut : pointcut 설정

- aop:around : Around Advice 설정(aop:before, aop:after-returning, aop:after-throwing, aop:after, aop:around)

JAVA AOP

@Aspect 어노테이션 사용시 xml에는 항상 <aop:aspectj-autoproxy/> 설정을 하거나 자바 설정을 이용하다면 @EnableAspectJAutoProxy를 적어준다.

PreviousJacksonAnnotationNextSpringDI

Last updated 4 years ago

Was this helpful?