[MSA] Feign Client ์˜ˆ์™ธ ์ฒ˜๋ฆฌ : try-catch

Updated:

Categories:

Tags: ,

๐Ÿ“Œ ๊ฐœ์ธ์ ์ธ ๊ณต๊ฐ„์œผ๋กœ ๊ณต๋ถ€๋ฅผ ๊ธฐ๋กํ•˜๊ณ  ๋ณต์Šตํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ๋ธ”๋กœ๊ทธ์ž…๋‹ˆ๋‹ค.
์ •ํ™•ํ•˜์ง€ ์•Š์€ ์ •๋ณด๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์œผ๋‹ˆ ์ฐธ๊ณ ๋ฐ”๋ž๋‹ˆ๋‹ค :๐Ÿ˜ธ
[ํ‹€๋ฆฐ ๋‚ด์šฉ์€ ๋Œ“๊ธ€๋กœ ๋‚จ๊ฒจ์ฃผ์‹œ๋ฉด ๋ณต๋ฐ›์œผ์‹ค๊ฑฐ์—์š”]

์ธํ”„๋Ÿฐ Dowon Lee๋‹˜์˜ Spring Cloud๋กœ ๊ฐœ๋ฐœํ•˜๋Š” ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜(MSA) ๊ฐ•์˜๋ฅผ ๋“ฃ๊ณ  ์ •๋ฆฌํ•œ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค.๐Ÿ˜Š
Spring Cloud๋กœ ๊ฐœ๋ฐœํ•˜๋Š” ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜(MSA) ๊ฐ•์˜ ๋“ค์œผ๋Ÿฌ ๊ฐ€๊ธฐ๐Ÿ‘ฉโ€๐Ÿซ


Feign Client ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ์ •๋ฆฌ

Feign Client ์‚ฌ์šฉ ์ค‘ API ํ†ต์‹ ์—์„œ ๋ฐœ์ƒํ•˜๋Š” ๋‹ค์–‘ํ•œ ์˜ˆ์™ธ ์ƒํ™ฉ์— ๋Œ€ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ •๋ฆฌํ–ˆ๋‹ค.

1. ์ž˜๋ชป๋œ ์—”๋“œํฌ์ธํŠธ๋กœ ์š”์ฒญํ–ˆ์„ ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ

API ์š”์ฒญ ์‹œ ํŠน์ • ์„œ๋น„์Šค์˜ ๊ฒฝ๋กœ(endpoint)๊ฐ€ ๋‹ค๋ฅธ ๋ถ€์„œ๋‚˜ ๋ฒค๋”์— ์˜ํ•ด ๋ณ€๊ฒฝ๋˜๊ฑฐ๋‚˜ ์ž˜๋ชป ์ „๋‹ฌ๋œ ๊ฒฝ์šฐ, ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ์˜ˆ๋ฅผ ๋“ค์–ด, order-service์˜ ๊ฒฝ๋กœ๊ฐ€ ๋ณ€๊ฒฝ๋˜์–ด ์‹ค์ œ๋กœ ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๊ฒฝ๋กœ๋กœ ์š”์ฒญ์ด ๋“ค์–ด๊ฐ€๋ฉด, ์„œ๋ฒ„์—์„œ๋Š” 404 Not Found ์˜ค๋ฅ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜์ง€๋งŒ, ํด๋ผ์ด์–ธํŠธ ์ชฝ์—์„œ๋Š” 500 Internal Server Error๋กœ ์ž˜๋ชป ์ธ์‹๋  ์ˆ˜ ์žˆ๋‹ค. ์ด๋Š” ๊ฒฝ๋กœ ์˜ค๋ฅ˜์ด๋ฏ€๋กœ, 500๋ณด๋‹ค๋Š” 404 ์—๋Ÿฌ๊ฐ€ ๋” ์ ์ ˆํ•˜๋‹ค.

์˜ˆ์™ธ ์ฒ˜๋ฆฌ ์ฝ”๋“œ

1
2
3
4
5
6
7
8
9
// Feign Client๋ฅผ ํ†ตํ•ด API ํ˜ธ์ถœ
List<ResponseOrder> ordersList = null;
try {
    ordersList = orderServiceClient.getOrders(userId);
} catch (FeignException ex) {
    log.error(ex.getMessage());
}

  • ์ด ์ฝ”๋“œ์—์„œ๋Š” FeignClient ํ˜ธ์ถœ ์‹œ ๋ฐœ์ƒํ•˜๋Š” FeignException์„ try-catch๋กœ ๊ฐ์‹ธ ๋กœ๊ทธ๋ฅผ ๊ธฐ๋กํ•จ์œผ๋กœ์จ ๋ฌธ์ œ ๋ฐœ์ƒ ์‹œ ์›์ธ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋„๋ก ํ–ˆ๋‹ค.
  • ๋ฌธ์ œ๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ์—๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์ถœ๋ ฅ๋˜๊ณ , ๋ฌธ์ œ ๋ฐœ์ƒ ๋ถ€๋ถ„์€ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฐ˜์˜๋˜์ง€ ์•Š๋„๋ก ์กฐ์ •ํ–ˆ๋‹ค.

