✅ 게시글 전체 조회 API 만들기
board-service에서 아래 코드 작성하기
- UserClient 로직 작성하기
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 List<UserResponseDto> fetchUsersByIds(List<Long> ids) {
try {
return this.restClient.get()
.uri(uriBuilder -> uriBuilder
.path("/users")
.queryParam("ids", ids)
.build()
)
.retrieve()
.body(new ParameterizedTypeReference<>() {});
} catch (RestClientException e) {
// 로깅 : 예외 발생 시 로그를 남겨 문제를 파악할 수 있게 해야 함
// log.error(...)
return Collections.emptyList();
}
}
}
- Service 로직 작성하기
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 List<BoardResponseDto> getBoards() {
List<Board> boards = boardRepository.findAll();
// userId 목록 추출
List<Long> userIds = boards.stream()
.map(Board::getUserId)
.distinct() // 중복 제거
.toList();
// user-service로부터 사용자 정보 불러오기
List<UserResponseDto> userResponseDtos = userClient.fetchUsersByIds(userIds);
// userId를 Key로 하는 Map 생성
Map<Long, UserDto> userMap = new HashMap<>();
for (UserResponseDto userResponseDto : userResponseDtos) {
Long userId = userResponseDto.getUserId();
String name = userResponseDto.getName();
userMap.put(userId, new UserDto(userId, name));
}
// 게시글 정보와 사용자 정보를 조합해서 BoardResponseDto 만들기
return boards.stream()
.map(board -> new BoardResponseDto(
board.getBoardId(),
board.getTitle(),
board.getContent(),
userMap.get(board.getUserId()) // 맵에서 UserDto 가져오기
))
.toList();
}
}
- Controller 로직 작성하기
controller/BoardController
@RestController
@RequestMapping("/boards")
public class BoardController {
private final BoardService boardService;
public BoardController(BoardService boardService) {
this.boardService = boardService;
}
...
@GetMapping()
public ResponseEntity<List<BoardResponseDto>> getBoards() {
List<BoardResponseDto> boardResponseDtos = boardService.getBoards();
return ResponseEntity.ok(boardResponseDtos);
}
}
- user-service, board-service 서버 실행시키기
- 테스트를 위한 게시글 데이터 2개 추가하기
- 잘 작동하는 지 API 요청 보내보기
- user-service, board-serivce 서버가 정상적으로 작동할 때의 API 호출
- user-service 서버가 장애났을 때의 API 호출
user-service 서버가 장애난 걸 가정하기 위해, user-service 서버를 종료시키고 API 호출을 날려보자.
✅ 정리
- 게시글 전체 조회 API 주소(ex.
GET localhost:8081/boards)로 요청을 보낸다.
- 게시글 서비스에서 사용자 정보가 필요해서, 사용자 서비스(ex.
localhost:8080/users?ids=1,2)로부터 데이터를 조회해온다.
- 사용자 서비스로부터 받아온 사용자 정보를 활용해 응답할 데이터를 조합한다.
- 사용자에게 응답한다.