HTTP 200 OK

Memento mori & Carpe diem

Spring 8

undertow VS tomcat 비동기 처리(Feat.이벤트루프란?)

Undertow와 Tomcat의 비동기 처리Undertow와 Tomcat은 자바 기반 웹 서버인건 동일하지만 비동기 I/O 처리하는 방식은 다릅니다. 이 둘에 대한 차이점과 어떠한 원리로 동작 하는지 살펴보겠습니다. 설명을 드리기에 앞서 undertow에서 비동기 프로그래밍을 처리할때 중요한 개념인 이벤트 루프에 대해 소개하겠습니다.  이벤트 루프(Event Loop)란?이벤트 루프는 비동기 프로그래밍 모델에서 중요한 역할을 하는 개념으로 싱글 스레드 환경에서 비동기 처리를 지원하기 위해 사용됩니다. 이벤트를 큐에 넣고 큐에 있는 이벤트를 하나씩 처리하는 방식(콜스택&큐)으로 동작합니다. 이러한 이벤트 루프의 순환 과정을 통해 실시간으로 이벤트를 처리하며 동시성을 관리하고 효율적으로 자원을 사용할 수 있..

Spring 2024.11.09

MSA 환경에서의 @JsonProperty 활용

데이터 필드 불일치 문제필자는 MSA 환경에서 여러 서비스 간에 데이터를 주고받고 데이터 필드명을 일치시킬 때 @JsonProperty를 사용하던 중 이슈가 발생했습니다. 바로 A서버에서 매핑한 데이터를 B서버에서 받지 못하는 상황이였습니다. 많은 분들이 @JsonProperty를 사용해보셨을 것 같고 저 또한 유용하게 사용하고 있었지만 동일한 JSON 객체를 2개 이상의 서버에서 연동시키며 사용해봤던 경험은 없었기에 이슈에 대한 해결방안을 공유하고자 글을 작성했습니다. @JsonProperty의 사용과 제한사항@JsonProperty는 내부 서버 통신에서만 매핑을 수행합니다. 즉 해당 서버 내부에서만 필드명이 변환되고 외부 서버와 통신할 때는 적용되지 않습니다. 앞선 이유 때문에 외부와 연동된 서버에서..

Spring 2024.10.13

JsonTypeInfo와 함께하는 다형성 구현

서론요구사항에 따라 여러 API를 만들다 보면 자동적으로 request dto도 변화가 발생합니다. API를 추가할 때 기존에 사용하던 dto와 별반 차이가 없다면 기존 것을 수정하는 방식을 통해 관리해 볼 수도 있겠죠 겹치는것이 많아진다면 공통 DTO를 만들어볼 수도 있겠습니다. 공통 DTO를 사용하기 애매할 경우에는 dto class를 늘리는 방법을 선택하고 있습니다. 하지만 비슷한 동작을 수행함에도 불구하고 약간의 차이가 존재한다는 이유만으로 새로운 API와 DTO를 추가하다보니 중복아닌 중복이 발생하는 느낌을 받았습니다. 앞으로 규모가 더욱 커진다면 유지보수가 복잡해지겠다는 느낌도 받았습니다. 앞선 문제를 해결할 수 있는 방법중 하나가 JsonTypeInfo 라고 생각합니다. 개요JsonTypeI..

Spring 2024.05.11

BlockHound - Blocking 코드 존재여부 확인

사용이유 Spring Webflux나 Coroutine을 사용할 때는 모든 코드가 reactive 하게 동작하길 원합니다. 비동기 처리를 하면서 느낀내가 만든 코드가 점은 비동기로 데이터가 처리되는것인지 동기형식으로 처리되는 것인지 확인해볼 수가 없다는 것이였습니다. 그저 비동기 문법에 맞게 코드를 만들었을뿐.. 즉 비동기로작성한 코드에 blocking 코드가 존재하는지 확인해주는 도구가 바로 blockhound입니다. BlockHound란? BlockHound는 webflux 에서 사용하는 reactor 팀에서 개발한 도구로 애플리케이션에서 blocking 코드가 작성되었는지 여부를 검출해주는 도구입니다. 직접 작성한 코드 뿐만 아니라, 서드 파티 라이브러리에서 사용한 블로킹 코드도 전부 검출합니다...

