전체 글 87

헥사고날 아키텍처 시리즈 3. 헥사고날 아키텍처 시작하기

핵사고날 아키텍처 중심으로 향하는 의존성 방향 핵사고날 아키텍처는 의존성 역전 원칙을 적용해서 애플리케이션 계층으로 의존성이 생기도록 구성합니다. 계층형 아키텍처에서 웹 → 도메인 → 영속성으로 의존성이 존재했다면, 핵사고날 아키텍처에서는 웹 → 도메인 ← 영속성 방향의 의존성을 가집니다. 의존성 방향이 도메인 계층을 향하면 웹과 영속성 계층의 기술에 의존하지 않고 비즈니스 로직을 작성할 수 있습니다. SpringBoot, JPA라는 한국형 국룰 조합을 사용한다고 하더라도 이러한 의존성 방향을 가져갈 이유가 있습니다. 하나의 애플리케이션이 더 작은 애플리케이션들로 나누어지는 경우에도 이러한 의존성의 방향이 도움을 줍니다. 도메인이 웹, 영속성 계층에 상관없이 독립적으로 작성되어 있기 때문에 비즈니스 요구..

헥사고날 아키텍처 시리즈 2. 계층형 아키텍처 극복하기

계층형 아키텍처 극복하기 단일 책임 원칙과 의존성 역전 원칙 단일 책임 원칙은 하나의 컴포넌트는 오로지 한 가지 일을 해야하고, 그것을 올바르게 수행해야 한다는 뜻으로 알려져 있습니다. 그런데 단일 책임 원칙의 실제 정의는 “컴포넌트를 변경하는 이유는 오직 하나뿐이어야 한다.” 입니다. 단일 책임 원칙을 좀 더 깊게 이해하기 위해서 단계적으로 들어가보겠습니다. 우선 웹 - 도메인 - 영속성의 구조를 가지는 게층형 아키텍처에서 서비스 규모가 매우 커진 상황을 가정합니다. 도메인이라는 거대한 층은 엄청나게 많은 비즈니스 로직들을 담고 있습니다. 도메인이라는 하나의 계층에서 각자의 역할을 하는 컴포넌트를 정의하고 컴포넌트 A에서 컴포넌트 B,C,D 를 사용하는 것은 당연합니다. A에서 B,C,D를 사용하는 것..

헥사고날 아키텍처 시리즈 1. 계층형 아키텍처의 문제점

계층형 아키텍처의 문제점 계층형 아키텍처 그림 웹 - 도메인 - 영속성 데이터베이스 중심의 설계를 유도한다 계층형 아키텍처에서 웹 계층을 도메인 계층에 의존하고, 도메인 계층은 영속성 계층에 의존합니다. 결국 자연스럽게 데이터베이스에 의존하게 됩니다. 데이터베이스 중심의 개발은 사용자의 행위보다는 상태에 더 집중하게 만듭니다. ‘계정이 잠기면 이런 저런 행위를 하지 못한다.(행위)’ 보다 ‘계정의 상태가 LOCKED 일 때에는 이런 저런 행위를 하지 못한다.’ 라는 생각을 하면서 개발을 하게 됩니다. LOCKED라는 계정의 상태가 데이터베이스에 저장되어 있음을 인지하고 떠올리면서 개발해야하는 것의 차이를 말하고 싶었습니다. ORM을 사용할 때, 도메인 계층에서 영속성을 고려하게 된다 JPA와 같은 ORM..

소프트웨어 장인 정신 - 커뮤니케이션 1

들어가며 ‘소프트웨어 장인 정신’에 대한 글을 적어 보려고 합니다. 가장 먼저 주제를 좁혀보겠습니다. ‘소프트웨어 장인이라면 이런 이런 습관을 가지고 있어야 한다’는 글은 아닙니다. 대신에 ‘소프트웨어 장인이 되어가는 과정에서 경력 3년을 가진 개발자 장환석의 정신 상태’라는 표현이 좋겠습니다. 소프트웨어 장인 정신이라는 대주제에 아래, 첫 번째 글은 ‘커뮤니케이션’에 대해서 두 번째 글은 ‘기술’에 대해서 작성할 생각입니다. 커뮤니케이션에 대해서 먼저 이야기하는 이유는 ‘조직의 커뮤니케이션 구조가 소프트웨어의 구조에 영향을 미친다’는 말에 크게 공감하기 때문입니다. 경력 10년의 개발자가 되었을 때에는 한 조직을 ‘제대로’ 리딩할 수 있는 사람이 되고싶다는 생각을 합니다. 3년의 시간동안 보고 배웠던 ..

DEV/INSIGHT 2024.03.14

Spring Security Authentication 아키텍처

