1. Logging ORM은 사용자의 의도에 맞는 SQL문을 생성하여 DB에 요청을 보내는 도구이다. 분명 편리하지만, ORM이 만들어주는 SQL문은 늘 최적화된 SQL문이라고 확신할 수 없다. 특히 SQL문이 쓸데없이 DB에 요청을 많이 보낼 경우 성능적으로 굉장히 부정적인 효과가 발생함 따라서 실제로 어떤 SQL문이 얼마나 DB로 보내지는지 확인이 필요하고, 이를 확인하기 위해 Logging을 사용한다. 참고)DB의 성능이슈는 주로 데이터를 읽을 때 발생함. 다른 기능(Create, Update, Delete)에서는 잘 발생하지 않음. 따라서 대부분의 DB(Mysql, Oracle..)등은 읽기에 최적화된 상태로 나옴 How to Logging 1)서버에 의해 뷰가 호출될때마다 쿼리가 찍히도록 하는..
Software testing Manutal Testing vs Automation Testing system test 전략 3가지 유닛테스트(장고) 1. software testing 배포전에 개발한 상품을 처음부터 끝까지 테스팅하는 것 결함을 아주 직관적으로 + 상세히 확인하고, 에러를 사전에 방지할 수 있다. 그 외에도, 시간 절약 / 코드의 효율적인 개선 / 품질개선 실제로 테스팅을 위한 코드작성시간이 전체작업중에 40% 이상을 차지한다. manual testing VS automating testing manual testing 사람이 직접 손으로 이것저것 해보는 테스트 불안정성, 비용, 인력소모가 증가 & 테스트 속도 감소 Automation Testing testing 자체를 반복성, 재사용..
API서버란? 앱/웹 서비스를 만드는 개발자들이 자주 이용하는 데이터 위주로만 응답을 하는 서버 즉 페이지 랜더링을 위한 HTML파일이 아니라 오로지 데이터만을 요구하는 경우, 그 데이터를 처리해서 응답해주는 서버를 의미함 주로 json형태의 응답형식을 사용하지만 필요에 따라 excel이나 html응답등이 필요함 시간이 지나도 호환성을 유지해야 한다는 부담감이 있을 수 있음 유저층이 사용하는 앱의 버전이 다양함 > API서버도 버전에 따라 모두 응답이 가능하도록 버전의 개념이 필요 참고)웹 서비스를 이용하는 유저는 항상 최신버전을 사용함. 응답으로써 html파일을 매번 받기 때문 REST(RESTful API) REST(Representational State Transfer) : 상태(state)를 나..
Model & DB Error Code: 1452. Cannot add or update a child row: a foreign key constraint fails (`vanilla`.`#sql-1c10_73`, CONSTRAINT `document_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `_user` (`id`)) FK로 사용되는 필드가 바뀌거나 추가된 경우 새로 추가된 필드에 값을 채워줘야 함(안 그러면 참조 무결성을 위반) table자체를 삭제하고 새로 만드는 것을 추천 모델필드를 migrate까지해서 테이블을 만듬 >> db에서 테이블을 삭제하고, 장고에서도 makemigrations를 삭제하고 나서 다시 migrate를 해도 db에서 테이블이 생성되지 않..
인프런 이진석 강사님의 장고 강의를 참고 Usercreationform modelform 유저모델과 연동되어, 유저이름을 필드명으로 가져옴 그외에 추가적으로 패스워드 등의 추가필드 등을 설정하여 가지고 있으며, 추가필드들에 대하여 다양한 로직을 가지고 있다. 두 번의 패스워드를 입력받아, 두 패스워드가 서로 일치하는지 확인 입력받은 패스워드에 암호화를 적용하여 DB에 저장. 즉 usercreationform을 사용하여 회원가입을 하면 비밀번호는 자동으로 암호화가 된다. (참고로 set_password 로직을 사용해 암호화를 진행하며, 일반적으로 DB에 저장되는 패스워드는 반드시 암호화가 되어야만 한다) 회원가입 View 구현 model과 form만 설정해주면 알아서 모델 instance를 생성하고 저장해..
인프런의 이진석 강사님의 강의를 참고 로그인처리를 위한 LoginView 장고는 로그인 기능을 위한 LoginView를 제공함. 아래는 사용예시 #urls.py from django.contrib. auth.views import LoginView from django.urls import path urlpatterns =[ path('login/',LoginView.as_view(template_name='accounts/login_form.html'),name='login'), ] Loginview는 기본적으로 장고에서 제공하는 Authentication Form을 사용한다 링크 : https://github.com/django/django/blob/main/django/contrib/auth/vie..
인프런 이진석 강사님의 장고강의를 참고 장고의 form에 관한 기능을 처리할 수 있는 CBV인 Generic editing views들에 대하여 다룸 Generic editing views 장고의 form기능을 다룰 수 있는 CBV들 FormView, CreateView, UpdateView, DeleteView가 있으며(심지어 CRUD중에서도 많은 기능을 차지), 만약 FBV형태로 동일한 기능을 구현할 경우 Form을 사용하게 된다.(그래서 View임에도 Form과 관련된 주제에서 다룸) Generic editing views의 부모클래스들 Generic editing view들도 앞서 다루었던 CBV들처럼 이런저런 부모 클래스들을 상속받아 완성된다 Form Mixin get요청시 빈Form을 만들어서..
인프런 이진석 강사님의 장고강의를 참고 Form의 유효성검사가 실행되는 시점 form의 객체가 만들어지면서 요청으로 들어온 데이터가 해당 form에 들어간 후 form.is_valid()에서 유효성검사가 실행. 모든 필드에 대한 유효성 검사가 통과되면 True를 반환 유효성검사 내부 로직(Form이 자동으로 실행해주는 것임) form.is_valid() 실행 : 유효성 검사 실행 form.is_valid()가 내부적으로 form.full_claen()호출. 호출된 full_clean()은 모든 필드에 대하여 필드객체.clean()를 호출해서 각 필드의 type에 대한 (장고 내부적으로 설정된 기본)유효성 검사를 실행함 ex)emailfield > 이메일 형식인지 검사함(@가 있는지 등등)\ 해당 필드에 ..
인프런 이진석 강사님의 장고 강의를 참고 CSRF Cross Site Request Forgery 사이트간 위조 공격으로 특정 웹브라우저가 유저의 웹브라우저를 신용하는 상태를 노린 것임 Form의 특성상 get요청을 받을 때 빈 Form을 보내주고 해당 빈 Form을 받은 사용자가 정보를 채워서 Post메서드로 다시 요청을 보내는 경우가 많은데, get요청과 post요청을보낸 유저가 일치하는지를 확인할 필요가 있음(CSRF 공격, 즉 위조해서 다른 사용자가 요청을 보낸 것일 수도 있음 ㅇㅇ) CSRF Token 장고는 공격을 받는 서버 입장에서 공격을 막기 위해 Token을 통한 체크를 함 Post요청에 한해, setting에서도 확인할 수 있는 CsrfViewMiddleware를 통한 Token체크를 ..
인프런의 이진석 강사님의 장고강의를 참고 ModelForm 장고 Form을 상속받음 지정된 Model로부터 필드정보를 읽어들여, Form Fields를 세팅할 수 있다. 내부적으로 Model instance 생성하여 저장(create)하거나 업데이트(update)함 유효성 검증에 통과한 값들로, 지정된(연결되어 있는) Model instance로의 저장(save)이 가능. 저장된 객체가 이미 존재한다면(pk가 이미 있다면) update되고, 그렇지 않으면 create됨 일반 Form과 Model Form의 차이 일반 Form은 만들 field를 일일이 설정하고(title,content..), 그 field들의 속성도 설정해줘야 함(Charfield같은 것) 모델 Form은 어떤 모델과 연결할지, 그리고 ..
인프런 이진석 강사님의 장고 강의를 참고 1. HttpRequest HttpRequest 객체 현재 요청에 대해, 클라이언트로부터의 모든 요청 내용을 담고 있음. 즉 요청 메세지 전체를 parsing해서 가지고 있다고 보면 됨 FBV와 CBV둘 모두 당연히 접근가능하며, 접근 방식은 다르다 FBV : 매 요청 시마다 뷰 함수의 첫번째 인자 request로 전달됨 CBV : 매 요청 시마다 self.request를 통해 접근 Form 처리 관련 속성들 . request.method : 요청의 종류에 대한 정보. "GET","POST","PUT" 등으로 모두 대문자형태임 request.GET : GET 인자 목록 (QueryDict타입) . request.POST : POST 인자 목록 (QueryDict타..
인프런 이진석 강사님의 장고 강의를 참고 django Form의 SERIALIZER와의 유사점 결국 현업에서는 웹 api생성을 위해 drf를 만드는데, 그때 serializer를 사용하게 된다. 그 serializer와 지금 포스팅의 주제인 Form의 전체적인 메커니즘이 굉장히 유사하다! 따라서 장고 form을 잘 이해한다면 drf도 쉽게 배울 수 있다! 1. HTML Form 그냥 진짜 일반적인 HTML Form 클라이언트에서 사용자에게 입력폼을 제공하고, 이를 서버로 전송하고자 할 때 사용함 HTML Form 필수 속성 action : 요청을 보낼 주소. 빈값("")으로 두면 현재 페이지 url로 요청을 보낸다 method : 전송 방식으로 Get(데이터 조회)과 Post(생성,수정,삭제)에 주로 사..
인프런의 이진석 강사님의 장고강의를 참고 몇 가지 장고의 기본 decorator django.views.decorators.http require_http_methods : 인자로 get, post등의 메서드를 받는다. 지정된 메서드가 아니면 405 에러를 반환 require_get, require_post : get 혹은 post메서드만 허용 require_safe : 리소스의 변화를 일으키지 않는 안전한 메서드(Get, Head..)등만 허용 django.views.decorators.http login_required : 로그아웃 상황에서 해당 데코레이터가 적용된 뷰가 호출되려하면 바로 login_url로 redirect됨 참고 : login_url은 settings에서 설정가능하며, default..
인프런의 이진석 강사님의 장고강의를 참고 GenericDateViews 날짜 관련된 필터링이 제공되는 CBV 각 CBV명에 부합되는 값을 인자로 받는다 ex) YearArchiveView: YEAR인자를 받음 일반적으로 urls.에서 '/'와 같은 식으로 인자를 제공함 allow_future 모든 genericdateviews들이 가지고 있는 공통옵션 현재 시간 이후의 record를 queryset에서 제외시킬지에 관함 디폴트는 false GenericDateViews 종류 ArchiveIndexView : 지정 날짜필드 역순으로 정렬된 목록 YearArchiveView : 지정 year년도의 목록 MonthArchiveView : 지정 year/month 월의 목록 WeekArchiveView : 지정..
인프런 이진석 강사님의 강의를 참고 Generic display views 장고의 CBV중 두번째 카테고리에 속하는 Generic display views DetailView와 ListView가 있음 1.DetailView 기능 1개 모델의 1개 Object에 대한 템플릿 처리 모델명의 소문자 이름의 model instance를 템플릿에 전달. 아래 예시에서도 post라는 Post모델의 인스턴스를 템플릿에 전달한다 #views.py post_detail=DetailView.as_view(model=Post) 상속 BaseDetailView를 상속받음 얘는 SingleObjectMixin , View를 상속받음 SingleObjectTemplateResponseMixin을 직접 상속받음 TemplateRe..