6장 컬렉션패턴

6장 컬렉션 패턴 Collection+JSON은 여러 도메인에 걸쳐 반복해서 나타나는 패턴(컬렉션)을 다루기 위해 만들어졌다. 컬렉션은 무엇인가? 다른 리소스들의 링크를 걸어 나열하는 리소스다. 다른 리소스들을 한 그룹으로 묶는게 존재 목적이다. 아이템에 연결하는 컬렉션 아이템(item), 엔트리(entry), 멤버(member) : 컬렉션에 포함된 개별 리소르를 부르는 동의어 아이템이라해서 그 리소스 자체가 아니다. 친구 전화번호부의 콜렉션은 내가 아니다. Collection+JSON href: 컬렉션 자체의 영속적인 링크 items: 컬렉션 멤버를 가리키는 링크와 그것들의 부분 표현 links: 컬렉션에 관계된 다른 리소스를 연결한다. queries: 컬렉션 검색을 위한 하이퍼미디어 컨트롤 template: 컬렉션에 새 항목을 추가하기 위한 하이퍼미디어 컨트롤 아이템 표현하기 각 멤버는 JSON 객체로 표현된다. href 속성 : 해당 아이템을 독립 리소스로 나타내는 영속적인 링크 links:: 그 아이템에 연관된 다린 리소스의 하이퍼미디어 링크 data: 해당 아이템의 표현의 중요한 부분을 나타내는 기타 정보 아이템의 영속적인 링크 href 속성의 URL에 GET 요청을 보내면 서버는 한 아이템에 대한 Collection+JSON 표현을 보낸다. 아이템의 데이터 아이템의 data 슬롯에 JSON 객체 배열로 들어간다. name과 value 프로퍼티가 각각 단일 키-값 묶음을 나타낸다. 선택사항인 prompt는 사람이 이해할 수 있는 설명이다. 아이템의 링크 특정 아이템 하나를 참조하고 싶을 때 클라이언트가 사용할 특별할 URL이다. links라는 목록이 포함될 경우, 여기에 관련된 리소스를 연결하는 하이퍼미디어 링크 여러 개가 포함된다. 쓰기 템플릿 새 아이템을 컬렉션에 추가하려면 쓰기 템플릿에 적혀있는 형식으로, 컬렉션의 href로 POST 요청을 보내면 된다. 쓰기 템플릿은 개념적으로 HTML 폼과 동일하다. 동일한 입력을 하면 똑같은 요청을 보낸다는 의미다. 폼으로 보내면 application/x-www-form-urlencoded, 쓰기 템플릿으로 보내면 application/vnd,collection+json 일 뿐이다. 검색 템플릿 queries 슬롯에 저장된다. (일반) 컬렉션은 어떻게 동작하는가? GET 표현을 제공한다. 표현의 미디어 유형은 그 리소스로 무엇을 할 수 있는지 말해준다. application/vnd,collection+json : Collection+JSON 표준의 규칙 적용 application/atom+xml: AtomPub 규칙이 적용 applcation/json: 맘대로 하겠다. POST로 추가하기(POST-to-Append) 새 리소스를 생성 PUT과 PATCH 몇 개의 요소를 한 번에 수정하거나 개별 요소를 제거하는 데 사용 DELETE 무언가를 삭제하기 위해 존재 페이지 나눔 링크가 많을 경우 나눠서 제공한다. <link rel=”next” href=”/collection/4iz6”/> : 다음 next, previous, first, last, prev 등이 제공될 수 있다. 검색 폼 AtomPub(Atom Publishing Protocol) Collection+JSON의 item은 어떤것이든 나타날 수 있다. 반면 AtomPub은 뉴스 기사를 게시할 목적으로 설계되었다. 또한 뉴스 기사에 필요한 필드들이 존재한다. XML을 처리하는 방식때문에 도태됨 사람들은 자신이 필요로 하는 표준이 아니라면 해당 표준을 배우려 하지 않는다. 의미 체계의 문제: 잘 대응하고 있는가? 우리는 ‘컴퓨터가 어떤 링크를 클릭하도록 결정하게 하려면 어떻게 프로그래밍을 해야 할까?’에 대해 생각 중 컬렉션 패턴은 두 가지 다른 종류의 리소스를 인식한다 ⇒ 아이템 유형 리소스 : GET, PUT, DELETE에 응답 컬렉션 유형 리소스 : GET, POST에 응답 컬렉션과 아이템의 차이점 : 의미체계에서 나온다. 컬렉션 패턴에서 어떤 행동을 하기 위해 무엇이 필요한지는 알 수 있다. 하지만 필요한 필드의 의미를 알기 위해선 여전히 설명이 필요하다.

2024년 10월 23일 · 2 분 · 배준수

페이스북 테스트앱으로 댓글 수집

