day61 πŸŒ•

μž₯λ―ΈΒ·2022λ…„ 8μ›” 13일
0

였늘의 μ„±κ³Ό

λͺ©λ‘ 보기
61/129

μŠ€ν”„λ§ MVC 2편 - λ°±μ—”λ“œ μ›Ή 개발 ν™œμš© 기술 μ„Ήμ…˜ 9 μˆ˜κ°•

+) 22. 08. 17. μΆ”κ°€

μ„Ήμ…˜ 9. API μ˜ˆμ™Έ 처리 μˆ˜κ°• μ™„λ£Œ!!

APIλŠ” 각 였λ₯˜ 상황에 λ§žλŠ” 였λ₯˜ 응닡 μŠ€νŽ™μ„ μ •ν•˜κ³ , JSON으둜 데이터λ₯Ό λ‚΄λ €μ€˜μ•Ό ν•œλ‹€.


μŠ€ν”„λ§ λΆ€νŠΈ κΈ°λ³Έ 였λ₯˜ 처리

BasicErrorController μ½”λ“œ

@RequestMapping(produces = MediaType.TEXT_HTML_VALUE)
public ModelAndView errorHtml(HttpServletRequest request, HttpServletResponse
response) {}

@RequestMapping
public ResponseEntity<Map<String, Object>> error(HttpServletRequest request) {}
  • errorHtml(): produces = MediaType.TEXT_HTML_VALUE ➑️ ν΄λΌμ΄μ–ΈνŠΈ μš”μ²­μ˜ Accept 헀더 값이 text/html인 κ²½μš°μ—λŠ” errorHtml()을 ν˜ΈμΆœν•΄μ„œ viewλ₯Ό μ œκ³΅ν•œλ‹€.

    • produces = MediaType.APPLICATION_JSON_VALUE: ν΄λΌμ΄μ–ΈνŠΈκ°€ μš”μ²­ν•˜λŠ” HTTP header의 Accept 값이 application/json일 λ•Œ ν•΄λ‹Ή λ©”μ„œλ“œκ°€ ν˜ΈμΆœλœλ‹€. ➑️ ν΄λΌμ΄μ–ΈνŠΈκ°€ λ°›κ³  싢은 λ―Έλ””μ–΄ νƒ€μž…μ΄ json이면 이 컨트둀러의 λ©”μ„œλ“œκ°€ ν˜ΈμΆœλœλ‹€.
  • error(): κ·Έ μ™Έμ˜ κ²½μš°μ— 호좜되고 ResponseEntity둜 HTTP Body에 json 데이터λ₯Ό λ°˜ν™˜ν•œλ‹€.

μŠ€ν”„λ§ λΆ€νŠΈκ°€ μ œκ³΅ν•˜λŠ” BasicErrorControllerλŠ” HTML νŽ˜μ΄μ§€λ₯Ό μ œκ³΅ν•˜λŠ” κ²½μš°μ—λŠ” 맀우 νŽΈλ¦¬ν•˜λ‹€.
ν•˜μ§€λ§Œ API 였λ₯˜ μ²˜λ¦¬λŠ” 각 APIλ§ˆλ‹€ μ»¨νŠΈλ‘€λŸ¬λ‚˜ μ˜ˆμ™Έμ— 따라 μ„œλ‘œ λ‹€λ₯Έ 응닡 κ²°κ³Όλ₯Ό 좜λ ₯ν•΄μ•Ό ν•  μˆ˜λ„ μžˆλ‹€. 예λ₯Ό λ“€μ–΄μ„œ, νšŒμ›κ³Ό κ΄€λ ¨λœ APIμ—μ„œ μ˜ˆμ™Έκ°€ λ°œμƒν•  λ•Œμ˜ 응닡과, μƒν’ˆκ³Ό κ΄€λ ¨λœ APIμ—μ„œ λ°œμƒν•˜λŠ” μ˜ˆμ™Έμ— 따라 κ·Έ κ²°κ³Όκ°€ λ‹¬λΌμ§ˆ 수 μžˆλ‹€.
λ”°λΌμ„œ 이 방법은 HTML 화면을 μ²˜λ¦¬ν•  λ•Œ μ‚¬μš©ν•˜λŠ” 것이 μ’‹λ‹€.


HandlerExceptionResolver

컨트둀러(ν•Έλ“€λŸ¬) λ°–μœΌλ‘œ λ˜μ Έμ§„ μ˜ˆμ™Έλ₯Ό ν•΄κ²°ν•˜κ³ , λ™μž‘ 방식을 λ³€κ²½ν•˜κ³  μ‹ΆμœΌλ©΄ HandlerExceptionResolverλ₯Ό μ‚¬μš©ν•˜λ©΄ λœλ‹€.