2. UserService์— ๋กœ๊น… ์ถ”๊ฐ€

๋กœ๊น…์„ ํ†ตํ•ด ์˜ค๋ฅ˜๋ฅผ ๊ธฐ๋กํ•˜๊ณ  ์ถ”์ ํ•  ์ˆ˜ ์žˆ๋‹ค. UserService์— ๋กœ๊น…์„ ์ถ”๊ฐ€ํ•˜์—ฌ ๋ฌธ์ œ ์ƒํ™ฉ์„ ํŒŒ์•…ํ•˜๊ณ  ๊ธฐ๋กํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์„ค์ •ํ–ˆ๋‹ค.

  1. UserServiceApplication์— ๋กœ๊น… ๋ฉ”์„œ๋“œ ์ถ”๊ฐ€ ํ›„ ๋นˆ ๋“ฑ๋ก
    • UserServiceApplication์— ๋กœ๊น…์„ ์œ„ํ•œ ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ๋นˆ์œผ๋กœ ๋“ฑ๋กํ•ด ๋กœ๊น…์„ ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ–ˆ๋‹ค.

  2. OrderServiceClient ๊ฒฝ๋กœ ์ˆ˜์ • ํ…Œ์ŠคํŠธ
    • OrderServiceClient์˜ ๊ธฐ์กด ๊ฒฝ๋กœ์—์„œ ์ž˜๋ชป๋œ ๊ฒฝ๋กœ๋กœ ์ˆ˜์ •ํ•˜์—ฌ ์˜ˆ์™ธ ๋ฐœ์ƒ ์ƒํ™ฉ์„ ์žฌํ˜„ํ–ˆ๋‹ค.
    1
    2
    3
    4
    5
    
     @FeignClient(name = "order-service")
     public interface OrderServiceClient {
         @GetMapping("/order-service/{userId}/orders_ng") // ์ž˜๋ชป๋œ ๊ฒฝ๋กœ๋กœ ์ˆ˜์ •
         List<ResponseOrder> getOrders(@PathVariable String userId);
     }
    

3. ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ์ ์šฉ ํ›„ ํ…Œ์ŠคํŠธ

  1. ์‚ฌ์šฉ์ž ๋“ฑ๋ก

    • userId ๋ณต์‚ฌ
  2. userId๋ฅผ ๋„ฃ์–ด ์‚ฌ์šฉ์ž ์ •๋ณด ์กฐํšŒ

    • ์‚ฌ์šฉ์ž ๋“ฑ๋ก ํ›„ ํ•ด๋‹น userId๋กœ ์ฃผ๋ฌธ ์กฐํšŒ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ฉด, ์ž˜๋ชป๋œ ๊ฒฝ๋กœ๋กœ ์ธํ•ด 404 Not Found๊ฐ€ ๋ฐœ์ƒํ•˜์ง€๋งŒ 500 Internal Server Error๊ฐ€ ๋ฐ˜ํ™˜๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.
  3. log ์ถœ๋ ฅ ํ™•์ธ

    • ๋กœ๊ทธ๋ฅผ ํ†ตํ•ด order-service feignClient ์—์„œ order-service/์‚ฌ์šฉ์žid/orders_ng๋ฅผ ์ž˜๋ชป๋œ ๊ฒฝ๋กœ๋กœ ํ˜ธ์ถœ๋œ ๊ฒƒ์„ ํ™•์ธ ํ•  ์ˆ˜ ์žˆ๋‹ค.

์˜ˆ์™ธ ์ฒ˜๋ฆฌ ์ฝ”๋“œ ๊ฐœ์„ 

์ž˜๋ชป๋œ ๊ฒฝ๋กœ๋กœ ์ธํ•ด ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝ์šฐ, ์˜ˆ์™ธ๋ฅผ ์บ์น˜ํ•˜๊ณ  ๋กœ๊ทธ์— ๊ธฐ๋กํ•œ ๋’ค ๊ธฐ๋ณธ์ ์œผ๋กœ ๋นˆ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ์กฐ์ •ํ•˜์—ฌ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ ๋ถ€๋ถ„๋งŒ ๋น„์›Œ์ง€๋„๋ก ํ–ˆ๋‹ค.

1
2
3
4
5
6
7
8
9
10
11
12
13
// Feign Exception handling

