본문 바로가기
카테고리 없음

oEmbed 공부하기 - 2 (클래스 해석해보기 Java)

by 고구밍 2022. 6. 27.

공식 사이트

https://oembed.com/

 

oEmbed

oEmbed oEmbed is a format for allowing an embedded representation of a URL on third party sites. The simple API allows a website to display embedded content (such as photos or videos) when a user posts a link to that resource, without having to parse the r

oembed.com

공부 중인 사이트

Java: java-oembed

https://github.com/michael-simons/java-oembed

 

GitHub - michael-simons/java-oembed: Simple oembed implementation for Java based on Apache HttpClient

Simple oembed implementation for Java based on Apache HttpClient - GitHub - michael-simons/java-oembed: Simple oembed implementation for Java based on Apache HttpClient

github.com

 

영어를 한글로 번역 해보자

 

AutodiscoveredOembedEndpoint OembedEndpoint을 상속받는다 (extends : 그대로 사용한다)

이것은 자동 검색된 끝점입니다. 
api url 생성은 지원하지 않지만
 고정 API URL만. 형식도 고정되어 있습니다.
-> 서비스에서 사용된다 (apUrl, format-> json)
AutodiscoveredOembedEndpoint(final URI apiUrl, final Format format) {
  this.apiUrl = apiUrl;
  super.setFormat(format);
}

OembedEndpoint
이것은 이름, URL 체계 등을 포함하는 oembed 끝점을 설명합니다.
 엔드포인트는 
<em>Daily 프라체</em> 주변의 여러 텍스트 문서에 포함될 수 있습니다.


 * 이 클래스는 일반 자바 빈으로 구현되어 별도의
 * Spring {@code @Configuration} 내부에서 많은 번거로움이 있습니다.

—-

1.이 공급자의 이름입니다.
private String name;


2.  기본 URL이 들어감

private String endpoint;


3.이 공급자가 지원하는 형식입니다.
 
private Format format = Format.json;


4.Null 값으로 설정하면 끝점에서 요청해야 하는 최대 너비입니다.
private Integer maxWidth;

5. Null 값으로 설정하면 끝점에서 요청해야 하는 최대 높이입니다.
private Integer maxHeight;

6. 지원되는 URL 구성표 목록입니다.
private List<String> urlSchemes;


7. 이 끝점에 대해 인스턴스화해야 하는 요청 공급자입니다. 기본 생성자가 있어야 합니다.
private Class<? extends RequestProvider> requestProviderClass = DefaultRequestProvider.class;

등등등..

