Django에서 웹개발을 하면서 Software Test를 공부하게 되었는데 가장 함수의 작은 단위를 쪼개서 테스트 해보는 것이 바로 Unit Test 이다. 유닛 테스트 (Unit Test) 작은 코드를 테스트 단위로 진행해야함 빠르게 실행되야함 독립된 상태로 테스트되야함 Mocking이란? 객체 A가 객체 B에 의존성이 있고 객체 B는 의존성이 없는 독립된 객체라고 가정하자. 객체 B를 유닛테스트하는데 아무런 문제가 생기지 않지만, 객체 A를 유닛 테스트 하기 위해선 B의 동작이 필요한데 이를 예상해서 정의하는 행위가 Mocking 이라고 한다. 유닛 테스트를 하다보면 인스턴스 혹은 함수들이 db에 hit을 해야 동작하는 경우가 있다. 그러나 유닛테스트에서 실제 db를 hit하게되면 얼마나 비효율적인지 생각해봐야 할 필요가있다. 빠르게 실행되기 위해 db를 hit하지 않고 hit 한 결과를 예상해서 유닛 테스트 결과를 확인하고자 우리는 django 에서
실제 서비스들은 자체적으로 클라우드에 파일을 저장해서 클라이언트에게 소유한 서버에 존재하는 정보들을 전달해준다. 이를 이해하기 위해서 이번 프로젝트에서 그 유명한 AWS S3 클라우드 서비스를 활용한 파일을 업로드하고 클라이언트에게 보여주는 서비스를 구현해보았다. 일단 진행하기에 앞서 나는 몇가지 세팅을 하였으니 참고하여 보길 권장한다. 위의 패키지는 django에서 s3에 연결을 도와주는 모듈이므로 필수적으로 설치해야한다. 그리고 AWS 사이트에 접속후 S3 서비스를 이용하는 방법을 알아보자. S3 서비스를 검색 후 들어가보면 버킷을 만들 수 있다. 버킷을 만들기를 클릭하면 에 저장하는 것을 해보았다. 위의 메서드를 보고 무엇인지 이해를 하기 힘들 것이다. 쉽게 말하자면, Form-data 형식의 데이터를 전송받으면 크게 두가지로 나눠서 전송을 받게된다. text 형식의 데이터 : 이름, 이메일, 전화번호, ETC file 형식의 데이터 : jpeg, png, mp3, ETC 두가지 형식의 데이터를 나눠서 전송받기 때문에 받은 데이터에서 원하는 정보를 추출하는 메서드도 두개로 존재한다는 것이다.  위와 같이 여러 과정을 하나의 과정으로 취급하는 방식 과정중 하나의 프로세스가 안되면 전체 프로세스가 안되는 원자성을 띄고 있다. 모든 과정이 통과하면 : COMMIT 과정 중 비정상 종료 및 취소 : ROLLBACK 데이터베이스적 측면에서 확인하면 transaction 작업중 실패하면 데이터에 반영되지 않는다. 반대로 transaction 작업이 성공하면 모든 작업으로 발생한 데이터의 변화가 반영된다. 사용법 Django 프로젝트 안에 settings.py 에서 ATOMIC_REQUESTS = True 라고 세팅해준다. 데코레이터를 사용한 transaction 사용 데코레이터를 사용하여 위와
bulk_create 사용하는 법 위와 같이 간단히 모델링된 테이블에 데이터를 많이 작성하고자 할 때 for 혹은 while문을 사용하여 매번 create명령을 실행하는 것보다 리스트를 만들어 bulk_create로 한꺼번에 데이터를 넣는 것이 효율적이다. 시간적, 효율적인 측면에서 bulk_create가 확실한 이점을 갖고있지만 사용하기에 다음과 같은 제약이 있다. save(), clean() 등의 기본 model 메서드를 사용할 수 없다는 점 ForeignKey를 참조하고 있으면 사용할 수 없다는 점 기본 메서드를 사용할 수 없는 이유를 찾아보니 DB에 직접 넣는 방법이라 django model 메서드를 사용할 수 없다고 한다. 그리고 같은 이유에서 참조하고있는 데이터를 django model 메서드를 통해 연결을 해야하기 때문에 외래키 참조에 제약이 있다고 한다. 위와 같은 제약조건이 있지만 만약 사용할 수 있는 환경이 갖추어진
데이터 베이스를 모델링 하던 중 멘토님으로부터 리뷰를 받은 사항이 있다. 카테고리와 같은 데이터들은 Enum class와 IntegerChoices필드를 공부하여 사용해보았으면 좋겠다는 점이었다. 써야하는 이유를 공부하면서 깨달았는데, 회원가입, 글작성, 제품등록 등 과 같이 데이터입력을 많이 해야하는 필드와 달리 카테고리, 메뉴와 같은 필드는 거의 데이터의 변동이 크지 않다. 따라서 이 데이터들은 미리 만들어둔 객체형(사전형)처럼 사용하는 것이 효율적이라는 것이다. Enum class 위와 같이 클래스를 선언해두고 사용하는 법은 다음과 같다. 따로 객체의 특별한 컬럼값들을 부여하지 않고 KEY 와 VALUE로 구성된 객체형 모델을 사용할 수 있는 것이 키포인트이다. 이제 다음으로 해야할 것은 Enum클래스로 작성된 테이블을 나의 다른 데이터와 연결시키는 것이다. 처음엔 ForeignKey를 사용하여 엮어
Query parameter 을 사용한 http 요청 URI속에 정보들을 담고있다면 이를 어떻게 꺼내서 사용할 수 있을까? 예를 들어 products라는 URI에서 name값이 item1인것을 찾는다고 생각하면 다음과 같이 요청을 http 요청을 할 수 있다. 위와 같은 http 요청이 들어왔다하면 products 뒤에 따라오는 name=item1을 api에서 가져와서 View 단계에서 데이터를 가공해서 클라이언트에게 제공을 해야한다. 이때 python 기반의 framework인 Django 에선 이라는 메서드를 사용할 수 있다. 파이썬에서 객체형 자료에서 존재하는 KEY값에 해당하는 VALUE값을 불러오는 get과 다른 성격을 가진 메서드이다. 간단하게 말하자면 http request를 객체로 불러올수 있는 메서드 이다. 따라서 api에선 객체화된 요청값을 가공하기 위해서 get 메서드를 사용할 수 있게된다. 결론적으로 django에서 사용하는 GET메서드는
1차 프로젝트로 Zaram Home을 모티브로 키즈 상품들을 메인 컨텐츠로 다룰 'ZARANARA'가 시작 되었다. 프론트엔드와 백엔드 개발자들이 한팀으로 진행하는 첫 프로젝트인 만큼 셀레기도 하고 걱정도 된다. (내가 잘 못할 까봐...ㅋㅋ) 프로젝트팀이 정해지고 각 팀마다 모여서 회의를 하며 바쁘게 진행하다보니 어쩌다 보니 백엔드 초기 세팅을 맡아 진행하게 되었다. 이번 프로젝트에서 꼭 하고 적용해보고 싶었던 초기세팅 내용중 하나는 시스템 환경변수를 사용하여 보안을 강화하는 것이다. (실제로 현업에서도 시스템환경변수를 사용한다고 하니 써보고 싶기도 했다!) 기존에 Foundation 기간에 진행했던 westagram에서는 Database 및 Secret key를 따로 my_settings.py라는 파일을 만들어 보안 정보를 넣어두고 gitignore를 통해 github에 올라가지 않게 만드는 방식이었다. 사용해온 방식은 여전히 로컬 스토리지에 my_sett
Mission 4: 로그인 기능 구현 4-1) users.views.py 에 새로운 class 인스턴스 SigninView를 추가로 작성 체크해야할 점 이메일과 비밀번호가 json 객체 안에 존재하지 않을 시 를 반환 이메일과 비밀번호가 일치하지 않을 시 (모든 경우에 대해서) 를 반환 이메일과 이메일에 해당되는 비밀번호가 일치 시 를 반환 4-2) URL conf 정의 4-3) 해당 뷰가 잘 작동하는지 확인 후 git push 및 pull request Mission 5: 회원가입 비밀번호 암호화 적용 기존에 users.views.py에 존재하는 SignupView에 bcrypt 요소를 추가 > 비밀번호를 해쉬하는 이유 : 입력받은 비밀번호가 데이터베이스에 저장되면 데이터 베이스가 유출되면 그대로 유저의 비밀번호가 노출되기때문에 이러한 상황을 대비하여 비밀번호를 해쉬하여 데이터베이스에 저장한다. 사용법 및 설명 : https
Mission 1: Django 초기 세팅 1-1) 가상환경 생성 및 가상환경 활성화 1-2) Database 생성 1-3) Django Project 설정 1-4) Django 세팅 $ westagram $ settings.py 설정 $ westagram $ urls.py 수정 최상단 디렉토리인 곳에 my_settings.py (환경변수) 작성 $ my_settings.py 기존 westagram $ settings.py 와 my_settings.py 연결 1-5) .gitignore 작성 https://www.toptal.com/developers/gitignore python, pycharm, VisualStudioCode, vim, macOS, Linux, zsh 검색하여 추가해주기 +) my_settings.py도 추가해주기 1-6) 서버구동해보기 프로젝트 최상단 디렉토리에서 입력 Mission 2: 모델링 **주의!) 모든 기능 및 모델링을
1. Aggregate 와 Annotate Aggregate > 테이블의 여러 레코드들에 대한 필드값을 가공하여(ex.sum avg 등) 객체값으로 반환한다. Annotate > 테이블의 여러 레코드들에 대한 컬럼값들을 가공하여 일시적으로 하나의 필드로 추가한다. 반환값은 각 레코드들의 컬럼속성이 추가된 QuerySet이된다. 2. F 와 Q F > Field의 약어로 필드값을 F('필드명')으로 불러올수 있다. 단일 객체 및 QuerySet 둘다 가공이 가능하다. Q > Query의 약어로 조건 ORM을 사용할때 사용된다. ~Q()는 EXCLUDE, Q() & Q() 은 AND, Q() | Q() 는 OR로 동작한다. 3. Selectrelated 와 Prefetchrelated Select_related > 정참조(1 : 1, N : 1)를 하고 있는 테이블에서 다른 테이블의 데
Django Queryset API를 직접 ORM으로 실행해보며 반환값 및 사용법을 확인 하였다. all() > 클래스인스턴스명(테이블명).objects.all() : 해당 테이블에 모든 데이터베이스값을 조회한다. filter() > 테이블명.objects.filter(조건) : 해당 조건에 맞는 Queryset을 반환한다. 조건의 예 (id gt = 3), (namestartswith='이름'), (info__contains='내용') 등등 exclude() > 테이블명.objects.exclude(조건) 해당 조건에 맞는 쿼리셋을 제외한 Queryset을 반환한다. values() > 테이블명.objects.values('column값') : 해당 테이블에 속성값들을 각각의 객체로 받아 Queryset으로 반환한다. 반환값 ex) values_list() > 테이블명.objects.values_list('column값') : 해
영화배우와 영화가 N : N 으로 연결되있는 모델이다. Actor 인스턴스와 Movie 인스턴스가 다대다로 연결 시 Junction Table을 생성하여야 하지만 models.ManyToManyField를 통해 따로 테이블을 만들 필요가 없다. Django 에서 제공되는 모듈의 기능으로 자동으로 연결 테이블생성하여 연결하기 때문이다. 사용법은 다음과 같다. 테이블 생성 정참조하는 테이블에서의 값추가, 제거 역참조하는 테이블에서의 값추가, 제거 전체 제거 Junction table에서 추가적인 column 값이 존재하지 않으면 테이블을 생성하지않고 ManyToManyField를 통해 테이블간 N:N 연결하여 쓸 수 있다.
간단하게 테이블 두개만 작성하여 1 : N으로 연결하였다. ORM 사용기 참조 / 역참조(1:N, N:N 사용 가능)시 데이터 값을 CRUD 할 때 (relatedname, (테이블명)set__(속성값))관계에 대한 이해를 높이기 위해 값 추가를 꼬아보았다. 추가내용: get을 통해 값을 받으면 object타입, filter을 통해 값을 받으면 queryset타입으로 받는 것 그리고 다른 메서드를 사용하여 값을 반환 받을 때 받는 데이터타입에 대한 공부를 하자.
Django 프로젝트를 세팅하기에 앞서 다음 환경설정을 하였다. 1. miniconda로 가상환경 만들어서 가상환경에 접속하기 > 2. 가상환경에 Django, mysqlclient, Django-cors-headers pip를 통해 설치하기 > 3. mysql에 데이터베이스 생성하기 > 4. 가상환경에서 프로젝트를 설치할 디렉토리로 이동 후 장고 프로젝트 파일설치 > 그럼 해당 디렉토리에 장고프로젝트 폴더가 생성된다. 해당 프로젝트는 프론트엔드 개발자분들과 request, response 할 것을 염두에 두고 생성되었다. 를 열어서 다음과 같은 설정을 수정하였다. > IP 허용 admin, csrf, auth의 기능은 쓰지 않을 것이므로 관련된 설정들은 주석처리 cors-header 기능을 사용하고자 다음 코드들은 추가하였다. **가장 중요한 DATABASES 및 SEC
Django 관리자 기능 알아보기 인터프리터에서 아래 코드 실행 localhost:8080/admin으로 접속하면 다음과 같은 페이지를 확인할 수 있다. 위에 인터프리터에서 작성한 id와 password값을 입력하고 로그인 한다.  빈 html 안에 “입력한 내용만“ 반영되어 나온다. 3. polls폴더 안에 urls.py라는 파일을 생성 후 코드작성 > # path() 의 필수 요소 첫번째 인수 route : 정규화 패턴 혹은 절대 주소등을 사용해서 참조할 위치를 설정 두번째 인수 views : 모