List<ResponseOrder> ordersList = null;
try {
    ordersList = orderServiceClient.getOrders(userId);
} catch (FeignException ex) {
    log.error("Failed to fetch orders for user {}: {}", userId, ex.getMessage());
    ordersList = new ArrayList<>(); // ๋นˆ ๋ฆฌ์ŠคํŠธ๋กœ ์ฒ˜๋ฆฌ
}

userDto.setOrders(ordersList);
return userDto;

4. ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ

  1. ์ž˜๋ชป๋œ ๊ฒฝ๋กœ๋กœ ์š”์ฒญ์„ ๋ณด๋‚ด๋ฉด 404 Not Found๊ฐ€ ์„œ๋ฒ„์—์„œ ๋ฐœ์ƒํ•˜๋ฉฐ, ์˜ˆ์™ธ๋ฅผ ์บ์น˜ํ•˜์—ฌ ๋นˆ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ฐ˜ํ™˜ํ•จ์œผ๋กœ์จ ์—๋Ÿฌ๊ฐ€ ์ƒ๊ธด ์ฃผ๋ฌธ ์ •๋ณด๋Š” ๋น„์›Œ์ง€๊ณ , ์ •์ƒ์ ์ธ ์‚ฌ์šฉ์ž ์ •๋ณด๋Š” ์ถœ๋ ฅ๋œ๋‹ค.
  2. ์ตœ์ข…์ ์œผ๋กœ ์ฃผ๋ฌธ ์กฐํšŒ ์š”์ฒญ ์‹œ 200 OK๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋‚˜ ์ฃผ๋ฌธ ์ •๋ณด๊ฐ€ ์ถœ๋ ฅ๋˜์ง€ ์•Š๋Š” ์ƒํ™ฉ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.์ด ๋ฐฉ์‹์œผ๋กœ Feign Client์—์„œ์˜ ์˜ˆ์™ธ ์ƒํ™ฉ์„ ํšจ๊ณผ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ์ฃผ๋ฌธ ๋“ฑ๋ก

    • ์ฃผ๋ฌธ ๋“ฑ๋ก ํ›„ ์ฃผ๋ฌธ ์กฐํšŒ ์‹œ 200 OK๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋‚˜ ์ฃผ๋ฌธ ์ •๋ณด๊ฐ€ ์ถœ๋ ฅ๋˜์ง€ ์•Š๋Š” ์ƒํ™ฉ


๋น„์Šทํ•œ ์ƒํ™ฉ์œผ๋กœ ํ”„๋กœ์ ํŠธ ํ•  ๋•Œ ์ž˜ ๋˜๊ณ  ์žˆ๋˜ feign ์š”์ฒญ์ด ์•ˆ๋œ ์ ์ด ์žˆ์—ˆ๋Š”๋ฐ employee ๋‹ด๋‹นํ•˜๋˜ ํŒ€์›์ด ๊ฐ‘์ž๊ธฐ endpoint๋ฅผ ๋ณ€๊ฒฝํ•ด์„œ ๋ช‡ ์‹œ๊ฐ„์„ ๊ณ ์ƒํ•œ ์ ์ด ์ƒ๊ฐ๋‚ฌ๋‹ค.
๊ทธ๋•Œ๋Š” ๋ฐ˜ํ™˜ ํƒ€์ž…๋„ ๋‹ฌ๋ผ์ง€๋Š” ๋ฐ”๋žŒ์— ๋” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š”๋ฐ ์˜ค๋ž˜ ๊ฑธ๋ ธ์ง€๋งŒ, ์ด๋Ÿฐ ์˜ˆ์™ธ์ฒ˜๋ฆฌ์™€ log๋ฅผ ์ž์„ธํžˆ ๋‚จ๊ฒผ๋”๋ผ๋ฉด ์กฐ๊ธˆ ์ˆ˜์›”ํ•˜๊ฒŒ ํ•ด๊ฒฐํ–ˆ์„ ๊ฒƒ ๊ฐ™๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ๋‹ค.
์ด ๋ฐฉ๋ฒ• ์™ธ์— ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•๋„ ์žˆ๋Š” ๊ฒƒ ๊ฐ™์•„์„œ ๋” ์ˆ˜๊ฐ•ํ•ด๋ณธ ๋‹ค์Œ์— ํ”„๋กœ์ ํŠธ์— ์ ์šฉํ•ด๋ด์•ผ๊ฒ ๋‹ค.

MSA ์นดํ…Œ๊ณ ๋ฆฌ ๋‚ด ๋‹ค๋ฅธ ๊ธ€ ๋ณด๋Ÿฌ๊ฐ€๊ธฐ

Leave a comment