λ§ˆμ΄ν¬λ‘œμ„œλΉ„μŠ€ κ°œλ°œμ— μžˆμ–΄μ„œ OpenFeign ν™œμš©μ— λŒ€ν•œ 뢀뢄이 μ•„λ‹Œ μž‘μ€ λͺ¨λ†€λ¦¬μ‹μœΌλ‘œ κ΅¬μ„±λœ μ†Œκ·œλͺ¨ μ‹œμŠ€ν…œμ—μ„œλ„ Apache HttpClientλ₯Ό μ§μ ‘μ μœΌλ‘œ μ‚¬μš©ν•˜μ§€ μ•Šκ³  μ–΄λ…Έν…Œμ΄μ…˜κ³Ό μΈν„°νŽ˜μ΄μŠ€ 기반의 μ„ μ–Έμ μœΌλ‘œ 톡신에 λŒ€ν•œ λ‘œμ§μ„ μž‘μ„±ν•˜λŠ” 것을 κ³ λ―Όν•˜κ²Œ λ˜λŠ” 뢀뢄을 μ μ–΄λ³΄κ³ μž ν•œλ‹€.

톡신 λ‘œμ§μ— λŒ€ν•œ 반볡적인 μ½”λ“œ μž‘μ„±

RestTemplate와 HttpClientλ₯Ό μ§μ ‘μ μœΌλ‘œ μ‚¬μš©ν•˜μ—¬ 톡신에 λŒ€ν•œ μ½”λ“œλ₯Ό μž‘μ„±ν•˜λŠ” 경우 URI ꡬ성과 쿼리 νŒŒλΌλ―Έν„° 그리고 폼 데이터 λ˜λŠ” μš”μ²­ 데이터 그리고 응닡 결과에 λŒ€ν•œ 데이터 μ²˜λ¦¬κΉŒμ§€ μ•„λž˜μ™€ 같은 뢀뢄듀이 κ°•μ œν™” λ˜μ–΄λ²„λ¦¬λŠ” κ²½μš°κ°€ λ§Žμ€ 것 κ°™λ‹€.

ObjectMapper objectMapper = new ObjectMapper();
LoginEntity login = objectMapper.readValue(json, new TypeReference<>(){});

ν†΅μ‹ ν•΄μ•Όν•˜λŠ” μ‹œμŠ€ν…œμ—μ„œ μ œκ³΅ν•˜λŠ” REST API κ·œκ²©μ— 따라 쿼리 νŒŒλΌλ―Έν„° λ˜λŠ” μš”μ²­ 데이터λ₯Ό 직접 κ΅¬μ„±ν•΄μ•Όν•˜κ³  전달받은 응닡에 λŒ€ν•˜μ—¬ μœ„μ™€ 같이 μ§μ ‘μ μœΌλ‘œ μ›ν•˜λŠ” λͺ¨λΈ 클래슀둜 λ³€ν™˜ν•˜λŠ” μ½”λ“œλ₯Ό μž‘μ„±ν•΄μ•Όλ§Œ ν•œλ‹€. 이것은 μŠ€ν”„λ§ λ°±μ—”λ“œ κ°œλ°œμžκ°€ Spring MVC의 컨트둀러λ₯Ό μž‘μ„±ν•˜λŠ” κ²ƒκ³ΌλŠ” λ‹€λ₯Έλ° OpenFeign ν΄λΌμ΄μ–ΈνŠΈλŠ” 선언적인(Declarative) 방식을 톡해 μ΄λŸ¬ν•œ 과정을 κ°„μ†Œν™”ν•˜κ³  Spring MVC와 λΉ„μŠ·ν•œ λ°©μ‹μœΌλ‘œ μž‘μ„±λ¨μ— λ”°λΌμ„œ μ‹œμŠ€ν…œ κ°„ 연동을 μœ„ν•œ 톡신 λ‘œμ§μ„ μž‘μ„±ν•˜κ³  κ΄€λ¦¬ν•˜κΈ° μš©μ΄ν•œ μž₯점을 가지고 μžˆλŠ” 것 κ°™λ‹€.

의쑴 μ‹œμŠ€ν…œμ— λŒ€ν•œ μž₯μ•  처리 λΆ€μ‘±

λ§ˆμ΄ν¬λ‘œμ„œλΉ„μŠ€ ꡬ성이 μ•„λ‹Œ 일반적인 μ†Œκ·œλͺ¨ μ‹œμŠ€ν…œμ—μ„œ RestTemplate와 HttpClientλ₯Ό μ§μ ‘μ μœΌλ‘œ μ‚¬μš©ν•˜λ‹€λ³΄λ©΄ μ‹œμŠ€ν…œ κ°„ 톡신에 λŒ€ν•œ 였λ₯˜μ™€ μž¬μ‹œλ„ λ°©μ•ˆμ— λŒ€ν•œ 고민을 ν•˜μ§€ μ•Šκ³  λ¬΄μ‹œν•˜κ²Œ λ˜λŠ” κ²½μš°κ°€ λ§Žλ‹€. OpenFeign은 λ§ˆμ΄ν¬λ‘œμ„œλΉ„μŠ€ κ°œλ°œμ— μ‚¬μš©λ˜μ–΄μ§€λŠ” 만큼 λ§ˆμ΄ν¬λ‘œμ„œλΉ„μŠ€μ—μ„œ μ€‘μš”μ‹œν•˜κ²Œ λ˜λŠ” μž₯μ•  μ „νŒŒ 방지에 λŒ€ν•œ 뢀뢄을 κ³ λ €ν•  수 μžˆλ‹€.

