[SpringFramework] Error Handling for REST with Spring

Spring 3.2 이전에는 Spring MVC 애플리케이션에서 예외를 처리하는 두 가지 주요 접근법이 HandlerExceptionResolver 또는 @ExceptionHandler 어노테이션이었다. 이 두 가지 모두 단점이 있다.

3.2 이후로 우리는  이전 두 가지 솔루션의 한계를 해결하고 전체 애플리케이션에서 통일 된 예외 처리를 촉진하기 위해 @ControllerAdvice Annotation을 사용할 수 있다.

 

1. @ExceptionHandler

Controller Level에서만 동작.

전역범위에서 동작하지 않음.

 

2. HandlerExceptionResolver

ExceptionHandlerExceptionResolver

DefaultHandlerExceptionResolver

ResponseStatusExceptionResolver

SimpleMappingExceptionResolver 와 AnnotationMethodHandlerExceptionResolver

커스텀 HandlerExceptionResolver

API에서 균일 한 예외 처리 메커니즘 을 구현

 

3. ControllerAdvice

Spring 3.2는 @ControllerAdvice 어노테이션 으로 전역 @ExceptionHandler 를  지원한다 . 이렇게하면 이전 MVC 모델 에서 벗어나 @ExceptionHandler 의 유형 안전성 및 유연성과 함께 ResponseEntity 를 사용하는 메커니즘을 사용할 수 있습니다 .

  • 상태 코드뿐만 아니라 응답 본문에 대한 완벽한 제어
  • 같은 메소드에 여러 예외를 매핑하여 함께 처리 할 수 ​​있습니다.
  • 새로운 RESTful ResposeEntity 응답 을 잘 활용합니다.
@ControllerAdvice
public class RestResponseEntityExceptionHandler
  extends ResponseEntityExceptionHandler {
    @ExceptionHandler(value
      = { IllegalArgumentException.class, IllegalStateException.class })
    protected ResponseEntity<Object> handleConflict(
      RuntimeException ex, WebRequest request) {
        String bodyOfResponse = "This should be application specific";
        return handleExceptionInternal(ex, bodyOfResponse,
          new HttpHeaders(), HttpStatus.CONFLICT, request);
    }
}

 

4. ResponseStatusException(Spring5 이상)

Spring 5에서는 ResponseStatusException 클래스를 도입했습니다 . HttpStatus를 제공 하고 선택적으로 이유   와 원인을 제공하는 인스턴스를 만들 수 있습니다 .

@GetMapping(value = "/{id}")
public Foo findById(@PathVariable("id") Long id, HttpServletResponse response) {
    try {
        Foo resourceById = RestPreconditions.checkFound(service.findOne(id));
        eventPublisher.publishEvent(new SingleResourceRetrievedEvent(this, response));
        return resourceById;
     }
    catch (MyResourceNotFoundException exc) {
         throw new ResponseStatusException(
           HttpStatus.NOT_FOUND, "Foo Not Found", exc);
    }
}

[Infra] Scale-up, scale-out

서버 확장을 위한 두 가지 방법: 스케일 아웃과 스케일 업

서버를 운영하다 보면, 갑작스런 이용자의 증가, 사업 확장 등의 이유로 더 많은 서버 용량과 성능이 필요하게 됩니다. 이럴 때에는 ‘스케일 아웃’과 ‘스케일 업’, 두 가지 방법으로 시스템을 확장시킬 수 있습니다.

hosting 160324-002

1) 스케일 아웃
‘스케일 아웃’이란 서버를 여러 대 추가하여 시스템을 확장하는 방법입니다. 예를 들어, ‘1’의 처리 능력을 가진 서버에 동일한 서버 4대를 더 추가하여, 총 ‘5’의 처리 능력을 만드는 것입니다. 서버가 여러 대가 되기 때문에 각 서버에 걸리는 부하를 균등하게 해주는 ‘로드밸런싱’이 필수적으로 동반되어야 합니다. 스케일 아웃의 경우, 서버 한 대가 장애로 다운되더라도 다른 서버로 서비스 제공이 가능하다는 장점이 있습니다. 반면 모든 서버가 동일한 데이터를 가지고 있어야 하므로, 데이터 변화가 적은 ‘웹 서버’에 적합한 방식입니다.

