+) 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
λ₯Ό μ¬μ©νλ©΄ λλ€.
β¬οΈ ExceptionResolver μ μ© μ
β¬οΈ ExceptionResolver μ μ© ν
HandlerExceptionResolver μΈν°νμ΄μ€
public interface HandlerExceptionResolver {
ModelAndView resolveException(
HttpServletRequest request, HttpServletResponse response,
Object handler, Exception ex);
}
ExceptionResolver
κ° ModelAndView
λ₯Ό λ°ννλ μ΄μ λ λ§μΉ try-catchλ₯Ό νλ―μ΄, Exceptionμ μ²λ¦¬ν΄μ μ μ νλ¦μ²λΌ λ³κ²½νλ κ²μ΄ λͺ©μ μ΄κΈ° λλ¬Έμ΄λ€.
ExceptionResolver νμ©
μμΈ μν μ½λ λ³ν
μμΈλ₯Ό response.sendError(xxx)
νΈμΆλ‘ λ³κ²½νμ¬ μλΈλ¦Ώμμ μν μ½λμ λ°λ₯Έ μ€λ₯λ₯Ό μ²λ¦¬νλλ‘ μμνλ€.
μ΄ν WASλ μλΈλ¦Ώ μ€λ₯ νμ΄μ§λ₯Ό μ°Ύμμ νΈμΆνλ€.
λ·° ν
νλ¦Ώ μ²λ¦¬
ModelAndView
μ κ°μ μ±μμ μμΈμ λ°λ₯Έ μ€λ₯ νλ©΄μ λ·° λ λλ§νμ¬ κ³ κ°μκ² μ 곡νλ€.
API μλ΅ μ²λ¦¬
HTTP μλ΅ λ°λμ μ§μ λ°μ΄ν°λ₯Ό λ£λ κ²λ κ°λ₯νλ€. μ¬κΈ°μ JSONμΌλ‘ μλ΅νλ©΄ API μλ΅μ μ²λ¦¬ν μ μλ€.
μ 리
ExceptionResolver
λ₯Ό μ¬μ©νλ©΄ 컨νΈλ‘€λ¬μμ μμΈκ° λ°μν΄λ ExceptionResolver
μμ μμΈλ₯Ό μ²λ¦¬ν΄ λ²λ¦°λ€. λ°λΌμ μμΈκ° λ°μνλλΌλ μλΈλ¦Ώ 컨ν
μ΄λκΉμ§ μ λ¬λμ§ μκ³ , μ€νλ§ MVCμμ λλλ€.
μ¦, κ²°κ³Όμ μΌλ‘ WAS μ
μ₯μμλ μ μ μ²λ¦¬κ° λ κ²μ΄λ€.
ExceptionHandlerExceptionResolver
@ExceptionHandler
λ₯Ό μ²λ¦¬νλ€. API μμΈ μ²λ¦¬λ λλΆλΆ μ΄ κΈ°λ₯μΌλ‘ ν΄κ²°νλ€.
ResponseStatusExceptionResolver
HTTP μν μ½λλ₯Ό μ§μ νλ€.
μ: @ResponseStatus(value = HttpStatus.NOT_FOUND)
DefaultHandlerExceptionResolver
μ€νλ§ λ΄λΆμμ λ°μνλ μμΈλ₯Ό μ²λ¦¬νλ€.
@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 μλ΅ μ½λλ₯Ό νλ‘κ·Έλλ°ν΄μ λμ μΌλ‘ λ³κ²½ν μ μλ€.
@ExceptionHandler
λ μ μ μ½λμ μμΈ μ²λ¦¬ μ½λκ° νλμ 컨νΈλ‘€λ¬μ μμ¬μλ€.
@ControllerAdvice
λλ @RestControllerAdvice
λ₯Ό μ¬μ©νλ©΄ λμ λΆλ¦¬ν μ μλ€.
@ControllerAdvice
λ λμμΌλ‘ μ§μ ν μ¬λ¬ 컨νΈλ‘€λ¬μ @ExceptionHandler
, @InitBinder
κΈ°λ₯μ λΆμ¬ν΄ μ£Όλ μν μ νλ€.
@ControllerAdvice
μ λμμ μ§μ νμ§ μμΌλ©΄ λͺ¨λ 컨νΈλ‘€λ¬μ μ μ©λλ€.
@RestControllerAdvice
λ @ControllerAdvice
μ κ°κ³ , @ResponseBody
κ° μΆκ°λμ΄ μλ€.
+) 22. 09. 03. μΆκ°!!
μλ‘ λ€λ₯Έ μμ€ν
λ€ μ¬μ΄μμ ν΅μ μ μ£Όκ³ λ°κ² νλ κ°μ₯ κΈ°λ³Έμ μΈ νλ‘ν μ½μ΄λ€.
λ°μ΄ν°λ₯Ό μλ² β λΈλΌμ°μ λ‘ μ μ‘νλ μ©λλ‘ κ°μ₯ λ§μ΄ μ¬μ©νλ€.
HTTPλ μλ²μμ λΈλΌμ°μ λ‘ μ μ‘νλ μ λ³΄κ° μνΈνλμ§ μλλ€λ λ¬Έμ μ μ΄ μλ€.
HTTPSλ HTTPμ SSL(보μ μμΌ κ³μΈ΅)μ μ μ©ν νλ‘ν μ½μ΄λ€.
SSLμ μλ²μ λΈλΌμ°μ μ¬μ΄μ μμ νκ² μνΈνλ μ°κ²°μ λ§λ€ μ μκ² λμμ£Όκ³ , μλ²μ λΈλΌμ°μ κ° λ―Όκ°ν μ 보λ₯Ό μ£Όκ³ λ°μ λ ν΄λΉ μ λ³΄κ° λλ λΉνλ κ²μ λ§μμ€λ€. (HTTP Message Bodyλ₯Ό μνΈννλ€.)
μ HTTPSλ₯Ό μ¬μ©ν΄μΌ ν κΉ?
http://velog.io/@newbiekim
httpλ‘ λ°μ΄ν°λ₯Ό μ μ‘ν κ²½μ°, λ€νΈμν¬λ‘ μλ³Έ λ°μ΄ν°κ° μ λ¬λλ€. λ°λΌμ ν΄μ»€κ° μ€κ°μ λ°μ΄ν°λ₯Ό κ°λ‘μ± λ€μ, ν΄λΉ λ°μ΄ν°λ₯Ό 보면 μ΄λ€ λ΄μ©μ΄ λ€μ΄μλμ§ λ°λ‘ μ μ μλ€.
https://velog.io/@newbiekim
HTTPμ λ¬λ¦¬ HTTPSλ‘ μ μ‘ν κ²½μ° λ°μ΄ν°λ₯Ό μνΈννμ¬ μ μ‘νλ€. κ·Έλμ ν΄μ»€κ° μ€κ°μ λ°μ΄ν°λ₯Ό κ°λ‘μ±λλΌλ λ°μ΄ν°κ° μνΈνλμ΄ μκΈ° λλ¬Έμ μ΄λ€ λ΄μ©μΈμ§ μκΈ° μ΄λ ΅λ€.
Netscape Communications Corporationμμ μΉ μλ²μ μΉ λΈλΌμ°μ κ°μ 보μμ μν΄ λ§λ νλ‘ν μ½μ΄λ€.
λμΉν€, 곡κ°ν€-κ°μΈν€(== λΉλμΉν€) κΈ°λ°μΌλ‘ μ¬μ©νλ€.
λμΉν€ λ°©μ
λμΌν ν€λ‘ μνΈνμ 볡νΈνλ₯Ό μννλ€. λꡬλ μ§ μνΈνμ μ΄μ©λ ν€λ₯Ό κ°μ§κ³ μλ€λ©΄ ν΄λΉ λ°μ΄ν°λ₯Ό 볡νΈνν μ μλ€.
μ, 볡νΈνκ° μ½λ€λ μ₯μ μ΄ μμ§λ§ ν€λ₯Ό μ λ¬ν λ 보μ μ λ¬Έμ κ° μκΈ΄λ€λ λ¨μ μ κ°κ³ μλ€.
곡κ°ν€(λΉλμΉν€) λ°©μ
μλ‘ λ€λ₯Έ ν€λ‘ μνΈνμ 볡νΈνλ₯Ό μννλ€. λ°μ΄ν° μνΈν μ 곡κ°ν€λ₯Ό μ¬μ©νκ³ λ³΅νΈν μμλ κ°μΈν€λ₯Ό μ¬μ©νλ€. 곡κ°ν€λ‘ μνΈνν λ°μ΄ν°λ μ€μ§ κ°μΈν€λ‘λ§ λ³΅νΈνν μ μλ€. λ°λΌμ λꡬλ 곡κ°ν€λ₯Ό κ°μ§κ³ μμ΄λ μκ΄μλ€. (β μ€κ°μ ν΄μ»€κ° 곡κ°ν€λ₯Ό κ°λ‘μ±κ°λ λ¬Έμ μλ€.)
곡κ°ν€ λ°©μμ λμΉν€μ λΉν΄ μμ νμ§λ§ μνΈν μ°μ° μκ°μ΄ λ λ§μ΄ μμλλ€.
κ° λ°©μμ΄ κ°μ§ μ₯, λ¨μ λλ¬Έμ SSLμ νλμ λ°©μλ§ μ¬μ©νμ§ μκ³ λ λ°©μμ μ μ ν μμ΄ μ¬μ©νλ€.
μ°Έκ³ - TLS(μ μ‘ κ³μΈ΅ 보μ, Transport Layer Security)
TLSλ SSLμ ν₯μλ, λμ± μμ ν λ²μ μ΄λ€.
μΉ μ¬μ΄νΈκ° SSL/TLS μΈμ¦μλ‘ λ³΄νΈλλ κ²½μ° HTTPSκ° URLμ νμλλ€.
SSLμ 곡κ°ν€ λ°©μμΌλ‘ λμΉν€λ₯Ό μ λ¬νλ€. μ΄ λμΉν€λ₯Ό νμ©νμ¬ μνΈνμ 볡νΈνλ₯Ό νκ³ , μλ²μ λΈλΌμ°μ κ° ν΅μ μ μ§ννλ€.
Aμμ Bλ‘ μ μ μμ²μ 보λΈλ€.
Bκ° Aμκ² μμ μ 곡κ°ν€λ₯Ό μ λ¬νλ€.
Aλ μμ μ λμΉν€λ₯Ό Bμκ² λ°μ 곡κ°ν€λ‘ μνΈννλ€.
κ·Έλ¦¬κ³ μνΈνν λμΉν€λ₯Ό Bμκ² μ λ¬νλ€.
Bλ Aμκ² λ°μ λμΉν€λ₯Ό μμ μ κ°μΈν€λ‘ 볡νΈννλ€. μ΄ λ³΅νΈν κ²°κ³Όλ‘ Bλ Aμ λμΉν€λ₯Ό μ»μ΄λΌ μ μλ€.
μ΄λ κ² μ»μ λμΉν€λ₯Ό νμ©νμ¬ Aμ Bλ μμ νκ² ν΅μ ν μ μκ² λλ€.
μ°Έκ³ μλ£
digicert, βSSL, TLS, HTTPSλ무μμΈκ°μ?β, https://www.digicert.com/kr/what-is-ssl-tls-and-https
μ°μνTech, β[10λΆ ν μ½ν‘] π λ€λμ HTTPSβ, https://youtu.be/wPdH7lJ8jf0