# aop

[TIL] Spring boot 기초 개념 with spring
스프링부트 핵심 가이드를 읽고 간략하게 정리한 글입니다. 스프링 자바 언어를 이용해 엔터프라이즈급 개발을 편리하게 만들어주는 오픈소스 경량급 애플리케이션 프레임워크로 불리고 있음. (+) 엔터프라이즈급 개발이란? 기업 환경을 대상으로 하는 개발로, 대규모 데이터를 처리하는 환경을 의미함. IoC (제어 역전) 일반적인 자바 개발의 경우, 사용하려는 객체를 선언하고 해당 객체의 의존성을 생성한 다음 객체에서 제공하는 기능을 사용함. 객체를 생성하고 사용하는 일련의 작업을 개발자가 직접 제어하는 구조임. 하지만, 제어 역전은 사용할 객체를 직접 생성하지 않고 객체의 생명주기 관리를 외부(스프링 컨테이너, IoC 컨테이너)에 위임함. 객체의 관리를 컨테이너에 맡겨 제어권이 넘어간 것을 제어 역전이라고 부르며, 제어 역전을 통해 의존성 주입 / 관점 지향 프로그래밍 등이 가능해 짐. DI (의존성 주입) 제어 역

AOP란
AOP (Aspect-Oriented Programming) 관점지향 프로그래밍 관점을 기준으로 다양한 기능을 분리하여 보는 프로그래밍이다. 여기서 관점이란, 공통 관심사(모듈) 정도로 스스로 해석했다. 웹 어플리케이션은 핵심 비즈니스 로직과 그 애플리케이션 전체를 관통하는 부가 기능 로직이 있다. (예를 들어 로깅, 보안, 트랜젝션 등이 있음) 이를 횡단 관심사라고 한다. 횡단 관심사의 코드는 비즈니스 로직의 코드와 분리하여, 각 코드의 변경과 확장에 유연함을 주도록 하는것이 AOP의 목적이다. AOP 관련 용어 Aspect : 흩어진 관심사를 모듈화한 것 Target : Aspect를 적용하는 곳 (클래스, 메소드 등) Advice : 실질적으로 어떤 일을 해야할 지에 대한
[Spring] 스프링 AOP란 무엇일까?
Spring AOP (Aspect Oriented Programming) AOP(Aspect Oriented Programming : 관점 지향 프로그래밍)은 프로그램의 공통적인 관심사(공통적인 기능)을 핵심적인 관심사(핵심 비즈니스 로직)로부터 따로 분리해냄으로써 프로그램의 모듈성을 높이고자 하는 패러다임이다. 아무래도 정의만 보았을 때에는 감이 잘 잡히지 않으니, 간단한 코드 예제를 보면서 이해해 보도록 하자. 여기 맥도날드 직원을 구현해 놓은 클래스가 있다. 이 맥도날드 직원 클래스의 각 메서드는 다음과 같이 고유의 관심사, 즉 비즈니스 로직으로써 달성해야 하는 특수한 목적이 존재한다. receiveOrder() : 주문을 접수하는 것. bakeBun() : 빵을 굽는 것. getVegetable() : 적절한 야채를 가져오는 것. grillPatty() : 패티를 굽는것. `as
AOP
[Spring] AOP란? 애플리케이션의 핵심적인 기능에서 부가적인 기능을 분리하여 모듈로 만들고 설계하여 개발하는 방법 목적(장점) : 1. 관심사 분리(핵심 로직, 부가 로직), 2. 중복 코드 제거 3. 비지니스 로직 순수성 유지 Spring AOP의 핵심 개념과 구성 요소: Aspect: Aspect는 AOP에서 관심사를 모듈화한 단위입니다. Aspect는 Advice와 Pointcut을 포함합니다. Advice : Aspect에서 실질적으로 어떤 일을 해야할지에 대한 부가기능을 담은 구현체를 의미 PointCut : 부가기능이 어느 지점에서 실행될지를 정의하는 것(ex : com.example.controller) @Aspect public class LoggingAspect { @Around("execution(* com.example.service..(..))") public Object logMethodExecution(Proceeding

[Spring] Spring AOP
⚡ Spring AOP 📌 AOP(Aspect Oriented Programming) 🔷 모듈화의 단위 OOP: 클래스 AOP: Aspect(관점) > 💡 Aspect 여러 타입과 객체에 거쳐서 사용되는 기능(Cross Cutting, 트랜잭션 관리 등)의 모듈화 > 💡 Cross Cutting: 공통 관심사항(핵심 관심사항을 관통하는 관점) 💡 Core Concern: 핵심 관심사항(주 기능들) 🔷 Spring framework의 필수요소는 아니지만, AOP 프레임워크는 Spring IoC를 보완한다. 🔷 기존의 경우 🖥 Programmer 🖥 DiseaseException 🖥 Test 예외 발생 시 
[Spring] 🌱AOP (Aspect-oriented Programming)
스프링에서는 스키마 기반 접근 방식 이나 @Aspect 어노테이션을 통해 AOP를 사용할 수 있도록 도와줍니다. 이중에서 @Aspect 기반의 AOP에 대해 정리해 보려고 합니다. 🌱 AOP(관점 지향 프로그래밍) AOP는 관점(Aspect)지향 프로그래밍으로, 여러 기능들에 나타나는 공통적인 부가 기능을 모듈화하여 재사용 하는 기법을 의미합니다. AOP의 목적 보통 중요한 로직을 수행하는 핵심 기능들을 구현하면 해당 기능들에 공통적으로 따라오는 부가 기능들이 존재합니다. 이것을 **횡단 관심사(C

스프링 부트 용어 정리1
Ioc - 제어의 역전 : 객체의 생성과 관리를 개발자가 하는 것이 아니라 프레임워크가 대신하는 것 DI - 의존성 주입 : 외부에서 객체를 주입받아 사용하는 것 빈 : 스프링 컨테이너가 생성하고 관리하는 객체 -> 스프링의 객체 AOP - 관점 지향 프로그래밍 : 프로그래밍을 할 때 핵심관점과 부가관점을 나누어서 개발하는 것 PSA - 이식 가능한 서비스 추상화 : 어떤 기술을 사용하던 일관된 방식으로 처리하도록 하는 것 라우터 : HTTP요청과 메서드를 연결하는 장치 계층 : 각각 역할과 책임이 있는 소프트웨어의 구성 요소

AOP(Aspect-Oriented Programming)
정의 > Aspect-Oriented Programming AOP는 관점(Aspect)지향 프로그래밍으로, 관점을 기준으로 다양한 기능을 분리하여 보는 프로그래밍이다. 관점(Aspect)이란, 부가 기능과 그 적용처를 정의하고 합쳐서 모듈로 만든 것이다 즉 어떠한 로직을 핵심적인 관점, 부가적인 관점으로 나누어 보고, 그 관점을 기준으로 나누어 모듈화 하는것이다. 흩어진 관심사 > Crosscutting Concerns 코드를 짜다보면 소스코드상에서 각각 다른 곳에서 반복적으로 쓰이는 똑같은 코드들을 발견하게 된다. 이것을 흩어진 관심사 라고 부른다. 이 흩어진 관심사들을 모듈화 하고 비즈니스 모델에서 분리해내서 재사용하는것이 AOP의 취지이다. 모

[CS] Life cycle / Aop
✅ 이미지로 미리보는 라이프 사이클 출처 >wjd489898 ✅ 라이프 사이클 class 컴포넌트와 React hooks >- 컴포넌트가 마운트 된 직후 호출된다. 초기화 작업은 이 메서드에 이루어지며 된다. API요청을 통해 외부에서 데이터를 가져와야 한다면, 요청을 보내기에 적절한 위치이다. componentDidMount() > >- 데이터가 갱신이 일어난 직후에 호출된다. 그래서 처음 렌더링 될 때는 호출되지 않는다. 이전의 props와 현재의 props를 비교하기 때문에 특정 props 변화에
[Spring] AOP(Aspect Oriented Programming)
AOP 정의 AOP는 Aspect Oriented Programming의 약자로 관점 지향 프로그래밍이라고 불린다. 이는 객체 지향 프로그래밍 패러다임을 보완하는 기술로 메서드나 객체의 기능을 핵심 관심사(Core Concern)와 공통 관심사(Cross-cutting Concern)로 나누어 프로그래밍 하는 것을 말한다. 핵심 관심사는 각 객체가 가져야할 본래의 기능이고, 공통 관심사는 여러 객체에서 공통적으로 사용되는 코드를 의미한다. 여러 개의 클래스에서 반복적으로 사용되는 코드가 있다면 해당 코드를 모듈화하여 공통 관심사로 분리한다. 여기서 모듈화란 어떤 공통된 로직이나 기능을 하나의 단위로 묶는것을 말한다. Class

로그 추적기 만들기
로그 추적기란? 애플리케이션이 커지면 모니터링과 운영이 중요해지기 때문에 어떤 부분에서 병목이 발생하고, 어떤 부분에서 예외가 발생하는지 로그를 통해 확인하는 것이 중요하다. 예시 📔 V0 버전 AOP에 들어가기 앞서 로그 추적기에 대해서 배운다. 우선 V0 버전을 소개하는데 현재는 로그추적기가 적용되어 있지 않은 상태이다. @RequiredArgsConstructor final이 붙거나 @NotNull 이 붙은 필드의 생성자를 자동 생성해주는 롬복 어노테이션 @Component 선언적인 어노테이션으로 패키지 스캔 안에 이 어노테이션이 있다면 자동으로 빈으로 등록해준다. 싱글톤 클래스 빈을 생성하는 어노테이션이다. @Scope를 통해 싱글톤이 아닌 빈을 생성할 수도 있다. > @Configuration의 차이 스프링에서 Bean을 수동으로 등록하기 위해서 설정하는 어노테이션이
[AOP] ProceedingJoinPoint, JoinPoint
Aop와 관련하여 공부하던 도중 알게 된것을 간단하게나마 적어보려고 합니다 저번에 한번 AOP @validate를 통한 유효성 검증 처리 블로그를 올린적이 있는데 간략하게 코드 설명을 하자면, postmapping, putmapping이 붙어있는 모든 컨트롤러가 동작 할때 BindingResult 매개변수가 있으면 if가 동작 하게 되는데 동작해도 에러가 있을때만 throw new CustomValidationException 를 날리고 에러가 없으면 proceed() 실행 정상적으로 실행하라는 메서드이다. 근데 메서드의 매개변수를 ProceedingJoinPoint를 사용 이유에 대해 간략하게 적어보려고 합니다 JoinPoint 인터페이스 JoinPoint 인터페이스는 호출되는 대상 객체, 메서드, 전달 파라미터 목록에 접근 할 수 있는 메소드 제공 제공 메서드 ProceedingJoinPoint 인터페이스 JoinPoint를 상속받은 객

[Spring] Spring AOP 사용 시 주의점 (With @Transactional)
문제 상황 실무에서 @Transactional 어노테이션을 사용하면서 겪은 문제이다. 다음과 같은 코드에서 문제가 발생했다. IntelliJ의 플러그인으로 사용하고 있는 SonarLint에서 버그를 감지했는데, 메세지를 확인해 보면 다음과 같다. 확인해보면 실제 트랜잭션이 동작되지 않는다고 써있는데, 그 이유는 뭘까? @Transactional의 동작 원리 먼저 @Transactional은 스프링AOP 기반(프록시)으로 동작된다. 스프링 AOP는 부가기능(Advice)을 적용할 대상(Pointcut)에 대해 런타임에 프록시를 생성하고, 생성한 프록시를 빈으로 등록해서 사용하게 된다.  vs 핵심 관심 사항(core concern) 분리 hellospring하위 디렉토리에 aop라는 패키지를 만들고 안에 TimeTraceAop라는 파일을 만듭니다. 위처럼 매서드가 실행될 때 마다 어떤 메서드가 실행되는지와 실행 시간을 출력하는 코드를 만듭니다. 또한 @component어노테이션을 붙여 스프링 빈에 등록해줍니다. @Aspect어노테이션을 사용하면 AOP의 Aspect로 작동하며 그 내부에는 advice와 pointcut이 정의된다. 위 코드가 잘 동작하는지 확인해봅시다.  Core Concern / Crosscutting Concern: Core Concern: 메인 코드. Business logic 을 주로 말한다. ex) Business logic Crosscutting Concern: Core Concern 진행 중에 계속 치고 들어오는 복붙 많은 코드 ex) 로깅, 트랜잭션 관리, 보안 등 Target Object: Target Object는 AOP의 대상이 되는 객체다. 주로 이 객체에 대한 메서드들이 대상이다. Advice: Advice는 Crosscutting Concern 을 언제, 어떻게 실행할지 정의한다. ex) 메서드 실행 전/후 에 실행 Join-Point: Join-Poi
플레이데이터 백엔드 부트캠프 10주차 회고
1. 전반적인 느낀점(배운 것) RestAPI를 해보면서 실제 스마트폰에서 화면을 이동하지 않고 그 화면에서 바뀌는 것을 배우고, Log4j를 수정하면서 AOP의 개념을 배우고, tiles를 통해 공통적으로 jsp를 합칠 수 있는 편리한 것을 배웠고 Interceptor를 배워 Filter와 위치만 다른 역할을 하는 것을 배웠다. 그리고 파일을 화면에서 선택을 해서 폴더에 넣는 것과 안 넣는 것까지 배웠다. 2. 좋았던 점 강사님께서 내주신 팀프로젝트 간 RestAPI와 Ajax를 잘 활용하여 같은 화면에서 버튼을 누르면 데이터를 바꿀 수 있는 것을 잘 짠 것이 뿌듯했다. 3. 아쉬웠던 점 리트코드 스터디를 제대로 하지 못하였다. spring이 워낙 벅차다 보니 코테 문풀을 하기가 여간 쉽지가 않다. 4. 개선할 점 어떻게든 스터디를 제대로 한다! 5. 다음 주 계획 월요일부터 시작하는 프로젝트에 열심히 임하고 이번에는 내가 주도하여 프로젝트를 진행해야 겠
[Spring] 6. Spring AOP
AOP는 기존 OOP(Object-Oriented-Programming)를 보조하기 위해 등장한 개념으로, 횡단 관심사를 깔끔하게 처리하기 위해 등장하였다. 우리가 만약 기존 코드에 반복적으로 등장하는 부가기능을 추가하고자 한다고 생각해보자. 기존의 OOP는 애플리케이션을 기능을 중심으로 바라보았다. 따라서 코드조각도 기능을 중심으로 나뉘어있고, 반복적으로 등장하는 부가기능을 추가하려면 그 모든 조각들을 하나씩 정성을 들여 수정을 해야한다. 이런 부가기능을 횡단관심사라고 부른다. 우리 애플리케이션의 주요한 핵심기능은 아니지만, 여러 부분에서 반복적으로 등장하는 코드. 이 코드들을 핵심기능에서 분리하고, 한 곳에서 관리하도록 만들어주는 것이 바로 AOP이다. 먼저 이 AOP의 핵심 개념을 짚어보겠다. Aspect : 횡단 관심사, 비즈니스 로직이 아니며 여러 객체에 걸쳐 반복적으로 등장하는 관심 사항이다. 적용할 기능을 뜻하는 Advice와 적용할 위치를 뜻하는 Pointcu

Spring AOP 란?
1. AOP란? AOP(Aspect-Oriented Programming)는 핵심 로직과 부가 기능을 분리하여 애플리케이션 전체에 걸쳐 사용되는 부가 기능을 모듈화하여 재사용할 수 있도록 지원하는 것이다. Aspect-Oriented Programming를 해석하면 관점(관심) 지향 프로그래밍 이 되는데, 이는 프로젝트 구조를 바라보는 관점을 바꿔보자는 의미이다. Java에서 객체지향프로그래밍인 OOP는 목적에 따라 클래스, 객체를 만드는 방식으로, 핵심 비즈니스 로직, 부가기능 로직 등 하나의 객체로 분리하는 방식인데, 이를 관점의 시선에서 바라보는 방식이 AOP다. 사실 말로 설명하면 이해가 잘 안되니 사진 하나를 보겠다. 위의 사진에서는 핵심 기능으로 이체, 대출, 이자계산 등이 있다. 해당
1-6. 로그 추척기 V2 - 적용
이제 로그 추적기를 애플리케이션에 적용해보자. v1 -> v2 복사 로그 추적기 V2를 적용하기 전에 먼저 기존 코드를 복사하자. com.example.logsystem.v2; 패키지 생성 복사 v1.OrderControllerV1 → v2.OrderControllerV2 v1.OrderServiceV1 → v2.OrderServiceV2 v1.OrderRepositoryV1 → v2.OrderRepositoryV2 코드 내부 의존관계를 클래스를 V2으로 변경 OrderControllerV2 : OrderServiceV1 → OrderServiceV2 OrerServiceV2 : OrderRepositor V1 → OrderRepositoryV2 OrderControllerV2 매핑 정보 변경 `@GetMapping
1-6. 로그 추척기 V2 - 적용
이제 로그 추적기를 애플리케이션에 적용해보자. **v1 -> v2 복사 로그 추적기 V2를 적용하기 전에 먼저 기존 코드를 복사하자. com.example.logsystem.v2; 패키지 생성 복사 v1.OrderControllerV1 → v2.OrderControllerV2 v1.OrderServiceV1 → v2.OrderServiceV2 v1.OrderRepositoryV1 → v2.OrderRepositoryV2 코드 내부 의존관계를 클래스를 V2으로 변경 OrderControllerV2 : OrderServiceV1 → OrderServiceV2 OrerServiceV2 : OrderRepositor V1 → OrderRepositoryV2 OrderControllerV2 매핑 정보 변경 `@GetMapping("