1.Serializer 직렬화를 해주는 일종의 도구 장고에만 특별히 존재하는 기능이라기보다는 대부분의 프레임워크에 존재하는 일반적인 개념임 장고 Form과의 유사성 장고의 Serializer는 장고의 Form(Model Form) 과 많이 유사하다. 기능적으로 비교하자면 Serializer는 POST요청만 처리하는 FORM이라고 볼 수 있음. Form : Form 태그가 포함된 HTML 태그를 생성 Serializer : Form 데이터가 포함된 JSON문자열을 생성 둘 다 입력된 데이터에 대한 유효성 검사 진행 가능 Serializer의 기능 데이터 변환 및 직렬화 지원(JSON 포맷 등) 입력된 JSON 포맷에 대한 유효성검사 LIST/CREATE을 포함하여 특정 record(데이터)에 대한 ret..
통신 방식의 변화 기존에는 Get 요청 > HTML Form 포멧으로 응답 Post 요청시 multipart/form-data인코딩을 요청하고(데이터를 전송하고) HTML 포맷으로 응답 최근에는 API 서버에서 대개 JSON 인코딩된 요청을 응답(JSON을 활용하여 요청 및 응답) 직렬화 어떤 프로그래밍 언어를 사용하든지, 통신에서 데이터는 필히 문자열로 표현되어야 함 송신자 : 데이터인 객체를 직렬화를 통해 문자열로 변환하여 전송 수신자 : 수신한 문자열을 비직렬화를 통해 객체데이터로 변환하여 활용 Json, XML등은 모든 언어에서 지원하는 직렬화 포멧임. 즉 어떤언어에서든 통신을 위한 수단으로 사용될 수 있기에, 다른 언어들 간의 소통도 가능하다 다른 말로 하면, 모든 언어가 Json/XML 등에 ..
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 자체를 반복성, 재사용..
특정 필드의 값이 존재하는지 확인 이메일이 존재하는지를 확인하는 코드 수정안 1에서 flat=True를 해줘야 queryset에 객체가 아닌 리스트가 들어가서 판별을 할 수 있다. flat을 하지 않으면 queryset안에 객체가 있어서 중복된 이메일이 있든 없든 False가 남 수정안 2가 대체로 깔끔하다 #기존 코드 email_list = [] for user in user_group: email_list.append(user.email) if new_email in email_list: return JsonResponse({"message":"ALREADY_EXISTED_EMAIL"},status=409) #수정안1 email_list = User.objects.value_list('email',f..
API서버란? 앱/웹 서비스를 만드는 개발자들이 자주 이용하는 데이터 위주로만 응답을 하는 서버 즉 페이지 랜더링을 위한 HTML파일이 아니라 오로지 데이터만을 요구하는 경우, 그 데이터를 처리해서 응답해주는 서버를 의미함 주로 json형태의 응답형식을 사용하지만 필요에 따라 excel이나 html응답등이 필요함 시간이 지나도 호환성을 유지해야 한다는 부담감이 있을 수 있음 유저층이 사용하는 앱의 버전이 다양함 > API서버도 버전에 따라 모두 응답이 가능하도록 버전의 개념이 필요 참고)웹 서비스를 이용하는 유저는 항상 최신버전을 사용함. 응답으로써 html파일을 매번 받기 때문 REST(RESTful API) REST(Representational State Transfer) : 상태(state)를 나..
django 인스타그램 api 시리즈 json통신을 상정한 인스타그램의 백엔드적 기능을 구현 게시물과 관련된 기능 구현 게시물 등록 및 확인 게시물 태그(M:M관계) 댓글(1:M관계) Like(M:M관계) 1. 게시물 등록 및 조회 게시물을 등록하고, (특정 게시물이 아닌)게시물 전체를 조회함 태그가 달릴 수 잇음 modeling 하나의 포스팅에 여러개의 image가 존재할 수 있음 따라서 포스팅과 image의 관계를 1:M으로 묶음 또한 image는 image파일 그 자체를 저장하는 게 아니라 image 파일이 저장된 경로를 저장하는 것임 태그는 게시물과 M:M의 관계임. Many to Many관계의 경우 through속성을 사용해 중간 테이블(여기선 Posting_Tag)를 설정해줄 수 있음 또한 p..
django 인스타그램 api 시리즈 json통신을 상정한 인스타그램의 백엔드적 기능을 구현 follow기능 구현 자신을 참조하는 many to many field가 사용됨 Modeling 기존에 만들었던(바로 그전 포스팅에서) 만들었던 User모델에 Follow를 위한 manytomanyfield 추가 유저들은 서로서로에게 follow할 수 있으며, 한 유저가 다른 유저를 follow한다고 해서, follow된 유저가 follow한 유저를 following하게 되지는 않는다. 따라서 user모델인 자기자신을 참조하며, 관계가 비대칭적이므로 대칭성(symetrical)=Flase 설정 또한 M to M 필드는 원래 자동적으로 MtoM관계를 설명하기 위한 중간table이 자동 생성된다. 그러나 throu..
django 인스타그램 api 시리즈 json통신을 상정한 인스타그램의 백엔드적 기능을 구현 SignUp, SignIn Jwt 토큰 확인을 위한 decorator 1. User : signup 유저 모델링 유저와 관련된, signup 기능을 구현 Coreapp : TimeStampModel 실제로 기능을 구현하기에 앞서서 프로젝트 전반에서 자주 사용될 부분을 따로 모아두기 위한 coreapp을 만듬 생성시각 및 업데이트 시각을 기록하기 위한 TimeStampModel을 생성(이 모델을 다른 앱에서 상속받아 사용) meta속성에 abstract = True를 줌으로써 해당 모델이 상속받을 수 있게 함 #core:models.py from django.db import models class TimeStam..
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체크를 ..