⬇️ ExceptionResolver 적용 μ „

ExceptionResolver 적용 μ „

⬇️ ExceptionResolver 적용 ν›„

ExceptionResolver 적용 ν›„

HandlerExceptionResolver μΈν„°νŽ˜μ΄μŠ€

public interface HandlerExceptionResolver {
	ModelAndView resolveException(
	HttpServletRequest request, HttpServletResponse response,
    Object handler, Exception ex);
}
  • handler: ν•Έλ“€λŸ¬(컨트둀러) 정보
  • Exception ex: ν•Έλ“€λŸ¬(컨트둀러)μ—μ„œ λ°œμƒν•œ μ˜ˆμ™Έ

ExceptionResolverκ°€ ModelAndViewλ₯Ό λ°˜ν™˜ν•˜λŠ” μ΄μœ λŠ” 마치 try-catchλ₯Ό ν•˜λ“―μ΄, Exception을 μ²˜λ¦¬ν•΄μ„œ 정상 νλ¦„μ²˜λŸΌ λ³€κ²½ν•˜λŠ” 것이 λͺ©μ μ΄κΈ° λ•Œλ¬Έμ΄λ‹€.

ExceptionResolver ν™œμš©

  • μ˜ˆμ™Έ μƒνƒœ μ½”λ“œ λ³€ν™˜
    μ˜ˆμ™Έλ₯Ό response.sendError(xxx) 호좜둜 λ³€κ²½ν•˜μ—¬ μ„œλΈ”λ¦Ώμ—μ„œ μƒνƒœ μ½”λ“œμ— λ”°λ₯Έ 였λ₯˜λ₯Ό μ²˜λ¦¬ν•˜λ„λ‘ μœ„μž„ν•œλ‹€.
    이후 WASλŠ” μ„œλΈ”λ¦Ώ 였λ₯˜ νŽ˜μ΄μ§€λ₯Ό μ°Ύμ•„μ„œ ν˜ΈμΆœν•œλ‹€.

  • λ·° ν…œν”Œλ¦Ώ 처리
    ModelAndView에 값을 μ±„μ›Œμ„œ μ˜ˆμ™Έμ— λ”°λ₯Έ 였λ₯˜ 화면을 λ·° λ Œλ”λ§ν•˜μ—¬ κ³ κ°μ—κ²Œ μ œκ³΅ν•œλ‹€.

  • API 응닡 처리
    HTTP 응닡 바디에 직접 데이터λ₯Ό λ„£λŠ” 것도 κ°€λŠ₯ν•˜λ‹€. 여기에 JSON으둜 μ‘λ‹΅ν•˜λ©΄ API 응닡을 μ²˜λ¦¬ν•  수 μžˆλ‹€.

정리
ExceptionResolverλ₯Ό μ‚¬μš©ν•˜λ©΄ μ»¨νŠΈλ‘€λŸ¬μ—μ„œ μ˜ˆμ™Έκ°€ λ°œμƒν•΄λ„ ExceptionResolverμ—μ„œ μ˜ˆμ™Έλ₯Ό μ²˜λ¦¬ν•΄ 버린닀. λ”°λΌμ„œ μ˜ˆμ™Έκ°€ λ°œμƒν•˜λ”λΌλ„ μ„œλΈ”λ¦Ώ μ»¨ν…Œμ΄λ„ˆκΉŒμ§€ μ „λ‹¬λ˜μ§€ μ•Šκ³ , μŠ€ν”„λ§ MVCμ—μ„œ λλ‚œλ‹€.
즉, 결과적으둜 WAS μž…μž₯μ—μ„œλŠ” 정상 μ²˜λ¦¬κ°€ 된 것이닀.


μŠ€ν”„λ§μ΄ μ œκ³΅ν•˜λŠ” ExceptionResolver

  • ExceptionHandlerExceptionResolver
    @ExceptionHandlerλ₯Ό μ²˜λ¦¬ν•œλ‹€. API μ˜ˆμ™Έ μ²˜λ¦¬λŠ” λŒ€λΆ€λΆ„ 이 κΈ°λŠ₯으둜 ν•΄κ²°ν•œλ‹€.

  • ResponseStatusExceptionResolver
    HTTP μƒνƒœ μ½”λ“œλ₯Ό μ§€μ •ν•œλ‹€.
    예: @ResponseStatus(value = HttpStatus.NOT_FOUND)

  • DefaultHandlerExceptionResolver
    μŠ€ν”„λ§ λ‚΄λΆ€μ—μ„œ λ°œμƒν•˜λŠ” μ˜ˆμ™Έλ₯Ό μ²˜λ¦¬ν•œλ‹€.