—-------------------
public URI toApiUrl(final String url) {
final List<NameValuePair> query = new ArrayList<>();
선언 후 format을 String 형식의 (JSON)으로 바꾸고, query에 url을 넣어준다.
가로세로 길이도 넣어준다.


URI빌더 반환
try {
  return new URIBuilder(uri).addParameters(query).build();
} catch (URISyntaxException ex) {
  throw new OembedException(ex);
}

DefaultOembedResponseRenderer OembedResponseRenderer을 참조 (implements : 재정의 -> 오버라이딩)

간단한 기본 oembed 응답 렌더러. 
대부분의 전달된 HTML을 사용합니다.


랜더를 재정의한다.
public String render(final OembedResponse response, final Element originalAnchor) {
rv에 

타입의 조건을 구분해서 정보를 넣어 줌

사진 :  
비디오 : 그냥 reponse.getHtml()으로 함
링크 :  링크주소의 형식을 format으로 정해서, url, title을 넣어줌
주소 :  
리치? : 

OembedResponseRenderer 인터페이스입니다.

이 인터페이스의 목적은 {@link OembedResponse}를 사용 가능한 html 코드 덩어리로 바꾸는 것입니다.


{@link OembedResponse} {@code 응답}을 html 문자열로 렌더링합니다.
더 많은 컨텍스트 정보를 제공하기 위해 원본 앵커가 제공됩니다.

  • @param response 처리해야 하는 응답
  • @param originalAnchor oembed 요청을 트리거한 앵커. 이것은 원본 개체의 복제본이므로 변경 사항이 전파되지 않습니다.
  • @return 주어진 표현을 포함하는 html 조각 OembedResponse
DefaultRequestProvider RequestProvider을 참조 (implements : 재정의 -> 오버라이딩)

oembed 공급자의 기본 구현입니다. 
일반 GET 요청을 생성합니다.


public static final Logger LOGGER = LoggerFactory.getLogger(DefaultRequestProvider.class.getPackage().getName());



주어진 URL에 대해 HTTP 요청을 반환해야 합니다.
* @param userAgent 우리의 사용자 에이전트
* @param applicationName 선택적 애플리케이션 이름, 존재하는 경우 userAgent에 추가됨
* @param uri oembed 엔드포인트의 API URL
* @return 준비된 HTTP 요청

@Override
public HttpGet createRequestFor(final String userAgent, final String applicationName, final URI uri) {
  LOGGER.debug("Creating HttpGet for url '{}'", uri.toString());

  final HttpGet request = new HttpGet(uri);
  request.setHeader("User-Agent", String.format("%s%s", userAgent, Optional.ofNullable(applicationName).map(s -> "; " + s).orElse("")));
  return request;
}



RequestProvider 인터페이스입니다.

oembed 공급자는 포함 가능한 URL에 대한 Http 요청을 생성합니다.

OembedException RuntimeException을 상속받습니다. (Extends)

응답 등의 구문 분석으로 인해 발생할 수 있는 확인된 예외를 wrapping하기 위한 예외입니다.


OembedJsonParser OembedParser을 참조받습니다. (implements)

{@link OembedResponse}에 대한 JSON 구문 분석을 제공합니다. 이 클래스는 private을 사용합니다.
 * JAXB 주석 검사기가 올바르게 구성되었는지 확인하기 위한 {@link ObjectMapper}.

setAnnotationIntrospector에 TypeFactory.defaultInstance()을 한다. -> 인스턴스를 반환한다.

역직렬화 : String 문자열(사람이 이해가능  고수준 언어 JSON) -> Object(객체)
@Override
public OembedResponse unmarshal(final InputStream in) {
  try {
     return objectMapper.readValue(in, OembedResponse.class);
  } catch (IOException ex) {
     throw new OembedException(ex);
  }
}

직렬화 : Object(객체) -> String 문자열 (JSON)
@Override
  public void marshal(final OembedResponse oembedResponse, final OutputStream out) {
     try {
        this.objectMapper.writeValue(out, oembedResponse);
     } catch (IOException ex) {
        throw new OembedException(ex);
     }
  }
}

—--
참고
ObjectMapper : JSON 형식을 사용할 때, 응답들을 직렬화하고 요청들을 역직렬화 할 때 사용하는 기술이다.
https://escapefromcoding.tistory.com/341

—---


OembedParser 인터페이스입니다.


이것은 동일한 이름의 인터페이스에서 1:1 사본입니다.

 <a href="https://github.com/michael-simons/java-oembed">
자바 OEM</a>

 * 체크된 예외는 제외.


  • 비정렬화할 입력 스트림의 @param
  •  @return 전체 OembedResponse


OembedResponse unmarshal(InputStream in);


  • @param oembedResponse 스트림에 기록되어야 하는 oembed 응답
  •  @param out 쓸 출력 스트림

void marshal(OembedResponse oembedResponse, OutputStream out);

OembedResponse Serializable을 구현 (implements) - 직렬화


이것은 의 사양에 따른 유효한 OEmbed 응답을 나타냅니다.
 * oembed.com. 고장이 난 경우 확인
 질문의 끝점은 유효한 응답(유형 등)을 반환합니다.



—---
직렬화
  • 생성한 객체를 파일로 저장할 일이 있을 수도 있습니다.
  • 저장한 객체를 읽을 일이 생길 수도 있습니다.
  • 다른 서버에서 생성한 객체를 받을 일도 생길 수 있습니다.
Serializable 인터페이스를 구현하면 JVM에서 해당 객체는 저장하거나 다른 서버로 전송할 수 있도록 해준다.
  • 자바 직렬화란 자바 시스템 내부에서 사용되는 객체 또는 데이터를 외부의 자바 시스템에서도 사용할 수 있도록 바이트(byte) 형태로 데이터 변환하는 기술과 바이트로 변환된 데이터를 다시 객체로 변환하는 기술(역직렬화)을 아울러서 이야기합니다.
  • 시스템적으로 이야기하자면 JVM(Java Virtual Machine 이하 JVM)의 메모리에 상주(힙 또는 스택)되어 있는 객체 데이터를 바이트 형태로 변환하는 기술과 직렬화된 바이트 형태의 데이터를 객체로 변환해서 JVM으로 상주시키는 형태를 같이 이야기합니다.
  • https://devlog-wjdrbs96.tistory.com/268


OembedService

가장 중요해 보임
 
OembedXmlParser
OembedParser를 참조 (implements : 재정의)

{@link OembedResponse}에 대한 XML 구문 분석을 제공합니다.

-새 OembedJsonParser를 만듭니다. JAXB 컨텍스트를 초기화할 수 없는 경우 예외가 발생할 수 있습니다.

OembedXmlParser() {
  try {
     this.jaxbContext = JAXBContext.newInstance(OembedResponse.class);
  } catch (JAXBException ex) {
     // Ignore this... I have no clue how that should happen.
     throw new OembedException(ex);
  }
}


역직렬화 : String 문자열(사람이 이해가능  고수준 언어 JSON) -> Object(객체)
@Override
public OembedResponse unmarshal(final InputStream in) {
  try {
     return (OembedResponse) jaxbContext.createUnmarshaller().unmarshal(in);
  } catch (JAXBException e) {
     throw new OembedException(e);
  }
}


직렬화 : Object(객체)  ->  String 문자열(사람이 이해가능  고수준 언어 JSON)
@Override
public void marshal(final OembedResponse oembedResponse, final OutputStream out) {
  try {
     jaxbContext.createMarshaller().marshal(oembedResponse, out);
  } catch (JAXBException e) {
     throw new OembedException(e);
  }
}