openapi 에서 json과 yaml

osanha의 이미지

기업용 RESTful web service 에서 api용 데이터 바인딩을 json 과 yaml 중에서 생각중입니다.
데이터 사이즈가 작고, 로그에서의 가독성이 좋으며, 파서의 연산량이 작은것을 주안점으로 하고 있구요.
json 은 yaml 의 subset 이라고 할 수 있으므로 json 형식의 데이터도 Yaml 문법을 만족하므로 yaml 파서가 파싱할 수 있긴 하지만..
json 식의 표현말고 일반적인 yaml 식의 표현 문자열로서의 두가지 비교입니다.

1. json

{"key1":"value1","key2":[1,2,3]","key3":{"key3-1":"value3-1","key3-2":"value":[4,5,6]}}

2. yaml

key1: value1
key2: [1,2,3]
key3:
 key3-1: value3-1
 key3-2: [4,5,6]

3. 비교

3.1. 데이터 사이즈

내부 객체의 깊이가 얕다면 yaml이 데이터량이 작다고 볼 수 있을것 같은데요.
반대로 객체의 깊이가 깊을때는 그 만큼 공백이 많이 들어가야 하므로 json이 더 작겠군요.
위의 예에서는 json의 글자수가 89, yaml 의 글자수가 69 이군요.

3.2. 파싱 연산량

이건 뭐..대략 느낌엔 거의 비슷할 것 같은 생각이 듭니다.

3.3. 로깅시 가독성

데이터를 그대로 로깅한다고 봤을때는 단연 Yaml 의 가독성이 높군요.
다만, json 도 json 라이버러리에서 json 객체화된후 포맷팅하여 로깅한다고 봤을땐 json 도 어느정도 가독성이 좋아지겠지만
그래도 key 의 따옴표나 중괄호, 콤마 등이 눈을 어지럽게 하므로 yaml 의 가독성이 좋다고 봐집니다. (아래 예)

{
  "key1": "value1",
  "key2": [1,2,3],
  "key3": {
   "key3-1": "value3-1",
   "key3-2": [4,5,6]
  }
}

그리고 실제 REST 서비스 서버에서는 JSON 문법에 어긋나서 객체화가 되지 않는 데이터도 로깅을 해놓아야 에러 분석시 무슨 값이 보내졌는지 검토가 되기 때문에..받은 데이터를 일단 로깅을 하게 되는데 그런 관점에서는 역시 가독성이 떨어진다고 볼 수 있겠군요.

4. 결론?

제가 생각기엔 일반적인 RESTful 웹서비스에서의 api 에 전달되는 데이터 타입의 구조가 그리 복잡지 않고,
깊이가 2,3 정도 일지라도 모든 key에 두개씩의 따옴표가 들어가는 json 의 데이터량 역시 만만치 않으며,
또한 로깅시의 이점등을 고려해볼때 yaml 이 좀 더 적격이지 않나 생각됩니다.

여러분의 생각은 어떠신지?

serialx의 이미지

저정도면 그냥 둘 다 지원하면 되지 않나요?

Python 같은거는 그냥 라이브러리 두개 쓰고 핵심 코드는 간결하게 재사용할 수 있을텐데요..

그리고 cost 자체는 scalable 한 architecture로 해결할 생각을 하는게 나을것 같네요.. ㅎ

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.