외부API 호출과 DB 저장업데이트 로직의 트랜잭션을 보장하기 위해, 외부API호출을 DB트랜잭션안에서 하는 방법을 많이 사용한다.
일반적으로 많이 사용하는 방식이지만,
때에 따라서는 좀더 다른방법으로 접근을 해야하는 경우도 있다.
외부API호출이 초단위로 넘어가는 느린 호출인경우 또는 더 최악으로 스크래핑같이 수초~수십초를 기다려야하는 호출인경우는 트랜잭션에 묶지 않고 트랜잭션에서 분리하여 호출하고,
문제가 있을경우, 보정을 해주는 방법으로 구현하는게 훨씬 시스템의 성능이나 안전성면에서 더 유리하다.
외부 호출이 느려지는 경우,
결국은 트랜잭셕이 길어짐에 따른 디비 커넥션 고갈을 가져올수있고,
그에 앞서서, 웹리퀘스트요청의 타임아웃이 먼저 발생할수도있다.
따라서, 외부 호출이 오래걸리는 작업인 경우는 트랜잭션영역에 포함되지않는 밖에서 호출을 하고,
트랜잭션처리를 할수있도록 코드를 구성해줘야 안전하다.
예를 들면)
게시판을 만드는데, 게시글에 첨부파일이 업로드되고 해당 첨부파일은 멀티파트데이터를 받아서,
s3에 업로드를 모두하고, 게시글을 db에 저장하는 흐름이라고 할때,
첨부파일을 s3에 업로드하는 흐름까지는 트랜잭션에 엮이기 않게 별도로 처리를 해야한다.
s3에 업로드가 모두 완료된 시점에 트랜잭션을 열어 db에 게시글을 저장하는 흐름이 되어야 할것이다.
(절대 트랜잭션안에서 s3업로드하는 로직이 들어가면 안된다 ;;;)
해결 방법으로는 코드를 통해 하는 방법도 있고, event방식을 통해 구현하는 방법도 있으니, 적절하게 골라서 사용하면 될듯하다.
@TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT)
TransactionalEventListener을 사용하면, 트랜잭션에과 별도로 처리를 더 유연하게 할수있다.
외부호출이 비동기로 동작해도된다면, @Async를 설정해주면, 더욱 성능을 높일수 있을듯하다.
DB에서 트랜잭션이 열리는 순간부터는 하나의 커넥션이 트랜잭션이 닫히는 순간까지 점유를 하게 되기때문에,
항상 설계단에서는, 트랜잭션은 빠르게 열고, 빠르게 닫히는 방향을 항상 최선시 하여 코드를 구성해야한다.
트랜잭션안에서 시간이 오래걸리는 행위(API호출, 작업)등은 최대한 피하는 방법으로 설계를 해야 성능을 높힐수있다.
이 부분은 실무에서 많이 간과할수있는 부분이라고 생각한다.
하지만, 간과함에 따른 문제가 발생하는 경우는 큰 문제로 번질수있는 원인이 될수있기에,
항상 머리속에 간직하고 있어야할 사항이라고 생각한다.
'MY개발생각' 카테고리의 다른 글
| [개발생각] 캐시 스탬피드 (0) | 2026.04.13 |
|---|---|
| [개발생각] 내가 생각하는 개발자란? (0) | 2026.04.05 |
| [개발생각] 게시판 JPA로 구현할때, 정해야 할것들 (0) | 2026.03.30 |
| [개발생각] 공지글 읽음 처리에 대해서.. (0) | 2026.03.26 |
| [개발생각] StructuredTaskScope에 대해서 (0) | 2026.03.24 |