λ§ˆμ΄ν¬λ‘œμ„œλΉ„μŠ€ ꡬ성 ν™•μž₯에 λŒ€ν•œ κ³ λ €

λͺ¨λ†€λ¦¬μ‹ μ•„ν‚€ν…μ²˜λ‘œ κ΅¬μ„±λ˜λŠ” μ†Œκ·œλͺ¨ μ‹œμŠ€ν…œλ„ ν˜„μž¬ μ‹œμŠ€ν…œ 규λͺ¨μ™€ μš”κ΅¬μ‚¬ν•­μ„ λ„˜μ–΄ λŒ€κ·œλͺ¨ νŠΈλž˜ν”½ λ˜λŠ” 데이터λ₯Ό μ²˜λ¦¬ν•˜κΈ° μœ„ν•œ μ‹œμŠ€ν…œμœΌλ‘œ ν™•μž₯λ˜λŠ” 것을 λͺ©ν‘œλ‘œ ν•˜λŠ” κ²½μš°κ°€ λŒ€λΆ€λΆ„μ΄λ‹€. ν˜„μž¬ μ‹ κ·œ ν”„λ‘œμ νŠΈλ„ λ§ˆμ΄ν¬λ‘œμ„œλΉ„μŠ€ ꡬ성을 λͺ©ν‘œλ‘œ 초기 섀계가 λ˜μ–΄μžˆμŒμ— 따라 Spring Cloud λͺ¨λ“ˆμ— λŒ€ν•œ μ˜μ‘΄μ„±μ„ λ³΄μœ ν•˜κ³  μžˆλ‹€. Spring Cloud OpenFeign 둜 μž‘μ„±λ˜μ–΄μžˆλŠ” 경우 μ„œλΉ„μŠ€ λ””μŠ€μ»€λ²„λ¦¬λ₯Ό μœ„ν•œ Eureka와 μž₯μ•  처리λ₯Ό μœ„ν•œ Resilience4J 과의 톡합이 μš©μ΄ν•˜λ‹€κ³  ν•œλ‹€.

이와 같이 λ§ˆμ΄ν¬λ‘œμ„œλΉ„μŠ€ μ•„ν‚€ν…μ²˜κ°€ μ•„λ‹ˆλ”λΌλ„ μ™ΈλΆ€ μ‹œμŠ€ν…œ λ˜λŠ” μ‹œμŠ€ν…œ κ°„ 톡신이 λ§Žμ€ μ‹œμŠ€ν…œμ˜ ν”„λ‘œμ νŠΈλΌλ©΄ OpenFeign ν΄λΌμ΄μ–ΈνŠΈ λ„μž…μ„ κ³ λ €ν•΄λ³Όλ§Œν•˜μ§€ μ•Šμ„κΉŒ? λ¬Όλ‘ , Feign μ½”λ“œ 뢄석과 μ„œλ²„ μ„±λŠ₯ κ°œμ„  μ—μ„œμ²˜λŸΌ λ¬Έμ œκ°€ λ‚΄μž¬λ˜μ§€ μ•ŠλŠ” 건 μ•„λ‹˜μ„ κ°μ•ˆν•˜κΈ΄ ν•΄μ•Όκ² μ§€λ§Œ 말이닀.


πŸ”₯ FeignClient μ—μ„œ GET λŒ€μ‹ μ— POST μš”μ²­μ΄ λ˜λŠ” 이유

FeignClient에 λŒ€ν•œ κ°„λ‹¨ν•œ 예제 μ½”λ“œλ₯Ό μž‘μ„±ν•΄λ³΄λ˜ 쀑에 GET μš”μ²­μ΄ POST둜 μ „ν™˜λ˜μ–΄ μš”μ²­λ˜λŠ” 문제λ₯Ό κ²½ν—˜ν–ˆλ‹€. GET μš”μ²­ μ‹œ 쿼리 νŒŒλΌλ―Έν„°λ₯Ό μ „λ‹¬ν•˜κΈ° μœ„ν•΄μ„œλŠ” @SpringQueryMapλ₯Ό ν•΄λ‹Ή νŒŒλΌλ―Έν„°μ— μ„ μ–Έν•΄μ•Όν•˜λ”λΌ. 쿼리 νŒŒλΌλ―Έν„°κ°€ μ „λ‹¬λ˜μ§€ μ•ŠλŠ” κ²½μš°κ°€ μ•„λ‹Œ μ„ μ–Έλœ μš”μ²­ ν•¨μˆ˜κ°€ λ°”λ€Œμ–΄λ²„λ¦¬λŠ” 건 μ‹ κΈ°ν•œ 뢀뢄이닀.