Spring-Boot
-
Spring 핵심 원리 고급편 - 8. @Aspect AOPSpring-Boot/스프링핵심원리 - 고급편 2022. 6. 8. 15:59
- 스프링 애플리케이션에 프록시를 적용하려면 포인트컷과 어드바이스로 구성되어 있는 어드바이저 ( ' Advisor ' )를 만들어서 스프링 빈으로 등록하면 된다. - 그러면 나머지는 앞서 배운 자동 프록시 생성기가 모두 자동으로 처리해준다. - 자동 프록시 생성기는 스프링 빈으로 등록된 어드바이저들을 찾고, 스프링 빈들에 자동으로 프록시를 적용해준다. ( 물론 포인트컷에서 매칭되는 경우에 프록시를 생성 ) - 스프링은 @Aspect 애노테이션으로 매우 편리하게 포인트컷과 어드바이스로 구성되어 있는 어드바이저 생성 기능을 지원한다 * 참고 * - @Aspect는 관점 지향 프로그래밍(AOP)을 가능하게 하는 AspectJ 프로젝트에서 제공하는 애노테이션이다 - 스프링은 이것을 차용해서 프록시를 통한 AOP..
-
Spring 핵심 원리 고급편 - 7. 빈 후처리기Spring-Boot/스프링핵심원리 - 고급편 2022. 6. 8. 10:33
- @Bean 이나 컴포넌트 스캔으로 스프링 빈을 등록하면, 스프링은 대상 객체를 생성하고, 스프링 컨테이너 내부의 빈 저장소에 등록한다. - 그리고 그 이후에는 스프링 컨테이너를 통해 등록한 스프링 빈을 조회해서 사용하면 된다 * 빈 후처리기 - BeanPostProcessor * - 스프링이 빈 저장소에 등록할 목적으로 생성한 객체를 빈 저장소에 등록하기 직전에 조작하고 싶으면 빈 후처리기를 사용하면 된다. - 빈 포스트 프로세서 ( BeanPostProcessor ) 는 번역하면 빈 후처리기인데, 이름 그대로 빈을 생성한 후에 무언가를 처리하는 용도로 사용한다 * 빈 후처리기 기능 * - 빈 후처리기의 기능은 막강하다 - 객체를 조작할 수도 있고, 완전히 다른 객체로 바꿔치기 하는 것도 가능하다 *..
-
Spring 핵심 원리 고급편 - 6. 스프링이 지원하는 프록시Spring-Boot/스프링핵심원리 - 고급편 2022. 6. 7. 16:47
프록시 팩토리 - 스프링은 유사한 구체적인 기술들이 있을 때, 그것들을 통합해서 일관성 있게 접근할 수 있고, 더욱 편리하게 사용할 수 있는 추상화된 기술을 제공한다. - 스프링은 동적 프록시를 통합해서 편리하게 만들어주는 프록시 팩토리( ProxyFactory ) 라는 기능을 제공한다 - 프로시 팩토리는 인터페이스가 있으면 JDK 동적 프록시를 사용하고, 구체 클래스만 있다면 CGLIB를 사용한다. 그리고 이 설정은 변경할 수도 있다. - 부가 기능을 적용할 때 Advice라는 새로운 개념을 도입했다 - 개발자는 InvocationHandler 나 MethodInterceptor를 신경쓰지않고 Advice만 만들면 된다. - 결과적으로 InvocationHandler 나 MethodInterceptor..
-
Spring 핵심 원리 고급편 - 5. 동적 프록시 기술Spring-Boot/스프링핵심원리 - 고급편 2022. 6. 7. 13:42
- 자바가 기본으로 제공하는 JDK 동적 프록시 기술이나 CGLIB 같은 프록시 생성 오픈소스 기술을 활용하면 프록시 객체를 동적으로 만들어 낼 수 있다. - 프록시를 적용할 코드를 하나만 만들어두고 동적 프록시 기술을 사용해서 프록시 객체를 찍어내면 된다. - JDK 동적 프록시를 이해하기 위해서는 먼저 자바의 리플렉션 기술을 이해해야 한다. 리플렉션 - 리플렉션 기술을 사용하면 클래스나 메서드의 *메타정보*를 동적으로 획득하고, 코드도 동적으로 호출할 수 있다. * 참고 * - 람다를 사용해서 공통화하는 것도 가능! @Test void reflection1() throws Exception { // 클래스 정보 // 클래스 메타정보를 획득한다. 참고로 내부 클래스는 구분을 위해 $를 사용한다. Cla..
-
Spring 핵심 원리 고급편 - 4. 프록시 패턴과 데코레이터 패턴Spring-Boot/스프링핵심원리 - 고급편 2022. 6. 3. 09:55
* 예제는 크게 3가지 상황 * v1 - 인터페이스와 구현 클래스 - 스프링 빈으로 수동 등록 v2 - 인터페이스 없는 구체 클래스 - 스프링 빈으로 수동 등록 v3 - 컴포넌트 스캔으로 스프링 빈 자동 등록 - 실무에서는 스프링 빈으로 등록할 클래스는 인터페이스가 있는 경우도 있고 없는 경우도 있다. 그리고 스프링 빈을 수동으로 직접 등록하는 경우도 있고, 컴포넌트 스캔으로 자동으로 등록하는 경우도 있다. - @RequestMapping : 스프링 MVC는 @Controller 또는 @RequestMapping 애노테이션이 타입에 있어야 스프링 컨트롤러로 인식한다. 그리고 스프링 컨트롤러로 인식해야, HTTP URL이 매핑되고 동작한다. 이 애노테이션은 인터페이스에 사용해도 된다. - @Response..
-
Spring 핵심 원리 고급편 - 3. 템플릿 메서드 패턴과 콜백 패턴Spring-Boot/스프링핵심원리 - 고급편 2022. 6. 2. 16:07
* 핵심 기능 vs 부가 기능 * - 핵심 기능 : 해당 객체가 제공하는 고유의 기능 - 부가 기능 : 핵심 기능을 보조하기 위해 제공되는 기능, 예를 들어 로그 추적 로직, 트랜잭션 기능이 있다. * 변하는 것과 변하지 않는 것을 분리 * - 좋은 설계는 변하는 것과 변하지 않는 것을 분리하는 것이다 - 여기서 핵심 기능 부분은 변하고, 로그 추적기를 사용하는 부분은 변하지 않는 부분이다 - 이 둘을 분리해서 모듈화해야 한다 → 템플릿 메서드 패턴 ( Template Method Pattern ) 은 이런 문제를 해결하는 디자인 패턴이다. - try~catch 처럼 중간에 비즈니스로직이 들어갔을 때 사용 템플릿 메서드 패턴 * 템플릿 메서드 패턴 구조 그림 * @Slf4j public abstract ..
-
Spring 핵심 원리 고급편 - 2. ThreadLocalSpring-Boot/스프링핵심원리 - 고급편 2022. 6. 2. 13:31
필드 동기화 * 동시성 문제 * FieldLogTrace는 싱글톤으로 등록된 스프링 빈이다. 이 객체의 인스턴스가 애플리케이션에 딱 1 존재한다는 뜻이다. 이렇게 하나만 있는 인스턴스의 ' FieldLogTrace.traceIdHolder ' 필드를 여러 쓰레드가 동시에 접근하기 때문에 문제가 발생 - 실무에 한번 나타나면 개발자를 가장 괴롭히는 문제도 바로 이러한 동시성 문제이다. 참고 Runnable user A = new Runnable() { @Override public void run() { } } Runnable userA = () -> { } : 동일 코드! * 동시성 문제 * - 여러 쓰레드가 동시에 같은 인스턴스의 필드 값을 변경하면서 발생하는 문제를 동시성 문제라 한다. - 이런 동시..
-
Spring 핵심 원리 기본편 - 9. 빈 스코프Spring-Boot/스프링핵심원리 - 기본편 2022. 5. 31. 09:55
빈 스코프란? - 지금까지 우리는 스프링 빈이 스프링 컨테이너의 시작과 함께 생성되어서 스프링 컨테이너가 종료될 때까지 유지된다고 학습했다. - 이것은 스프링 빈이 기본적으로 싱글톤 스코프로 생성되기 때문이다. 스코프는 번역 그대로 빈이 존재할 수 있는 범위를 뜻한다. * 스프링은 다음과 같은 다양한 스코프를 지원한다. * - 싱글톤 : 기본 스코프, 스프링 컨테이너의 시작과 종료까지 유지되는 가장 넓은 범위의 스코프이다 - 프로토타입 : 스프링 컨테이너는 프로토타입 빈의 생성과 의존관계 주입까지만 관여하고 더는 관리하지 않는 매우 짧은 범위의 스코프이다. - 웹 관련 스코프 ㆍrequest : 웹요청이 들오고 나갈때까지 유지되는 스코프이다 ㆍsession : 웹 세션이 생성되고 종료될 때까지 유지되는 ..