JSCODE Logo
프로그래밍 과외블로그후기멘토진
회사명 : JSCODE대표 : 박재성사업자 등록번호 : 244-22-01557통신판매업 : 제 2023-인천미추홀-0381 호
학원 명칭 : 제이에스코드(JSCODE)원격학원학원설립ㆍ운영 등록번호 : 제6063호

서울특별시 구로구 경인로 20가길 11(오류동, 아델리아)

Copyright ⓒ 2025 JSCODE - 최상위 현업 개발자들의 프로그래밍 교육 All rights reserved.

이용약관개인정보처리방침
← 블로그 목록으로 돌아가기

[실습] 특정 서비스가 장애났을 때, 장애가 전파되지 않게 방어 코드 작성하기

JSCODE 박재성
JSCODE 박재성
2025-12-06
author
JSCODE 박재성
category
MSA
createdAt
Dec 6, 2025
series
비전공자도 이해할 수 있는 MSA 입문/실전
slug
practice-implement-failure-protection
type
post
updatedAt
Dec 6, 2025 05:43 AM

✅ 장애 전파 방어 코드 작성하지 않으면 어떻게 되는 지 테스트하기

  1. user-service 서버 종료시키기
    1. user-service가 장애가 났다고 가정하기 위해 user-serivce를 종료시키자.
       
  1. 게시글 조회 API로 요청 보내기
    1. notion image
      user-service가 정상적으로 작동하지 않을 때, board-service의 게시글 조회 API도 같이 장애가 나는 걸 확인할 수 있다. 즉, 장애가 전파됐다.
       
       

✅ 장애 전파 방지 전략

notion image
User Service가 장애가 나더라도 Board Service의 게시글 조회 API의 로직은 영향을 받지 않게 만들어보자. 여러 장애 전파 방지 전략 중 ‘정상적으로 응답할 수 있는 값만 사용자에게 응답하는 방식’으로 장애 전파를 막아보자.
Response
200 OK { "boardId": 1, "title": "제목", "content": "내용" "user": null }
 
 

✅ 코드 작성하기

board-service에서 아래 코드 작성하기
  1. UserClient 코드 수정하기
    1. client/UserClient
      @Component public class UserClient { private final RestClient restClient; public UserClient( @Value("${client.user-service.url}") String userServiceUrl ) { this.restClient = RestClient.builder() .baseUrl(userServiceUrl) .build(); } public Optional<UserResponseDto> fetchUser(Long userId) { try { UserResponseDto userResponseDto = this.restClient.get() .uri("/users/{userId}", userId) .retrieve() .body(UserResponseDto.class); return Optional.ofNullable(userResponseDto); } catch (RestClientException e) { // 로깅 : 예외 발생 시 로그를 남겨 문제를 파악할 수 있게 해야 함 // log.error("사용자 정보 조회 실패: {}", e.getMessage(), e); return Optional.empty(); } } }
       
  1. BoardService 코드 수정하기
    1. service/BoardService
      @Service public class BoardService { private final BoardRepository boardRepository; private final UserClient userClient; public BoardService(BoardRepository boardRepository, UserClient userClient) { this.boardRepository = boardRepository; this.userClient = userClient; } ... public BoardResponseDto getBoard(Long boardId) { // 게시글 불러오기 Board board = boardRepository.findById(boardId) .orElseThrow(() -> new IllegalArgumentException("게시글을 찾을 수 없습니다.")); // user-service로부터 사용자 정보 불러오기 Optional<UserResponseDto> optionalUserResponseDto = userClient.fetchUser(board.getUserId()); // UserDto 생성 UserDto userDto = null; if (optionalUserResponseDto.isPresent()) { UserResponseDto userResponseDto = optionalUserResponseDto.get(); userDto = new UserDto( userResponseDto.getUserId(), userResponseDto.getName() ); } // ResponseDto 생성 BoardResponseDto boardResponseDto = new BoardResponseDto( board.getBoardId(), board.getTitle(), board.getContent(), userDto ); return boardResponseDto; } }
       
  1. board-service와 user-service 서버 둘 다 실행시키기
    1.  
       
  1. 게시글 조회 API 잘 작동하는 지 테스트해보기
    1. notion image
       
  1. user-service 서버만 종료하기
    1. user-service에 장애가 난 상황을 가정하기 위해 서버를 종료시키자.
       
  1. 게시글 조회 API 잘 작동하는 지 테스트해보기
    1. notion image
      분명 user-service가 정상적으로 작동하고 있지 않는 상태인데도 불구하고, board-service에는 영향을 미치지 않았다. 이로써 장애가 전파되지 않았다.
 
author
JSCODE 박재성
category
MSA
createdAt
Dec 6, 2025
series
비전공자도 이해할 수 있는 MSA 입문/실전
slug
type
series-footer
updatedAt
Dec 6, 2025 05:45 AM
📎
이 글은 비전공자도 이해할 수 있는 MSA 입문/실전 강의의 수업 자료 중 일부입니다.