자바에서의 CRTP(Curiously Recurring Template Pattern)
·
성장이야기/TIL
최근 빌더 패턴을 구현하다 CRTP(Curiously Recurring Template Pattern) 패턴을 알게 되었는데, 처음 접하는 패턴이라는 점과 제네릭을 통해 구현된 다소 복잡해 보이는 패턴이라 공부하게 되었습니다. 이번 글을 통해 CRTP 패턴이 무엇인지와 장단점에 대해 소개드립니다. CRTP란?CRTP는 원래 C++에서 주로 사용되는 패턴으로 클래스가 자신의 서브클래스 타입을 제네릭 매개변수로 사용하는 디자인 패턴입니다. 자바에서는 주로 빌더 패턴에서 자식 클래스의 타입을 부모 클래스에 전달하여 메서드 체이닝 시 자식 클래스의 메서드를 사용할 수 있게 합니다. (제네릭을 이용한 재귀적 타입 제한) 즉, 빌더 패턴에서 주로 이루어지는 메서드 체이닝에서 자식 클래스 타입을 유지함으로 컴파일 시..
[E-commerce] 트랜잭셔널 아웃박스 패턴을 활용한 이벤트 기반 주문 처리 시스템 설계 및 구현(With Kafka)
·
성장이야기/TIL
현재 서비스의 트랜잭션 범위에 대한 이해상품 주문 결제 트랜잭션Tx -> 사용자 조회 -> 장바구니 조회 -> 주문 및 주문 아이템 생성 -> 재고 차감 -> 결제 -> 주문 정보 전송 -> commit현재 트랜잭션 범위의 문제점긴 트랜잭션 : 하나의 트랜잭션에서 주문, 결제 같이 여러 작업을 처리하게 될 경우 트랜잭션의 작업 시간이 길어져, 다른 트랜잭션에서 커넥션이 필요할 때 대기시간이 길어져 사용성이 떨어진다.-> 트랜잭션의 사용시간이 길어 생기는 문제전체 롤백 문제 : 주문 정보를 외부 데이터 플랫폼에 전송 도중 오류로 인해 전송에 실패하면 이전 작업(주문 생성, 재고 차감, 결제)들이 모두 롤백된다. 상품 주문 시 핵심적인 비즈니스 로직이 부가적인 주문 정보 전송 로직에 의해 롤백되고 있기 때문..
[E-commerce] 주문 결제 트랜잭션 단위를 어떻게 가져가야 할까
·
성장이야기/TIL
주문 결제 트랜잭션 단위를 어떻게 가져가야 할까 이번에 이커머스 서비스를 만들면서 주문 결제 트랜잭션 단위를 어떻게 설계할 것인지에 대해 고민을 많이 하게 되었습니다. 우선 이 서비스에서 결제는 별도의 pg사를 연동하지 않고 user 테이블에서 point를 관리하여 이 point로 결제를 하는 서비스입니다. 주문 결제 트랜잭션을 분리하는 방안과 하나의 트랜잭션으로 가져가는 2가지 방안에 대해 어떤 방법이 더 적절(?)한 지 고민하고 생각했던 내용을 정리해보려고 합니다. 사실 "이 방법이 무조건 맞아!" 같은 정답이 없다는 건 머리로는 알지만 이런 선택을 해야 할 때는 누군가 정답을 줬으면 좋겠다는 마음이 있습니다. 아직까지는 트레이드 오프하는 게 쉽지 않은 것 같습니다.. 주문 결제 트랜잭션 분리 우선 ..
Domain과 Entity의 두 얼굴?
·
성장이야기/TIL
개발을 하다 보면 “도메인”과 “엔티티”라는 용어는 한 번씩 듣게 된다. 그런데 누구는 도메인을 엔티티와 비슷한 개념으로 사용해서 이야기하는 것 같고, 누구는 도메인과 엔티티는 다르다! 라고 말을 하는 것을 종종 볼 수 있다. 나 또한 그랬고 두 개념이 어떻게 다른지, 실상 모르고 용어를 사용했었다. 결론부터 말하면 내가 이해한 도메인과 엔티티는 같은 의미로 사용될 수도 있고 아닐 수도 있다. 얘가 지금 무슨 소리 하는 거지 할 수 있다.. 우선은 도메인과 엔티티는 내가 만들려는 애플리케이션의 아키텍처 설계에 따라 달라질 수 있다. 즉, 어떻게 설계했느냐에 따라 사용되는 용어의 의미가 달라질 수도 있고 같아질 수도 있다. 그래서 도메인, 엔티티 이야기를 할때는 맥락파악이 중요하다. 2가지 케이스로 나눌 ..
Actions Runner Controller 를 이용해 self-hosted runner로 배포하기
·
성장이야기/TIL
Actions Runner Controller 를 이용해 self-hosted runner로 배포하기 Github actions workflow를 실행시키는 환경에는 Github가 제공하는 github-hosted 환경과 자체적으로 관리하는 self-hosted 환경이 존재한다. 대부분(나 또한 그랬듯이) github-hosted 환경에서 빌드 및 배포 작업을 진행한다. 대표적으로 ubuntu-latest 환경(windows-latest, macos-latest..)이 있다. 하지만 이번에 self-hosted 환경에서 애플리케이션을 빌드 및 배포하는 작업을 진행했다. self-hosted runner를 어디에서 실행시킬지도 2가지 방법으로 나뉜다. (다른 방법이 더 존재할 수도..) EC2에서 실행 e..
AWS EKS “instances failed to join the kubernetes cluster” Error
·
성장이야기/TIL
AWS EKS “instances failed to join the kubernetes cluster” Error AWS EKS Node Group을 생성 하는데, instances failed to join the kubernetes cluster 에러가 발생하는 문제가 있었다. 결론부터 나의 경우 체크해보아야 하는 부분은 크게 3가지였다. Cluster Private, Public Endpoint 확인 Cluster Worker Node의 IAM 권한 확인 Cluster가 배치된 VPC 내 Subnet 연결 설정 확인 노드 그룹 생성 시 인스턴스는 정상적으로 생성이 되었는데, 해당 인스턴스가 eks cluster에 Join이 되지 않아 cluster 생성에 실패하는 문제였는데 어떻게 해결했는지 복기해..