Servlet Authentication Architecture Authentication과 AuthenticationManager Servlet Authentication Architecture에 대해서는 공식 도큐먼트의 마지막에 있는 그림을 먼저 보고 시작해야 이해가 잘 됩니다. Servlet Authentication Architecture의 시작은 Spring Security Architecture에서 보았던 SecurityFilterChain에서부터 시작합니다. SecurityFilterChain 안에 AbstractAuthenticationProcessingFilter가 포함되어 있고, 많이 사용하는 UsernamePasswordAuthenticationFilter는 이 추상 클래스를 상속받은..

DEV/Spring Security 2024.01.30

Spring Security 아키텍처

Filter Spring Security는 Sevlet Filter에서 동작함 Servlet Filter를 먼저 확인해야 함 Client → FilterChain FilterChain = Filter + Servlet 요청을 받으면 서블릿 컨테이너에서 Filter, Servlet을 포함하고 있는 FilterChain을 생성 위 그림에서 Servlet은 DispatcherServlet HttpServletRequest의 URI에 의해서 처리됨 Filter의 역할 다음 차례의 Filter, Serlvet이 동작하는 것을 막고 HttpServletResponse에 응답을 씀 HttpServletRequest, HttpServletResponse를 변경하여 다음 차례의 FilterChain에서 변경된 사항을 사..

DEV/Spring Security 2024.01.30

jevn 설정 (JDK 버전 변경하기)

1. jenv 설치 brew install jenv 2. jdk 설치 brew tap AdoptOpenJDK/openjdk brew install --cask adoptopenjdk8 brew install --cask adoptopenjdk11 아래와 같은 에러가 발생하는 경우에는 hwanseok@hwanseoks-MacBook-Pro ~ % brew install --cask adoptopenjdk8 Error: Cask adoptopenjdk8 exists in multiple taps: homebrew/cask-versions/adoptopenjdk8 adoptopenjdk/openjdk/adoptopenjdk8 아래의untap을 해준 뒤 다시 install을 하면 된다 brew untap ado..

DEV/JAVA 2024.01.26

로그 모니터링 개발 기록 04. 검색엔진의 트러블슈팅

2021년 11월부터 현재(24년 1월)까지 약 2년동안 와탭 로그 모니터링을 개발하면서 배우고 느꼈던 것들을 정리하고 있습니다. 검색 엔진의 저장 구조, 조회 구조, 성능 최적화 그 다음으로 트러블슈팅을 다루고 있습니다. 트러블 슈팅 사례는 워낙 많았는데, 굵직 굵직한 선에서 정리해보겠습니다. DFS에서의 시간 정렬 문제 이전 포스팅에서 DFS에 대한 설명을 간략히 언급한 적이 있습니다. 필요한 부분만 다시 요약하면, DFS Client가 검색 요청을 받아서 DFS Server로 실제 검색을 위임합니다. 그리고 각각의 DFS Server에서 검색된 내용을 DFS Client가 취합합니다. 그런데 이 과정에서 DFS Server는 각각 자신의 서버에 저장된 데이터 안에서만 시간을 기준으로 정렬된 상태입니..

로그 모니터링 개발 기록 03. 검색엔진의 성능 최적화

2021년 11월부터 현재(24년 1월)까지 약 2년동안 와탭 로그 모니터링을 개발하면서 배우고 느꼈던 것들을 정리하고 있습니다. 검색 엔진의 저장 구조, 조회 구조 다음으로 성능 최적화를 다루고 있습니다. 이번 글에서는 가장 아쉬움이 많이 남는 기능인 동시에, 가장 성능 개선이 많이 진행된 기능인 ‘임의의 문자열로 검색하기’에 대해서 이야기를 해보겠습니다. 들어가며 엄청나게 많은 문서 속에서 임의의 문자열이 등장하는 단 하나의 문서를 찾으려면 어떻게 해야할까요? 첫 번째 방법은 모든 키워드에 대해서 색인을 생성하는 것입니다. 검색엔진의 저장 구조 이해하기를 읽어주신 분이라면 ‘색인’은 특정 단어로 직접 이동할 수 있는 자료구조라는 것과 Inverted Index, SSTable을 사용해서 개념적으로 어..

로그 모니터링 개발 기록 02. 검색엔진의 조회 구조 이해하기

2021년 11월부터 현재(24년 1월)까지 약 2년동안 와탭 로그 모니터링을 개발하면서 배우고 느꼈던 것들을 정리하려고 합니다. 전체적인 흐름을 어떻게 구조를 잡을까 고민해보다가 Lucene In Action에서 Lucene에 대해서 설명하고 있는 구조를 그대로 차용하겠습니다. 검색 엔진의 조회 구조 이전 글에서 Inverted Index와 SSTable의 구조에 대해서 설명었습니다. 이 두가지 자료구조에 대한 설명을 전제로 시작해보겠습니다. 검색 엔진에서 제공하는 검색 기능에는 크게 3가지 종류의 이론적이 모델이 있습니다. 순수 불리언 모델 벡터 공간 모델 순수 불리언 모델 질의에 매칭되는 문서가 있는지 없는지를 판단합니다. 각각의 Token에 대한 가중치 또는 검색 결과에 대한 점수 계산은 존재하지..