헥사고날 아키텍처의 port에는 어떤 매개변수가 사용될까?
·
아키텍처
시작하며안녕하세요. 개발자 stark입니다!오늘은 제가 헥사고날 아키텍처를 하면서 항상 고민하던 것을 정리해 봤습니다. 그 내용은 바로 in/out port 인터페이스 메서드 시그니처를 작성할 때 매개변수로 dto, 도메인, 기본 타입 중에 어떤 것이 가장 적절한가?입니다. 저는 여러 타입의 매개변수를 다 적용해 봤는데도 어떤 것을 써야 할지 감이 제대로 잡히지 않았는데 이번 기회에 다시 분석하고 정리하며 제 나름의 기준점을 잡았고 그 내용을 적어봤습니다. 이번에는 제가 겪은 과정 자체를 맛있게 담지는 못했지만 결론은 담아두었으니 다들 재미있게 봐주셨으면 좋겠습니다. Let's go! In port(UseCase)의 매개변수는 DTO보다 Command헥사고날 아키텍처에서는 애플리케이션의 각 계층이 자기..
[MSA] SpringBoot에 gRPC 클라이언트 구성하기
·
gRPC
시작하며안녕하세요. 개발자 stark입니다. 이전 포스팅에서는 gRPC 서버를 구성해 봤습니다. 이번에는 gRPC 클라이언트 서버를 구성해 봅시다.지금 구성중인 프로젝트는 MSA이기 때문에 최소 2개의 서버가 필요합니다. 그래서 저는 어떤 도메인을 예시로 들지 고민하다 가장 예시로 설명하기 쉬운 회원 도메인을 적용해서 메인 서버를 구성했고 내부에 gRPC 서버를 구성하였습니다. 아래 다이어그램을 보시면 gRPC 서버는 SpringBoot 내부에 들어가 있는 것을 확인하실 수 있습니다. 그 이유는 gRPC는 SpringBoot에서 일반적으로 사용하는 tomcat과 별개로 netty 서버를 띄워줘야 하기 때문입니다. 반면 클라이언트 서버들은 netty 서버 구성을 하지 않고 SpringBoot의 기본 tom..
[Spring] 헥사고날 아키텍처
·
아키텍처
지금까지 내가 헥사고날 아키텍처를 설계해 보며 배운 점을 정리해 봤다.📌 서론지금까지 3번 정도 헥사고날 아키텍처를 적용시켜서 프로젝트를 만들어봤다. 첫 번째 설계에서는 왜 port 같은 것을 사용해서 이렇게 복잡하고 어렵게 설계하는 거지? 이런 생각이 많이 들었다. 원리를 이해하지 못하고 단순히 이게 좋다니까 해봐야겠다! 이런 생각을 하면서 개발을 진행했었던 것 같다. 관련된 자료를 열심히 찾아보기도 했지만 사실 제대로 알지 못하고 개발을 진행했다. 이렇게 원리를 잘 모르고 일단 개발해 보자는 마인드로 개발을 진행한 후 다시 한번 돌아보니 도메인 내부에 비즈니스 로직을 넣어두는 중요성을 놓치고 있었다. 그래서 서비스의 로직이 엄청 커지고 패키지도 많고 클래스도 많다 보니 오히려 이전과 큰 차이는 없으..
[Spring] 스프링 순환참조
·
Spring/Spring 기초 지식
스프링의 순환참조 상황을 알아보자📌 서론스프링으로 개발을 하다 보면 정말 가끔씩 발생하는 오류가 있다. 바로 circular references (순환참조)다.스프링 빈을 등록하면서 2가지의 클래스가 서로를 의존하면 이러한 문제가 발생한다. 서버가 실행되면 스프링 컨테이너가 빈을 등록하는 과정에서 의존성 주입을 하는데 이 과정에서 서로 의존하는 두 빈이 서로를 기다리며 무한루프에 빠지게 되는 것이다.순환참조라는 이름만 봐도 순환해서 참조한다는 의미이므로 생각해 보면 간단하게 한쪽의 참조만 끊어주면 해결될 것으로 보인다. 그러나 가끔은 서로의 로직을 사용해야 하는 경우가 있을 수도 있다. 이때는 어떻게 문제를 해결해야 할까?  이런 상황에 문제를 해결하는 여러 가지 방법이 존재한다. 1. @Lazy 어노..
[Spring] Spring Event 스레드의 동작원리 (동기/비동기)
·
Spring/Spring 기초 지식
Spring Event 스레드의 동작원리를 이해해 보자 📌 서론 스프링 이벤트(Application Events)는 기본적으로 발행자(publisher)와 리스너(listener)가 같은 스레드에서 동작한다. 즉, 이벤트를 발행하는 메서드를 호출하면 그 호출을 처리하는 스레드가 이벤트 리스너도 처리하는 것이 기본 동작이다. 이번 포스트에서는 스프링 이벤트와 스레드의 동작 방식을 자세히 알아보자 1. 스프링 이벤트와 스레드 동작 방식 (1개의 이벤트 리스너) 스프링 이벤트의 스레드 동작(동기) 기본적으로, 스프링에서 이벤트를 발행하면, 그 이벤트는 기존 로직을 처리하고 있던 같은 스레드에서 처리된다. 예를 들어 어떤 컨트롤러 메서드에서 이벤트를 발행했다면, 그 이벤트에 대한 처리도 요청을 처리하고 있던 그..
[Spring] 통합 테스트와 단위 테스트 비교하기
·
Spring/테스트 코드
통합테스트와 단위테스트를 작성하고 차이점을 비교해 보자 📌 서론 통합테스트 코드를 작성했는데 이런 생각이 들었다. "이걸 단위테스트 코드로 바꿔서 작성하면 기존 코드와 어떤 차이가 있을까? 그래서 당장 각 테스트 방법으로 코드를 작성하고 테스트를 해봤다. 지금부터 그 내용을 공유한다. 테스트를 하고자 하는 컨트롤러는 다음과 같다. 간단히 레시피를 생성하는 컨트롤러 메서드다. @RequestMapping("/recipe") @RequiredArgsConstructor @RestController public class RecipeController { private final CreateRecipeUseCase createRecipeUseCase; @PostMapping("/createRecipe") pu..
[Spring MSA] 스프링 이벤트와 SNS/SQS로 DB 정합성 보장 2탄 - ZeroPayload로 FeignClient 요청
·
MSA
이번에는 멤버 서버의 SNS로 발행한 메시지를 받은 레시피 서버의 SQS리스너 동작에 대해서 설명한다. 이 글은 이전에 작성한 MSA 이벤트 정합성 보장방법 1탄에서 이어지는 내용이라 이것을 읽기 전에 꼭 아래의 글을 보고 오자 Spring Event와 AWS SNS, SQS를 활용한 MSA 데이터 정합성 보장 전략 나는 DB 정합성 보장을 위해 Spring Event를 다음과 같이 사용했다. 잠시 이전 글의 서론을 다시 가져왔다. 한번 읽어보자 내가 구성한 MSA 프로젝트에서는 멤버 서버와 또 다른 서버가 상호 작용한다 curiousjinan.tistory.com 1. 포스트 내용 요약 1-1. 이전 포스트의 내용 요약 내가 구성한 MSA 프로젝트에서는 멤버 서버와 또 다른 서버가 상호 작용한다. 만약..
Spring: 필터(Filter)가 인터셉터(Interceptor)와 다른점
·
Spring/Spring 기초 지식
이번 포스트에서는 Spring Filter에 대해서 알아보도록 하자 1. Spring에서 Filter의 개념 필터의 정의 필터는 웹 애플리케이션에서 클라이언트의 요청과 서버의 응답을 가로채는 재사용 가능한 코드 조각이다. 서블릿 스펙의 일부로, 요청이 서블릿에 도달하기 전과 응답이 클라이언트로 반환되기 전에 특정 작업을 수행할 수 있다. 서블릿 필터의 기본 원리 필터 체인을 통해 여러 필터를 순차적으로 적용할 수 있다. 각 필터는 doFilter() 메서드를 통해 요청과 응답을 조작하고, 필터 체인의 다음 필터나 최종 목적지(서블릿 또는 정적 리소스)로 요청/응답을 전달할 수 있다. 스프링 부트에서 필터의 역할 스프링 부트는 자동 구성을 통해 필터를 쉽게 추가하고 관리할 수 있게 해준다. 보안, 트랜잭션..