인스타그램 Carousel_album

2024년 11월 13일 수요일

Today I Learned

날짜

2024년 11월 13일 수요일

내용

진짜 모든 미디어를 저장하기

이번 스프린트에 유저의 태그된 게시글도 불러와야 한다. 이것 자체는 상당히 간단했는데, /tags 엔드포인트로 요청을 보내면 다 가져왔다. 문제는 캐러셀 타입의 포스트들이다.

인스타그램 미디어에는 3가지 종류가 있다. IMAGE, VIDEO, CAROUSEL_ALBUM 이다. 게시글을 올릴 때 뭐가 됐든 하나만 올리면 IMAGE, VIDEO 로 올라가지만 여러 장을 올릴경우 CAROUSEL_ALBUM으로 올라간다. 이떄 데이터에 담긴 media_url 은 가장 처음에 나오는 이미지를 대상으로 한다. 나머지 뒤에 있는 것들은 이 미디어의 children들로 처리된다. 사실 이 말이 엄밀하진 않은게, 이 children에는 자기 자신도 포함된다. 즉 게시글에 사진을 3장 올리면 children 안에 3개의 Child 데이터가 존재하는 셈이다. 즉

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
{
	"data": {
		"id" : 12345,
		"media_type": "CAROUSEL_ALBUM",
		"media_url": "www.22346236.~!@#!#",
		...,
		"children" : {[
			{
				"id": 42734,
				"media_type": "IMAGE",
				"media_url": "www.22346236.~!@#!#",
				...,
			},
			{
				"id": 6363,
				"media_type": "VIDEO",
				"media_url": "~~~",
				...,
			}
		]}
	}
}

이런 형태란 의미이다. 저 밖았의 media_url은 children의 첫번째와 동일하거나, 달라도 들어가보면 똑같다. 하지만 ID는 달랐다. 동료분의 질문으로 확인해보니 정말 달라서 당황했다. 그럼 미디어 데이터의 ID는 저 children 내의 배열에서 주어진 아이디를 저장해야 할까? 그렇다면 댓글을 불러오는 과정에서 문제가 발생한다. 한 게시글 내에 있는 것들은 모두 동일한 댓글을 가진다. 따라서 위에서 내가 작성한 데이터의 댓글을 불러올떄 사용해야할 media의 ID는 12345다.

메타에서는 미디어와 게시글을 전혀 구분하고 있지 않지만 실질적으론 구분되고 있었다. 여기서 알게된 건

  1. 데이터상으론 게시글과 내에 포함된 미디어는 구분된다.
  2. 게시글에 미디어가 단 1개만 있을경우는 게시글 ID와 미디어 ID는 동일하다
    1. 사실, 애초에 children을 제공하지도 않는다.
  3. 미디어의 ID로는 댓글 조회 요청이 안된다. 게시글 ID를 사용해야 한다.

회고

요즘 RESTful API를 공부하면서 느낀건, 데이터를 주고받는 형식도 이해하기 쉽게 약속한대로 짜는게 중요하다는 거다. 그럼 별개의 Docs를 상세히 써야하니까… 메타도 스터디해라.