21. 테스트코드에서 setup 함수와 setupclass의 차이는 무엇입니까?
setUp = 테스트를 하기위한 조건을 만들어 주는 것
setUpClass = 테스트를 하기 위한 조건이 테스트를 진행하는 과정중에 기억되게 하는 것
setUp 함수는 unit-test으로 모든 테스트를 독립적으로 시행하기 위해서 필요한 함수
그러나 매번 단위별로 테스트를 진행할 수 없고, 통합테스트를 진행할 수 있도록 setUpClass를 통해 공통된 조건들을 기억 할 수 있도록 세팅할 수 있음
테스트코드를 작성함에 있어서 중요한 핵심은 모든 테스트는 독립적으로 시행되어야 합니다. 또한 테스트케이스에서 사용되는 데이터베이스 레코드는 실제 레코드가 아닌 테스트케이스에서 생성해서 테스트를 실행한 후 삭제하게 됩니다. 이러한 레코드를 테스트코드 밖에서 만들어주는 작업이 필요한데 이것을 SetUp 함수에서 담당하게 됩니다.
독립적으로 회원가입, 로그인과 같은 기능을 테스트케이스마다 매번 실행해준다면, API와는 관계없이 같은 SetUp함수를 반복적으로 실행하는 것으로 테스트케이스의 속도저하를 유도하게 됩니다. 따라서 stateless한 테스트케이스이지만 공통적으로 반복되는 데이터의 경우 SetUp 클래스를 생성하여 한 번의 실행으로 모든 테스트케이스가 공통조건을 가지고 SetUP 함수의 반복 실행없이 테스트할 수 있습니다.
22. Template Engine을 사용할 때, 발생하는 CSRF Error가 무엇이고 어떻게 해결합니까?
23. Django ORM에서 queryset과 object의 차이점에 대해서 설명하시오
queryset은 object의 집합체이며 리스트로 구성되어 있음
object = 데이터베이스를 하나의 단일 객체 덩어리로 봄
Django ORM 을 통해서 데이터베이스의 레코드를 접근하여 추출한 결과물에는 object와 queryset이 있습니다.
object는 레코드 하나를, queryset은 여러 개의 object가 있는 리스트를 의미합니다.
object는 하나의 데이터베이스 레코드이므로 해당 필드 이름을 메서드로 사용하여 값을 추출할 수 있습니다.
그러나 queryset은 리스트 형태로 되어 있어 object형식으로 특정할 수 있는 인덱스를 사용하거나 반복문을 사용하는 등 추가 처리를 통해서 필드 값을 추출할 수 있습니다.
24. Django ORM에서 정참조와 역참조에 대해서 설명하시오
25. Response 결과와 함께 status code를 반환하는 이유는 무엇입니까?
26. 회원탈퇴, 게시글 삭제와 같은 기능을 구현할 때 실제 레코드를 삭제합니까? 그렇지 않다면 그 이유는 무엇입니까?
27. RESTful API는 무엇을 의미합니까?
REST의 특징을 기반으로 API를 구현한것을 RESTful API라고 합니다
HTTP 요청을 보낼때 어떤 URI에 어떤Method를 사용할 지 개발자들 사이에 널리 지켜지는 약속이며 프레임워크등이 아닌 형식이기때문에 기술에 구애받지는 않음
REST 란?
어떤 자원에 의해 CRUD(Create, Read, Update, Delete)연산을 수행하기 위해 URI(Resource)로 GET, POST등의 방식(Method)를 사용하여 요청을 보내며, 요청을 위한 자원은 특정한 형태(Representation of Resource)로 표현됨.
28. DRF를 사용해 API를 개발할 경우 어떤 장점이 있습니까?
valid 분기문을 통한 검증을 하지 않아도 되기에 좋다
DRF 시리얼라이저의 Validation을 통해서, 모델 필드의 형식과 맞는지 자동으로 검사해주므로, 일일히 입력값을 조회하여 확인해주지 않아도 되는 편리함이 있다.
Django 프로젝트에서, Serializer(직렬화)를 통해 JSON과 같은 양식으로 다양한 플랫폼의 클라이언트에게 데이터를 제공해 줄 수 있는 장점이 있다
29. Django 와 DRF를 통한 개발의 차이점은 어떤 것이 있습니까?
30. Django User 모델과 DRF Custom User 모델의 차이는 무엇입니까?
31. DRF Serializer는 무엇이며, 어떤 기능을 수행합니까?
32. JSON 형식으로 데이터를 받고, Serializer를 통해서 JSON형식으로 데이터를 반환하는 이유는 무엇인가요?
33. Serializer를 통해서 모델에 존재하지 않지만, 관계 있는 테이블의 필드 레코드를 반환하는 방법에 대해서 설명하시오
34. Serializer를 통해서 역참조 하는 방법에 대해서 설명하시오
35. Django Q기능을 통해서 쿼리하는 것은 어떤 장점이 있습니까?
36. Serializer에서 어떻게 객체를 validate하게 됩니까?
37. Serializer에서 Custom Validation을 하는 이유는 무엇입니까?
38. Serializer에서 create, update 함수는 어떤 기능을 수행합니까?
39. Serailizer Custom validate함수를 통해 오류 케이스를 어떻게 처리합니까?
40. DRF permission_classes를 사용하는 이유는 무엇입니까?
41. Django는 어떤 종류의 데이터베이스를 사용합니까? Flask와의 차이는 무엇입니까?
42. Django에서 제공하는 sqlite는 어떤 장단점이 있습니까?
SQLite는 낮은 메모리 환경에서도 이식성, 안정성이 좋고 매우 가볍습니다.
무료 오픈소스 소프트웨어이고, 이를 사용하는 데 특별한 라이센스가 필요하지 않습니다.
또한 별도로 돈을 낸다면 압축 및 암호화에 도움이 되는 확장 기능을 제공하기도 합니다.
이식성 = 데이터를 분리된 파일의 커다란 배치로 저장하는 다른 일반적인 데이터베이스와 달리 단일 파일에 전체 데이터가 저장되고, 이 파일은 디렉터리 계층의 어디에나 위치할 수 있으며 이동식 디스크 또는 파일 전송 프로토콜을 통해 공유할 수 있습니다.
특별한 라이센스가 필요하지 않음 = 완전한 독립형, 외부 종속성이 없음 즉시 사용될 수 있는 “Zero-configuration”데이터베이스
Sqlite는 Django에서 기본으로 제공하는 데이터베이스로, 다른 데이터베이스에 대한 사전지식이 많지 않아도 개발환경에서 프로젝트의 데이테베이스를 쉽고 빠르게 구현할 수 있습니다. 다른 SQL에 비해서 가벼우며, 개발환경에서 직접 데이터베이스를 GUI로 확인할 수 있습니다.
동시성의 제한이 있습니다.
동시에 여러 프로세스가 SQLite 데이터베이스에 액세스하고 쿼리가 가능하지만 주어진 시간에 하나의 프로세스만 데이터베이스를 변경할 수 있습니다.
사용자 관리가 존재하지 않습니다.
데이터베이스 시스템은 데이터베이스 및 테이블에 대해 사전에 정의된 액세스 권한을 사용자에게 제공하지만, SQLite는 일반 디스크 파일을 직접 읽고 쓰기 때문에 적용 가능한 유일한 액세스 권한은 기본 운영 체제의 일반적 액세스 권한뿐입니다.
이로 인해 특별한 액세스 권한이 필요한 응용 프로그램에는 적합하지 않습니다.
다른 RDBMS에 비해 보안이 약합니다.
Django에서 기본으로 제공하는 Sqlite는 가벼우나 다른 관계형데이터베이스에 비해, 방대한 양의 데이터처리나 빠른 속도를 제공하는 것은 아닙니다.
43. AWS를 통해 배포할 경우, sqlite를 사용하지 않는 이유는 무엇입니까?
44. Django settings에서 DB 스택을 변경하는 방법은 무엇입니까?
45. Django 프로젝트를 배포할 때, 노출되어서는 안되는 값은 어떤 것이 있습니까?
DEBUG = False 로 변경해야 합니다
디버깅 정보를 오픈하면 소스를 그대로 보여주는것과 다름이 없습니다
Secret Key
암호화 서명, 해싱등에 사용하는 값이기때문에 노출하면 안됩니다
ALLOWED_HOSTS
HTTP Host Header Attack 위협에 대응하기 위해서 비공개 처리해야합니다
RDS, S3
AWS 계정 정보가 있기 때문에 비공개 처리해야 합니다
46. Django 프로젝트를 배포할 때, 시크릿키를 노출하지 않는 방법에 대해서 설명하시오
47. Django 프로젝트 진행 시 발생하는 CORS 오류를 처리하는 방법에 대해서 설명하시오
Django Settings.py 에
CORS_ORIGIN_WHITELIST
CORS_ALLOW_METHODS
CORS_ALLOW_HEADERS 를 추가,
추가로 MIDDLEWARE corsheaders.middleware.CorsMiddleware 순서가 중요하기에 맨위에 에 추가한 후
CORS_ORIGIN_WHITELISTE 에 교차출처를 허용할 사이트 주소를 명시해줌으로써 CORS 오류를 해결할 수 있습니다
요청을 받는 백엔드쪽에서 CORS를 허용할 출처들을 미리 명시해줌으로 해결해줄 수 있다
48. Django 프로젝트를 배포할 때 Allow Host에 * 가 들어가면 안되는 이유는?
해킹에 위험이 있기때문에 와일드카드는 개발할때 혹은 특별한 경우를 제외하고는 사용하지 않는것이 좋습니다
Allow Host는 Django settings.py파일에서 서버에 접근할 수 있는 호스트의 IP를 명시하는 부분입니다.
와일카드인 애스터리스크(*)는 모든 경로의 접근을 허용한다는 것을 의미합니다.
이는 어떤 IP더라도 해당 프로젝트에 접근할 수 있게 되는 것을 의미하며, 이는 서버에 직접적으로 관여할 수 있게되는 접근 권한을 모두 열어둔 것이기 때문에, 프로젝트 개발자 이외의 불특정 공격자에게 서버를 무방비 노출하게 되는 결과를 초래합니다.
따라서, 서버를 관리할 IP주소를 Github에 노출하지 않게 해서 보안 취약을 막아야 합니다.
49. Django 프로젝트를 배포할 때 사용되는 Gunicorn이 무엇이며, WSGI를 왜 사용해야 하는지 설명하시오
Gunicorn은 Python WSGI로 WEB Server(Nginx)로부터 서버사이드 요청을 받으면, WSGI를 통해 서버 애플리케이션(Django)에 전달해주는 역할을 수행합니다.
WSGI는 파이썬 애플리케이션이 웹 서버와 통신하기위한 인터페이스로, 웹서버서의 요청을 해석하여 분배해야함으로 필요하고 멀티 쓰레드를 만들 수 있기 때문에 Request 요청이 많아지더라도 효율적으로 처리할 수 있으며, 이는 production 환경에 적합합니다
Django를 통해서 웹 서버를 구축한 뒤 배포하려면, 프론트엔드를 담고 있는 정적인 웹 서버를 필요로 합니다. 그러나, Django와 웹 서버는 바로 연결될 수 없습니다. 웹 서버에 해당하는 Nginx는 Django의 코드를 이해하지 못하기 때문에 연결해줄 중간 역할이 필요하며 이를 WSGI가 사이에 연결되어 해소할 수 있습니다.
50. Django 프로젝트를 배포할 때 사용되는 NGINX가 무엇이며, 웹서버를 왜 사용해야 하는지 설명하시오
Nginx는 동시접속 처리에 특화된 웹 서버로 http 요청을 받아 요청에 해당하는 파일을 http통신을 통해 응답해주는 프로그램입니다
Apache보다 동작이 단순하고, 전달자 역할만 하기때문에 효율적입니다
Nginx를 사용함으로써 여러 Request를 처리할 수 있음으로 정적 콘텐츠를 고속으로 처리하기에 사용합니다
Django는 웹 백엔드를 담당하는 스택입니다.
따라서 일반적으로 서비스에서 사용되는 프론트엔드는 Django가 아닌 다른 스택을 사용하기 때문에 프론트엔드와 백엔드는 분리되어 있습니다.
이를 하나로 배포하기 위해서는 백엔드에서는 프론트엔드의 요청을 받고 읽어낼 수 있는 웹서버를 필요로합니다. Nginx는 이 웹서버 중 하나로 백엔드에서 정적 파일의 요청을 읽어 웹 프레임워크인 Django로 전달하는 행위를 수행합니다.
51. Django에서 PostgreSQL을 선호하는 이유는 무엇입니까?
52. HTTP가 아닌 HTTPS로 배포했을 때의 장점에 대해 설명하시오
HTTPS는 Hyper Text Transfer Protocol Secure로 보안이 추가된 HTTP입니다
클라이언트와 서버가 서로 비밀리에 약속된 방식을 통해 주고받는 내용을 암호화 하여 전달받기때문에
하이재킹 공격을 통한 위험을 줄여줍니다
또한 구글 검색결과로 HTTPS를 우선하여 보여주기때문에 SEO관점에서도 좋습니다
서버에 요청하는 HTTP Request를 HTTPS를 사용하지 않는다면, 전부 보여지게 되므로 불특정 공격자에게 노출이 되게 됩니다. HTTPS를 사용하면 Request와 관련된 모든 내용을 암호화하는 것으로 보안성을 높일 수 있습니다.