Today I Learned 날짜 2024년 10월 23일 수요일 내용 테스트용 페이스북 앱 페이스북 앱은 참 갈대같다. 로그인과 관련된 설정을 바꾸더라도 안바뀔 떄도 있고 바로 바뀔 떄도 있다. 콜백 URL을 여러개로 설정해도 괜찮을 것처럼 UI가 되어있긴 한데, 어떻게 될지 모르겠다. 실서버에서도 사용하는거라 괜히 잘못 건드렸다가 요즘 아주 신나신 서비스께 누가 될까봐 건드리지를 못하겠다. 이번에 네이버 스마트스토어 쪽 서비스를 추가하면서 QA를 진행할 차례다. 지금 설정대로라면 인스타그램 로그인 부분은 실서버에 가서야 QA를 할 수 있는데.. 실서버 올라간다고 바로 솔루션이 개시되는게 아니라(심사 필요) 상관은 없다만.. 그래도 철저한 QA를 위해, 앞으로 개발의 편의성을 위해 테스트용 페북 앱을 만들어야 한다. 기존에도 시도했었으나 왠지 모르게 댓글만 안불러와진다. 게시글은 되는데 댓글만.. ...

2024년 10월 23일 · 1 분 · 배준수

알림톡 머갈톡

Today I Learned 날짜 2024년 10월 22일 화요일 내용 알림톡 배너 이미지를 모두 생성한 사람에게 알림톡을 보내줘야 한다. 처음 만들어 보는거긴 한데.. 나름 API 문서도 잘되어있고 테스트용 서버도 만들어놓은 서비스라, 생각보다는 쉽게 만들었다. 1 코드 비공개 로컬에서 잘 되길래, 테스트서버에 올리고 실제 알림톡을 보내봤는데 안보내진다. 뭔가 파라미터가 잘못됐다는데.. 정말 2시간동안 눈이 빠져라 찾아봐도 잘못된 부분이 없었다. 혹시나 싶어 발송메서드의 key 부분을 다시 API 문서에 있는 텍스트로 복사 붙여넣기 해봤다. 하는 과정에서 다시한번 봤으나, 다른 글자는 없었다. 그런데 갑자기 작동한다. 뭐가 잘못되었는지 여전히 모르고, 왜 작동하는지 여전히 모르겠다. ...

2024년 10월 22일 · 1 분 · 배준수

Selenium에게 패배한 개발자 : PIL

Today I Learned 날짜 2024년 10월 21일 월요일 내용 Selenium은 말을 듣지 않는다. 인스타그램 댓글을 가져와 이미지를 생성하고 있다. 과정은 Jinja2로 HTML 생성 ⇒ Selenium으로 HTML을 렌더링해 높이 파악 ⇒ HTML2Image로 높이를 정한 이미지 생성 이다. 근데, HTML 하단의 여백이 배경이 없이 나타난다. 그라데이션 모델은 배경이 CSS가 아니라 이미지인데, 하단 84px 정도는 이 배경이미지를 불러오지 못해서 하얗게 나타난다. 이걸 해결하기 위해 온갖 시도를 다해봤으나 실패했다… 오전에 우스갯소리로 “이걸 생성해서 흰색 만큼 자르는건 개발자로서 수치스러운 겁니다”라고 했었는데.. ...

2024년 10월 21일 · 2 분 · 배준수

서버가 HTML의 길이를 파악하는 법

Today I Learned 날짜 2024년 10월 18일 금요일 내용 HTML에서 전체 길이를 파악하는 법 인스타그램에서 가져온 댓글 10개를 이미지로 만들어야 한다. html2image는 생성할 때 사이즈를 표시할 수 있는데, 어떤 값을 넣어야 할지 불명확했다. 댓글의 작성 길이에 따라 어찌 될지 모르니… GPT께서, selenium을 이용하라고 하신다. 기본적인 원리는 selenium으로 서버에서 크롬창을 띄운다. 거기에 내가 이미지로 만드려는 HTML 파일을 올린다. 그 창의 길이를 측정한다. 이미지로 만들 때 그 값을 높이로 제공하면 딱 알맞은 이미지가 생성된다. 다. 코드가 참 더러운데 어떻게 작동은 된다…? ...

2024년 10월 18일 · 2 분 · 배준수

안전한 S3 링크 : presigned_url

Today I Learned 날짜 2024년 10월 17일 목요일 내용 path parameter VS query parameter 네이버 커머스 API를 보면서 열심히 개발중이다. 상품 상세페에지에 이미지를 추가해야 하는데 PUT이라 덮어 씌워지는 형태다. 따라서 우선 데이터를 조회하고, 거기서 상세정보 페이지 데이터만 변경한 후 다시 보내줘야 한다. 분명 “https://naver-api/commerce/v1/origin-product/{ProductOriginNo}” 로 보내면 된다고 하는데, 자꾸 없는 리소스라고 한다. 네이버 문서에 의하면, 없는 주소로 요청을 보냈다는 의미다. 분명 맞는데… 그러다 발견했다. 저 상품 넘버를 “path parameter”로 보내라고 쓰여있었다. 실제로 위에 써져 있는 형태는 path parameter다. ...

2024년 10월 17일 · 2 분 · 배준수

