스프링
노션으로 따로 정리는 해두었지만, 그 내용이 너무 길어서 간단하게 정리한다.
어제 학습했을 때 프록시 클래스를 만들면서 원본 코드의 아무런 수정없이 로그 추적이 가능했다.
하지만, 이는 프록시 클래스를 모든 경우에 만들어줘야 한다는 문제가 있었다.
따라서, 이를 해결해야만 한다.
먼저, 자바에서 제공해주는 리플렉션 기술을 사용한 경우에는 Class로부터 메타데이터를 받아와 Method를 추상화하여 사용할 수 있으므로, 동적 프록시 클래스 생성이 가능했다.
하지만, 이는 컴파일시 오류를 잡지 못하고 런타임에서만 오류를 잡을 수 있는 문제가 있다.
따라서, 이것은 개발자의 발전을 역행하는 것이므로, 리플렉션은 보통 사용하지 않는다.
그래서, 다른 대안으로 JDK 동적 프록시를 활용한 방법인 InvocationHandler를 구현하여 사용하는 방법이 있다.
InvocationHandler는 프록시 작업을 하려고 하는 인터페이스를 전달받아서 프록시 작업을 한다.
위처럼 구성함으로, 우리는 Config 클래스를 통해 의존성만 잘 주입하면
생성한 InvocationHandler 구현체 프록시 클래스 하나로 다른 프록시 클래스를 추가로 생성할 필요없이 처리가 가능하다.
그럼 인터페이스만 해당 기술이 가능한가? 그것도 아니다
JDK 동적 프록시 한계
JDK 동적 프록시는 인터페이스가 필수이다. 그렇다면 V2 애플리케이션 처럼 인터페이스 없이 클래스만 있는 경우에는 어떻게 동적 프록시를 적용할 수 있을까? 이것은 일반적인 방법으로는 어렵고 CGLIB 라는 바이트코드를 조작하는 특별한 라이브러리를 사용해야 한다.
CGLIB - 소개
CGLIB: Code Generator Library
- CGLIB는 바이트코드를 조작해서 동적으로 클래스를 생성하는 기술을 제공하는 라이브러리이다.
- CGLIB를 사용하면 인터페이스가 없어도 구체 클래스만 가지고 동적 프록시를 만들어낼 수 있다.
- CGLIB는 원래는 외부 라이브러리인데, 스프링 프레임워크가 스프링 내부 소스 코드에 포함했다. 따라서 스프링을 사용한다면 별도의 외부 라이브러리를 추가하지 않아도 사용할 수 있다.
참고로 우리가 CGLIB를 직접 사용하는 경우는 거의 없다. 이후에 설명할 스프링의 ProxyFactory 라는 것이 이 기술을 편리하게 사용하게 도와주기 때문에, 너무 깊이있게 파기 보다는 CGLIB가 무엇인지 대략 개념만 잡으면 된다.
CGLIB은 MethodInterceptor 인터페이스를 구현하여 클래스를 상속하는 동적 프록시 생성을 도와준다.
하지만, 클래스를 상속하기에 아래와 같은 제약이 존재한다.
CGLIB 제약
- 클래스 기반 프록시는 상속을 사용하기 때문에 몇가지 제약이 있다.
- 부모 클래스의 생성자를 체크해야 한다. CGLIB는 자식 클래스를 동적으로 생성하기 때문에 기본 생성자 가 필요하다.
- 클래스에 final 키워드가 붙으면 상속이 불가능하다. CGLIB에서는 예외가 발생한다.
- 메서드에 final 키워드가 붙으면 해당 메서드를 오버라이딩 할 수 없다. CGLIB에서는 프록시 로직이 동작하지 않는다.
자세한 내용은 관련된 포스팅으로 다뤄보도록 하겠다.
Jenkins
- Jenkins + SonarQube 사용
- Jenkins Multi nodes 구성 - Master + Slaves(포스팅 중)
알고리즘
'개발 기록' 카테고리의 다른 글
2024-08-03 학습일기 (0) | 2024.08.03 |
---|---|
2024-08-02 학습일기 (0) | 2024.08.02 |
2024-07-31 학습일기 (0) | 2024.07.31 |
2024-07-30 학습일기 (0) | 2024.07.30 |
2024-07-27 ~ 2024-07-29 학습일기 (0) | 2024.07.29 |