@ExceptionHandler

@ExceptionHandler μ˜ˆμ™Έ 처리 방법
@ExceptionHandler μ• λ…Έν…Œμ΄μ…˜μ„ μ„ μ–Έν•˜κ³ , ν•΄λ‹Ή μ»¨νŠΈλ‘€λŸ¬μ—μ„œ μ²˜λ¦¬ν•˜κ³  싢은 μ˜ˆμ™Έλ₯Ό 지정해 μ£Όλ©΄ λœλ‹€.

λ‹€μ–‘ν•œ μ˜ˆμ™Έ
λ‹€μŒκ³Ό 같이 λ‹€μ–‘ν•œ μ˜ˆμ™Έλ₯Ό ν•œ λ²ˆμ— μ²˜λ¦¬ν•  수 μžˆλ‹€.

@ExceptionHandler({AException.class, BException.class})
public String ex(Exception e) {
   log.info("exception e", e);
}

μ˜ˆμ™Έ μƒλž΅
@ExceptionHandler에 μ˜ˆμ™Έλ₯Ό μƒλž΅ν•˜λ©΄ λ©”μ„œλ“œ νŒŒλΌλ―Έν„°μ˜ μ˜ˆμ™Έκ°€ μ§€μ •λœλ‹€.

@ExceptionHandler
public ResponseEntity<ErrorResult> userExHandle(UserException e) {}

ResponseEntityλ₯Ό μ‚¬μš©ν•˜λ©΄ HTTP 응닡 μ½”λ“œλ₯Ό ν”„λ‘œκ·Έλž˜λ°ν•΄μ„œ λ™μ μœΌλ‘œ λ³€κ²½ν•  수 μžˆλ‹€.


@ControllerAdvice

@ExceptionHandlerλŠ” 정상 μ½”λ“œμ™€ μ˜ˆμ™Έ 처리 μ½”λ“œκ°€ ν•˜λ‚˜μ˜ μ»¨νŠΈλ‘€λŸ¬μ— μ„žμ—¬μžˆλ‹€.
@ControllerAdvice λ˜λŠ” @RestControllerAdviceλ₯Ό μ‚¬μš©ν•˜λ©΄ λ‘˜μ„ 뢄리할 수 μžˆλ‹€.

  • @ControllerAdviceλŠ” λŒ€μƒμœΌλ‘œ μ§€μ •ν•œ μ—¬λŸ¬ μ»¨νŠΈλ‘€λŸ¬μ— @ExceptionHandler, @InitBinder κΈ°λŠ₯을 λΆ€μ—¬ν•΄ μ£ΌλŠ” 역할을 ν•œλ‹€.

  • @ControllerAdvice에 λŒ€μƒμ„ μ§€μ •ν•˜μ§€ μ•ŠμœΌλ©΄ λͺ¨λ“  μ»¨νŠΈλ‘€λŸ¬μ— μ μš©λœλ‹€.

  • @RestControllerAdviceλŠ” @ControllerAdvice와 κ°™κ³ , @ResponseBodyκ°€ μΆ”κ°€λ˜μ–΄ μžˆλ‹€.


ν† ν”½ 1개 - http vs https

+) 22. 09. 03. μΆ”κ°€!!

HTTP(Hypertext Transfer Protocol)

μ„œλ‘œ λ‹€λ₯Έ μ‹œμŠ€ν…œλ“€ μ‚¬μ΄μ—μ„œ 톡신을 μ£Όκ³  λ°›κ²Œ ν•˜λŠ” κ°€μž₯ 기본적인 ν”„λ‘œν† μ½œμ΄λ‹€.
데이터λ₯Ό μ„œλ²„ β†’ λΈŒλΌμš°μ €λ‘œ μ „μ†‘ν•˜λŠ” μš©λ„λ‘œ κ°€μž₯ 많이 μ‚¬μš©ν•œλ‹€.
HTTPλŠ” μ„œλ²„μ—μ„œ λΈŒλΌμš°μ €λ‘œ μ „μ†‘ν•˜λŠ” 정보가 μ•”ν˜Έν™”λ˜μ§€ μ•ŠλŠ”λ‹€λŠ” 문제점이 μžˆλ‹€.

HTTPS(Hypertext Transfer Protocol Secure)

