[Spring] 헥사고날 아키텍처
·
Spring MSA
지금까지 내가 헥사고날 아키텍처를 설계해 보며 배운 점을 정리해 봤다.📌 서론지금까지 3번 정도 헥사고날 아키텍처를 적용시켜서 프로젝트를 만들어봤다. 첫 번째 설계에서는 왜 port 같은 것을 사용해서 이렇게 복잡하고 어렵게 설계하는 거지? 이런 생각이 많이 들었다. 원리를 이해하지 못하고 단순히 이게 좋다니까 해봐야겠다! 이런 생각을 하면서 개발을 진행했었던 것 같다. 관련된 자료를 열심히 찾아보기도 했지만 사실 제대로 알지 못하고 개발을 진행했다.이렇게 원리를 잘 모르고 일단 개발해 보자는 마인드로 개발을 진행한 후 다시 한번 돌아보니 도메인 내부에 비즈니스 로직을 넣어두는 중요성을 놓치고 있었다. 그래서 서비스의 로직이 엄청 커지고 패키지도 많고 클래스도 많다 보니 오히려 이전과 큰 차이는 없으면..
[Spring] 스프링 순환참조
·
Spring 기초/Spring 기초 지식
스프링의 순환참조 상황을 알아보자📌 서론스프링으로 개발을 하다 보면 정말 가끔씩 발생하는 오류가 있다. 바로 circular references (순환참조)다.스프링 빈을 등록하면서 2가지의 클래스가 서로를 의존하면 이러한 문제가 발생한다. 서버가 실행되면 스프링 컨테이너가 빈을 등록하는 과정에서 의존성 주입을 하는데 이 과정에서 서로 의존하는 두 빈이 서로를 기다리며 무한루프에 빠지게 되는 것이다.순환참조라는 이름만 봐도 순환해서 참조한다는 의미이므로 생각해 보면 간단하게 한쪽의 참조만 끊어주면 해결될 것으로 보인다. 그러나 가끔은 서로의 로직을 사용해야 하는 경우가 있을 수도 있다. 이때는 어떻게 문제를 해결해야 할까?  이런 상황에 문제를 해결하는 여러 가지 방법이 존재한다. 1. @Lazy 어노..
[Spring] Spring Event 스레드의 동작원리 (동기/비동기)
·
Spring 기초/Spring 기초 지식
Spring Event 스레드의 동작원리를 이해해 보자 📌 서론 스프링 이벤트(Application Events)는 기본적으로 발행자(publisher)와 리스너(listener)가 같은 스레드에서 동작한다. 즉, 이벤트를 발행하는 메서드를 호출하면 그 호출을 처리하는 스레드가 이벤트 리스너도 처리하는 것이 기본 동작이다. 이번 포스트에서는 스프링 이벤트와 스레드의 동작 방식을 자세히 알아보자 1. 스프링 이벤트와 스레드 동작 방식 (1개의 이벤트 리스너) 스프링 이벤트의 스레드 동작(동기) 기본적으로, 스프링에서 이벤트를 발행하면, 그 이벤트는 기존 로직을 처리하고 있던 같은 스레드에서 처리된다. 예를 들어 어떤 컨트롤러 메서드에서 이벤트를 발행했다면, 그 이벤트에 대한 처리도 요청을 처리하고 있던 그..
[OOP] 단일 책임 원칙, 응집도, 관심사
·
JAVA
단일 책임 원칙, 응집도, 관심사 📌 서론 최근 조영호 선생님의 "객체지향의 사실과 오해"라는 책을 다시 읽었다. 확실히 다시 읽어보니 처음 읽었을 때와는 다른 느낌을 받을 수 있었다. 내 개발 지식이 조금 더 늘어서 그런 건지 해왔던 프로젝트가 책의 내용과 겹쳐서 보였다. 그래서 다시 읽은 후 코드를 바라보는 시야가 더 넓어진 것 같다는 느낌이 든다. 조영호 선생님이 작성해 주신 이 책에서는 "책임", "응집도"에 대한 얘기를 풀어가며 "단일 책임 원칙"을 설명해 주는데 나는 내 방식대로 고민해 본 것을 한번 정리해서 설명을 적어봤다. 또한 책에서는 역할은 인터페이스 책임은 메시지(메서드 명)로 표현한다. 이것을 보고 나는 그럼 관심사는 어떻게 표현할지 많이 고민해 보게 되었고 내부 로직(메서드)의 동..
[Spring] 통합 테스트와 단위 테스트 비교하기
·
Spring 테스트 코드
통합테스트와 단위테스트를 작성하고 차이점을 비교해 보자 📌 서론 통합테스트 코드를 작성했는데 이런 생각이 들었다. "이걸 단위테스트 코드로 바꿔서 작성하면 기존 코드와 어떤 차이가 있을까? 그래서 당장 각 테스트 방법으로 코드를 작성하고 테스트를 해봤다. 지금부터 그 내용을 공유한다. 테스트를 하고자 하는 컨트롤러는 다음과 같다. 간단히 레시피를 생성하는 컨트롤러 메서드다. @RequestMapping("/recipe") @RequiredArgsConstructor @RestController public class RecipeController { private final CreateRecipeUseCase createRecipeUseCase; @PostMapping("/createRecipe") pu..
[Spring MSA] 스프링 이벤트와 SNS/SQS로 DB 정합성 보장 2탄 - ZeroPayload로 FeignClient 요청
·
Spring 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() 메서드를 통해 요청과 응답을 조작하고, 필터 체인의 다음 필터나 최종 목적지(서블릿 또는 정적 리소스)로 요청/응답을 전달할 수 있다. 스프링 부트에서 필터의 역할 스프링 부트는 자동 구성을 통해 필터를 쉽게 추가하고 관리할 수 있게 해준다. 보안, 트랜잭션..
Pipeline 방식으로 Jenkins구축 - SpringBoot CI/CD 구축
·
DevOps
Pipeline 방식으로 젠킨스를 구축해 보자 이번 포스트에서는 설정과 사용 방법이 좀 더 복잡하지만 커스텀하기 좋고 세밀한 구성이 가능한 Pipeline 방식으로 Jenkins의 CI/CD를 모두 구현해보도록 한다. 이번에 적용시킬 CI/CD는 SpringBoot이다. 1. Jenkins CI(지속적 통합)를 위한 Script 추가 작성하기 1-1. 우선 Jenkins 대시보드 좌측 상단의 “새로운 Item” 버튼을 클릭해서 들어간다. 1-2. 아래와 같은 창이 나올것이고 여기서 Item의 이름을 적고 하단에서는 Pipiline을 선택한다. 1-3. Pipeline 작성하기 아이템을 생성하면 아래와 같이 생성한 파이프라인의 설정 페이지로 넘어갈 것이다. 위의 설정들은 skip하고 아래로 스크롤을 내려서..