๐ Personal project / ๐ 2021.7 - 2021.11
Ali Express์์ ์ ๊ณตํ๋ ์ํ ์ ๋ณด๋ฅผ Zapiex API๋ฅผ ํตํด ๊ฐ์ ธ์ DB์ ์ ์ฅํ๊ณ , ์ฌ์ฉ์๋ค์ด drop shippingํ ์ํ๋ค์ ๊ฒ์ํ ์ ์๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ์๋น์ค์ ๋๋ค.
โ
๐ก What is Zapiex API?
Zapiex API is an unofficial AliExpress API that provides the following realtime services on AliExpress
โ
-
Frontend: https://aed-frontend-app.herokuapp.com
โ
- Python 3.9
- FastAPI 0.68
- PostgreSQL 13
- Alembic 1.7
- Heroku
- JavaScript
- TypeScript
- React 17.0
- Next.js 11.1
- Bootstrap
- Heroku
โ
-
search_texts
-
๊ฐ์ ๊ฒ์์ด๋ ํ์ด์ง๊ฐ ๋ค๋ฅด๋ฉด ๊ตฌ๋ณํ์ฌ ์ ์ฅํฉ๋๋ค. (Zapiex API ํธ์ถ ์ ๊ฒ์์ด์ ํ์ด์ง ์ธ์๋ฅผ ๋์์ ์๊ตฌํ๋ฏ๋ก)
Ex. ('welsh corgi', 1 page) != ('welsh corgi', 5 page)
-
-
product_lists
search_text_id
๋ฅผ Foreign key๋ก ์ฌ์ฉํ์ฌ,search_texts
ํ ์ด๋ธ๊ณผ 1-to-1 realationship์ ๊ตฌ์ถํฉ๋๋ค.
-
๋ชจ๋ table์ 3NF ์ ๊ทํ๋ฅผ ์ถฉ์กฑํฉ๋๋ค.
โ
Zapiex API๋ฅผ ์ฌ์ฉํด Ali-Express์ ์ํ ์ ๋ณด๋ฅผ ์กฐํํด์ค๋ API ๊ตฌํ (2๊ฐ)
๊ฒ์์ด ์๋์์ฑ API ๊ตฌํ (1๊ฐ)
-
search_items_by_text
๐ ์ฝ๋ ํ์ธ- ๊ฒ์์ด์ ํ์ด์ง๋ฅผ query๋ก ๋ฐ์ Zapiex API๋ฅผ ํธ์ถํ๊ณ , Ali-Express์์ ํด๋นํ๋ ์ํ ๋ฆฌ์คํธ ์ ๋ณด๋ฅผ ์กฐํํด์ฃผ๋ API์ ๋๋ค.
- Zapiex API์ call ๊ฐ์ ์ ํ์ด ์์ด, ์ต๋ํ ํธ์ถ ์๋ฅผ ์ค์ด๋ ๋ฐฉํฅ์ผ๋ก ๊ตฌํํ์ต๋๋ค.
- ์ฒ์ ๊ฒ์์ API๋ฅผ callํ์ฌ ๊ฒ์์ด ๋ฐ ํ์ด์ง์ ํด๋นํ๋ ์ํ ๋ฆฌ์คํธ ์ ๋ณด๋ฅผ ๋ฐ๊ณ DB์ ์ ์ฅ
- ์ดํ, update date๋ฅผ ํ์ธํ์ฌ ํ๋ฃจ๊ฐ ์์ง๋ฌ๋ค๋ฉด DB์ ๊ธฐ์กด data๋ฅผ ๋ฆฌํด
- ํ๋ฃจ๊ฐ ์ง๋ฌ๋ค๋ฉด ์๋ก API callํ์ฌ DB๋ฅผ updateํ๊ณ ๋ฆฌํด
- Zapiex API์ page๋ฅผ query๋ก ๋ณด๋ผ ์ ์์ด, pagination ๊ธฐ๋ฅ์ ํ์ฉํ๋ ๋ฐฉํฅ์ผ๋ก ๊ตฌํํ์ต๋๋ค.
-
create_details
๐ ์ฝ๋ ํ์ธ-
์ํ์ id๋ฅผ query๋ก ๋ฐ์ Zapiex API๋ฅผ ํธ์ถํ๊ณ , ํน์ ์ํ์ detail ์ ๋ณด๋ฅผ ์กฐํํ๋ API์ ๋๋ค.
-
Zapiex API์๋ call ๊ฐ์ ์ ํ์ด ์์ด, ์ต๋ํ ํธ์ถ ์๋ฅผ ์ค์ด๋ ๋ฐฉํฅ์ผ๋ก ๊ตฌํํ์ต๋๋ค. (
search_items_by_text
์ ๋์ผ ๋ฐฉ์) -
์๋ต ์ฝ๋๊ฐ 200์ผ ๋, ์๋ต ์ ๋ณด ์ค 'status'๊ฐ activeํ ์ํ์ผ ๋ DB์ ์ ์ฅํ์ต๋๋ค.
-
Zapiex API์์ ์ ๋ ฅ๋ ์ ์๋ id์ ์ ํ์ ๋ฐ๋ผ ์์ธ์ฒ๋ฆฌ๋ฅผ ์งํํ์ต๋๋ค.
-
๋น์ ์์ ์ธ id๋ฅผ ๋์ง ๋, ์๋ต ์ฝ๋๊ฐ 201์ด์ด์ ํจ์๋ฅผ ๊ทธ๋๋ก ์ข ๋ฃ
Ex. '1230192314802471024333333333332433256164', 'asdf5625435', ';;;;'
-
ํ๊ตญ์ด๋ฅผ id๋ก ๋์ง๋ ๋ฑ ์ด์ธ์ ์ํฉ์์๋ ํด๋น ์๋ฌ๋ฅผ ๊ทธ๋๋ก ์์ธ ์ฒ๋ฆฌ
Ex. '๊ฐ์์ง'
-
-
-
autocomplete_search_text
๐ ์ฝ๋ ํ์ธ- ๊ฒ์์ด ์๋์์ฑ API์ ๋๋ค.
- ํ๋ก ํธ์์ ๊ฒ์์ด ํ ์คํธ๊ฐ ์ ๋ ฅ๋ ๋๋ง๋ค API๊ฐ ํธ์ถ๋ฉ๋๋ค.
- DB์์ ์ ์ฅ๋ ๊ฒ์์ด ์ค ํด๋น ํ ์คํธ๊ฐ ํฌํจ๋ ๋ชจ๋ ๊ฒ์์ด๋ฅผ ์กฐํํด ๋ฆฌํดํฉ๋๋ค.
- ๊ฒ์์ด ํ ์คํธ๋ ์์ด ๋ฐ ์ซ์๋ง ์ ๋ ฅ๋ฐ์ ์ ์๊ฒ parameter์์ validationํฉ๋๋ค.
โ
User ์ ๋ณด์ ๋ํ CRUD API ๊ตฌํ
-
create_me
๐ ์ฝ๋ ํ์ธ- ์ ์ ์ ๋ณด๋ฅผ ์ ๋ ฅ ๋ฐ์ ์๋ก์ด ์ ์ ๋ฅผ DB์ ์์ฑํ๊ณ ๋ฆฌํดํฉ๋๋ค.
- ํจ์ค์๋๋
passlib
๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก bcrypt ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํด ํด์ํ์ฌ ์ ์ฅํฉ๋๋ค. - DB์ ์ ์ ์กด์ฌ ์ ๋ฌด๋ ์ด๋ฉ์ผ์ ํ์ฉํด ํ์ธํฉ๋๋ค.
-
read_me
๐ ์ฝ๋ ํ์ธget_current_user
dependency๋ฅผ ์ฌ์ฉํด ํ์ฌ ์ ์ ์ ๋ณด๋ฅผ DB์์ ์กฐํํ๊ณ ๋ฆฌํดํฉ๋๋ค.
-
update_me
๐ ์ฝ๋ ํ์ธget_current_user
dependency๋ฅผ ์ฌ์ฉํด ํ์ฌ ์ ์ ์ ๋ณด๋ฅผ DB์์ ์กฐํํ๊ณ , ์ ๋ ฅ๋ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ DB์์ ์์ ํ์ฌ ๋ฆฌํดํฉ๋๋ค.- ์ฌ์ฉ์ ์ ๋ณด๋ Patch method๋ก ์ ๋ฌํฉ๋๋ค. (Partial updateํฉ๋๋ค.)
- ๋ค๋ง, ์ด๋ฉ์ผ์ ์์ ํ ์ ์์ต๋๋ค.
-
delete_me
๐ ์ฝ๋ ํ์ธget_current_user
dependency๋ฅผ ์ฌ์ฉํด ํ์ฌ ์ ์ ์ ๋ณด๋ฅผ DB์์ ์กฐํํ๊ณ ์ญ์ ํฉ๋๋ค.
โ
JWT Athentication ๋ฐ Authorization API ๊ตฌํ
-
login_for_access_token
๐ ์ฝ๋ ํ์ธ- ๋ก๊ทธ์ธ์ ํตํด authentication์ ์งํํ์ฌ ์ธ์ฆ๋ ์ฌ์ฉ์๋ผ๋ฉด JWT token์ ๋ฐ๊ธํด์ฃผ๋ API์ ๋๋ค.
- ๋ฐ๊ธ๋ JWT๋ ํ๋ก ํธ ์ธก์์ ์ฟ ํค๋ก ์ ์ฅ๋ฉ๋๋ค.
- ํ๋ก ํธ ์ธก์์๋ ๋ง๋ฃ ๋ ์ง(1 day)๋ฅผ ๋์ผํ๊ฒ ์ค์ ํด, ํ ํฐ์ ๋ง๋ฃ์ ๋ธ๋ผ์ฐ์ ์์ ํ ํฐ์ด ์๋์ผ๋ก ์ ๊ฑฐ๋๋ ๊ฒ์ด ๋์์ ์ด๋ค์ง๊ฒ ํ์ต๋๋ค.
-
verify_access_token
๐ ์ฝ๋ ํ์ธ- ์ ํจํ token์ธ์ง authorizationํด์ฃผ๋ API์ ๋๋ค.
- ํ๋ก ํธ์์ ํน์ ํ์ด์ง ์ ๊ทผ์ ํ์๋ง ํ ์ ์๋๋ก ์ ํํ๊ธฐ ์ํด ๋ง๋ค์์ต๋๋ค.
โ
-
get_current_user
๐ ์ฝ๋ ํ์ธ- HTTP header๋ก JWT ํ ํฐ์ ์ ๋ฌ ๋ฐ์ผ๋ฉด token์ decodingํด ๊ฒ์ฆํ๊ณ , ํ์ฌ ์ฌ์ฉ์์ DB ์กด์ฌ ์ ๋ฌด ๋ฐ ์ ๋ณด๋ฅผ ๋ฆฌํดํฉ๋๋ค.
creat_me
,login_for_access_token
์ ์ ์ธํ ๋ชจ๋ API๋ฅผ authorizationํ๋๋ฐ ์ฌ์ฉํฉ๋๋ค.
-
get_db
๐ ์ฝ๋ ํ์ธ- DB session์ ์ด์ด DB ์์ ์ด ํ์ํ API์ ์ ์ ๋๊ฒจ์ฃผ๊ณ , ์์ ์ด ๋๋๋ฉด ๋ค์ session์ ๋๋ ค๋ฐ์ ๋ซ์ต๋๋ค.
โ
- Zapiex API๋ ํด๋์ค๋ก ๋ง๋ค์ด ์ฌ์ฉํ์ต๋๋ค. ๐ ์ฝ๋ ํ์ธ
- ๋ณด์์ด ํ์ํ ์ ๋ณด๋ ํ๊ฒฝ๋ณ์์ ์ ์ฅํด ์ฌ์ฉํ์ต๋๋ค. (API key, JWT secret key, DB information...) ๐ ์ฝ๋ ํ์ธ
- CORS ๋ฌธ์ ๋ ๋ฏธ๋ค์จ์ด(Middleware)๋ฅผ ์ด์ฉํด ํ์ฉํ์ต๋๋ค. ๐ ์ฝ๋ ํ์ธ
โ
-
ํน์ ์ํฉ์ Alembic autogeneration์ด ์ ๊ฐ์งํ์ง ๋ชปํ๋ ๋ฌธ์ ๐ ์ฝ๋ ํ์ธ
- Column์ ํ์ ๋ณํ ๊ฐ์ alter ๊ด๋ จ ํ ์ด๋ธ ๋ณํ๊ฐ autogeneration ์ ์ ๋ฐ์๋์ง ์์์ต๋๋ค.
run_migrations_offline
๋ฐrun_migrations_online
์compare_type=True
๋ฅผ ์ค์ ํด์ ํด๊ฒฐ
-
Zapiex API ํธ์ถ ์ ์ํ ์ ๋ณด ๋ฆฌ์คํธ์ ๊ฐฏ์๊ฐ ๊ท ์ผํ๊ฒ ์ค์ง ์๋ ํ์ ๐ ์ฝ๋ ํ์ธ
- 20๊ฐ์ ์ํ์ ๋ํ ์ ๋ณด ๋ฆฌ์คํธ๊ฐ ์์ผํ๋๋ฐ, ์ฝ 15~18๊ฐ๊ฐ ๋ฌด์์๋ก ์ค๋ ํ์์ด ๋ฐ์ํ์ต๋๋ค.
- API document์์ AliExpress-promoted products๋ ๊ท๊ฒฉ์ด ๋ง์ง ์์ ์ ์ธํ๊ณ ๋ณด๋ด์ง๋ค๋ ์ ์ ํ์ธํ์ต๋๋ค.
- ํ๋ก ํธ ์ธก์์ ๋ช๋ช ์์ดํ ์ด ์ ์ธ๋๋๋ผ๋ ์์ ํ๊ฒ 12๊ฐ์ฉ paginationํ๋ ๋ฐฉ์์ผ๋ก ํด๊ฒฐํ์ต๋๋ค.
-
Product detail ๊ด๋ จ Zapiex API๋ฅผ ํธ์ถํ ์ input์ผ๋ก ์ฌ์ฉ๋๋ id์ ์ข ๋ฅ์ ๋ฐ๋ผ ๋ค๋ฅธ ์ํ์ฝ๋ ์๋ต ๐ ์ฝ๋ ํ์ธ
- ๋น์ ์์ ์ธ input์ด ๋ ์ ์๋ ๊ฒฝ์ฐ๋ฅผ ์๋ํด๋ณด๋ฉด์ ๊ฒฝ์ฐ์ ์๋ฅผ ๋๋๋ฉฐ ํด๊ฒฐํ์ต๋๋ค.
-
datetime
๊ฐ์ฒด ๋น๊ต ์๋ฌ (search_items_by_text
,create_details
API) ๐ ์ฝ๋ ํ์ธ- update date๋ฅผ ๋น๊ตํ ๋,
TypeError: can't compare offset-naive and offset-aware datetimes
๋ฐ์ํ์ต๋๋ค. - ์๊ฐ๋๊ฐ ํฌํจ๋ aware ํ์ datetime ๊ฐ์ฒด(DB์ date)์ ๊ทธ๋ ์ง ์์ naive ํ์ datetime ๊ฐ์ฒด(์๋ก ๋ง๋ date) ๊ฐ ๋น๊ต๋ก ์ธํ ๋ฌธ์ ์์ต๋๋ค.
pytz
๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํด naive ํ์ ๊ฐ์ฒด๋ฅผ aware ํ์ ์ผ๋ก ๋ฐ๊ฟ์ ํด๊ฒฐํ์ต๋๋ค.
- update date๋ฅผ ๋น๊ตํ ๋,
-
fastapi_pagination
์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ ์ฉ ์ ์๋ฒ ๋ฐฐํฌ ์๋ฌ ๐ ์ฝ๋ ํ์ธ- ์๋ ๊ฒ์์ด ์๋ ์์ฑ API์๋
fastapi_pagination
๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ ์ฉํด pagination์ ๊ตฌํํ์ต๋๋ค. - ๋ค๋ง, Heroku ์๋ฒ ๋ฐฐํฌ ์
TypeError: typing.ClassVar...
๊ฐ ๋ฐ์ํ์ต๋๋ค. fastapi_pagination
์ ์ ์ฉํ ๋ FastApi app ์ธ์คํด์ค๋ฅผ ๊ฐ์ธ nested ๋๋ ๋ถ๋ถ์ด ์กด์ฌํ๋๋ฐ, ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๊ธฐ๋ณธ ์ฌ์ฉ๋ฒ์ ํด๋นํ๋ ๋ถ๋ถ์ด๋ผ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ฌธ์ ๊ฐ ์๋ค๊ณ ํ๋จํ์ต๋๋ค.- ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ ์ฉ์ ํด์ ํ๋ ๋ฐฉํฅ์ผ๋ก ํด๊ฒฐํ์ต๋๋ค.
- ์๋ ๊ฒ์์ด ์๋ ์์ฑ API์๋
โ
- ํ์ด์ง๊ฐ ๋ณํํด๋ Header, Footer ์ปดํฌ๋ํธ๋ ์ ์ง๋๋ SPA(Single Page Application) ํํ๋ก ์ ์ํ์ต๋๋ค.
- ํ์ ๊ฐ์ , ๋ก๊ทธ์ธ, ์๋น์ค ์๊ฐ, ์ํ ๋ฆฌ์คํธ, ํน์ ์ํ ์ ๋ณด ํ์ด์ง๋ฅผ ๊ตฌํํ์ต๋๋ค. ๐ ์ฝ๋ ํ์ธ
- Product detail ํ์ด์ง๋ ๋ชจ๋ ํ์ด์ง๋ฅผ ๋ฏธ๋ฆฌ ์์ฑํด๋ ์ ์์ผ๋ฏ๋ก ์๋ฒ ์ฌ์ด๋ ๋๋๋ง(Server-side rendering)์ผ๋ก ๊ตฌํํ๊ณ , ๊ทธ ์ธ์ ํ์ด์ง๋ ํด๋ผ์ด์ธํธ ์ฌ์ด๋ ๋๋๋ง(Client-side rendering)์ผ๋ก ๊ตฌํํ์ต๋๋ค. ๐ ์ฝ๋ ํ์ธ
- ํน์ ํ์ด์ง๋ ๋ก๊ทธ์ธ์ ํ์ ๊ฒฝ์ฐ์๋ง ์ ๊ทผ ๊ฐ๋ฅํ๋๋ก ๊ตฌํํ์ต๋๋ค. ๐ ์ฝ๋ ์์ ํ์ธ
- ๊ฒ์์ด๋ฅผ ์
๋ ฅํ ๋๋ง๋ค API ํธ์ถ๋ก ์๋ ์์ฑ๋๋๋ก
Autocomplete
์ปดํฌ๋ํธ๋ฅผ ๊ตฌํํ์ต๋๋ค. ๐ ์ฝ๋ ํ์ธ - ์ํ ๋ฆฌ์คํธ ํ์ด์ง์ pagination ๊ธฐ๋ฅ์ ๋ถ์ฌํ๋
Pagination
์ปดํฌ๋ํธ๋ฅผ ๊ตฌํํ์ต๋๋ค. ๐ ์ฝ๋ ํ์ธ - Bootstrap์ผ๋ก ๋์์ธ์ ์ ์ฉํ์ต๋๋ค.
โ