항해 플러스 9주차 회고

2024. 5. 19. 19:53·회고
반응형

9주차 책임 분리를 통한 애플리케이션 설계

 

1. 문제

비즈니스 로직과 트랜잭션 범위 고려

@Transactional
void payment() {
    결제_요청_검증()
    유저_포인트_차감()
    결제_정보_저장()
    주문_정보_전달() //외부 플랫폼 API 호출    
}

 

예를 들어서 상품을 결제하는 결제 함수가 있다.

결제처리 하는 비즈니스 로직 안에 여러 가지 함수들이 존재하며, 결제 처리가 끝난 후 최종적으로 주문 정보를 외부 API를 호출하여 전송해 주는 기능까지 존재한다. 즉, payment()가 정상적으로 성공 처리 되기 위해서는 외부 API에 호출 또한 정상적으로 통신이 되어야 한다.

 

위에 로직은 정상적인 것 같지만 심각한 문제가 있다.

- 외부 플랫폼 API 호출 시 네트워크 이슈로 인해 통신이 오래 걸리는 경우 pamyent()로직 자체가 오래 걸리게 된다. (하나의 트랜잭션으로 동작하기 때문에)

- payment()가 실행되면서 모든 로직이 성공적으로 다 처리 되었지만 외부 API에서 문제가 생기는 경우 전부 롤백된다.

 

주문 정보 전달은 부가 로직 이므로 주요 로직인 결제 처리에 영향을 끼치면 안 된다.

 

2. 시도 & 해결

문제점을 해결하기 위해서 이벤트를 사용해서 부가 로직과 주요 로직의 결합을 끊어낼 수 있다.

@Transactional
void payment() {
    결제_요청_검증()
    유저_포인트_차감()
    결제_정보_저장()
    applicationEventPublisher.publishEvent(주문_정보_전달()) //외부 플랫폼 API 호출    
}

 

스프링에서 제공하는 이벤트리스너 기 등을 사용해서 이벤트로 비즈니스 로직을 수정하였다.

이벤트의 동작 과정 : 이벤트 생성 주체 -> 이벤트 디스패처(이벤트 퍼블리셔) -> 이벤트 핸들러(이벤트 구독자)

 

스프링 이벤트를 사용

이렇게 이벤트를 사용해서 부가 로직(외부 API)에 의해서 주요 로직의 영향이 없도록 만들 수 있지만!!!! 단순히 이벤트로 처리한다고 해서 영향이 없는 건 아니다. 

 

이벤트는 크게 동기 방식과 비동기 방식이 있는데 동기 방식으로 하는 경우에는 하나의 트랜잭션 범위로 동작하기 때문에 여전히 외부 서비스에 영향을 받게 된다.

비동기 방식은 (이벤트 리스너에서 @Async를 사용) 다른 스레드에서 동작하기 때문에 우리가 원하는 대로 처리하기 위해서는 비동기 방식을 사용해서 처리해야 한다. 외부 시스템과의 연동을 동기로 처리할 때 발생하는 성능과 트랜잭션 범위 문제를 해소하기 위해서는 이벤트를 비동기로 처리하거나 이벤트와 트랜잭션을 연계하는 방법이 있다.

 

비동기 방식을 사용하기 위해서는 @EnableAsync를 통해서 비동기를 활성화시켜야 한다!!!!

-> 처음에 @Async만 적용했다가 로그에 같은 스레드로 동작하는 걸 보고 이상함을 감지..

 

로컬 핸들러 비동기 실행이 아니라 외부 메시징 시스템을 이용해서도 해결할 수 있다.

나는 저기 저 어깨너머로 듣기만 했던 카프카를 사용해서 처리해 봤지만 카프카 너무 어렵다..

 

카프카를 적용하면서 만약 메시지 발행에 대해서 실패하는 경우? 에 대한 고민을 해결해 보기 위해서 Transactional Outbox Parttern을 사용하는 것을 보고 대략적으로 설계는 해봤지만 아직 실제로 적용해보진 못했다. 이 부분도 카프카를 공부해 보면서 나중에 적용해 볼 계획이다.

 

4. 목표

카프카를 (찍먹!?) 사용해봤지만.. 대용량 트래픽을 수월하게 카프카에 대한 필요성과 중요성이 느껴졌다.

조만간 아파치 카프카 애플리케이션 프로그래밍 with 자바 정독을 목표로 잡고 카프카에 대해서 제대로 알아 가는 시간이 필요할 것 같다.

https://www.yes24.com/Product/Goods/99122569

반응형
저작자표시 (새창열림)

'회고' 카테고리의 다른 글

항해 플러스 4기 백엔드 솔직 후기  (4) 2024.06.02
항해플러스 8주차 회고  (0) 2024.05.11
항해 플러스 5주차 회고  (0) 2024.04.20
콘서트 예약 프로젝트 회고  (0) 2024.04.18
항해 플러스 4주차 회고  (0) 2024.04.13
'회고' 카테고리의 다른 글
  • 항해 플러스 4기 백엔드 솔직 후기
  • 항해플러스 8주차 회고
  • 항해 플러스 5주차 회고
  • 콘서트 예약 프로젝트 회고
:j
:j
ddongjunn@gmail.com
  • :j
    dev.j
    :j
  • 전체
    오늘
    어제
    • :j
      • 프로그래밍 언어
        • Java
        • html
        • JavaScript
        • XML
        • JSON
        • CSS
        • jQuery
        • Web
        • k8s
        • JPA
      • 프레임워크
        • Spring
      • 코딩 테스트
        • Java
      • 네트워크
        • CCNA
      • 데이터베이스
        • Mssql
        • Oracle
      • 회고
      • :j story
      • CS
  • 블로그 메뉴

    • 홈
    • 태그
    • github
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    항해솔직후기
    오버로딩
    appendChild
    항해백앤드
    class
    항해플러스백앤드
    Name
    항해99
    id
    Queue
    <br>
    group by
    오버라이딩
    지역변수
    멤버변수
    다형성
    HAVING
    항해플러스
    항해플러스백엔드
    MSSQL
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
:j
항해 플러스 9주차 회고
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.