포트와 어댑터 아키텍처 라고도 불리는 헥사고날 아키텍처(Hexagonal Architecture)는 인터페이스나 기반 요소(infrastructure)의 변경에 영향을 받지 않는 핵심 코드를 만들고 이를 견고하게 관리할 수 있도록 해준다. 헥사고날 아키텍처를 설명하기전에 계층형 아키텍처와 클린 아키텍처, 그리고 도메인 주도 설계(DDD)에 대해서도 언급이 필요하다. 헥사고날 아키텍처는 전통 방식인 계층형 아키텍처의 단점을 보완하기 위해 설계되었다. 기존 계층형 아키텍처의 문제점은 무엇일까?1. 데이터베이스, 영속성에 대한 의존성 도메인 계층이 데이터베이스에 의존하게 되어 데이터베이스에 변화가 일어나면 도메인 계층에도 변화가 생긴다. 서비스 계층에서도 영속성 모델을 도메인 모델처럼 사용하게 된..
1. SRP (Single Responsibility Principal)SRP는 단일 책임 원칙으로 객체는 단 하나의 책임만 가져야 한다는 원칙을 말한다. 여기서 책임은 하나의 기능 담당이다. 즉, 하나의 클래스는 하나의 기능을 담당하여 하나의 책임을 수행해야한다. 여러 개의 기능이 하나에 담겨있다면 더 효율적이고 좋다고 생각할 수도 있다. 하지만 이건 사용자의 입장이다. 사용자가 아닌 코드를 설계하는 개발자 입장에선 마이너스 적인 요소로 작용하게 된다. 하나의 클래스에 여러 기능(책임)을 넣느냐, 따로따로 클래스를 분리하여 기능(책임)을 분산시키느냐 설계는 프로그램의 유지보수와 밀접한 관련이 있다. 하나의 클래스에 여러 책임이 포함되어 있다면 한 책임의 변경에서 다른 책임의 변경을 야기할 수 ..
1. 개요진행 중인 프로젝트의 api 개수가 어느새 90개가 다되간다. Spring Security를 사용하여 RBAC(Role-Based Access Control)을 구현 하고있고, 이 설정은 Security Config에서 관리하고 있다. 새로운 엔드포인트를 개발할 때마다 기존의 설정과 잘 매칭되는지 확인해야 했고, 그렇지 않다면 추가적인 설정이 필요했다. 이러한 과정 때문에 지금까지 개발된 API들에 RBAC이 제대로 적용되었는지 확인하기 어렵고, 놓친 부분을 점검하는 것도 번거로운 작업이 필요했다. URL에 prefix로 ROLE을 추가하여 일괄적으로 관리하는 방법을 고려해 보았지만, 보안상 좋은 방법이 아니라는 피드백을 여러 차례 받았다. 다른 방법은 없을까 알아보다, 어노테이션으로써 ..
1. 개요개발을 하다보면 어떤 데이터가 삭제되면 연관된 다양한 데이터들이 함께 삭제되야 하는 경우가 종종 발생한다. 예를 들면 게시글이 삭제되면 해당 게시글에 달린 좋아요, 댓글, 답변 등등 연관된 데이터도 함께 삭제되야 한다. 하지만, 함께 삭제되면 안 되는 경우도 있다. 예를 들어, 상품 거래 서비스에서 판매자의 정보를 삭제하면 판매자가 올린 상품에 대한 정보도 삭제될 것이다. 그러나, 구매자는 자신이 구매했던 상품의 정보나 영수증을 확인해야 할 필요가 있을 수 있다. 만약 판매자 정보와 함께 해당 상품 정보도 삭제된다면, 구매자는 자신의 구매 상품에 대한 정보를 확인할 수 없게 되어 불편을 겪을 수 있다. 따라서 이러한 경우에는 판매자 정보와 연관된 데이터라도, 특정 조건하에서 보존되거나 관리..
1. 개요현재 Spring Cloud를 이용해서 MSA 프로젝트를 진행 중이다. 기존의 모놀리식 아키텍처는 하나의 프로젝트에서 모든 코드를 관리하기 때문에, 작성한 API를 하나의 API 문서에서 확인할 수 있다. 하지만 MSA는 각각의 도메인에 따라 프로젝트가 존재하고, 각각의 도메인마다 API 문서가 생성되는 문제가 발생했다. 이 API 문서들을 사용하는 개발자들 입장에선 각각의 API 문서 주소를 알고 있어야 한다. 굉장히 불편하고 비효율적이다. MSA 환경에서 API 문서를 한 곳에 모아 관리하기 위해 방법을 찾아보았고 공유하고자 이 글을 작성한다. 2. 의존성 추가먼저 Swagger 사용을 위해 API Gateway에 의존성 추가를 해주자. 여기 에서 각 버전에 맞는 의존성..
1. 개요진행 중인 Jikgong 서비스에서 Nginx를 사용하여 Blue/Green 무중단 배포 전략을 사용하여 배포 시 다운 타임을 최소화 시켰다. 그 과정에서 작성한 deploy.sh 파일엔 다음과 같은 코드가 작성되어있다. # 기존에 실행 중이었던 docker-compose는 종료시켜줍니다.echo "jikgong-${TERMINATE_CONTAINER} down"sudo docker-compose -f docker-compose.${TERMINATE_CONTAINER}.yml down --rmi all 이 부분이 문제였다. 현재 사용 중인 Blue/Green 방식의 무중단 배포 프로세스를 간략하게 설명하면 1. 새로운 버전의 애플리케이션 구동2. 지속적인 헬스체크로 구동 완료 확인3. 구동 ..