2021-04-19-TIL
2021-04-19-TIL
반찬 데이터 요청 구조
메인은 따로 요청
국은 따로 요청
총 세 번 요청
화면의 카테고리마다 API를 따로 부르는 구조다. 카테고리 하나의 목록이 늦게 와도 나머지는 먼저 그릴 수 있고, 응답 하나의 크기도 작아진다. 대신 첫 화면을 그리려면 요청이 세 번 필요하다. 한 번에 모아 보낼지 나눠 보낼지는 화면이 데이터를 어떻게 쓰는지에 따라 정하면 된다.
상세 데이터에서 볼 필드
- top_image가 배열이다. thumb_image
- sPrice, nPrice
받은 원본 데이터는 아래와 같다.
1
2
3
4
5
6
7
8
9
10
11
12
13
"{
""hash"": ""H9881"",
""data"": {
""top_image"": ""https://cdn.bmf.kr/_data/product/H9881/910a01a81c49cb75414edb759237501f.jpg"",
""thumb_images"": [""https://cdn.bmf.kr/_data/product/H9881/910a01a81c49cb75414edb759237501f.jpg"", ""https://cdn.bmf.kr/_data/product/H9881/fbf29077698ca16f8050e43476b47f38.jpg"", ""https://cdn.bmf.kr/_data/product/H9881/c96c6949efc3391148e9b280a2c5ed0b.jpg"", ""https://cdn.bmf.kr/_data/product/H9881/71411e15d2d961df496f87f08648b345.jpg"", ""https://cdn.bmf.kr/_data/product/H9881/437196dacf46b52b11d0bccbc4231558.jpg""],
""product_description"": ""경상도 명물 요리 세 가지를 한 상에!"",
""point"": ""312원"",
""delivery_info"": ""서울 경기 새벽배송 / 전국택배 (제주 및 도서산간 불가) [화 · 수 · 목 · 금 · 토] 수령 가능한 상품입니다."",
""delivery_fee"": ""2,500원 (40,000원 이상 구매 시 무료)"",
""prices"": [""39,000원"", ""31,200원""],
""detail_section"": [""https://cdn.bmf.kr/_data/product/H9881/7fb1ddf1adeadc5410cecd79441f7b65.jpg"", ""https://cdn.bmf.kr/_data/product/H9881/b776c59544b516a184d1363c2c802789.jpg"", ""https://cdn.bmf.kr/_data/product/H9881/cc2b4a61db410096db0e3c497096d63f.jpg"", ""https://cdn.bmf.kr/_data/product/H9881/77970960c8efe0992f9746c37062e1e4.jpg"", ""https://cdn.bmf.kr/_data/product/H9881/aa56cec7d2fe4dde0b124c17a06ffda6.jpg"", ""https://cdn.bmf.kr/_data/product/H9881/c9fbe313767400ce21ea83bb2b9d8e96.jpg"", ""https://cdn.bmf.kr/_data/product/H9881/320939f0d0fbe8e4846e20111f1aa4ce.jpg"", ""https://cdn.bmf.kr/_data/product/H9881/5778ae933121c5d131889ecbf5e2874c.jpg"", ""https://cdn.bmf.kr/_data/product/H9881/785291ed7fe3f2a8c7e06f443dea7553.jpg"", ""https://cdn.bmf.kr/_data/product/H9881/92ef47f6efdd0286f6af7f712c3c838d.jpg"", ""https://cdn.bmf.kr/_data/product/H9881/c0319354245ee2963ccb97d60943e8ff.jpg"", ""https://cdn.bmf.kr/_data/product/H9881/07b1864a06f3b0b26af9a7148ac70cfb.jpg"", ""https://cdn.bmf.kr/_data/product/H9881/ba2aba220a55924a00c668dd13c4cee1.jpg""]
}
}"
따옴표가 두 번씩 들어간 것은 JSON을 CSV 셀 하나에 넣어서 내보냈기 때문으로 보인다. CSV에서는 따옴표로 감싼 필드 안의 따옴표를 따옴표 두 개로 이스케이프한다(RFC 4180 규칙 7). 그래서 실제 JSON으로 쓰려면 바깥 따옴표를 벗기고 ""를 "로 되돌려야 한다.
필드를 보면 top_image는 문자열 하나지만 thumb_images와 detail_section은 이미지 URL 배열이다. prices도 정가와 할인가 두 값을 담은 배열이고, 값이 "39,000원"처럼 단위가 붙은 문자열이다. DB에는 숫자로 저장하고, 응답을 만들 때 형식을 입히는 편이 정렬이나 계산에 유리하다. 배열 필드는 테이블을 따로 둘지 한 컬럼에 넣을지를 조회 방식에 따라 정해야 한다.
DTO 변환 위치
dto 클래스에서 변환해준다
repository에서 직접 Query로 dto를 리턴한다
엔티티를 응답 형태로 바꾸는 방법은 두 가지다.
- 리포지토리는 엔티티(애그리거트)를 돌려주고, DTO의 정적 팩터리 메서드나 생성자에서 변환한다. 엔티티 구조가 그대로 유지되고 변환 로직이 한곳에 모인다.
- 리포지토리 메서드에
@Query를 붙여 필요한 컬럼만 조회한다. Spring Data JDBC의@Query는:name형식의 이름 있는 파라미터만 지원하고,rowMapperClass로 결과를 원하는 타입으로 바꾸는 매퍼를 지정할 수 있다(Spring Data JDBC 문서). 화면에 필요 없는 컬럼을 읽지 않는 대신, 리포지토리가 화면 형태에 묶인다.
목록 화면처럼 일부 필드만 필요하면 2번이, 상세 화면처럼 애그리거트 전체가 필요하면 1번이 자연스럽다.
참고한 자료외부 출처 2
이 글은 저작권자의 CC BY 4.0 라이선스를 따릅니다.
댓글
아직 댓글이 없습니다