Backend/Spring - Core

본 글들은 인프런 김영한 강사님께 저작권이 있습니다.
Backend/Spring - Core

Spring Advanced #13. 스프링 AOP 실무 주의사항

스프링 핵심 원리 - 고급편의 복습을 위한 글이며, 이 글에 나오는 모든 사진과 코드의 저작권은 김영한 강사님께 있습니다. 1. 프록시와 내부 호출 스프링은 프록시 방식의 AOP를 사용한다. 따라서 AOP를 적용하려면 항상 프록시를 통해서 대상 객체(Target)을 호출해야 한다. 이렇게 해야 프록시에서 먼저 어드바이스를 호출하고, 이후에 대상 객체를 호출한다. 만약, 프록시를 거치지 않고 대상 객체를 직접 호출하게 되면 AOP가 적용되지 않고, 어드바이스도 호출되지 않는다. 스프링은 의존관계 주입시에 항상 프록시 객체를 주입하지만, 대상 객체의 내부에서 메소드 호출이 발생하면 프록시를 거치지 않고 대상 객체를 직접 호출하는 문제가 발생한다. 프록시 방식의 AOP는 메서드 내부 호출에 프록시를 적용할 수..

Backend/Spring - Core

Spring Advanced #12. 스프링 AOP 실전

스프링 핵심 원리 - 고급편의 복습을 위한 글이며, 이 글에 나오는 모든 사진과 코드의 저작권은 김영한 강사님께 있습니다. 1. 예제 생성 다음 어노테이션을 적용시킨 스프링 AOP를 만들어보겠다. @Trace : 어노테이션 로그 출력 @Retry : 어노테이션으로 예외 발생시 재시도 ExamRepository 5번정도 실행했을 때 1번 정도 오류가 발생하는 리포지토리이다. @Repository public class ExamRepository { private static int seq = 0; /** * 5번에 1번 실패하는 요청 */ public String save(String itemId) { seq++; if (seq % 5 == 0) { throw new IllegalStateException..

Backend/Spring - Core

Spring Advanced #11. 스프링 AOP 포인트컷

스프링 핵심 원리 - 고급편의 복습을 위한 글이며, 이 글에 나오는 모든 사진과 코드의 저작권은 김영한 강사님께 있습니다. 1. 포인트컷 지시자 조인 포인트(Join Point)란 어드바이스(부가 기능)가 적용될 수 있는 위치, 메소드 실행, 생성자 호출, 필드 값 접근, static 메소드 접근 같은 프로그램 실행 중의 지점이라고 정의했고, 포인트컷(Point Cut)이란 이 조인 포인트 중에서 어드바이스가 적용될 위치를 선별하는 기능이라고 정의하였다. AspectJ는 포인트컷을 표현하기 위한 @Pointcut("execution(* hello.aop.order..*(..)") 와 같은 표현식을 지원한다. 포인트컷 표현식은 위 표현식에서 execute와 같은 포인트컷 지시자(PointCut Design..

Backend/Spring - Core

Spring Advanced #3. 템플릿 메소드 패턴과 콜백 패턴 (2)

스프링 핵심 원리 - 고급편의 복습을 위한 글이며, 이 글에 나오는 모든 사진과 코드의 저작권은 김영한 강사님께 있습니다. 1. 템플릿 콜백 패턴 변하는 부분과 변하지 않는 부분을 분리하는 것이 해결하고 싶은 문제였다. 변하지 않는 부분을 템플릿이라고 하고, 그 템플릿에 변하는 부분의 코드 조각을 넣어서 실행하는 것이 목적이다. 앞서 만들었던 ContextV2는 변하지 않는 템플릿 역할을 한다. 그리고 변하는 부분은 파라미터로 넘어온 Strategy의 코드를 실행해서 처리한다. 이렇게 다른 코드의 인수로서 넘겨주는 실행 가능한 코드를 콜백(Callback)이라 한다. 쉽게 이야기해서 콜백은 코드가 호출(call)은 되는데 코드를 넘겨준 곳(back)에서 실행된다는 뜻이다. 👉 콜백이란? 프로그래밍에서 콜..

Backend/Spring - Core

Spring Advanced #3. 템플릿 메소드 패턴과 콜백 패턴 (1)

스프링 핵심 원리 - 고급편의 복습을 위한 글이며, 이 글에 나오는 모든 사진과 코드의 저작권은 김영한 강사님께 있습니다. 1. 템플릿 메소드 패턴 로그 추적기 도입 전과 후의 코드를 비교해보자. 로그 추적기 도입 전 - V0 //OrderControllerV0 코드 @GetMapping("/v0/request") public String request(String itemId) { orderService.orderItem(itemId); return "ok"; } 로그 추적기 도입 후 - V3 //OrderControllerV3 코드 @GetMapping("/v3/request") public String request(String itemId) { TraceStatus status = null; tr..

Backend/Spring - Core

Spring Advanced #2. 쓰레드 로컬 - ThreadLocal

스프링 핵심 원리 - 고급편의 복습을 위한 글이며, 이 글에 나오는 모든 사진과 코드의 저작권은 김영한 강사님께 있습니다. 1. 필드 동기화 앞서 로그 추적기를 만들어서 다음 로그를 출력할 때 트랜잭션ID와 level을 동기화 하는 문제를 해결하기 위해 TraceId를 파라미터로 넘겼다. TraceId를 파라미터로 넘기지 않기 위해 새로운 로그 추적기를 만들어보겠다. LogTrace 로그 추적기를 위한 최소한의 기능인 begin(), end(), exception()을 정의했다. public interface LogTrace { TraceStatus begin(String message); void end(TraceStatus status); void exception(TraceStatus status,..

Backend/Spring - Core

Spring Advanced #1. 로그 추적기 (2)

스프링 핵심 원리 - 고급편의 복습을 위한 글이며, 이 글에 나오는 모든 사진과 코드의 저작권은 김영한 강사님께 있습니다. 1. 로그 추적기 - V2 앞 Spring Advanced #1. 로그 추적기 (1) 에서 로그 추적기의 기능을 어느정도 개발했지만, 아직 메소드의 호출 깊이가 표현이 안되고, HTTP 요청이 구분이 안된다는 문제가 있다. 통틀어서 로그에 대한 문맥(Context) 정보가 필요하다. 로그 추적기 요구사항 모든 Public 메소드의 호출과 응답 정보를 로그로 출력 애플리케이션의 흐름을 변경하면 안됨 메소드 호출에 걸린 시간 정상 흐름과 예외 흐름, 예외 발생시 예외 정보가 남아야 한다. 메소드 호출 깊이 표현 HTTP 요청 구분 HTTP 요청 단위로 특정 ID를 남겨서 어떤 HTTP ..

Backend/Spring - Core

Spring Advanced #1. 로그 추적기 (1)

스프링 핵심 원리 - 고급편의 복습을 위한 글이며, 이 글에 나오는 모든 사진과 코드의 저작권은 김영한 강사님께 있습니다. 1. 프로젝트 생성 2. 예제 프로젝트 - V0 상품을 주문하는 프로세스라고 가정하고, 일반적인 웹 애플리케이션에서 Controller -> Service -> Repository 로 이어지는 흐름을 단순하게 만들어보겠다. OrderRepositoryV0 @Repository 어노테이션 안에는 @Component 어노테이션이 내장되어 있기 때문에, 의존관계 주입을 위해 따로 어노테이션을 선언할 필요가 없다. @Service, @Controller 도 마찬가지이다. @Repository @RequiredArgsConstructor public class OrderRepositoryV0..

Backend/Spring - Core

Spring #10. 빈 스코프 (2)

스프링 핵심 원리 - 기본편의 복습을 위한 글이며 이 글에 나오는 모든 소스코드의 저작권은 인프런의 김영한 강사님께 있습니다. 1. 프로토타입 스코프 - 싱글톤 빈과 함께 사용 시 Provider로 문제 해결 싱글톤 빈과 프로토타입 빈을 함께 사용할 때 어떻게 하면 사용할 때 마다 새로운 프로토타입 빈을 생성할 수 있을까? 1.1 스프링 컨테이너에 요청 간단한 방법은 싱글톤 빈이 프로토타입을 사용할 때 마다 스프링 컨테이너에 새로 요청하면 된다. PrototpyeProviderTest public class PrototypeProviderTest { @Test void providerTest() { AnnotationConfigApplicationContext ac = new AnnotationConfi..

Backend/Spring - Core

Spring #10. 빈 스코프 (1)

스프링 핵심 원리 - 기본편의 복습을 위한 글이며 이 글에 나오는 모든 소스코드의 저작권은 인프런의 김영한 강사님께 있습니다. 1. 빈 스코프 이 스프링 컨테이너의 시작과 함께 생성되어서 스프링 컨테이너가 종료될 때 까지 유지된다고 학습했다. 이것은 스프링 빈이 기본적으로 싱글톤 스코프로 생성되기 때문이다. 스코프란 번역 그대로 빈이 존재할 수 있는 범위를 뜻한다. 스프링은 다음과 같은 다양한 스코프를 지원한다. 싱글톤 : 기본 스코프, 스프링 컨테이너의 시작과 종료까지 유지되는 가장 넓은 범위의 스코프 프로토타입 : 스프링 컨테이너는 프로토타입 빈의 생성과 의존관계 주입까지만 관여하고 더는 관리하지 않는 매우 짧은 범위의 스코프이다. 웹 관련 스코프 request : 웹 요청이 들어오고 나갈 때 까지 ..

Backend/Spring - Core

Spring #9. 빈 생명주기 콜백

스프링 핵심 원리 - 기본편의 복습을 위한 글이며 이 글에 나오는 모든 소스코드의 저작권은 인프런의 김영한 강사님께 있습니다. 1. 빈 생명주기 콜백 시작 데이터베이스 커넥션 풀이나, 네트워크 소켓처럼 애플리케이션 시작 시점에 필요한 연결을 미리 해두고, 애플리케이션 종료 시점에 연결을 모두 종료하는 작업을 진행하려면, 객체의 초기화 작업이 필요하다. 스프링을 통한 초기화 작업과 종료 작업을 어떻게 진행하는지 알아보겠다. 이 NetworkClient는 애플리케이션 시작 시점에 connect()를 호출하여 연결을 맺어두어야 하고, 애플리케이션이 종료하면 disConnect()를 호출해서 연결을 끊어야 한다. NetworkClient public class NetworkClient { private Stri..

Backend/Spring - Core

Spring #8. 다양한 의존관계 주입 방법

스프링 핵심 원리 - 기본편의 복습을 위한 글이며 이 글에 나오는 모든 소스코드의 저작권은 인프런의 김영한 강사님께 있습니다. 1. 다양한 의존관계 주입 방법 의존관계 주입은 크게 4가지 방법이 있다. 생성자 주입 수정자 주입(setter 주입) 필드 주입 일반 메소드 주입 1.1 생성자 주입 생성자를 통해 의존관계를 주입받는 방식이다. 불편, 필수 의존관계에서 사용된다. 생성자가 딱 1개만 존재하는 경우 @Autowired를 생략해도 자동으로 주입된다. @Component public class OrderServiceImpl implements OrderService { private final MemberRepository memberRepository; private final DiscountPol..

SeongJun Han
'Backend/Spring - Core' 카테고리의 글 목록