1. 서비스 분리에서 나타난 문제점
기존 모놀리식 구조에서 MSA전환을 진행하면서 애플리케이션을 각 서비스별로 분리하다 엄청난 고뇌에 빠지게 되었습니다...
예매 서비스와 티켓 서비스를 분리한 구조에서, 예매 내역을 조회할 때 데이터를 어떻게 처리할까에 대한 고민이었습니다.
상황 설명
1. 티켓 서비스
- 공연, 스케줄, 좌석 정보를 관리
- 주요 기능: 티켓 생성, 스케줄 관리, 좌석 관리
2. 예매 서비스
- 예매 및 예매 내역 관리
- 주요 기능 : 예매 생성, 예매 취소, 예매 내역 조회
예매 내역을 조회하면 공연 이름, 스케쥴(회차), 좌석 정보 등이 필요하게 됩니다. 하지만 이 데이터는 티켓 서비스에서 관리하고 있는 상황입니다. 고뇌 끝에 이 문제를 해결할 두 가지 방법을 생각해보았습니다.
1. 예매 서비스의 DB에 관련 데이터를 저장한다.
2.예매 서비스에서 ID만 저장하고, 서비스 간 통신을 통해서 데이터를 조회한다.
옵션 1: 예매 서비스가 공연 이름, 스케쥴 정보, 좌석 등의 데이터를 저장하고 관리한다.
장점으로는 필요한 모든 데이터가 한 DB에 있으므로 빠르게 조회가 가능하고, 클라이언트는 예매 서비스만 호출하면 모든 데이터를 받을 수 있다는 장점이 있다.
단점으로는 티켓 서비스와 예매 서비스에 동일 데이터를 관리하므로 데이터가 중복 저장되게 됩니다. 이로 인해 티켓 정보(공연 정보, 스케줄)가 변경되면 예매 서비스의 데이터를 추가로 업데이트하는 작업이 필요하게 됩니다. 또한 티켓 데이터 구조가 변경되거나 할 경우 예매 서비스의 DB 스키마 변경 등이 발생할 가능성이 있습니다.
옵션 2: 예매 서비스는 티켓 관련 데이터의 ID만 저장하고 예매 내역을 조회할 때, 티켓 서비스와 통신을 통해 데이터를 가져온다.
2번의 경우 장점은 티켓 데이터가 변경되어도 추가적인 작업이 필요하지 않다. 각 서비스는 자신이 맡은 역할만 관리하므로 변경 사항이 다른 서비스에 영향을 주지 않는다.
이 때 단점으로는 티켓 정보를 얻기 위해서 서비스간 통신이 필요하다. 이로 인해 티켓 서비스에서 장애가 발생하면 예매 서비스도 영향을 받을 가능성이 있다.
이런 고민 끝에 옵션 1번을 선택하게 되었습니다. 그 이유는 다음과 같습니다.
1. 티켓 예매 시점에서 좌석 정보, 티켓 이름 등이 변경될 확률이 매우 적다 -> 데이터 동기화의 부담이 적다.
2. 티켓 예매 서비스에 장애가 생겼을 경우 예매 내역 확인까지 영향을 미치는 것이 더 치명적이다.
따라서 예매 내역 생성 시, 티켓 정보를 가져오기 위해 서비스 간 통신을 활용해 필요한 데이터만 조회해 저장한 후, 임시 예매 내역을 생성하는 방식을 적용했습니다!
2. OpenFeign 활용한 서비스 간 통신
긴 고민이 끝났지만 여전히 서비스 간 통신이 필요합니다. 서비스 간 통신을 위해 OpenFeign을 사용해 서비스 간 통신을 진행해보도록 하겠습니다.
잠깐 OpenFeign이란?
Spring Cloud OpenFeign은 넷플릭스가 개발한 Feign이라는 선언형 HTTP 클라이언트를 확장한 오픈 소스 프로젝트로, REST API 기반의 마이크로서비스 아키텍처에서 서로 다른 서비스 간의 통신을 더욱 간결하고 선언적으로 처리할 수 있도록 도와줍니다.
OpenFeign은 선언형 방식으로 되어있어 인터페이스와 어노테이션을 정의하기만 하면, Spring이 실행시점에 자동으로 해당 인터페이스 구현체를 제공해 API 통신을 손쉽게 수행할 수 있게 해줍니다. 이를 통해 개발자는 복잡한 HTTP 통신 로직을 신경쓸 필요 없이 메서드 호출 하듯이 외부 API와 통신할 수 있다는 장점이 있습니다.
https://alswns7984.tistory.com/96
[Spring] OpenFeign란?
1. OpenFeign란?Spring Cloud OpenFeign은 넷플릭스가 개발한 Feign이라는 선언형 HTTP 클라이언트를 확장한 오픈 소스 프로젝트입니다. REST API 기반의 마이크로서비스 아키텍처에서 서로 다른 서비스 간의
alswns7984.tistory.com
(해당 글은 이전에 제가 블로그에 포스팅한 글입니다.)
이 OpenFeign을 활용해 서비스 간 통신을 진행해보도록 하겠습니다.
2-1 Spring Cloud OpenFeign 의존성 추가하기
예매 서비스 애플리케이션에 OpenFeign 의존성을 추가해줍니다.
implementation 'org.springframework.cloud:spring-cloud-starter-openfeign'
2-2 OpenFeign 활성화하기
OpenFeign활성화를 위해 @EnableFeignClinets 어노테이션을 선언해줍니다.
@EnableFeignClients
@SpringBootApplication (
scanBasePackages = { "kr.doridos.reservationservice", "kr.doridos.common"}
)
public class ReservationServiceApplication {
public static void main(String[] args) {
SpringApplication.run(ReservationServiceApplication.class, args);
}
}
2-3 Ticket Service 애플리케이션에 티켓 정보 API 만들기
예매 서비스에서 티켓 정보를 가져와야 하기 때문에 티켓 서비스 애플리케이션에 티켓 정보 API를 추가해줍니다.
@RestController
@RequestMapping("/tickets")
public class TicketController {
private final TicketService ticketService;
public TicketController(final TicketService ticketService) {
this.ticketService = ticketService;
}
@GetMapping("/details")
public ResponseEntity<List<TicketInfoFeignResponse>> getReservationsWithSeatsByTicketAndSchedule(
@RequestParam final Long ticketId,
@RequestParam final Long scheduleId,
@RequestParam final List<Long> seatIds) {
return ResponseEntity.ok(ticketService.getReservationsWithSeatsByTicketAndSchedule(ticketId, scheduleId, seatIds));
}
2-4 OpenFeign 인터페이스 작성하기
@FeignClient(name = "ticket-service", path = "tickets/details")
public interface TicketFeignClient {
@GetMapping
TicketInfoFeignResponse getReservationsWithSeatsByTicketAndSchedule(@RequestParam final Long ticketId, @RequestParam final Long scheduleId, @RequestParam final List<Long> seats);
}
위에서 만든 티켓 서비스의 API를 호출해 티켓 정보를 가져올 OpenFeign 인터페이스를 만들어줍니다.
- name : 유레카 서버에 등록된 티켓서비스의 이름
- path : 요청을 보낼 티켓 서비스의 엔드포인트
2-5 Reservation 서비스에서 Ticket 서비스와 통신을 통해 정보 가져오기
@DistributedLock(key = "request.seatIds", paramIndexes = {1})
public RegisterReservationResponse registerReservation(final Long userId, final ReservationRequest request) {
final List<Long> seats = request.getSeatIds();
validateSeatsSize(request.getSeatIds(), seats);
validateSeatsIsReserved(seats, request.getScheduleId());
//서비스간 통신!!!!
final TicketInfoFeignResponse ticketInfoFeignResponse = ticketFeignClient.getReservationsWithSeatsByTicketAndSchedule(
request.getTicketId(),
request.getScheduleId(),
seats
);
~~~~~~~~~~~~~
}
예매 서비스에서 만들어준 TicketFeignClient를 주입받은 후 티켓 서비스의 API에 요청을 보내고 서비스 간 통신을 통해서 티켓 정보를 받아옵니다.
2-6 서비스 간 통신이 제대로 이뤄지는지 확인하기
실제 요청을 보내 정상적으로 서비스 간 통신이 이뤄지는지 테스트해보겠습니다. (임시로 게이트웨이가 아닌 서버 url로 진행)
예매서비스에서 예매 요청을 보내면 정상적으로 200응답이 오는 것을 확인할 수 있습니다.
티켓 서비스에의 로그를 확인하면 서비스 간 통신이 정상적으로 진행된 것을 확인할 수 있습니다.

참고
https://alswns7984.tistory.com/96
[Spring] OpenFeign란?
1. OpenFeign란?Spring Cloud OpenFeign은 넷플릭스가 개발한 Feign이라는 선언형 HTTP 클라이언트를 확장한 오픈 소스 프로젝트입니다. REST API 기반의 마이크로서비스 아키텍처에서 서로 다른 서비스 간의
alswns7984.tistory.com
Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA) 강의 | Dowon Lee - 인프런
Dowon Lee | Spring framework의 Spring Cloud 제품군을 이용하여 마이크로서비스 애플리케이션을 개발해 보는 과정입니다. Cloud Native Application으로써의 Spring Cloud를 어떻게 사용하는지, 구성을 어떻게 하는
www.inflearn.com
'Backend > MSA 전환' 카테고리의 다른 글
[MSA 전환하기 8편] Kafka를 활용한 이벤트 기반 아키텍처 구축하기 (0) | 2025.02.12 |
---|---|
[MSA 전환하기 7편] 서킷 브레이커 적용하기 (Resilence4J) (1) | 2025.01.31 |
[MSA 전환하기 5편] Spring Cloud Config 도입하기 (+ Spring Cloud Bus) (0) | 2025.01.20 |
[MSA 전환하기 4편] Spring Cloud Gateway 구현하기 (API Gateway) (0) | 2025.01.15 |
[MSA 전환하기 3편] Service Discovery 적용하기 (0) | 2025.01.13 |