Optional & Enum & Webhook 에 대하여

단비·2023년 4월 19일
0

학습

목록 보기
9/66

Optional에 대하여

  • Object를 리턴하는데 null일 가능성이 있다면 Optional로 래핑하는 것을 권장
  • 매핑 함수의 적용 결과가 null인 경우 빈 Optional을 반환(메소드를 체이닝했을 때 중간에 null이 있어도 빈 Optional로 계속해서 이어나갈 수 있음)

메소드체이닝이란?
메소드를 줄줄이 엵어서 메소드를 계속해서 사용할 수 있게끔 하는 방법
setter() 메소드에서 void가 아닌 세팅된 객체를 리턴


map과 flatmap

  • A type을 B type으로 바꾼다는 뜻(매핑)
  • Optional의 값이 있는 경우에만 실행

🎇 flatmap과 map의 차이점

  • map: 결과를 Optional로 감싸서 리턴
  • flatmap: 감싸지 않고 반환

orElse와 orElseGet 의 차이점

  • orElse()
    • 내부 객체의 상태와 상관없이 무조건 실행
    • Optional 내부 객체가 not null이라서 orElse가 결과값을 반환하지는 않더라도 실행됨
  • orElseGet()
    • 객체가 null인 경우에만 실행

orElseThrow 란

  • 값이 없다면 에러를 발생시킬 수 있는 메소드
obj.orElseThrow(() -> new Exception("throw exception"));

isPresent 란

  • 값이 있는지 없는지 확인할 수 있는 메소드
findById(4).ifPresent((user) -> System.out.println(user.getName()));

Optional 사용 시 주의할 점

1. Optional 변수에 null 할당 금지

  • 반환 값으로 null을 사용하는 것이 위험하기 때문에 등장한 것이 Optional이므로
    Optional.empty()(내부 값을 null로 초기화한 싱글턴 객체) 메서드를 사용해야 함
  • 빈 Optional 객체에 get() 메서드를 호출한 경우 NoSuchElementException이 발생하기 때문에 orElse 메소드를 사용

2. 원시 타입의 Optional에는 OptionalInt, OptionalLong, OptionalDouble 사용을 고려할 것

  • 원시 타입(primitive type)을 Optional로 사용해야 할 때는 박싱과 언박싱을 거치면서 오버헤드가 생기게 되므로
    Optional의 제네릭 타입에 맞춰야 하는 경우가 아니라면, int, long, double 타입에는 OptionalXXX 타입 사용을 고려하는 것이 좋음
OptionalInt maybeInt = OptionalInt.of(2);
OptionalLong maybeLong = OptionalLong.of(3L);
OptionalDouble maybeDouble = OptionalDouble.empty();

3. 값에 대해 미리 정의된 규칙(제약사항)이 있는 경우에는 filter 사용을 고려할 것

  • 인자로 전달된 predicate이 참인 경우에는 기존의 내부 값을 유지한 Optional이 반환되고, 그렇지 않은 경우에는 비어 있는 Optional을 반환
Optional.ofNullable(username)
   .filter(this::isOverLength)
   .isPresent();

enum이란

  • 한정된 개수의 값들을 하나로 묶어 사용 가능

사용법

  • enum 생성

    • enum 값들 세팅(값들 사이엔 콤마[,]를 이용해 연결하고, 마지막 값엔 세미콜론[;]로 닫기)

    • enum 값의 순서대로 전역 변수 선언

      1. 생성자와 get을 직접 생성해주는 방법

      public enum Num {
      //  enum명(전역변수1, 전역변수2)
          ONE("mon", 10),
          TWO("tue", 20);
      
          private final String name;
          private final int value;
      
          private Num(String name, int value) {
              this.name = name;
              this.value = value;
          }
      
          public String getName() {
              return this.name;
          }
      
          public int getValue() {
              return this.value;
          }
      }

      2. lombok을 이용해 생성해주는 방법

      @Getter
      @AllArgsConstructor
      public enum Num {
          ONE("one", 10),
          TWO("two", 20);
      
          private final String name;
          private final int value;
      }
  • enum 호출

    Num.ONE

enum 메소드

  • values()

    • enum의 모든 값들을 배열로 만들어 리턴해줌

      for (Num num : Num.values()) {
      	System.out.println(Num.getName());
          // one
          // two
      }
      
  • ordinal()

    • enum 중 몇 번째 값인지 숫자 반환
    Num.ONE.ordinal() // 0
  • valueOf(), name()

    • valueOf
      • 문자열을 통해 enum 값을 찾아옴
       Num.valueOf("ONE").getName() // one
    • name
      • enum값의 이름을 찾아옴
       Num.valueOf("ONE").name() // ONE
  • compareTo()

    • 두 enum값을 비교하여 전후로 몇 번째에 위치하는지 반환
    Num.ONE.compareTo(Num.ONE) // 0
    Num.ONE.compareTo(Num.TWO) // -1

