과제2) 장고 심화 개인 과제2222
전 글이 궁금하다면?
https://hsjoo126.tistory.com/51
과제2) 장고 심화 개인과제! 또과? (또 과제냐는 뜻)
과제 한 게 엊그제 같은데... 또 돌아왔다! 과제....저번이랑 같은 기능을 구현해야하지만 이번에는 DRF를 사용해야한다!이번엔 프론트 엔드가 없다. 잘 되는지는 포스트맨으로 테스트할 것이기
hsjoo126.tistory.com
0. 깃 레포지토리 만들고 연결하기
0-1. 브랜치 나누기 (products, accounts) **main은 나중에 합칠 때만 쓰기
0-2. 가상환경
0-3. pip install
0-4. git-ignore 만들기
1. spartamarket_DRF 프로젝트 만들기
2. accounts앱 생성하고 등록하기
3. models.py 작성하기
3-1. AUTH_USER_MODEL 셋팅스에 등록
3-2. makemigrations, migrate 하기
4. urls들 다 연결해주기
회원가입 기능
5. accounts->urls작성하기 (api/accounts/)
6. accounts view 로직 작성하기
7. 포스트맨 실행해보기 method는 POST
--------------커밋하기---------------
로그인 기능
8. accounts->urls작성하기 (api/accounts/login)
9. login view 로직 작성하기
10. 포스트맨 실행해보기 method는 POST
--------------커밋하기---------------
프로필 조회기능
11. accounts->urls작성하기 (api/accounts/<str:username>)
12. ??? view 로직 작성하기
13. 포스트맨 실행해보기 method는 GET
--------------커밋하기---------------
어제 전체적인 그림을 짜다가 끝났다 오늘 이어서 하면 될 거같은데
어제 하면서 생겼던 의문이 클래스형 view와 함수형 view중에 난 뭘써야하지? 하는 의문이 들었다.
그래서 강의를 다시 찾아봤는데, endpoint는 같지만 method에 따라서 여러개가 나올 때 클래스형 뷰를 쓰면 좋다고 했다.
예를 들어서 endpoint는 같은 .../product/1/ 이고 method가
post 면 게시글 작성
get 이면 게시글 읽기
put 이면 게시글 수정
delete 면 게시글 삭제
가 될 수 있다.
표로 표현하면 다음과 같다.
어쨌든, 클래스와 함수형은 대략적으로 감이 잡혔다.
근데 로그인 관련된 애들은 endpoint가 다다르니까
그냥 함수형 뷰 써도 될거같은디... ㅋㅋㅋㅋㅋㅋ
회원가입 - Endpoint: `/api/accounts`
로그인 - Endpoint: `/api/accounts/login`
프로필 조회 - Endpoint: `/api/accounts/<str:username>`
오케 그럼 함수형 뷰 쓰는 걸로 결정하고 그 다음으로 넘어가보자~
이쯤에서 다시보는 필수 기능들!
필수 기능 - MVP(Minimum Viable Product)
-회원가입
- Endpoint: `/api/accounts`
- Method: `POST`
- 조건: username, 비밀번호, 이메일, 이름, 닉네임, 생일 필수 입력하며 성별, 자기소개 생략 가능
- 검증: username과 이메일은 유일해야 하며, 이메일 중복 검증(선택 기능).
- 구현: 데이터 검증 후 저장.
-로그인
- Endpoint: `/api/accounts/login`
- Method**: `POST`
- 조건: 사용자명과 비밀번호 입력 필요.
- 검증: 사용자명과 비밀번호가 데이터베이스의 기록과 일치해야 함.
- 구현: 성공적인 로그인 시 토큰을 발급하고, 실패 시 적절한 에러 메시지를 반환.
- 프로필 조회
- Endpoint: `/api/accounts/<str:username>`
- Method: `GET`
- 조건: 로그인 상태 필요.
- 검증: 로그인 한 사용자만 프로필 조회 가능
- 구현: 로그인한 사용자의 정보를 JSON 형태로 반환.
#---------------------------------------------------------
상품 관련 기능 및 조건
- 상품 등록
- 상품 목록 조회
- 상품 수정
- 상품 삭제
필수 기능 - MVP(Minimum Viable Product)
- 상품 등록
- Endpoint: `/api/products`
- Method: `POST`
- 조건: 로그인 상태, 제목과 내용, 상품 이미지 입력 필요.
- 구현: 새 게시글 생성 및 데이터베이스 저장.
- 상품 목록 조회
- Endpoint: `/api/products`
- Method: `GET`
- 조건: 로그인 상태 불필요.
- 구현: 모든 상품 목록 페이지네이션으로 반환.
- 상품 수정
- Endpoint: `/api/products/<int:productId>`
- Method: `PUT`
- 조건: 로그인 상태, 수정 권한 있는 사용자(게시글 작성자)만 가능.
- 검증: 요청자가 게시글의 작성자와 일치하는지 확인.
- 구현: 입력된 정보로 기존 상품 정보를 업데이트.
- 상품 삭제
- Endpoint: `/api/products/<int:productId>`
- Method: `DELETE`
- 조건: 로그인 상태, 삭제 권한 있는 사용자(게시글 작성자)만 가능.
- 검증: 요청자가 게시글의 작성자와 일치하는지 확인.
- 구현: 해당 상품을 데이터베이스에서 삭제.
이제 상품 관련된 걸 하면 된다.
14. products 앱 생성, 등록하기
15. models.py 작성
16. makemigrations, migrate 하기
상품등록 기능 (post)
17. products->urls작성하기 (api/products/)
18. products view 로직 작성하기 (클래스형뷰)
18-1. 상품 이미지 등록은 어떻게 하는 건지 알아보기
19. 포스트맨 실행해보기 method는 POST
--------------커밋하기---------------
상품목록조회 기능 (get)
20. products->urls작성하기 (api/products/)
21. products view 로직 작성하기 (클래스형뷰)
21-1. 페이지네이션...?
22. 포스트맨 실행해보기 method는 GET
--------------커밋하기---------------
상품수정 기능 (get)
23. products->urls작성하기 (api/products/<int:productsID>)
24. products view 로직 작성하기 (클래스형뷰)
25. 포스트맨 실행해보기 method는 PUT
--------------커밋하기---------------
상품삭제 기능 (get)
26. products->urls작성하기 (api/products/<int:productsID>)
27. products view 로직 작성하기 (클래스형뷰)
28. 포스트맨 실행해보기 method는 DELETE
--------------커밋하기---------------
다 한 거 같은데...? ㅋㅋㅋㅋㅋ 체크리스트 소환!
#1. ERD 그리기
#2. 전체적인 그림 생각해보기
3. accounts 만들기
4. products 만들기
++ 포스트맨으로 계속 체크하기
오케 절반은 했다!!
이제 본격적으로 해봅시다~
전체 체크리스트
- 0. 깃 레포지토리 만들고 연결하기
- 0-1. 브랜치 나누기 (products, accounts) **main은 나중에 합칠 때만 쓰기
- 0-2. 가상환경
- 0-3. pip install
- 0-4. git-ignore 만들기
- 1. spartamarket_DRF 프로젝트 만들기
- 2. accounts앱 생성하고 등록하기
- 3. models.py 작성하기
- 3-1. AUTH_USER_MODEL 셋팅스에 등록
- 3-2. makemigrations, migrate 하기
- 4. urls들 다 연결해주기
회원가입 기능
- 5. accounts->urls작성하기 (api/accounts/)
- 6. accounts view 로직 작성하기
- 7. 포스트맨 실행해보기 method는 POST
--------------커밋하기---------------
로그인 기능
- 8. accounts->urls작성하기 (api/accounts/login)
- 9. login view 로직 작성하기
- 10. 포스트맨 실행해보기 method는 POST
--------------커밋하기---------------
프로필 조회기능
- 11. accounts->urls작성하기 (api/accounts/<str:username>)
- 12. ??? view 로직 작성하기 (과정이 시리얼라이져 json)
- 13. 포스트맨 실행해보기 method는 GET
--------------커밋하기---------------
- 14. products 앱 생성, 등록하기
- 15. models.py 작성
- 16. makemigrations, migrate 하기
- 17. urls들 다 연결해주기
상품등록 기능 (post)
- 18. products->urls작성하기 (api/products/)
- 19. products view 로직 작성하기 (클래스형뷰)
- 19-1. 상품 이미지 등록은 어떻게 하는 건지 알아보기
- 20. 포스트맨 실행해보기 method는 POST
--------------커밋하기---------------
상품목록조회 기능 (get)
- 21. products->urls작성하기 (api/products/)
- 22. products view 로직 작성하기 (클래스형뷰)
- 22-1. 페이지네이션...?
- 23. 포스트맨 실행해보기 method는 GET
--------------커밋하기---------------
상품수정 기능 (get)
- 24. products->urls작성하기 (api/products/<int:productsID>)
- 25. products view 로직 작성하기 (클래스형뷰)
- 26. 포스트맨 실행해보기 method는 PUT
--------------커밋하기---------------
상품삭제 기능 (DELETE)
- 27. products->urls작성하기 (api/products/<int:productsID>)
- 28. products view 로직 작성하기 (클래스형뷰)
- 29. 포스트맨 실행해보기 method는 DELETE
--------------커밋하기---------------
본격적으로 시작!
튜터님이 상품관련 먼저 만들라고 하셔서.. 아마 뒤에 체크리스트 먼저 할 거 같다! 순서 바꾸는 건 무리무리...
- 0. 깃 레포지토리 만들고 연결하기 (만들고 두번째거 복사해서 터미널에 그대로 붙이기)
echo "# spartamarket_DRF" >> README.md
git init
git add README.md
git commit -m "first commit"
git branch -M main
git remote add origin 레파지토리 주소.git
git push -u origin main
- 0-1. 브랜치 나누기 (products, accounts) **main은 나중에 합칠 때만 쓰기
#브랜치 만들고 그 브랜치로 이동하기
git switch -c 브랜치명
#브랜치 이동하기
git switch 브랜치명
- 0-2. 가상환경
#가상환경 활성화하기
#맥
source .venv/bin/activate
#윈도우
source .venv/Scripts/activate
- 0-3. pip install
#requirements.txt 에 있는 거 다 설치하기
pip install -r requirements.txt
- 0-4. .gitignore 만들기
- 1. spartamarket_DRF 프로젝트 만들기
django-admin startproject spartamarket_DRF
- 2. accounts앱 생성하고 등록하기 (브랜치 이동 후)
python manage.py startapp accounts
- 3. models.py 작성하기
- 3-1. AUTH_USER_MODEL 셋팅스에 등록
- 3-2. makemigrations, migrate 하기
python manage.py makemigrations
python manage.py migrate
- 4. urls들 다 연결해주기
- 14. products 앱 생성, 등록하기 (브랜치 이동 후)
- 15. models.py 작성
- 16. makemigrations, migrate 하기
- 17. urls들 다 연결해주기
------------------이 상태로 커밋 ㄱㄱㄱ "모델, url등 기본 세팅 완료"-----------------
#올릴 거 선택
git add .
#커밋하기
git commit -m "커밋할 메세지"
#깃에 올리기
git push
아 그러고보니까... 이상태로 products 브랜치로 올리면... 음....
accounts까지 다같이 올라가버리네.. 하하하하
Q.튜터님께 찾아가서 accounts, products 따로따로 깃에 못 올리냐고 했는데,
다음과 같은 답변을 받았다.
A.
1. 현업에서는 git add . 을 많이 쓰지 않는다.
2. 보통은 기능별로 프로젝트가 다 따로 있다.
그래서 애초에 브랜치가 겹치지 않는다
2-1.팀원 1이 accounts, 팀원 2가 products를 만든다고 했을 때
각자 컴퓨터에서 각자 프로젝트를 만들고 기능을 만든다. 그래서 겹칠 일이 없다
즉, 나같은 경우는 혼자 작업하기에 생긴 현상!
3. 굳이 따로따로 올리고싶다면 gitignore를 활용해야한다.
accounts를 커밋하고 싶다면 products를 gitignore에 넣고 ..
4. 개발자들이 혼자 작업할 때 보통 브랜치를 프론트엔드, 백엔드 이런식으로 나눈다.
결론.
-이번에는 어쩔 수 없다. 팀플 때 브랜치 나누는 연습을 하자
-그대신 커밋메세지는 자세히 남기자
커밋완료
튜터님의 조언대로~ 커밋 메세지를 길게 자세하게 남겼다!
상품등록 기능 (post)
- 18. products->urls작성하기 (api/products/)
- 19. products view 로직 작성하기 (클래스형뷰)
- 19-1. 상품 이미지 등록은 어떻게 하는 건지 알아보기
- 20. 포스트맨 실행해보기 method는 POST
아 어떡하지~~ title과 content은 완성 했는데 author부분을 로그인연계해서 어떡할지 고민이다
상품 이미지 등록도 안 해봐가지고... 일단 튜터님이 로그인 관련된 건 내일 알려주시겠다고 했으니
이미지 먼저 어떡할지 찾아봐야겠다..
토큰 으악!
후.... 로그인한 유저만 글 작성 가능, 조회는 누구든 할 수 있어야함 ;;;;
강의에는 permission_classes = [IsAuthenticated] 이 코드만 나와있는데
이건 조회든 뭐든 다 로그인한 유저만 볼 수 있음....
방법이 없을까 하다가 공식문서 열심히 뒤져서 찾은 키워드 IsAuthenticatedOrReadOnly
그리고 구글링해서 찾은 링크https://heokknkn.tistory.com/50
permission_classes = [IsAuthenticatedOrReadOnly]
이 권한은 API에서 익명 사용자에게 읽기 권한을 허용하고 인증된 사용자에게 쓰기 권한만 허용하려는 경우에 적합합니다.
즉 「IsAuthenticatedOrReadOnly」을 써주면 get은 할 수 있습니다 !
하지만 post던, put, delete의 관계없이 전부다 인증 된 사용자에게만 액세스를 허용합니다 !
내가 원하는 기능을 공식문서와 구글링해서 찾는 게 이렇게 짜릿할 줄이야 ㅋㅋㅋㅋㅋ 도파민 빡 돈다 이제 다음거 하러간ㄷ
오늘내로 products 다 짜고 잔다 진짜로
--------------커밋하기---------------
상품목록조회 기능 (get)
- 21. products->urls작성하기 (api/products/)
- 22. products view 로직 작성하기 (클래스형뷰)
#pip
pip install django-seed
#앱 등록
"django_seed"
#데이터생성
python manage.py seed articles --number=30
- 22-1. 페이지네이션...?
- 23. 포스트맨 실행해보기 method는 GET
--------------커밋하기---------------
상품수정 기능 (PUT)
- 24. products->urls작성하기 (api/products/<int:productsID>)
- 25. products view 로직 작성하기 (클래스형뷰)
- 26. 포스트맨 실행해보기 method는 PUT
--------------커밋하기---------------
상품삭제 기능 (DELETE)
- 27. products->urls작성하기 (api/products/<int:productsID>)
- 28. products view 로직 작성하기 (클래스형뷰)
- 29. 포스트맨 실행해보기 method는 DELETE
--------------커밋하기---------------
다한 건가..? 갑자기 각성해서 수정하고 삭제 기능은 걍 논스탑으로 달려버림ㅋㅋㅋㅋㅋㅋㅋ
아 웃기다.... 이제 위에서 못 했던 이미지 등록 기능만 하면 상품은 끝!
다시 확인 해보니 좀 실수한 게 있어서 수정하고 커밋 하고 어쩌구...
이미지 등록 기능은 내일 할 것이다. ...... 난 자러갈거야 이제.....
내일의 승주에게 남기는 체크리스트
- 노션 보고 static & media 공부하기
- 이미지 등록하기
회원가입 기능
- 5. accounts->urls작성하기 (api/accounts/)
- 6. accounts view 로직 작성하기
- 7. 포스트맨 실행해보기 method는 POST
--------------커밋하기---------------
로그인 기능
- 8. accounts->urls작성하기 (api/accounts/login)
- 9. login view 로직 작성하기
- 10. 포스트맨 실행해보기 method는 POST
--------------커밋하기---------------
프로필 조회기능
- 11. accounts->urls작성하기 (api/accounts/<str:username>)
- 12. ??? view 로직 작성하기 (과정이 시리얼라이져 json)
- 13. 포스트맨 실행해보기 method는 GET
--------------커밋하기---------------
- 14. products 앱 생성, 등록하기
- 15. models.py 작성
- 16. makemigrations, migrate 하기
- 17. urls들 다 연결해주기