일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- Java
- 유레카
- Zuul
- 구간 트리
- 스택
- spring boot
- spring cloud
- 이분 탐색
- Gradle
- 주울
- ZuulFilter
- 스프링 시큐리티
- 다익스트라
- 도커
- Logback
- BFS
- 트리
- 달팽이
- 구현
- 비트마스킹
- 이분 매칭
- docker-compose
- 완전 탐색
- dp
- 게이트웨이
- 서비스 디스커버리
- Spring Cloud Config
- 메모이제이션
- 백트래킹
- 플로이드 와샬
- Today
- Total
목록분류 전체보기 (387)
Hello, Freakin world!
참고 : https://docs.spring.io/spring/docs/4.3.15.RELEASE/spring-framework-reference/html/aop.html#writing-good-pointcuts 11. Aspect Oriented Programming with Spring Aspect-Oriented Programming (AOP) complements Object-Oriented Programming (OOP) by providing another way of thinking about program structure. The key unit of modularity in OOP is the class, whereas in AOP the unit of modularity is the ..
거두절미하고 바로 예제로 고고! 우선 Person 도메인 클래스를 정의합니다. package com.aop.validationexam; import lombok.Getter; import lombok.RequiredArgsConstructor; import lombok.ToString; import javax.validation.constraints.Min; import javax.validation.constraints.NotNull; @Getter @ToString @RequiredArgsConstructor public class Person { @NotNull(message = "name is null") private final String name; @Min(1) private final in..
시간이 엄청나게 걸렸다. 간단한 CRUD라도 테스트를 일일이 작성하고 예외처리, validation 등 견고한 코드를 작성하는건 꽤 어려운 일이었다. 구현한 것들 - api 응답에 하이퍼미디어 추가 - ControllerAdvice를 이용한 예외처리 - api 메서드 마다 단위테스트 추가 구현 보류한 것들 - AOP이용한 validation : AOP에 대한 학습이 더 필요하다. 휴~ 일단 결과물부터 살펴보자. /customers 는 고객 도메인의 aggregate root의 진입점에 해당한다. 페이징 파라미터를 따로 추가하지 않으면 size = 5다. 굳이 이렇게 말하지 않아도 응답에 _link 객체의 all의 href를 보거나, 여기서는 보이지 않지만 self 속성의 href 속성을 보면 어떤 파라미..
참고 : https://docs.spring.io/spring/docs/4.3.15.RELEASE/spring-framework-reference/html/aop.html#aop-pointcuts-designators 이 글은 위의 내용을 요약/정리한 내용입니다. * 본 글에서 Designator는 지시어라는 용어로 나타냈습니다. Designator는 쉽게 말하자면 포인트컷 표현식 내에서 어떤 기능들을 수행하기 위해 정의해놓은 속성들입니다. 지원하는 포인트컷 지시어들 스프링 AOP는 다음의 AspectJ 포인트컷 지시어를 지원합니다. - execution : 메서드 조인 포인트에 매칭할 때, 주로 사용되는 기본적인 포인트컷 지시어입니다. - within : 주어진 타입으로 조인 포인트 범위를 제한할 수 ..
스프링 AOP는 오직 메서드 실행에 관한 조인 포인트만을 지원합니다. 포인트컷은 두가지 요소를 가집니다. 하나는 signature 입니다. 이름과 파라미터들고 구성됩니다. 다른 하나는 표현식입니다. 이 표현식은 매칭될 메서드를 결정합니다. @AspectJ 애너테이션 방식에서 포인트컷의 시그니처를 메서드 시그니처를 따릅니다. 표현식은 @Pointcut의 속성으로 지정됩니다. @Pointcut("execution(* transfer(..))")// the pointcut expression private void anyOldTransfer() {}// the pointcut signature 위의 예제에서 표현식은 "execution(* transfer(..))" 이고, 시그니처는 파라미터는 없으므로 any..
@AspectJ 를 사용할 수 있게 되면, 스프링 빈 중 @Aspect 애너테이션이 정의되어있는 경우 자동으로 찾아 Spring AOP에 사용한다. @Aspect public class NotVeryUsefulAspect { } @Aspect 클래스는 다른 클래스와 마찬가지로 클래스와 메서드를 가질 수 있다. 또 포인트컷, 어드바이스, 인트로덕션(inter-type)도 포함할 수 있다. 만약 애스펙트 빈을 추가할 때, xml 방식을 사용한다면 위의 방식으로 충분하다. 하지만 자바 애너테이션 스타일을 사용한다면 다음과 같이 @Component 를 같이 사용해 빈으로 만들어줘야 한다. @Component @Aspect public class NotVeryUsefulAspect { } 참고 : @Aspect ..
참조 : https://docs.spring.io/spring/docs/4.3.15.RELEASE/spring-framework-reference/html/aop.html#aop-ataspectj 위 글의 토막을 번역/요약한 내용입니다. @ApsectJ support @AspectJ는 자바 애너테이션을 이용해 aspect를 선언하는 방법이다. 스프링은 AspectJ에 의해 제공되는 라이브러리를 이용해 포인트컷을 파싱하고 매치한다. @AspectJ support 사용하기 XML, Java style 설정이 가능하다. 이 두 가지 방식 모두 AspectJ의 aspectweaver.jar 라이브러리가 애플리케이션 classpath에 위치해 있어야 한다(ver 1.6.8 이상). 이 라이브러리는 AspectJ ..
validation 이라는 주제로 이렇게 시간을 오래 끌줄은 몰랐다. 순전히 개인적인 욕심 때문이기도 하다. 목표는 컨트롤러 메서드에서 validation 코드를 분리하는 것이었다. 처음에는 @InitBinder 메서드를 이용하는 방법을 생각했다. @InitBinder 메서드는 context로부터 WebDataBinder 인스턴스를 주입받을 수 있다. 이 인스턴스에 validator를 추가할 수 있는데, 뭔가 이상했다.(혹시 버그가 있는걸까?) validator가 호출되지 않아야하는 타입에서 자꾸 호출되면서 예외를 던졌다.(단위 테스트에서는 분명히 제대로 작동하는데도!) 자질구레한 버그들이 자꾸 생겨서 일단 이 방식은 쓰지 않기로 했다. 위 방식을 쓰지 않겠다는 말은 컨트롤러 메서드의 본문이 시작되기 이..
참조 : https://docs.spring.io/spring/docs/4.3.15.RELEASE/spring-framework-reference/html/aop.html#aop-introduction-defn Aspect : 다수 클래스를 가로지르는 관심사를 모듈화한 것이다. 객체지향에서의 클래스와 같은 개념이다. 스프링에서 aspect는 두 가지 방식으로 구현된다. - schema-based approach (xml을 기반으로 한 방식인듯? 하다) - annotation approach Join Point : 메서드가 실행되고 있는 동안의 시점을 의미한다. AOP 프레임워크의 어느 특정 기능에 대한 용어가 아니다! 예를 들어, 특정 메서드가 실행되기 전에서 끝나기 까지의 그런 시점들을 총징하는 용어다..
시나리오 사용자가 POST 요청으로 데이터를 보낼 때(포맷은 json), @RequestBody 애너테이션을 이용하면 스프링 내부에서 필드명을 이용해서 자동으로 값을 바인딩해줍니다. 값이 제대로 되었는지 체크하는 validation 과정을 컨트롤러 메서드 내에서 수행하기 보단, 컨트롤러 로직 이전, 값을 바인딩한 직후 validation 과정을 수행하고 싶습니다. validation 과정 중 이상이 있는 경우 예외를 던지고 AOP를 @ControllAdvice를 이용해서 전역적으로 이 예외를 처리하려고 합니다. 예제 우선 바인딩 타겟이 되는 Person이라는 클래스를 만듭니다. import lombok.Builder; import lombok.Getter; @Getter public class Perso..