@Enumerated 어노테이션의 EnumType

  • ORDINAL

    • enum 순서 값을 DB에 저장
    enum Gender {
        MALE, // 1
        FEMALE; // 2
    }
    
    @Enumerated(EnumType.ORDINAL)
    private Gender gender;
  • STRING

    • enum 이름을 DB에 저장
    enum Gender {
        MALE, // "MALE"
        FEMALE; // "FEMALE"
    }
    
    @Enumerated(EnumType.STRING)
    private Gender gender;

웹훅이란?

  • 웹페이지 or 웹앱에서 발생하는 특정 행동(이벤트)들을 커스텀 Callback으로 변환해주는 방법
  • 행동 정보를 실시간으로 제공하는데 사용됨
  • 서버에서 특정 이벤트가 발생했을 때, 클라이언트를 호출하는 방식으로써 역방향 API라고도 불림
    (일반적인 API(Polling)는 클라이언트가 서버를 호출하는 방식)

Callback URL이란?
서버측에서 클라이언트의 어떤 URL로 데이터를 보낼지 정해놓은 주소

Webhook Endpoint이란?

  • 이벤트의 목적지인 Target
  • 이벤트가 어디로 전달되어야 하는가에 대한 것

💣 주의할 점

  • 웹앱이 중단된 경우, 웹훅으로부터 오는 데이터가 유실될 가능성이 존재함
  • 웹훅으로부터 오는 요청을 처리 완료했지만, response를 제대로 보내지 못했을 경우에 웹훅에서 response가 실패인 것으로 확인하고 동일한 정보를 다시 보낼 가능성

🔊 Slack Webhook 사용법

1. Webhook을 설치할 채널의 설정 -> 앱 추가 선택

2. Incoming WebHooks 설치

3. Webhook URL을 이용하여 JAVA 코드 작성

  • 별도의 메소드를 만들어 이용하는 것이 편리함
// API 호출을 위한 인스턴스 선언
RestTemplate restTemplate = new RestTemplate();
String url = //Webhook URL

// 메시지 정보
Map<String,Object> sendMsg = new HashMap<String,Object>();
sendMsg.put("username", "이름");
sendMsg.put("text", "보낼 내용");

HttpEntity<Map<String,Object>> entity = new HttpEntity<Map<String,Object>>(sendMsg);

restTemplate.exchange(url, HttpMethod.POST, entity, String.class);

HttpEntity란?
헤더와 바디로 이루어진 HTTP request, response 엔티티


RestTemplate 이란?

  • Rest 방식 API를 호출할 수 있는 Spring 내장 클래스

RestTemplate의 메소드

  • exchange
    • 접속할 url, httmlMethod 타입, request entity, responseType


💡 TIP!

1. API 테스트 시 406 Not Acceptable 오류가 발생?

  • 컨트롤러의 반환 타입의 객체에 Getter가 정상적으로 선언되었는지 확인 필요

2. PropertyValueException 예외란?

  • not-null에 null을 넣을 때 발생

3. DataIntegrityViolationException 예외란?

  • 데이터가 잘못 바인딩 됐을 때 발생

데이터 바인딩이란?
두 개의 데이터 소스(또는 동일한 데이터에 대한 두 개의 개별 표현)를 함께 연결하고
동기화 상태를 유지하는 일반적인 기술

  • 단방향 바인딩
    적절한 Event를 통해 데이터 흐름이 단방향으로 이루어지고(부모 -> 자식)
    뷰가 바로 업데이트 되지 않는다.
  • 양방향 바인딩
    데이터 변경에 따라 프레임워크를 통해 양방향으로 이루어지며(부모 <-> 자식)
    뷰가 즉각 업데이트 된다.

4. NoSuchElementException 예외란?

  • 값이 없을 때 발생
  • 중복 데이터가 있는데 하나만 뽑으려고 하는 경우에도 발생

5. 경우에 따라 예외를 강제로 실행 시키기

  • 오류를 통해 강제 예외를 발생 시켜야하는 경우 하기 코드를 참고하여 실행
throw new NullPointerException();
profile
tistory로 이전! https://sweet-rain-kim.tistory.com/

0개의 댓글