WEB 158

스프링 핵심 원리 - 고급편 7) @Aspect AOP , 스프링 AOP 개념

@Aspect AOP AspectJ 에서 제공하는 에노테이션이다. annotation을 차용했을 뿐 실제 내부 구현은 스프링이 한것이다. 진짜 AspectJ를 사용하는것이 아니다. (컴파일 ,로드타임 위버 사용하는것 아님) @Slf4j @Aspect public class LogTraceAspect { private final LogTrace logTrace; public LogTraceAspect(LogTrace logTrace) { this.logTrace = logTrace; } @Around("execution(* hello.proxy.app..*(..))") public Object execute(ProceedingJoinPoint joinPoint) throws Throwable { Trace..

WEB/Spring 2022.06.12

스프링 핵심 원리 - 고급편 6) 빈 후처리기

일반적인 스프링 빈 등록 과정 public class BasicTest { @Test void basicConfig() { ApplicationContext applicationContext = new AnnotationConfigApplicationContext(BasicConfig.class); //A는 빈으로 등록된다. A a = applicationContext.getBean("beanA", A.class); a.helloA(); //B는 빈으로 등록되지 않는다. Assertions.assertThrows(NoSuchBeanDefinitionException.class, () -> applicationContext.getBean(B.class)); } @Slf4j @Configuration sta..

WEB/Spring 2022.06.09

스프링 핵심 원리 - 고급편 5) 스프링이 지원하는 프록시

ProxyFactory 인터페이스가 있을때 -> JDK동적프록시 (InvocationHandler) 인터페이스가 없을때 -> CGLIB(MethodInterceptor) 둘다 구현하기는귀찮다. 특정 조건이 맞을 때 프록시 로직을 적용하는 기능도 공통으로 제공되었으면한다. 추상화 레이어인 ProxyFacotry가 생겼고 InvocationHandler, MethodInterceptor 를 추상화한 Advice가 제공된다. Advice = 조언 , 프록시가 제공하는 부가 기능 로직 Factory안에서 우리가 주입해준 Advice 를 CGLIB,JDK Dynamic을 알아서 구분하여 호출 하게 된다. ProxyFactory + Advice 예제 public class TimeAdvice implements M..

WEB/Spring 2022.06.09

앱 설명

facebook 로그인 버튼을 누르면 client (react app에서) 날리는 요청의 url 이다. http://localhost:8300/oauth2/authorize/facebook 은 provider 인 facebook의 인증 페이지에 관한 요청 redirect_uri 는 모든 인증 과정이 끝나면 나를 여기로 보내달라는 의미 -> react router에 해당 url 이 존재함 OAuth2AuthorizationRequestRedirectFilter에서 HttpServletRequest에서 OAuth2AuthorizationRequest를 만들어내는데 성공하면 이것의 GrantType이 authorization_code 인지 확인해보고 AuthorizationRequestRepository 에 ..

WEB/Security 2022.06.08

스프링 핵심 원리 - 고급편 4) 동적 프록시 기술

리플렉션 void reflection0() { Hello target = new Hello(); //공통 로직1 시작 log.info("start"); String result1 = target.callA(); //호출하는 메서드가 다음 log.info("result={}", result1); //공통 로직1 종료 //공통 로직2 시작 log.info("start"); String result2 = target.callB(); //호출하는 메서드가 다음 log.info("result={}", result2); //공통 로직2 종료 } 거의 로직1 과 로직 2가 유사하지만 공통 메소드로 묶기가 힘들다. 중간에 호출하는 메서드가 다르기 때문이다. void reflection2() throws Exceptio..

WEB/Spring 2022.06.07

스프링 핵심 원리 - 고급편 4) 프록시 패턴과 데코레이터 패턴

예제 생성할때 주의할점 @Import(AppV1Config.class) @SpringBootApplication(scanBasePackages = "hello.proxy.app") //주의 public class ProxyApplication { 원래는 해당 ProxyApplication이 존재하는 패키지 부터 (proxy) 밑으로 쫘악 component scan을 하지만 여기서는 Configuration을 계속해서 바꾸길 원하기 때문에 basepackage의 위치를 변경하였다. @Configuration public class AppV1Config { @Bean public OrderControllerV1 orderControllerV1() { return new OrderControllerV1Impl..

WEB/Spring 2022.06.06

스프링 핵심원리 고급편 3) 템플릿 메서드 패턴과 콜백 패턴

템플릿 메서드 패턴 부모클래스에 알고리즘의 골격인 template을 정의하고 일부 변경되는 로직은 자식클래스에서 정의하는것이다. 로그 추적기를 사용하는 구조는 모두 동일하다. 이런 boilerplate 를 template으로 만들어서 해결하자 public abstract class AbstractTemplate { public void execute() { long startTime = System.currentTimeMillis(); //비즈니스 로직 실행 call(); //상속 //비즈니스 로직 종료 long endTime = System.currentTimeMillis(); long resultTime = endTime - startTime; log.info("resultTime={}", resul..

WEB/Spring 2022.06.06

Lesson 33,34 - Integration testing for Spring Security implementations - Part 1,2

test doesn't go whole cycle of spring security instad mock create Security context also assuming authentication had worked already authentication , authorization test are seperated @SpringBootTest @AutoConfigureMockMvc class Example1Tests { @Autowired private MockMvc mockMvc; @Test @DisplayName("When calling the /demo endpoint without authentication we expect to get a 401 Unauthorized.") void te..

WEB/Security 2022.05.22