내일배움캠프 38일차

2023년 05월 09일 by barryjung

    내일배움캠프 38일차 목차

[오늘 한일]

  • 팀프로젝트 진행
  • JS 프론트엔드 구축 공부

 

[오늘 배운점]

 

장고

<모델에 여러개 pk키를 만들수 없다>

유저 기능을 맡으신 팀원분께서,

유저 모델을 계획하실때 id와 username을 둘다 pk키로 두셨다.

 

실제 오늘 모델을 작성하시고 테스트 해보셨는데,

결론적으로 여러개 필드를 pk로 설정할수 없었다.

 

class User(AbstractBaseUser):
(중략)
    username = models.CharField(max_length=32, unique=True, primary_key=True)

작성하신 User모델에 해당 부분이다.

username에 primary_key 속성을 True로 부여하여, pk로 삼을 수 있다.

이럴 경우 원래 기본 pk인 id는 필드가 생성되지 않는다.

id는 사용처가 많기 때문에 꼭 필요하다.

 

username에 해당 속성을 주면서 pk_id도 제대로 생성되게 할수는 없는지 확인해봤다.

장고 문서에 보니 장고는 오직 하나의 pk키를 지원한다고 한다.

https://django.readthedocs.io/en/stable/faq/models.html

 

해당 안내에는 pk키가 하나인것이 문제가 되지 않을 것이라고도 적혀있다.

결국 우리는 id를 pk로 두고,

username은 unique한 속성을 가진 한 필드로 두기로 했다.

 

결론, 장고에서는 여러개 pk키를 지원하지 않는다.

 


<마이그레이션 파일도 커밋의 대상>

장고 각 앱 폴더 아래에는 마이그레이션 폴더와 그 파일들이 있다.

이 부분은 gitignore.io에서 추출한 gitignore에서는 제외 대상이 아니다.

즉, 공유해도 되는 파일이라는 뜻인데,

그동안 나는 db가 각자 따로이다보니, 이것도 따로라고 생각해 커밋의 대상으로 삼지 않았었다.

 

그런데 오늘 프로젝트를 진행하며 이 문제를 다시 마주하게 되었고,

팀원분과 얘기해본 결과, 마이그레이션 파일들은 커밋의 대상이 되는게 적합하다고 배우게 되었다.

 

앱 기능 작성자가, 작성한 모델을 makemigrations 시킨다.

그럼 migration 폴더와 파일들이 생기게 된다.

이 파일들을 커밋하게 되면 내려받은 다른 팀원은 migrate만 시키면 된다.

해당 파일들 덕분에 migration이 잡혀있는 셈이 된다.

 

다만 유저모델에 관해서는 아래와 같은 에러가 날수 있다.

django.db.migrations.exceptions.InconsistentMigrationHistory: Migration admin.0001_initial is applied before its dependency user.0001_initial on database 'default'.

이런 경우 sqlite3파일을 제거하고 migrate하면 된다.

(초기 상태로 migrate를 한차례 했었을때 위 에러가 나온다.)

기존 모델에서 변경점이 생겼을때 위와 같이 해줘야 한다.

 

 


<커밋 메세지는 수정가능>

내 마지막 커밋은 커밋메세지를 수정할수 있다.

명령어는 git commit --amend이다.

vscode의 소스제어에서도 해당 기능버튼이 있다.

 

<pull request title도 수정가능>

pull request의 제목은 별도로 적어주는 부분이다.

만약 고치고 싶다면 pull request로 들어가면 Title 옆에 edit 버튼으로 수정할 수 있다.

 


JS

<JS 프론트엔드 알게된 포인트들>

- java script에 변수 선언, const는 변하지 않을, let은 변할수 있는 변수를 선언할때 사용한다.

- script에서 html본문에서 태그등 본문을 가져올때,

html파일에서 script태그(임포트하는)는 바디의 맨밑에 적는다.

그래야 처리 속도차이로 못가져오는 일 없이 잘 불러올수 있다. 

- classlist.toggle 없으면 넣고, 있으면 뺀다. 좋아요 버튼을 만드는데 적합하다.

- Array.from(listItem).forEach() 클래스명을 이용한 엘리먼트와 짝으로 사용된다.

리스트를 배열로 바꿔주는데, 불필요한 부분도 빼준다.

- 엘리먼트에 .id, .innerText, .innerHTML등으로 태그에서 필요한 부분을 골라낸다.

- 가공된 엘리먼트를 다시 html로 넣을때는 append()를 쓴다.

appendchild()로 가공중인 엘리먼트에 자식 태그를 붙일수 있다. 

- .previousSibling 같은 형제태그중 바로 앞태그를 가져온다.

다른 함수도 있을것 같지만 우선 이것만 익혀봤다.

 

html

- onclick(this) 해당 태그를 인자로 실어보낸다. 이는 JS에서 엘리먼트로 바로 활용가능.

- ul. unordered list 점자를 찍는 리스트이다.

- ol. ordered list 숫자로 나열하는 리스트이다.

- 부트스트랩을 쓸때는 구역을 컨테이너로 잡는 것부터 시작한다.