Spring 2023.12.24

Spring Security 주요 아키텍처 이해( Part 2)

인증 저장소 SecurityContextHolder, SecurityContext SecurityContext Authentication 객체가 저장되는 보관소로 필요 시 언제든지 Authentication 객체를 꺼내어 쓸 수 있도록 제공되는 클래스 ThreadLocal에 저장되어 아무 곳에서나 참조가 가능하도록 설계함 ThreadLocal : Thread마다 할당도니 고유 공간(공유X) 다른 Thread로부터 안전하다 get, set, remove api가 있다. set 한 이후 get할 대 장소의 제약이 없다 (ex : A메서드에서 set한 내용을 B메서드에서 get하는것이 가능하다) 인증이 완료되면 HttpSession에 저장되어 어플리케이션 전반에 걸쳐 전역적인 참조가 가능하다 HttpSessi..

Spring 2022.05.30

Spring Security 주요 아키텍처 이해( Part 1)

위임 필터 및 필터 빈 초기화 DelegatingProxyChain, FilterChainProxy Servlet Filter 흐름 요청을 받은 WAS가 Servlet Container에게 Request, Response를 던져주면, 이를 먼저 Filter에서 받아. Request에 대한 필터링를 진행하고, 서블릿에게 ServletRequest, ServletResponse를 넘겨준다. 요청에 대한 작업이 끝난 후 Response에 대한 필터링를 진행 쉽게말해, 요청과 응답에 대한 필터링을 진행한다. DelegatingProxyChain 서블릿 필터에서 서블릿 필터를 구현한 스프링 빈에게 요청을 위임해주는 대리자 역할의 서블릿 필터 서블릿 필터는 스프링에서 정의 된 빈을 주입해서 사용할 수 없다 왜냐하면..

Spring 2022.05.30

Annotation && AOP란?

Annotation이란? Annotation은 JDK 1.5부터 도입된 것으로 자바 소스 코드에 추가하여 사용할 수 있는 메타데이터의 일종입니다. 대부분이 많이 봤을 만한 @Override, @Deprecated 가 Annotation 예로 Annotation의 구현된 정보에 따라 연결되는 방향이 결정됩니다. 즉, 전체적인 소스코드의 로직을 바꾸진 않지만 Annotation의 타겟을 연결 방법이나 소스코드의 구조를 변경할 수 있습니다. Annotation의 기능을 잘 활용한다면 비즈니스 로직과 별도의 시스템 설정은 Annotation에게 위임함으로써 개발자들은 로직 구현에만 집중할 수 있습니다. 따라서 Annotation을 통해 AOP(Aspect Object Programming)을 구성할 수 있습니다..

Spring 2022.05.11

Spring IoC 컨테이너 및 Bean소개(1) [with spring docs]

Spring IoC 컨테이너와 Bean에 대한 소개 IOC 컨테이너라고 하는 스프링 컨테이너는 DI(Dependency Injection)의 관점에서는 빈 팩토리라고도 하고, 이런 빈 팩토리에 여러가지 기능을 추가한 것을 어플리케이션 컨텍스트라고 한다. 객체가 생성자, 팩토리메서드에 대한 인수 또는 팩토리 메서드에서 생성되거나 반환 된 후 개체 인스턴스에 설정된 속성을 통해서만 개체가 종속성(즉, 작업하는 다른 개체)을 정의하는 프로세스이다. 컨테이너는 Bean을 생성할 때 의존성들을 주입한다. 이 프로세스는 기본적으로 클래스 또는 Service Locator 패턴과 같은 메커니즘을 사용하여 종속성의 인스턴스화 또는 위치를 제어하는 Bean 자체(이름, Inversion of Control)이다. org..

Spring 2022.05.11