Logback AsyncAppender 동작원리 분석
·
Spring
Logback에 대해 자세히 알아보는 과정에서 AsyncAppender를 통해서 로깅 작업을 비동기적으로 수행할 수 있다는걸 알게 됐습니다. 그렇다면 내부적으로 로깅을 대신해주는 쓰레드풀이 존재하는건지 동작 원리가 궁금해서 직접 디버깅을 통해 알아보는 시간을 가졌습니다.AsyncAppender 설정우선 logback에서 AsyncAppender를 어떻게 설정하는지 알아보자. 100 20 false true logback.xml 파일에서 ch.qos.logback.classic.AsyncAppender를 추가하면 AsyncAppender를 사용 가능하다.이때 AsyncAppender는 직접 로깅을 하는..
스프링 캐시 동작 과정 분석
·
Spring
프로젝트에 스프링 캐시를 도입하는 과정에서 어떤 방식으로 내부 구현이 되어 있는지 궁금해졌습니다. @Cacheable 어노테이션을 사용해서 캐시 조회 기능을 사용했을때 어떻게 동작하는지 위주로 분석해보겠습니다.캐시 호출 시 가장 먼저 동작하는 클래스는 CacheAspectSupport이다. 해당 클래스는 AOP를 사용해 스프링 캐시의 구체 기술을 쉽게 적용할 수 있도록 도와주는 역할을 수행한다. 해당 클래스 내의 execute() 메서드가 호출되면 findCacheValue()라는 내부 메서드가 호출되서 캐시값을 가져온다. findCacheValue() 메서드를 좀 더 자세히 살펴보자.  findCachedValue() 메서드 내부에 findInCaches()라는 메서드가 하나 더 있는걸 볼 수 있다. ..
멀티 모듈 분리와 객체 지향 설계에 대한 고민
·
Spring
프로젝트를 리팩토링하면서 좋은 구조는 무엇일지에 대해 고민을 많이 했습니다. 전체 구조를 여러번 수정하면서 제 나름대로 내린 결론은 확장에 열려있고 적절한 격리를 통해 유지 보수 시 코드 변경 지점을 최소화 하는게 좋은 구조라 생각하게 됐습니다. 지금부터 제 생각을 프로젝트에 녹여본 경험을 공유하고자 합니다.멀티 모듈 구조 도입Melly 프로젝트 멀티 모듈저는 프로젝트를 구성하는 기능의 종류를 기준으로 멀티 모듈을 분리했습니다. 1차적으로 비슷한 기능끼리 대분류를 한 뒤, 의존성과 역할을 기반으로 모듈을 세분화했습니다. 이 방식을 통해 라이브러리 의존성간의 응집성을 높이고 모듈별로 독립적인 확장을 해나갈 수 있습니다. 모듈별 의존성을 Gradle의 Implementation으로 주입하면 Compile 타..
중첩 클래스 스프링 빈 등록에 대한 분석
·
Spring
토비님의 유튜브 영상을 보던 중 내부 클래스를 스프링 컨테이너에 등록 가능한지 확인해보는 컨텐츠가 있었다. 제목을 읽고 확실히 답을 해볼 수 없었기에 영상을 기반으로 정리를 해보고자 한다.내부 클래스 vs 정적 중첩 클래스분석에 앞서, 기존에 헷갈렸던 개념에 대해 한번 정리를 하고자 한다.@Configurationpublic class NestedClass { @Component public static class StaticNestedClass{ } public static void main(String[] args) { // 외부 클래스와 상관 없이 생성 가능! StaticNestedClass staticNestedClass = new StaticNestedClass(); }}위의..