포스트

2021-08-23-TIL

2021-08-23-TIL

FCM

  • https://maruzzing.github.io/study/etc/FCM(Firebase-Cloud-Messaging)%EC%9D%B4%EB%9E%80/

FCM(Firebase Cloud Messaging)은 Android, Apple, 웹 앱에 메시지를 보내는 크로스 플랫폼 메시징 서비스다(Firebase 문서). 구조는 세 부분으로 나뉜다.

  • 신뢰할 수 있는 백엔드(앱 서버나 Cloud Functions)가 Firebase Admin SDK나 FCM 서버 프로토콜로 메시지를 만들어 보낸다.
  • FCM 백엔드가 메시지를 받아 대상 기기로 전달한다.
  • 클라이언트 앱은 기기마다 발급되는 등록 토큰(registration token)으로 식별된다. 앱 서버는 이 토큰을 받아 저장해 두었다가 메시지를 보낼 때 쓴다.

메시지는 두 종류다. 알림 메시지(notification message)는 시스템이 사용자에게 바로 표시하고, 데이터 메시지(data message)는 최대 4096바이트의 페이로드를 앱이 직접 처리한다. 대상은 기기 하나, 기기 그룹, 특정 토픽을 구독한 기기들로 지정할 수 있다.

백엔드 입장에서 신경 쓸 부분은 등록 토큰의 관리다. 토큰은 기기와 앱 설치에 묶여 있으므로, 사용자 계정과 토큰을 연결해 저장하고 더 이상 유효하지 않은 토큰은 정리해야 한다.


HTTP

엔터티와 인코딩

  • https://mkki.github.io/http/2018/02/14/http-the-definitive-guide-1-15.html

링크한 글은 “HTTP 완벽 가이드” 15장을 정리한 것이다. 책에서 말하는 엔터티는 HTTP 메시지에 실린 본문과 그것을 설명하는 헤더다. 현재 HTTP 명세는 이를 표현(representation)이라고 부르고, 표현을 설명하는 헤더를 따로 정의한다(RFC 7231 3.1절).

  • Content-Type: 본문의 미디어 타입과 문자 집합(application/json; charset=UTF-8)
  • Content-Encoding: 본문에 적용한 변환(예: gzip)
  • Content-Language: 본문이 대상으로 하는 언어
  • Content-Length: 본문의 바이트 길이

여기서 “인코딩”이라는 말이 두 가지로 쓰인다는 점을 구분해야 한다. charset은 글자를 바이트로 바꾸는 문자 인코딩이고, Content-Encoding은 이미 만들어진 바이트를 압축 같은 방식으로 한 번 더 바꾸는 콘텐츠 코딩이다. 클라이언트는 Accept-Encoding: gzip으로 받을 수 있는 코딩을 알리고, 서버는 그중 하나를 골라 Content-Encoding에 적는다.


Java

Enum 값 가져오기

  • https://www.slipp.net/questions/563
  • https://stackoverflow.com/questions/309333/enum-string-name-from-value

Enum Javadoc 기준으로 기본 제공되는 메서드는 다음과 같다.

  • name(): 선언된 상수 이름을 그대로 돌려준다.
  • valueOf(String): 이름이 상수 선언과 정확히 같아야 하고, 없으면 IllegalArgumentException을 던진다.
  • values(): 컴파일러가 만들어 주는 정적 메서드로 모든 상수를 배열로 돌려준다.
  • ordinal(): 선언 순서(0부터)다. Javadoc은 대부분의 프로그래머는 쓸 일이 없고 EnumSet, EnumMap 같은 자료구조를 위한 것이라고 적는다.

이름이 아닌 별도의 코드 값(예: DB나 외부 API의 "01")으로 상수를 찾으려면 필드와 조회 메서드를 직접 둔다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public enum DeliveryType {
    DAWN("01"), PARCEL("02");

    private final String code;

    DeliveryType(String code) { this.code = code; }

    public static DeliveryType fromCode(String code) {
        return Arrays.stream(values())
                .filter(type -> type.code.equals(code))
                .findFirst()
                .orElseThrow(() -> new IllegalArgumentException("unknown code: " + code));
    }
}

상수가 많고 자주 조회한다면 코드와 상수를 담은 Map을 정적 필드로 미리 만들어 두고 찾는 방법도 있다.

참고한 자료외부 출처 3

외부 출처

이 글은 저작권자의 CC BY 4.0 라이선스를 따릅니다.

댓글

아직 댓글이 없습니다