본문 바로가기

say와 AI 챗봇친구 만들기 보고서

블로그 API 만들기 [Django REST Framework / 2023-03 서울대학교 웹 / 앱 개발 동아리 와플스튜디오 Django 세미나]

728x90
반응형
SMALL

블로그 API 만들기 (Django REST Framework) / 2023-03 서울대학교 웹/앱 개발 동아리 와플스튜디오 Django 세미나

 

서울대학교 컴퓨터공학부 웹/앱 개발 동아리 와플스튜디오 (https://wafflestudio.com/)
2022 Django 세미나 03: 블로그 API 만들기 (Django REST Framework)

 

오늘은 그 지난번에 블로그 만들었었지 아요요 앞에서 만들었던
거를 레스 프레임워크를 써서 베스트 API는 걸 한번 오늘 해 보려고
합니다 그래서 지금 간단하게 과제를 만들어 놨는데요
이걸 보고 이걸 하려면 어떤 걸 해야 될까를 생각하면서 좀 당의 자료를
짜봤어요 이번 이제 지금까지 만약에 플립러닝
잘 따라 오셨으면 사실 장고 레스트에 대한 모든 내용이 다 돼 있어요 아
이게 지금 또 갑자기 바뀌네요네 tmi
지금 윈도우로 저도 옮겨왔습니다 왜 맥 쓰는지
모르겠어요네 잠시만요 이런 느낌으로 봐야겠다
아무튼 오늘 목표는 그 블로그 웹사이트로 지난번에 했던 거를 이제
레스트 API 구현을 해 보는 건데 기존 거를 좀 들고 와서 거기에 이제 레스트 프레임워크 오을 보여 드리는
것처럼 그냥 덮어씌우는 방식으로 하는게 의도된 거예요 어 약간
스타트업의 서버 개발자가 됐다라는 설정을 이렇게 넣어서 진짜 겪게 되는 일을 좀 시뮬레이션 해 본 거거든요
약간 대표가 괜히 이런 이런 이상한 말하기도 하고 거기서 이제 유저 유저가 이제
가입하는 거를 이제 레스트 API 구현을 해 보는 거죠네 일단 지금 레스트가 뭔지 다 알고 계시겠지만
오늘 한번 개념 더 잡아 드리도록 하겠습니다 이렇게 해서 어 포스트
멘트까지 다 지난번 거랑 비슷한데 이제 레스트로 하는 거고요 여기에서
이제 여기서 클라이언트 오케이션 그러니까 로그인을 어떻게 해야 되는
건지 아니면 그 여러 개 내용이 어떻게 많을 때
어떻게 페이징을 해야 되는 거지네 그리고 뭐 태그 포스트에 이제
태그 같은 걸 넣을 수 있잖아요 인스타그램에도 해시태그 같은 걸 넣을 수 있잖아요 그런 거를 한번 구현해보는 과제입니다
이번부터는 플린 러닝은 필수로 제출 안 하셔도 될 거 같아요 대신 이제 SQL이나 이런에 대해서 어 생이라면
무조건 들어봤을 텐데 아직 안 들어보셨다면 꼭 한번 들어보시는 걸 권장을 드리겠습니다 그래서 지금 과제
읽어보면서 나왔던 주제들을 하나씩 다뤄 볼게요네 먼저 그 레스트 프레임워크가
뭘까요 레스트 API 뭘까요 그 어 장고 그냥 지금 서버 배운다고 지금
장고 시작하셨으니 장고가 그냥 서버 프레임워크 아니었나라고 생각하시기 쉬운데 맞죠
서버 프레임워크 많은데 장고는 원래 풀스택 프레임워크에 그냥 기본적으로 지난번에 하셨던 것처럼 웹페이지
html 구성된 웹페이지를 띄워주는게 장고가 원래 하는 일이고요 사실 현재 대부분의 모바일 어플리케이션이나 어
심지어 웹페이지들이 내려주는 방식으로 소통하지 않아요 어 지금 예를 들면
네이버 닷컴을 들어가 볼게요 여기서 그 아마 fcb 뭐
맥은 또 다른 거겠지만 누르시면 이제 개발자 도구를 들어가실 수 있는데요
여기서 이제 네트워크 들어가 보시면 어 새시 한번 해 볼게요 지금이 웹
브라우저가 여기 들어가면서 하는 모든 요청을 오른쪽에 찍어 줘요 살펴보면
지금 여기 일단이 www.neb.com이라는 요청은
기본적으로 이런 html 포드를 내려 줘요 그 html이 대충 어떤 느낌인지 아시겠죠네 근데 사실은 요즘
서버들은 이걸 직접적으로 내려 주기보다는 왜냐면은 모바일 어플리케이션은 html 랜드 하지
않을 거잖아요 그래서 약간 이런 제이슨이 아는 형태 우리가 훨씬
더 읽기 좋은 그런네 괄호로 감싸진 뭐 키가 있고
밸류가 있는 이런 리더블 한 형태로 내려주면 클라이언트에서 이걸 어떻게
어떻게 랜더 할지를 알아서 하는게 요즘 레이스트 API 소통 방식이고요
그래서 어 장고의 어떤 orm이나 이런 백들이 너무 좋아서 이걸 어
레스트 레스트 프레임워크를 만드는데에도 쓰고 싶은데 레스트 API 만드 는데도 쓰고 싶은데 그러기 위해서 나온게 장고 레스트
프레임워크입니다 그래서 지금 지난번 과제 때 했었던 그 장고 웹페이지에
아 그 블로그 웹페이지에 장고 레스 프레임워크를 한번 설치하는 걸 보여
드릴게요네 다 해보셨겠죠네 다 해보셨겠지만네 처음부터 한번
해보겠습니다네 그래서 사실은 되게 기이한 구조예요 자 장고 베스트
프레임워크 이게 장고 공식 라이브러리가 아닌데 사실상 공식인 것처럼 다들 쓰고
있어요네 막혀 있네 아네 URL
달라요네네 근데 그만큼 사실 장고에 있는 어떤 기존에 쌓아온 자산들
그니까 스택 오버플로에 쌓인 질문들이 아니면 라이브러리들이 이런게 정말 튼튼해서 어떻게 이걸 쓰고 싶어서
하는 거라고 생각해주시면 되고요 여기 이제 다 읽어 보시면 좋고 당연히 튜토리얼도 다 해보시면 좋고요 어
일단 이거를 장고에 깔려면 인스톨레이션 절차를 따라가시면 되겠죠
그래서 파이참에서 먼저 터미널을 켜서 p 인스톨 장고 레스트
프레임워크 하시고네 아마 깔려 있을 겁니다 빨리
까시고 인스톨 앱스에 이거를 세팅스 프로젝트 세팅에
들어가셔서 인드 앱스에 여기 레스트 프레임워크 이것까지는 제가 해 왔는데 레스 프레임워크를 추가를 해 주시고요
해주시면은 그리고 그 루트 urls 패스로이 API 오스 이거를 추가를 해 주시면은 레스트 설치가 완료가
됩니다네 이렇게 하면 레스트 프레임워크가 설치가 된 거고요이 레스 프레임워크에 대한 많은 기능들을 이제
쓸 수 있게 됩니다 네 지금 런 서버를 하면
사실은 큰 차이점을 느낄게 어려울 거예요 들어가면네 기존 것처럼 이렇게 뜨는
걸 볼 수 있죠 API 오스 같은 그 엔드포인트가 추가됐고 블로그 뭐
코멘트 들어가 보면 똑같 블로그네 포스트 들어가 보면 똑같고
뭐 이런 지난번에 보여 드렸던 그 유죠네 그렇습니다 이렇게 설치하는
거고요 어 여기서 이제 간단한 뷰를 추가를 해 볼게요 어 기존에 장고
템플릿을 할 때 폼이라는 걸 썼었죠 폼은 그 기존 장고 템플릿에 어 그
폼 html 폼에 대응되는 거라고 생각해 주시면 되고이 폼과 같은 역할을 레스트 프레임워크에서 하는게
시리얼라이즈 그러니까 둘 다 클라이언트가 보내준 리퀘스트를 밸리데이션 하는 역할을
맡아요 어 시리얼 라이저는 아까 보여드린 제이슨 형태로 클라이언트에서
데이터를 보내면 그걸 밸리데이션 하는 역할을 받고요네 그래서 지금 한번 보여
드릴게요 여기서 일단 첫 번째로 포스트 포스트 리스트를 받는 API
짜 볼게요 그러려면 뷰를 들어가야겠죠 여기서
이제 장고 장고 답 뷰스 기존에는 들고 왔지만 이제 레스트
프레임워크에서 제네릭을 들고 와서 호스트 크리에이 그 리스트
크리에이트 API를 만들어
볼게요 어 이거는 그냥 습관 같은 건데 이제 장고 장고 레스를 둘 다
쓰게 되는 경우가 이런 식으로 꽤 많아요 그래서 장고 템플릿을 쓸 때는 뷰라고 막 전 네이밍을 하고 장고
레스트를 쓸 때는 API 아고 네이밍을 뷰를 하는 편이에요 이렇게 해서이 뷰를 URL 포함을 시켜 주면
되겠죠 좀 명시적으로 분리하기 위해서 패스 API API 밑에 넣어
볼게요 이렇게 인클루드 해 주시면이 밑에 있는 패들도 들어가는
걸 말 수 있고요 여기에 포스트 그 포스트 리스트 크리에이트
API S 해주시면 되고요 뷰를 해야 클래스 베이스트 뷰는
되죠 이렇게 임포트 해 주시면은 안 될 겁니다 왜냐면 아무것도 안 들어가
있으니까요 어 여기서 이제 기존에 네임을 그 뷰로 이렇게 넣었죠
레스트의 경우에도 네임을 넣을 수 있는데 사실 쓸 일이 없어요 왜냐면 네임을 넣는 이유가 템플릿이나
다른 곳에서 이제을 다시 불러 쓴 거였는데 URL 어떤 건지 알기
위해서 근데 레스트 프레임워크는 사실 템플릿 같이 그렇게 쓸 일이 잘 없거든요 그냥 클라이언트 테 URL이
거야라고 전달해주는게 더 많지 그래서 보통 네임을 잘 안 쓰고요 그래서
여기서도 비슷하게 다른 제네릭이 했던 것처럼 그 쿼리 셋과 어 폼이
아니라 리셋은 포스트 있죠 포스트 리셋과 시리얼라이저를 지정해 주면
됩니다 그러면은이 포스트 리스트 크리에이트
API 생기는데요이 포스트 이걸 만들기 위해서 시리얼라이저 추가해
볼게요라네 포스트 시리얼라이저라고
하고 똑같이 레스트 프레임워크에서라
가져오고 모델 있었죠 그 만드는게 모델 시리얼 저입니다 이것도
마찬가지로 메타를 이용해서 모델을 지정해 주면은 이거에
대한 그 리퀘스트를 어떻게 제이슨으로 그니까
리퀘스트를 어떻게이 파이썬 리더랑 오브젝트로 만드는지 그 모델 같은 거
아니면은 모델 같은 파이썬 인스턴스를 어떻게 제이슨 형태로 만드는지 그 두 가지 역할을 알아서 라이저가 해준다고
알고 계시면 되고요 똑같이 필드를 이제 포스트 안에서 가져와서 지정을
하면 됩니다 저는
여기서 그 모델 스를 옆에
켜두고 네 필드를 하나씩 넣을게요 그 PK 일단 하나
넣고 PK n 여기 지정이 안 돼 있지만 그냥 장고 모델에서 프라이머리 키에 대한 대해
항상네 쓸 수 있는 필드에 프라이머리 키가 어떤거든 아이든 타이틀이네
이렇게 필드를 지정을 해
주겠습니다 이런 식으로요 어 제 자동 정렬를 쓰고 있어서 그에 콤마를
넣으면 이렇게 되고 이제 그 사실은이 모든 필드가 유저가 수정
가능한 필드는 아니에요 그래서 여기서 이제 리드온 필드를 몇 개를 지정해 주면은 겠죠 가령 PK n 바꾸면 안
되고 어 사실 크리이드 앱이 수정 시간도 저희 서버에서
기록해야겠다 사실 유저가 제이슨으로 그렇게 넣어서 지정하는 필드는
아니니까 이렇게 해서 포스트 라이저를 한번
만들었습니다 포스트 시리얼 라이저를 이제 여기에 넣고 알트엔터 해서 포트
하시면은이 리스트 시리얼 라이저가 리스트 크리에이트 API 뷰가 잘 될
거예요 그래서 API 호스트 블로그 API 포스트
가했습니다로 가면네 이런 꽤 깔끔한 UI 나오죠 이게 그 레스트 프레임워크에서 자체적으로 제공해 주는
API 브라우저 그요 브라우저 API 그요 여기서 이제 타이틀 디스크립션
두 개를 입력하면 이제 포스트가 생겨 생기면 좋겠죠
안녕하세요 여기 너무 hdml 선이
짧아요 호스트 누르면은 안 되죠 어 이거 이렇게 러 떴을 때네 항상 이거
당황하지 마시고 이거부터 항상 읽어 보시면 좋겠고요 읽어 보면 그냥 크리이드 바이가 안 들어갔다 그렇죠
크리에이티드 바이를 어디서 지정해 주지 않았으니까 크리에이티드 마이는 이걸 요청하는 유저 유저로 지정을
해줘야겠죠 지난번처럼네 그거를 이제 다음 오서라이즈 션을 하면서 하게
했습니다 어 이렇게 그 레스 프레임워크를 쓸
때는 어떻게 유저를 알아낼 수 있을까요
서버에서 그게 이제 레스 프레임워크 오티케이 해주는 일인데요 어 그냥
장고 템플릿을 쓸 때는 저희가 가볍게 제가 지난번에 지나가면서 말씀드렸는데
그 쿠키라는 걸 사용해서 그 서버에서이 유저를 체킹하고 비에
저장해 놔서 로그인을 하는 방식으로 했어요 근데 레스트 프레임워크는 그렇게 할 수 없어요 왜냐면은 그
쿠키를 관리하는게 웹브라우저의 영역이든 근데이 웹브라우저 말고 다양한 모든
곳에서 쓰고 싶게 한 거니까 같은 방식으로 할 수 없고 그래서 레스 프레임워크에서 해스 레스
프레임워크에서 제공해주는 오케이션이 직 오케이션 세션 오케이션 토 오케이션 이런게
있어요 어 여기 지금이 사실 제
PPT네 요기를 되게 익숙해야 됩니다 여기 케이션을 살펴보시면
되고요 날짜로 그 제일 많이 쓰는 토큰 오센티스 적용을 한번 해보도록
하겠습니다 간단하게만 소개해드리면이 베이직 오센티스 말 그대로 베이직 그냥 리퀘스트에 아이디 비밀번호를
그냥 넣는 건데 어 뭐 헤더나 이런 방식으로 근데 그다지 암호화가 되어 있지 않아서 권장되는 방식은 아니고요
세션 오센티스 어 저희 장고 오리지널에서 쓰는 쿠키 오센티스을
그대로 쓰는 방식이에요 토큰 오센티스이 리퀘스트에 헤더에 이런
방식으로 토큰을 유저별로 정의된 토큰을 같이 보내주면이 리퀘스트를
유저로 하겠다이 유저의 리퀘스트로 하겠다라는 방식의 오센티스 있니다
적용을 한번 해
볼게요
그래서
네 여기에 이거 따라가다 보면 이거 이거 지정하라고 나오는데요 이걸
복사하시고
자 세팅스
가서
맨밑에 어 레스 프레임워크 이런 딕셔너리를 하나 만들어주면 이게 다
프레임워크 관련된 설정들이 들어가는 곳입니다 여기에 이제 클래스를 지정을
해주면 레스 프레임워크에서 기본적으로 사용하는 오티케이 이렇게 지정해 줄 수 있고요 베이직 세션이 두 개가
기본적으로 적용이 되는데 됐는데 여기에 이제 토큰을 추가를
하겠습니다 추가를 해 주시고요 어 그 토큰 오티케이 할
때는 여기에 이제 레스 프레임워크 스토크이라는 앱을 추가를 해
주시고 인스
앱스에네 해주시고
그 유저가 생길 때마다 이렇게 토큰도 모델이에요
토큰을네 토큰 인스턴스를 하나씩 만들어 주는 방식으로 쓰게
됩니다 보면은네 이것도 토큰 모델이 인스톨 앱스 이제 포함되면서 마이그레이션을
실행하면 생기는데요네 지금 오스 토큰 관련된
마이그레이션 실행이 됐죠 데이터베이스를 살펴보면
여기에 모스 토큰 토큰이라는 테이블이 생인 걸 확인할 수 있습니다
네 그래서 그 원래 여기
문서에는
이제네 맨밑에 이런게 나오거든요 장고 시그널이라고 사용해서 이게 읽으면
그냥 유저 모델이 저장되고 나서 생성 바로 토큰을 만들어라 이런 걸
만들어 줄 수 있는데요 어 저희는 이거를 지금 쓰진 않고 나중에 이걸 꼭 쓰셔서 구현하면 편해요 지금은
그냥 유저를 계속 슈퍼 유저로 만들었으니까
파이썬 메니 파일 크리에이트 슈퍼유저
해서 이렇게 하면은 유저 생기고이 유저 1번에 대해서 토크는
인스턴스를 쉘로 하나
만들겠습니다 그 장고 네스이
이거를네 가져오고 프롬스
모델스 아 여기 안 만들어 놨군요 장고 트리
트 유 하면은 저죠 이거를 이제
오젝스 유 하면 될 거 같은데네 이렇게 생성이 되면은 생성을 하면은
여기 비에 이제 토큰이 생깁니다 유저별로 이럼이 키를 나중에 리퀘스트
할 때 날리 같이 날리면 되는 거예요
일단 그걸 해 보죠 여기에 이제
어 이제 로그인된 유저한테 아이 포스트 시리얼라이저
저장할 때 크리에이티드 바이가 같이 들어가게고 해보고 싶었잖아 그거를 이제 하시려면
어 이렇게 하시면 되는데요
지금은 다소 랜덤하게 느껴지시겠지만
사실 이런 그 일반적인 구현에서 어떻게 어디에 내가 원하는 추가적인
로직을 넣으면 될까 가령 지금 이런 식으로 리퀘스트 유저가 어디 들어가야 제일 깔끔할는 어 내부 구현을 잘
살펴보시면 좋습니다 이거 그냥 무지성 들어가도 되지만 그 나중에 어
데이터가 들어가면 디버그 포인트를 찍고 하나씩 살펴보고 얘네들이 어떤 생각으로 인을고 함수는 어떤
느낌으로고 왜냐면 얘네들이 되게 그 아 레스 프레임워크를 만든 사람들이
그 딱 재사용하면 좋을 만한 부분들만 이렇게 함수로 빼 놨거든요 그래서 그런 부분들을 잘 인지하고 있으면
이렇게 그 일반적인 제에서 벗어나는 구들을 쉽게 할 수 있습니다 아무튼
이런 느낌으로 그 리퀘스트 제이슨 안에 말고 그냥 인스턴스에 넣고 싶은 데이터들은 이런
크리트에 라이저 다 세이브에 이렇게 키월드 알트 넘겨 주면 얘가 알아서
내부 구현을 살펴보면 시리얼라이저 모델 시리얼라이저 구현에 그 K 키월드 먼트를 받아서
하는 것이 들어가 있습니다네 그래서네 좀 설명이 길었지만 리퀘스트 that 유저은
이렇게 넣어 주시면 되고요 근데 이게 그 여기서 로그인이
안 돼 있으면은 어 어떻게 날라가는지 아세요 어떻게 날아가면 셀프다
리퀘스트 유저가 머스 유저라는 빈깡통 유저로 날아가게 됩니다 그래서 아마
저장할 때 오류가 날 거예요 보면은
자 간단하게 그 html http 요청을 날리는 툴들이 가가장 유명하게
포스트맨 이런게 있고 어 제가 치를 깔아놨는데
이게 잘는지 모르겠네요 오픈소스로 좀 가게
만든인데이 tttp 요청을 할 수 있게 하는 거예요 그래서 보스트 저희 서버로 한번 요청을 날려
볼게요 그래서
타면은
네 잠시만요 이거 하퍼스 터치가 잘 안 될 거 같아서 인썸 리아라는
툴을서
하겠습니다네 이것도 되게 좋은 그 API 레스트 요청 날리는
툴이고 런거 하나 깔아 놓으면은 레스트 요청 날리기 좋고요
아이고 얘네 유료 하면서 또 많이 숨겨
놨네네 그러면 그 포스트맨으로
가겠습니다
한 레스 요청 날리는 클라이언트에 돈 벌려고 이것저것 많이
붙여놔 가지고 많이 무거워져서 포스트맨이 요즘 죽어가는데
네 써보고 싶지 않네요 여기 이렇게 들어오면 1 7점 0.0.1
8,000 알릴 수 있을 것 같은데
탠드 데스크탑 에이전트를 써야겠네요 잠시만 기다려
주세요 네 이거를 다운을 받는 동안
그 사실은 여기 브라우저 API 그래도 로그인 테스트를 해 볼 수는
있어요 여기서 로그인 우리가 세션 로그인을 켜 놨기 때문에 세션 어센티케이션 켜
놨기 때문에 그냥 이걸로 로그인 하시면은 그네 csrf가
두고요지면서 다시 하면
됩니다 네 요런 식으로 제가 로그인 돼서
저장이
되는데요 이렇게 저장이 잘 되는 걸 볼 수 있죠 세션 오센티스 써도
그래서 그냥 토큰 오센티스 꼭 확인하시고 싶은 방식이 아니라면 이렇게 개발하실 때 브라우저 API
사용하시면 되게 편하고요
여기서 만약에 유저가
없다면 에러가 나니까 저희가 이걸 유저가 없는 유저에게는 아 그
로그인을 안 한 유저에게는이 요청을 날릴 수 없도록 만드는 작업을 퍼미션을 통해서 할 수 있습니다
이걸 하고 하는게 좋
같은데네 아쉽지만 http 요청 날리는 거는 포기하겠습니다 다음번에
해보는 걸로 하고 그 헤더가 뭔지 좀 짚어드리고 싶어 가지고 어 아시는
분은 아시겠지만 여기서 리퀘스트를 날릴 때 그 사실은 내 내용 말고도
앞에 헤더라 걸 붙일 수 있어요 그냥 모든 요청에 이렇게 리퀘스트 헤더가 같이 들어가는데요 보면은
여기 이런 느낌으로 그 리스폰스 헤더 말고 리퀘스트 헤더에 뭐 세트는 이제
내가 어떤 어떤 거를 읽을 수 있다라는 뜻이에요 클라이언트에서 뭐 이런 느낌으로 어서트 랭귀지 나는
어떤 나는 한국어를 읽을 수 있어 약간 이런 방식으로 헤더에 이제 리퀘스트 관련된 메타 정보들을 같이
보냈는데 여기에 이제 나중에
[음악]
오서라이즈
네 이거 오라이 띄고 토큰 딱이 내용이 들어가게 되면 저희 서버에 저
토큰을 가진 유저로 매칭을 시켜서이 유저인 것처럼 행동할 수 있게
해줍니다네 그런 방식으로 나중에 구현하실 때 케이션을 구 야 될
거예요네 그렇게 말씀드리고요 그래서 일단은
지금은네 테스트는 세션 오센티스 통해서 하겠습니다 그래서 지금이
크레이트를 그 리퀘스트 유저가 있을 때만 호출이 가능하도록 해보고 싶은데
그거를 레스트 프레임에서 의견이 있어요 그거 그걸 제공해 주는게
미션입니다 네 로그인이 만약에 가능해졌으면 이제
유저 있는 사람한테만 생성을 하고 싶게 할 수도 있고 가령 그 포스트를
수정하고 싶다 그러면은 이제 포스트를 진짜 만든 사람만 수정이 해야겠죠 뭐
그런 방식으로 어떤 유저에게만 특정 액션을 허용하고 싶어질 수 있는데
고에서는 이제 클래스 베이스 퍼미션을 제공을 해서 구현할 수 있어요 이것도
마찬가지로 여기 서에 되어 있고요 구하시기 전에 이걸
꼭 읽어 주시면 한번 읽어봐 주시면 좋을 것 같고요 그래서 지금 글
작성은 가입된 유저에게만 허용하고 글 수정은 글을 작성한 유저에게만
허용하는 로직을 작성을 해 보겠습니다 이제 클래스 베이스드
퍼미션은 어떤 거냐 일단이 뷰이 클래스 베이스드 뷰에서 퍼미션
클래스를 넣을 수 있어요 이게 리스트로 봤는데요 여러 개가 전부 월
조건으로 들어갑니다 그래서 여기 사실 이미 구현된 레스에서 제공을
해주는 그런 미션들이 있어요 가령
이센 이거는 말 그대로 그 로그인 한 유저에게만이 뷰를
허용하겠다이 어 유저 어민 유저에게만 이유를 허용하겠다 이런 것들이 있어서
일는 좋겠죠 그래서네이 오케이를 적응하면 될 거
같지만 그러면
이제
여기서 이렇게 적용을 해 버리면 그 리스트 크리에이트 API 하나의 URL 해서 겟 하면 리스고 포스트
하면 크리에이트이기 때문에 둘 다 이제 로그인된 유 에게만 하는 거죠 그래서이 포스트 리스트를 불러올 때도
로그인 된 유저만 불러올 수 있겠죠 그래서 그런 경우를 위해서 이오이 all 리 리라는게 있습니다 이거를
적용하면 우리 의도한 대로 작동할 거예요 인버터에서 적용해
보면
이제네 지금 로그인을 안 했을 때는 아까 밑에 그 포스트 생성하는 UI 없어졌어요 왜냐면은 지금 로그인 안
된 유저는 생성할 수가 없으니까
그래서 로그인을 하고 나면 이렇게 생깁니다 지금 앞에 이게 가능해진 거
같은데 이게 지금 저 브라우저 U UI
럼 API 날릴 수 있는 방식이고요네 이렇게 똑같이 날릴 수
있고요 여기서 그 그 포스트를 일단 무지성 그냥
날리면네 어 로그인이 안 됐어라고 내려오고 401 라라고 내려옵니다
401은 40 3이랑 살짝 달라요 둘 다 권한 이슈인데 401은 이제 유저
유저인지조차 모르겠다라는 거고 그래서 헤더에 아까 말했던 것처럼
오서라 토큰 그리고 그 아까 만든 토큰
키를 여기에 넣어
주면네 이렇게 바뀌었죠 400으로 내려옵니다 어 내용을 아예 안 넣기
때문에 바디에 제이슨 형태로 잘 오를 누르고
제이슨
타이틀 이렇게 보내면은 유청이 성공하는 걸 볼 수
있습니다 이렇게 토큰 오티케이 쓰는 걸 보여 드리고 싶었고요
그네 이런 방식으로 그 이리드 이이 리리를 사용해서 미션을 구현할 수
있고요 어 조금 더 나아가 볼게요 그 포스트 업데이트 포스트 디테일 디테일
API 구하고 싶 인데요 수정도 할 수 있는 걸 살짝 구현해 놓은 거를
가져오겠습니다 마찬가지로 그 리스크 API 뷰 제네릭이 있었던 것처럼
리트라이브 업데이트 디로이 API 뷰도 있습니다 이거는 디테일 그
리트라이브 하나의 오브젝트를 읽어 오는 거 업데이트 하나의 오브젝트를 수정하는 거 디스트로이 하나의
업데이트를 아 하나의 오브젝트를 삭제하는이 세 가지 액션을 하는 제네릭이 이제 시리얼라이저 클래스에
똑같이 지정해 주고 그 포스트 쿼리셋 지정해주고 퍼미션을 지정해 주면
됩니다 url 그 기존과 포스트라는 그 인스턴스 리스트를 불러오는 것과
다르게 뒤에 PK 곳이 들어가야 합니다네 이런을 보통 지정을
하고요 그 여기서 이제
이리는 장고에서 제공해 주는 거였고 이리가 저희가 미션이라는 파일을
만들어서 새로 정의를 한 파일인데요 여기 이제 살펴보면
이제 스 프레임워크에서 제공해 주는이 베이스 미션이라는 걸 상속해서 직접
구현하시는 되고 이제 해스 오브젝트 미션이라는 거를 오버라이드를 하면 저희가 어떤 방식으로이 퍼미션을 그
할지를 지정해 줄 수 있어요 여기서 트루를 내려주면 아이이 함수는 먼저
오브젝트 리퀘스트 뷰 리퀘스트는 이제 어떤 유저 리퀘스트 유저를 통해서 어떤 유저인지 알 수 있겠죠 오브젝트
그은 지금이 뷰가 어떤 오브젝트에 대해서 실행되고 있는지 그 오브젝트
가령 포스트 디테일이면 그 포스트 인스턴스를 주는 거고요 그거에 따라서 분리 값을
내려주면 트를 내려주면 이게 허용되는 액션인 거고 스를 내려주면 이게 허용되지 않는 액션인 겁니다 그런
방식으로 저희가 퍼미션을 구현할 수 있고요 구현하고 싶은게 이제 그
포스트 디테일에서 그 포스트의 주인만 수정할 수 있는
거니까 이미션 세이 메드가 만들어놨어요 그러니까 이게 겟 헤드
옵션이면 안전한 옵션이죠 그 해당 인스턴스를 수정하거나 삭제하는 그 메소드가 아니겠죠 그래서 이럴 때는를
내리고 아닐 때는 그 크리에이드 바이가 같을 때만 내려라라고 이렇게 제가 구현을 해서 그 구현한 모습을
확인하실 수 있습니다네 이런 방식으로 퍼미션을 구현 하시면 되고요
그 조금 이제 슬슬 이런 의문이 생기시면 좋아요 어
왜 URL 이런 방식으로 하는 걸까 그러니까 레스트 API 여기 포스트
이렇게 해놓고 여기에 이제 스 리스트 목록을 불러오거나 새로 생성하는 거를 게시한
포스트라는 메소드로 지정을 하고이 닌트 PK 아는이 URL 상세 관련
액션들을 다 몰아 넣었네 사실 이게 그 서버 개발자들 간의 귀하기에 그냥
레스 프레임워크를 쓰는 쓰는 관련해서 자료를 하나
가져왔는데요네 그런 레스트 API 괜찮은가 이글을 꼭 저는 정말 좋은
사실은 네이버 강연이었어요 이게 유튜브 들어가 보면은 이게 제가 건너
건너서 아는 분인데 기가 되게 좋거든요 관련해 보면은 왜 지금 레스
프레임워크가 지금이 형태로 왔을까에 대해서 조금 더 이해할 수 있어요네 토스
분인데 그 약속인 거예 그냥 예를 들어 여기에 이제 1 업데이트 이런
곳에 코스트를 날리면 그 인스턴스가 되게 할 수도 있겠죠 근데 그렇게
하면은 클라이언트 입장에서 예측이 너무 불가 불가능해지는 거예요 그래서
액션은 웬만하면 http 메소드로 지정을 하고 이런 게시나 포스트 같은 거 그 리스에 위치만 URL 하자라는
약속이 그래서 일반적으로 그 스 이렇게
그 블로그라는 앱 이름 안에는 곳에 뭐 인스턴스 이름을 복수 형태로
넣어서 이렇게 두 가지 URL 구성을 하는게 모든 일반적인 액션들을 저렇게
한다고 생각해 주시면 됩니다 저희가 오늘은 다루지 않았고 사실은 개발할
때 잘 안 쓰게 되는 거지만 장고 셋이라는 걸 쓰면 플레마는
면 엄청 모든 걸 다 해 줘요 그러니까 모델이랑 시리얼라이저 지정을
하면 URL 그 여섯 개 제가 방금 말한 삭제 수정 땡땡 땡땡이 다 되거든요
얘도 사실은 같은 방식으로 그런 URL 지정을 해 줍니다네 그게 서버 개발자들 간의 약속이
가지고요네 그렇게 이해해 주시면 되고요
네 넘어가겠습니다 그다음에 이제 페이지네이션을 하기 전에 어 페이지
네이션을 해보려면 일단 데이터가 많아야 될 텐데 그걸 로컬에서 테스트 하시기 어렵잖아요 그래서 그런 간단한
그 모델 마이라는 라이브러리를 가져왔습니다 작년에 이제 저희 조교
님인 태양 님이 추천해 주셔 가시고요네 이걸 쓰게 들으시다가 이거 써도 되나요라고
여쭤 보셔 가지고 했던 기억이 있는데네 일단이 모델 맘이라는
라이브러리는 어 말 그대로 그 모델 인스턴스를 알아서 만들어
주는 모킹 라이브러리입니다 어떻게 쓰냐면 일단 이걸 설치를
하시고요 설치를 하시고요네 깔려 있습니다 사실 전는
그리고 여기 베이식 뉴에이지 들어가 보면은 다 읽어 보시면 좋지만 이렇게
모델 마이라는 라이브러리를 임포트 하셔서 마미다 메이크 장고 모델을
넣으면 얘가 알아서 인스턴스를 하나 만들어 줘요 그냥 가짜 데이터를 막 넣어서네 그런 되게 유용한 라이브러리
저는 이걸 써서 지금 포스트 커멘트를 한 개 정도 빠르게 만들어
볼게요 자 될 해가지고 모델 마미 볼트 마미
한 다음에 그 블로그 모델의
호스트랑 커멘트가 있겠죠 그다음에 이제 100번
반복해서 포스트를 100번 만들어 보겠습니다
이 좌라락 막 만들어 줘요네 TV 확인해 보면 이런 이상한
글자로 이제 들어갔고요네 크리에이티드 마이크까지 막 알아서 만들어 줘요 이게 좋은게
사실 릴레이티드 모델이라서 내부적으로도 이런 것들을 다 만들어 줘야 모킹이 되거든요 왜냐면 누가
만들었는지를 알아야 되잖아요 그런 것까지 제가 알아서 다 해 준다는 거네 그 리시브
하게 그다음에 포스트도 이제 기존
포스트라이 만들어진 포스트를 쓰면 좋으니까이 포스트를 가져와서 어 제 생각에 그냥 아이디를
지정해 주면 되겠네 홀 레인지백에 대해서 그 마미다 메이크
커멘트 그다음에 포스트 아이디를 만 1번으로 해서 1번에 대한 댓글을
뵙게 만들게요 네 이렇게 마미가 꼭 알아서 다 해 주는게 아니라
그 어떤 포스트 어떤 일부분만 지정을 저희가 해 줄 수도 있어요 이렇게
쓰는 모킹 라이브러리 그요 그래서 지금 아까 켜놓은 그
사이트를 이제 다시 들어가 보면은 엄청
많겠죠 새로 붙임을 하면네 이제 좌라락 뜨는데요 벌써 렉 걸립니다
네 클라이언트에서 이렇게 많은 데이터에 대해서 한 번에 보내 주면은 많은
불이익이 있겠죠 사실 그 이렇게 리퀘스트가 오고 리스폰스가 올 때까지
시간을 보통 레이턴시 이렇게 많이 뭐 얘기를 하는데 그 레이턴시가 짧으면 짧으면 짧을수록 좋아요 그래야 이제
클라이언트 저희 모바일 어플리케이션에서도 다음 액션이 일어나기 전까지 너무 스트레스를
받잖아요 저희가 그래서 로딩 및 빠가 조금이라도 돌게 하는 액션을 만들려면 그 그걸 어느 정도 진행되는지를 알려
줘야 되는데 그래서 그걸 적용하는 방식이 페이지 네이션이 아는게
있고요네 그래서 그렇게 여러 개로 나눠서 요청을 날리는게 사실 되게 유용한 방법입니다 그래서 drf ES
이런 페이지 네이션을네 아 맞아 일단 이거부터 생각해 보죠 뭐 각종 커뮤니티 같은데
들어가 봐 사실 1페이지 2페이지 3페이지 4페이지 귤이 엄청 많은데 그렇게 나누죠 그것도 페이지 네이션의
일부입니다네 drf ES 다양한 방식의 페이지 네이션을 제공을 해 주는데요 당연히 똑같이 것도 거 문서 읽어
주시면 좋고요 가장 일반적으로는 페이지 넘버 페이지 네이션 진짜 1번 1번 페이지인지 10번 페인 이렇게
나누는 거죠 그다음에 리미 오프셋은 어떤 곳에서부터 몇 번 불러와라 이런게 있는데요 제가 이번에 써 볼
거는 커서 페이지네이션 있니다 커서 페이지 네이션은네
그 가령 인스타그램 같은 곳에서 저희가 내리면서 이제 몇 번
페이지인지 모르잖아요 그런 방식일 때 많이 써요 어이 서라는 걸 내려받고 그 리퀘스트
할 때마다 커서를 같이 주면 그 커서에 맞는 데이터를 내려주는 거거든요 읽어보면 그런 내용인데 일단
보여 드리는게 제일 좋을 것 같습니다 그래서 그 커서 페이지 션을 사용하는
방식은 미션이나 다른 것을 사용하는 것과 마찬가지로 여기 페이지네이션
클래스를 지정해줄 수 있어요 여기에 커서 페이지네이션 해주시면 되는데요 어 얘는 조금 독특하게 에
그 항상 오버라이드를 해야 돼요 잠시만요 또 이걸로
가겠습니다네 보시면 이제 리스트 크리에이트 API 페이지네이션 클래스를 추가를 했는데요이 커서
페이지 네이션이 저희가이 페이지 네이션이 파일에 구현을 해 놨습니다
이렇게 페이지 사이즈를 지정을 해 줘야 되거든요 그리고 어떤 거 기준으로 정렬 할지도 해 줘야 되거든요 그래서 항상 오버라이드를
해야 되고요 그래서 이렇게 들어가 보면 새로 고침 해 보면 이런
방식으로 구현이 돼 있습니다네 지금 넥스트라는 걸 줬죠
그러니까 지금이 넥스트 프리비어스 리트가 이게 항상 감싸지는 거고요
지금 지금 칸의 내용은 이렇게 지금 개의 포스트가 이렇게 쌓인 거고요 개
포스트만 내려 준 거고요이 다음 다음 거는 이걸 통해서 요청해라인 거예요
그래서이이 URL 사실 같은 URL 뒤에 커서라는이 알트만 들어간
거고요 들어가 보면은 이제 넥스트 프리비어스 또 있습니다 이런 방식으로 계속 클라이언트 입장에서 그냥 내려준
URL 다시 하기만 하면 되는 이전께 궁금하면 이전 거를 누르면 되는 그런
방식의 페이지 네이션이 커서 페이지 네이션 입니다 그래서 그런 인스타그램 무한로딩 같은 곳에서 응용할 수
있겠죠네 그렇게 적용을 해 주시면
되고요네 사실이 정도만 레스 프레임워크에서 할 줄 알아도 레스트 프레임워크의 대부분의 기능들을 좀
유용하게 쓰고 계신 건데이 정도면 블로그를 구원하시기 문제가 없을 것 같고요 하나 짚어 드리고 싶었어요
저희 이번에 태그를 구현하는게 있는데요 음 사실 장고 레스트 프레임워크
부분은 아니고 릴레이션십이 어떻게 실제 디비랑 연동 되는지를 이해하시면 좋아요 어 릴레이셔널 dvga 그냥
주어지니까 시작했지만 사실 모든 dvga 다 이런 건 아니에요 뭐 몽고 디비라 노드 JS 쓰는
디비도 있는데 그건 릴레이셔널 비가 아니고 릴레이셔널 dvl 사용한다는 거는 말 그대로 관계형 이런 관계형
데이터를 다루는데 큰 장점이 있어요 뭐 관계형 데이터베이스는 이런
원칙들을 다 가지는데요 조금 유용하게 볼만한 거는 일관성 그니까 저희가 그
컨스트레인트이 테이블에 대해서 가령이 모든 테이블에 어떤 스트링이 항상
유니크하게 있어 이런 거를 지정한다 아니면 어떤 테이블에 어떤 아이디는
그 코멘트에 가에 있는 거는 항상 스 유저에
존재하는 아디야 될 거잖아요 서로간에 제약을 걸어서 비에
데이터의 일관성을 유지한다든지 이럴 때 좀 큰 장점이 있는게 rdb 그래요 장고 장고를 쓰면서 자연스럽게
쓰고 계신다고 생각 이해해 주시면 되고요 그 그래서이 니투 1 릴레이션십 니투
메니 릴레이션은 사실 테이블을 어떻게 생하는 그 ddl ddl 박혀요
그래서 지금이 태그를 구현을 한번 해 해보려면 지난번에 보여 드렸던로 보여
드릴게요
네 사실 태그가 어떤 건지 다 이해하고 계시죠 그 포스트에 태그 달리면 포스트 뭐 어떤 포스트 관련된
내용을 나중에 다 살펴볼 수 있고 약간 이런 거라서이 태그가 뭐 포스트에도 달릴
수 있지만 멘트에도 달릴 수 있다고 예를 들어 가정을 해 볼게요 댓글에서도 이제 놀리면서 막네
태그를니까 태그가 이렇게 있겠죠
저는이 태그를 태그는 프라이머리 키를 뭐 콘텐트로 하고
싶어요 그래도 되겠죠 왜냐면은 컨텐트는이 컨텐트는 유니크 해야죠
같은 내용에 태그가 여러 개가 있으면 안 되죠 그리고 이제 컨텐트 자체가 키가 될 수도 있겠죠 이 태그가 어떤
태그 인스턴스에 대해서 그래서이 태그랑 포스트는 어떤
관계인가네 포스트 하나에 태그가 여러 개 달릴 수 있겠죠네 뭐 이것도 가고
저것도 가고 이럴 수 있으니까 근데 태그 하나에 포스트가 여러 개가 되기도 하겠죠네 그런 투 n 관계예요 니투
매니 관계인데 그래서 장고에서 그냥 태그는 니투 매니 매니저를 쓰면
돼서 비에서 이렇게 연동이 되겠구나 살표 여기서 여기 뭐
가령 n2 n 이런 테이블 감계 했구나라고
이해하기 쉬운데 사실 그 릴레이셔널 디비에 n2n 없어요 릴레이셔널
DB에는 항상 1투 만 있거든요 그래서이 태그가 구현된 방식은 사실은
이단이요 투앤 저희가 니투 매니 필드로 정의를 하면 어 중간 테이블이
하나 더 생깁니다 이렇게 포스트 투 태그 아마 이름은
좀 다를 수 있는데요 여기에 이게
아니라 호스트 아이디가
생기고 해그 아이디이 두 개가 생깁니다 사실은 매니 투 매니
매니저를 하면 그러면은 얘도 1대인 거고
얘도네
생니 1대인 거죠 이렇게 생각하면은 호스트랑을
태그를네으로 유지할 수 있겠죠네 사실은 장고에 저희가 니투 니드 장고에서 이렇게 정의를 하면은
내부적으로 이렇게 구현 돼요네 그래서 저희가이 부분을 나중에 막 따로 만들어서 여기에 뭐 생성
시간 이게 언제 만들어졌는지 누가 오셨네요 안녕하세요네 여기서 이제 이게 언제이
포스트 테가 언제 수정되는 이것도 건드릴 수 있어요네 그래서 자 그 코드로 보여
드릴게요 어네 여기서
커멘트 부분 구현하고 메투 매까지 와볼게요
살펴보면 모델스 이제 맨밑에이 태그라는 거를 추가를 했어요이 태그는
이제 포스트 내부적으로 포스트도 니투 매니 필드로 가지고 코멘트도 니투
매니 필드로 가진다라고 이렇게 정의를 하고이 컨텐트가
유니크하면서가 가 얘 자체가 키다 나중에 PK 쓸 수 있다 그리고 맥스 랭스 피드는 무조건 맥스 지정해 줘야
되죠 이렇게 해서 마이그레이션을 했습니다 이렇게 마이그레이션이 태그가
새로 생겼고요 메이크 마이그레이션 했고요 이렇게
그 마이그레이션을 실행을 하면
여기에 블로그 태그 블로그 태그 태그라는 곳에 이제 텐트라는 거 다른
테이블이랑 하게 이제 아이디가 없어졌죠 왜냐면 프라이머리 키를 그 명시적으로 지정을 해 줬기 때문이에요
그리고 이제 태그 커멘트를 들어가 보면은 태그 아이디 커멘트 아이디네 실제로 내부 rdb 이렇게 구현이 돼
있다는 거를 이해해 주시면은 쉽게 이제 나중에 니투 매니 필드에 뭐
가령 스루를 넣는다든지 이런 거를 이해하실 수 있을 겁니다 그래서 뭐
하나만 더 짚어 드리고 넘어가면이 미니투 매니 필드는 태그에 있어야 될까 아니 포스트에 있어야
될까가 사실 둘 다 돼요네 어느 곳에 있어도 이상하진 않거든요 근데 조금 더 의미에 맞는
걸 해 주시는 걸 권장해요 사실 태그 관련된 로직은 전 여기 뭉쳐 있는게 더 읽기 쉬운 거 같아요 그래서 전는
여기에 만들었고요네
그렇습니다 네 맞습니다이 정도 얘기 드리면 오늘
과제 이번 과제는 되게 어렵지 않게 하실 수 있을 것 같아요 사실 제가 너무 걱정했던 거 같아요 지난번에 막
몇 분 물어봤는데 너무 쉽대요 그리고 이제 스프링 하는 쪽은 훨씬 더
고생하고 있대요 저희 나중에 약간 과다 끝나는데 고분들 못하시면 안
되잖아요 그래서 과제를 좀 빡세게 계속하려고 노력하고 있고요 어 rds
톡 사용하시면서 어 사실이 프리티어 아 당연히 이거 알아서 하시겠지
싶었는데 생각보다 되게 스트레스 받아 하시는 분들이 계셔서 꼭 주의해 주세요 진짜 사실 몇 천만 원 나갈
수도 있거든요 오늘 한번 살펴 버리겠습니다 그 aws 아마 좀
들어가셔서 이제 엘라스틱 빈스톡이랑 rds 두 개를 이제 쓰실
텐데
네 여기서 이제 엘라스틱 빈 스톡에서 애플리케이션 생성 새로 하실 때 어
애플리케이션 생성까지 뭐 안 들어가고요 이제 환경 환경에서 막 이렇게 파이썬
지정해서 뭐 샘플 애플리케이션 한 다음에 나중에 막 건드리고 하잖아요 여기 이제 프리티어 사용 가능 이걸로
지정을 해 주시고요 여기서 어 이런 거 다 통과 통과
통과한
다음에 보통 이렇게 vcc 막 해 가지고 뭐 여기서 이제 데이터베이스
추가를 하실 텐데 여기서 어떤 거를 주의하셔야
되냐 돈 나가는 거는 여기입니다이 인스턴스
클래스입니다 그이 dbd T2 마이크로 되거든요 이거 아 아 숫자 데크다 이거 기분 좋다라고 누르시면
바로 돈 나갑니다 여기서 이제 마이크로 그 rds 프리티어 검색해
보시면 아마 어떤 것까지 이제 프리티어 그리고 프리 티어가네 dbt2 마이크로 dt3 마이크로
dbt 43 마이크로지 750시간 쓸 수 있다 이렇게 나오고요네 이거를 이제 이중에서 하나
골라서 꼭 쓰시기를 쓰시면 요네 T2 마이크로로
하겠습니다 그다음에
이제 여기서 단일 인스턴스 온디멘드 인스턴스 해주신
다음에네 이게 약간 그런 거예요 뭐가 오토스 게 저희 서비스에 요청이
갑자기 너무 많이 들어오면 알아서 들려주겠다 약간 이런 건데 이거를 하실 때 온디맨드로 하셔야지 저희가
지정한 걸 딱딱 할 수 있겠죠 여기서 인스턴스 유형을 잘해 주셔야 돼요 그러니까 엘라스틱 빈스톡 하나 켜면은
두 개가 켜지는 거죠 DV 하나 켜지고 서버가 하나 켜지잖아 둘 다 이제 프리티어 해주셔야 돼요 이것도
비슷하게 대충 T2 마이크로 이런 거 하시면 됩니다 이거는네 이렇게 잘
지정이 돼 있고요 이거는 그 E2 프리 티어를 검색해 보시면 정확하게
나와요 E2 피어를 사실 엘라스틱 스톡이
22라 그 aws 서버를 키는 모든 서비스가
이거든요 그걸 알아서 띄워주는게 엘라스틱 스이요 그래서 22의 어떤 프리티어 같은
기준인데 이것도 같이 T2 마이크로나 T3 마이크로 인스턴스를 매월 750시간 제공을 해주십니다 그래서
이렇게 다음을 누르시면은 티어로 잘 생성이 된
거고요네 아마 좀 걸리겠지만
생성까지네 이렇게 하면은 뭐 애플리케이션이 성성이 되죠 여기서 이제 제출하신 다음에 좀 껄끄러워서
삭제하고 싶다 하면은이 환경을 꼭 종료를 해 주세요네이 환경을 꼭 종료를 해 주시
아직 안 켜져서 안 보이는데이 종료를 해 주셔야 돈이 안 나가고요 제출하신 다음에 검사까지 다 받고 나셔서
그리고 지금 혹시 아 지금 돈 나갔을까 싶으시면여 결제 대시보드
들어가셔서네 여기 청구서 들어가 보시면 얼마 지금 이번 달 얼마 썼다가 나와요 그래서 이거 꼭 확인해
보시고네 별 문제 없으셨으면 좋겠습니다네 이렇게 해주시면 될 거
같 요 어 그리고
그네 뭔가 알려 드리고 싶은게 하나 더 있었는데네 오늘은 여기까지 진행하고요
이제 다음 주 금요일에 이제 아 지금까지 남으신 분들 대상으로 서바이버 식 있더라고요 그어 그거
봐주시면 좋을 것 같습니다 고생 많으셨습니다 이번 제도 파이팅
하시고요네 여기까지입니다
체크하신네 했습니다네네네네
728x90
반응형
LIST