2) 스케일 업
‘스케일 업’은 서버에 CPU나 RAM 등을 추가하거나 고성능의 부품, 서버로 교환하는 방법을 의미합니다. 예를 들어, ‘1’의 처리 능력을 가진 서버 한 대를 ‘5’의 처리 능력을 가진 서버로 업그레이드시키는 것입니다. CPU나 RAM을 추가하기로 했다면 현재 서버에 추가 부품을 장착할 수 있는 여유 슬롯이 있어야 하며, 그렇지 않은 경우 서버 자체를 고성능으로 교체하는 것이 필요합니다. 스케일 업의 경우, 서버 한 대에 모든 부하가 집중되므로 장애 시 영향을 크게 받을 수 있는 위험성이 있습니다. 한 대의 서버에서 모든 데이터를 처리하므로 데이터 갱신이 빈번하게 일어나는 ‘데이터베이스 서버’에 적합한 방식입니다.

 

 

출처 : http://library.gabia.com/contents/infrahosting/1222

[인공지능] 딥러닝

모두의 딥러닝
1. 머신러닝 Flow
– 데이터 => 일반프로그래밍 => 답
– 데이터,답 => 머신러닝 => 규칙
2. Numpy : 수치 계산을 위해 만들어진 라이브러리
* 머신러닝에서 알고리즘이나 좋은 컴퓨터 환경만큼 중요한 것이 바로 제대로 된 데이터를 준비하는 일이다.
* 딥러닝을 구동시키려면 ‘속성’만을 뽑아 데이터셋을 만들고, ‘클래스’를 담는 데이터셋을 또 따로 만들어줘야 한다.
3. 주요라이브러리
Keras, TensorFlow
*딥러닝 프로젝트를 여행으로 비유해본다면 텐서플로는 목적지까지 빠르게 이동시켜주는 ‘비행기’에 해당하고 Keras는 비행기의 이륙 및 정확한 지점까지의 도착을 책임지는 ‘파일럿’에 비유할 수 있다.

 

(1) Keras 함수

  • Sequential 함수는 딥러닝의 구조를 한층 한층 쉽게 쌓아올릴 수 있게 해준다. 함수를 선언하고 나서 model.add() 함수를 사용해 필요한 층을 차례로 추가하면 된다.

 

 

4. 딥러닝의 동작원리

(1)선형회귀 : 가장 훌륭한 예측선 긋기란 통계학 용어인 ‘선형회귀’를 쉽게 풀어 쓴 것. 머신러닝은 제대로 된 선을 긋는 작업부터 시작된다.

“학생들의 중간고사 성적이 []에 따라 다르다.”

여기서 []에 들어갈 내용을 ‘정보’라고 한다. 머신러닝과 딥러닝은 이 정보가 필요하다.

x값이 변함에 따라 y값도 변한다. x를 독립변수. 이 독립변수에 따라 종속적으로 변하는 y를 종속변수라 한다.  ‘선형회귀’란 독립변수 x를 사용해 종속변수 y의 움직임을 예측하고 설명하는 작업을 말한다.

  • 단순선형회귀 : x 하나
  • 다중선형회귀 : x1, x2, x3 …

 

정보1개일때, y=ax+b

정보2개일떄, y=a(1)x+a(2)+b

– 평균제곱오차 =  (실제값-예측값) 제곱의 합 / n

위 식은 앞으로 머신러닝,딥러닝을 공부할때 자주 등장하는 중요한 식이다.

 

**선형회귀란 임의의 직선을 그어 이에 대한 평균 제곱근 오차를 구하고, 이 값을 가장 작게 만들어 주는 a와 b값을 찾아가는 작업이다.

 

(2) 로지스틱 회귀(참,거짓 판단)

– 선형회귀와 마찬가지로 적절한 선을 그려가는 과정. 다만,직선이 아니라 참(1)과 거짓(0)사이를 구분하는 S형태의 선을 그어주는 작업.

-시그모이드 함수(sigmoid function) : 위와 같이 S자 형태로 그래프가 그려지는 함수.

y = 1 + e(지승ax+b) / 1

 

 

(3) 퍼셉트론 : 입력값들에 대해 가중치를 곱하고 바이어스를 더한뒤 활성함수를 통과시킨 결과를 출력하는 구조, 인공신경망을 구성하는 가장 기본단위

y = a(1)x + a(2)x + b