전체 글

전체 글

    헥사고날 아키텍처 적용하기

    들어가며우리가 개발하는 어플리케이션은 생애주기 간 필연적으로 수정된다. 기반 기술이 변경(이를테면, DB의 변경, Client 라이브러리의 변경 등)되기도 하며, 요구사항이 바뀌기도 한다. 그렇기에 핵심 코드는 견고하게 관리하고 주변 요소들의 수정엔 크게 영향을 받지 않는 설계가 필요하다. 이를 가능하게 해주는 것이 헥사고날 아키텍처 (Hexagonal Architecture) 또는 포트와 어댑터 아키텍처(Ports and Adapters Architecture)다.대부분 레거시 코드의 경우 레이어드 아키텍처일 확률이 매우 높다. 레이어드 아키텍처는 이해하기 쉽고, 첫 개발의 시작 속도가 빠르단 장점이 있지만, 단점 또한 명확하다. 우선, DB Layer의 토대로 각 계층이 쌓이기 때문에 개발자로 하여금..

    의존성 역전을 통한 Mockito 프레임워크없이 단위 테스트 하기

    1. 개요 의존성 역전 원칙(Dependency Inversion Principle)은 객체 지향 설계 원칙 중 하나이다. SOLID 중 D가 바로 의존석 역전 원칙이다. 시스템의 고수준 모듈(비즈니스 로직 등의 세부 구현)이 저수준 모듈(데이터 엑세스 등)에 직접적으로 의존하는 것을 피하고, 대신 둘 모두가 추상화에 의존하도록 설계하는 원칙이다. 의존성 역전 원칙이 구현되어 있지 않은 프로젝트의 경우 유닛 테스트가 쉽지 않다. 일반적인 레이어드 아키텍처의 스프링 프로젝트들은Controller - Service - Repository 순으로 모두 직접 의존하게 되어 있는 경우가 많다. 이런 프로젝트들은 단위 테스트 작성이 매우 까다롭다. 데이터베이스 연결이 필요한 환경에서 테스트를 실행하거나, 테스트 데..

    POJO(Plain Old Java Object) 필수 값 Check Annotation 만들기

    개요 // 현재 운영 서비스에 적용되어 있는 극단적인 예시 // if문 지옥 if (!lSomeStringField.equalsIgnoreCase(SomeCase) && !lSomeStringField.equalsIgnoreCase(SomeCase) && !lSomeStringField.equalsIgnoreCase(SomeCase) && !lSomeStringField.equalsIgnoreCase(SomeCase) && !lSomeStringField.equalsIgnoreCase(SomeCase) && !lSomeStringField.equalsIgnoreCase(SomeCase) && !lSom..

    로깅 룰 구축기 (2) - Jersey에 적용하기

    1. 기술 스택 정보 Server Framwork : Spring boot 2.2.1.RELEASE Client Library : Jersey (spring-boot-starter-jersey:2.2.1.RELEASE) Logging Library log4jdbc-log4j2:1.16 logback:1.2.9 (slf4j) 2. RequestFilter 작성 Jersey 라이브러리의 ContainerRequestFilter, ContainerResponseFilter Interface를 구현하여 작성한다. public class ApiFilter implements ContainerRequestFilter, ContainerResponseFilter { @Context private HttpServlet..

    로깅 룰 구축기 (1)

    1. 시행 개요 MSA (Micro Service Architecture) 현재 담당하는 업무는 각각 독립된 역할을 하는 여러 서비스 (약 40여개의 서비스 존재)들로 구성되어 있다. Interface, Core 처리, Gateway 등 각 역할에 맞는 서비스들이 존재하며 유기적으로 연결되어 있다. 각 서비스는 작고 독립적이며 느슨하게 결합되어 있다. 때문에 서비스 각 독립적으로 배포할 수 있다는 장점이 있다. 단점으로는 서비스 간 통신이 필요하다는 점이다. 이로 인해 복잡해질 수 있으며, 상호작용 테스트가 어렵다. 또한 통합 유지관리가 어렵다는 단점이 존재한다. 위의 관점에서 보았을 때 현 업무는 통합 관리가 정상적으로 이뤄지지 않고 있다. 각 Transaction 이 유기적으로 어떻게 연결되는 지 업..

    네이티브 메모리 누수 추적기

    Native Memory Leak Detection. 1. 개요 java.lang.OutOfMemoryError: Direct buffer memory 협력 업체에서 통신이 안된단 연락을 받고 해당 프로세스의 로그를 열었을 때 위 에러가 제일 먼저 반겨주었다. Java는 일반적으로 Heap 메모리 영역을 이용하는 경우 JVM에서 관리를 하지만, Direct Buffer를 이용해 네이티브 메모리 영역을 사용하는 경우도 있다. 일례로 java.nio.DirectByteBuffer를 이용하는 경우인데, HeapByteBuffer와 다르게 DirectByteBuffer는 성능적으로 유리하단 점이 있어 DirectMemoryAccess(DMA)를 활용한다. 그런고로 Heap Memory 처럼 Garbage Col..

    Mockito를 이용한 단위테스트 겉핥기

    1. 단위 테스트란? 단위 테스트는 컴퓨터 프로그래밍에서 소스 코드의 특정 모듈이 의도된 대로 작동하는 지 검증하는 절차이다. 즉 모든 함수와 메소드에 대한 테스트 케이스를 작성하는 절차. - 위키피디아 단위 테스트 잘 갖춰진 단위 테스트 코드들이 존재한다면, 리팩토링 또는 레거시 코드 수정에 자신감을 가질 수 있게 된다. 코드 수정을 통해 변경된 이후의 코드들이 정상 동작하는 지 단위 테스트를 통해 파악 가능해지기 때문이다. 단위 테스트는 테스트 대상 코드를 정확하게 파악하는 것이 중요하다. 비즈니스 로직이 들어간 레이어의 코드가 단순하다면 크게 문제되지 않지만, 일반적으로 아래와 같은 상황들이 단위 테스트 대상 코드를 식별하기 어렵게 만든다. 외부 API와의 통신 DB CRUD 불필요한 데이터 생성 ..

    [Network] 자주 찾게 되는 네트워크 상식

    프로토콜 (Protocol) a. 프로토콜은 컴퓨터 내부에서, 또는 컴퓨터 사이에서 데이터 교환 방식을 정의하는 규칙 체계 b. 기기간 통신은 교환되는 데이터의 형식에 대한 상호 합의를 요구 c. b. 와 같은 규칙의 집합 = 프로토콜 패킷 통신 a. 패킷 교환 (Packet Switching) 방식은 미리 이동 경로를 정하지 않고, 데이터를 패킷이라는 작은 단위로 나누어 다중 노드로 구성된 네트워크를 통해 전송하는 개념 b. 전송될 데이터는 패킷 단위로 쪼개어지고 수신지에 도착했을 때 번호 순서대로 결합되어 원 데이터로 결합. c. 각 패킷은 전송 당시 가장 효율적인 경로를 설정하여 최종 목적지까지 이동. d. 때문에 각 노드들은 가장 효율적인 경로를 패킷에 안내 필요. e. d. 와 같은 기능을 하는..