HTTPSλŠ” HTTP에 SSL(λ³΄μ•ˆ μ†ŒμΌ“ 계측)을 μ μš©ν•œ ν”„λ‘œν† μ½œμ΄λ‹€.
SSL은 μ„œλ²„μ™€ λΈŒλΌμš°μ € 사이에 μ•ˆμ „ν•˜κ²Œ μ•”ν˜Έν™”λœ 연결을 λ§Œλ“€ 수 있게 도와주고, μ„œλ²„μ™€ λΈŒλΌμš°μ €κ°€ λ―Όκ°ν•œ 정보λ₯Ό μ£Όκ³  받을 λ•Œ ν•΄λ‹Ή 정보가 λ„λ‚œ λ‹Ήν•˜λŠ” 것을 막아쀀닀. (HTTP Message Bodyλ₯Ό μ•”ν˜Έν™”ν•œλ‹€.)

μ™œ HTTPSλ₯Ό μ‚¬μš©ν•΄μ•Ό ν• κΉŒ?

http://velog.io/@newbiekim

http둜 데이터λ₯Ό 전솑할 경우, λ„€νŠΈμ›Œν¬λ‘œ 원본 데이터가 μ „λ‹¬λœλ‹€. λ”°λΌμ„œ 해컀가 쀑간에 데이터λ₯Ό κ°€λ‘œμ±ˆ λ‹€μŒ, ν•΄λ‹Ή 데이터λ₯Ό 보면 μ–΄λ–€ λ‚΄μš©μ΄ λ“€μ–΄μžˆλŠ”μ§€ λ°”λ‘œ μ•Œ 수 μžˆλ‹€.

https://velog.io/@newbiekim

HTTP와 달리 HTTPS둜 전솑할 경우 데이터λ₯Ό μ•”ν˜Έν™”ν•˜μ—¬ μ „μ†‘ν•œλ‹€. κ·Έλž˜μ„œ 해컀가 쀑간에 데이터λ₯Ό κ°€λ‘œμ±„λ”λΌλ„ 데이터가 μ•”ν˜Έν™”λ˜μ–΄ 있기 λ•Œλ¬Έμ— μ–΄λ–€ λ‚΄μš©μΈμ§€ μ•ŒκΈ° μ–΄λ ΅λ‹€.


SSL(Secure Sockets Layer)

Netscape Communications Corporationμ—μ„œ μ›Ή μ„œλ²„μ™€ μ›Ή λΈŒλΌμš°μ € κ°„μ˜ λ³΄μ•ˆμ„ μœ„ν•΄ λ§Œλ“  ν”„λ‘œν† μ½œμ΄λ‹€.
λŒ€μΉ­ν‚€, κ³΅κ°œν‚€-κ°œμΈν‚€(== λΉ„λŒ€μΉ­ν‚€) 기반으둜 μ‚¬μš©ν•œλ‹€.

  • λŒ€μΉ­ν‚€ 방식
    λ™μΌν•œ ν‚€λ‘œ μ•”ν˜Έν™”μ™€ λ³΅ν˜Έν™”λ₯Ό μˆ˜ν–‰ν•œλ‹€. λˆ„κ΅¬λ“ μ§€ μ•”ν˜Έν™”μ— 이용된 ν‚€λ₯Ό 가지고 μžˆλ‹€λ©΄ ν•΄λ‹Ή 데이터λ₯Ό λ³΅ν˜Έν™”ν•  수 μžˆλ‹€.
    μ•”, λ³΅ν˜Έν™”κ°€ μ‰½λ‹€λŠ” μž₯점이 μžˆμ§€λ§Œ ν‚€λ₯Ό 전달할 λ•Œ λ³΄μ•ˆ 상 λ¬Έμ œκ°€ μƒκΈ΄λ‹€λŠ” 단점을 κ°–κ³  μžˆλ‹€.

  • κ³΅κ°œν‚€(λΉ„λŒ€μΉ­ν‚€) 방식
    μ„œλ‘œ λ‹€λ₯Έ ν‚€λ‘œ μ•”ν˜Έν™”μ™€ λ³΅ν˜Έν™”λ₯Ό μˆ˜ν–‰ν•œλ‹€. 데이터 μ•”ν˜Έν™” μ‹œ κ³΅κ°œν‚€λ₯Ό μ‚¬μš©ν•˜κ³  λ³΅ν˜Έν™” μ‹œμ—λŠ” κ°œμΈν‚€λ₯Ό μ‚¬μš©ν•œλ‹€. κ³΅κ°œν‚€λ‘œ μ•”ν˜Έν™”ν•œ λ°μ΄ν„°λŠ” 였직 κ°œμΈν‚€λ‘œλ§Œ λ³΅ν˜Έν™”ν•  수 μžˆλ‹€. λ”°λΌμ„œ λˆ„κ΅¬λ‚˜ κ³΅κ°œν‚€λ₯Ό 가지고 μžˆμ–΄λ„ 상관없닀. (β†’ 쀑간에 해컀가 κ³΅κ°œν‚€λ₯Ό κ°€λ‘œμ±„κ°€λ„ 문제 μ—†λ‹€.)
    κ³΅κ°œν‚€ 방식은 λŒ€μΉ­ν‚€μ— λΉ„ν•΄ μ•ˆμ „ν•˜μ§€λ§Œ μ•”ν˜Έν™” μ—°μ‚° μ‹œκ°„μ΄ 더 많이 μ†Œμš”λœλ‹€.