댓글 점수 매기기

Today I Learned 날짜 2024년 10월 16일 수요일 내용 댓글 점수화 기준에 적합한 댓글 중 상위 10개를 추려 이미지화해야 한다. 기존에 AI를 파인튜닝할 때, 적합한지 아닌지만 판단하도록 했었는데, 부적절하다는 생각이 들었다. 왜냐하면 적합한 것이 10개 이상일 경우, 어떻게 더 좋은 댓글을 가려낼 것인가? 댓글이 부족하다면, 기준에 미치지 못하는 문의성 댓글이나 부정적 댓글도 걸러낼 수 있는가? 한 번 판단한 댓글을 또 다시 판단할 필요가 있는가? 라는 생각이 들었다. 그래서 댓글 테이블에 점수 필드를 만들어놓고 비워뒀다. 처음 판단 때 점수를 적어서 기록해놓고, 이 값이 있는 댓글은 굳이 AI에게 묻지 않아서 비용을 아꼈다. 점수는 0~10 점 사이로 설정했는데 0점은 아예 부적합한 댓글이다. 댓글을 선정할 때 점수가 높은 순으로 뽑았고 아무리 부족해도 0점은 뽑지 않았다. 만족 ...

2024년 10월 16일 · 1 분 · 배준수

HTML을 이미지 파일로 변경하기

Today I Learned 날짜 2024년 10월 11일 금요일 내용 HTML2image 네이버 스마트스토어 상품 상세페이지에 이미지를 추가해야 한다. 이미지는 AI로 선정한 댓글들이 들어간 위젯이다. Jinja2로 동적으로 데이터를 넣고 나서, HTML로 저장하고 그 파일을 이미지로 변환하려고 했다. 1 2 3 4 5 6 7 8 9 def _image_test(db: Session): 코드 비공개 return hti.screenshot( html_file="a.html", css_file="b.css", save_as="test.png", ) 일단 테스트로 만들어 놓긴 했는데.. 위는 Jinja2 로 렌더링 하는 코드고 아래 hti가 html2image 인스턴스다. html string도 넣을 수 있고, 파일도 넣을 수 있다. ...

2024년 10월 11일 · 1 분 · 배준수

uselist, passive_delete, cascade

Today I Learned 날짜 2024년 10월 10일 목요일 내용 데이터베이스 설정의 의미 데이터베이스에서 고민이 생겼다. 오른쪽에 있는 네이버 관련된 부분을 작성해야 했는데, 다음과 같은 조건을 만족해야했다. 네이버 스토어는 여러개의 네이버 이미지 배너를 가질 수 있다. 네이버 이미지 배너는 하나의 네이버 상품과 관련될 수 있다. 네이버 이미지 배너는 다수의 인스타그램 게시글과 관련될 수 있다. 네이버 상품과 네이버 이미지 배너는 네이버 스토어의 자식테이블이다. 중복된 데이터 생성은 최대한 방지한다. 이미지 배너 데이터가 삭제되더라도 네이버 상품과 인스타그램 게시글 데이터는 삭제되선 안된다. 어렵다.. 사실 5번만 무시(?) 한다면 일은 훨씬 쉬워진다. 그냥 네이버 배너이미지 테이블 밑에다가 중복된 데이터를 저장하는 테이블을 2개 만들고 관계가 생성되면 복붙해서 넣어주면 된다. 하지만 중복된 데이터는 효율성이나 리소스 낭비의 문제도 있지만 데이터 무결성과도 연관이 있다. 똑같은 데이터가 2개 있을 때, 하나가 삭제되면 반드시 다른 하나가 삭제되야 하는데 그렇지 않게 될 경우 발생할 수 있는 위험성들이라던가.. ...

2024년 10월 10일 · 6 분 · 배준수

JWT 디코딩

Today I Learned 날짜 2024년 10월 8일 화요일 내용 JWT 디코딩 네이버에선, 솔루션에 가입한 유저의 정보를 JWT 토큰으로 넘겨준다. 이 토큰을 각 솔루션에 제공되는 공개키를 이용해 디코딩하여 유저 정보를 저장해야 한다. 쇼피파이에서도 했던 거라 그리 안어려울 거라 생각했는데 난관에 많이 부딪혔다. 인식하지 못하는 알고리즘 JWT 토큰은 헤더, 페이로드, 시그니처로 이루어져 있다. 헤더에는 토큰 타입과 시그니처의 해싱 알고리즘이 나타나있고, 페이로드에는 토큰에 담아 전달하려는 정보가 담겨있다. 시그니처는 토큰의 검증에 사용한다. 헤더에 사용해야하는 알고리즘이 적혀있지만, 일반적으로는 정해져있다. 예를 들어, 쇼피파이에선 Docs에 HS256을 사용한다고 나와있어서 굳이 헤더를 열어볼 필요가 없다. 그리고 이 알고리즘이 보통 많이 쓰이기도 하고… ...

2024년 10월 8일 · 2 분 · 배준수