각 방식이 가진 μž₯, 단점 λ•Œλ¬Έμ— SSL은 ν•˜λ‚˜μ˜ λ°©μ‹λ§Œ μ‚¬μš©ν•˜μ§€ μ•Šκ³  두 방식을 적절히 μ„žμ–΄ μ‚¬μš©ν•œλ‹€.

μ°Έκ³  - TLS(전솑 계측 λ³΄μ•ˆ, Transport Layer Security)

TLSλŠ” SSL의 ν–₯μƒλœ, λ”μš± μ•ˆμ „ν•œ 버전이닀.
μ›Ή μ‚¬μ΄νŠΈκ°€ SSL/TLS μΈμ¦μ„œλ‘œ λ³΄ν˜Έλ˜λŠ” 경우 HTTPSκ°€ URL에 ν‘œμ‹œλœλ‹€.

SSL 톡신 κ³Όμ •

SSL은 κ³΅κ°œν‚€ λ°©μ‹μœΌλ‘œ λŒ€μΉ­ν‚€λ₯Ό μ „λ‹¬ν•œλ‹€. 이 λŒ€μΉ­ν‚€λ₯Ό ν™œμš©ν•˜μ—¬ μ•”ν˜Έν™”μ™€ λ³΅ν˜Έν™”λ₯Ό ν•˜κ³ , μ„œλ²„μ™€ λΈŒλΌμš°μ € κ°„ 톡신을 μ§„ν–‰ν•œλ‹€.

접속 μš”μ²­

Aμ—μ„œ B둜 접속 μš”μ²­μ„ 보낸닀.

κ³΅κ°œν‚€ 전달

Bκ°€ Aμ—κ²Œ μžμ‹ μ˜ κ³΅κ°œν‚€λ₯Ό μ „λ‹¬ν•œλ‹€.

μ•”ν˜Έν™”

AλŠ” μžμ‹ μ˜ λŒ€μΉ­ν‚€λ₯Ό Bμ—κ²Œ 받은 κ³΅κ°œν‚€λ‘œ μ•”ν˜Έν™”ν•œλ‹€.

λŒ€μΉ­ν‚€ 전달

그리고 μ•”ν˜Έν™”ν•œ λŒ€μΉ­ν‚€λ₯Ό Bμ—κ²Œ μ „λ‹¬ν•œλ‹€.

λ³΅ν˜Έν™”

BλŠ” Aμ—κ²Œ 받은 λŒ€μΉ­ν‚€λ₯Ό μžμ‹ μ˜ κ°œμΈν‚€λ‘œ λ³΅ν˜Έν™”ν•œλ‹€. 이 λ³΅ν˜Έν™” 결과둜 BλŠ” A의 λŒ€μΉ­ν‚€λ₯Ό μ–»μ–΄λ‚Ό 수 μžˆλ‹€.

톡신

μ΄λ ‡κ²Œ 얻은 λŒ€μΉ­ν‚€λ₯Ό ν™œμš©ν•˜μ—¬ A와 BλŠ” μ•ˆμ „ν•˜κ²Œ 톡신할 수 있게 λœλ‹€.


참고 자료

  1. digicert, β€œSSL, TLS, HTTPSλŠ”λ¬΄μ—‡μΈκ°€μš”?”, https://www.digicert.com/kr/what-is-ssl-tls-and-https

  2. μš°μ•„ν•œTech, β€œ[10λΆ„ ν…Œμ½”ν†‘] 🍭 λ‹€λ‹ˆμ˜ HTTPS”, https://youtu.be/wPdH7lJ8jf0


베이슀볼 ν…ŒμŠ€νŠΈ μ½”λ“œ μž‘μ„± μ—°μŠ΅


객체지ν–₯ 곡뢀


내일 νŒ€μ›λ“€ λ§Œλ‚˜μ„œ λ°œν‘œν•  κ±° 정리!

profile
김뉴비

0개의 λŒ“κΈ€

κ΄€λ ¨ μ±„μš© 정보