Django 50문 50답

손성수·2023년 7월 19일
0

| 1 | Django가 무엇인지 설명하시오

Python언어를 기반으로 하며, 오픈소스로 제작된 쉽고 빠르게 개발 가능한 풀스택 프레임 워크
장고로 제작된 대표적인 사이트는 인스타그램, 핀터레스트 등이 있다.

프레임 워크란?

  • 어떤 어플리케이션을 개발하기 위해 필요한 기능과 라이브러리등이 모두 포함되어있는 환경

  • 프레임 워크와 라이브러리의 차이점
  • 라이브러리는 개발자가 선택하여 추가, 제거 또는 입맛대로 사용할 수 있는 자유성이 보장 된다.
  • 프레임 워크는 해당하는 프레임워크의 강력한 기능을 제공하는 대신
    그에 대한 규칙을 개발자가 지켜야 하므로 어느정도 완전한 자유성은 보장받지 못한다.


| 2 | Django를 백엔드 스택으로 선정한 이유는 무엇입니까?

확장 라이브러리를 이용한 손쉬운 개발 및 학습

  • Simple JWT
    JSON Web Token(JWT)을 사용한 사용자 인증과 관련된 기능을 구현하기 위한 라이브러리

  • Django Rest Framwork (DRF)
    RESTful 웹 서비스를 구축하기 위한 여러 기능 제공

  • Django Channels: 비동기 처리 및 웹소켓 지원 라이브러리
    실시간 통신이 필요한 웹 애플리케션을 구축 가능

친절한 공식 문서

  • Django뿐 아니라 그외 확장 라이브러리 역시 친절한 공식 문서


| 3 | Django에는 어떤 장점이 있습니까?

다양한 기능 제공
개발을 위한 다양한 기능 제공을 통해 개발 속도를 높이고 코드의 복잡성을 줄일 수 있습니다.

  • 웹 구현에 필수적인 기본 기능을 제공
    로그인, 유저모델, 비밀번호 해싱 등

  • ORM(Object-Relational Mapping)
    손쉬운 데이터 베이스 작업 처리
    관계형 데이터베이스와 객체 지향적 프로그래밍간의 의존성을 낮춰주는 ORM 레이어 제공

  • 백 오피스 및 Admin Interface 제공
    관리자 인터페이스 제공을 통해 손쉬운 데이터 관리 및 CRUD 제어

  • URL Routing
    URL을 논리적인 구조로 매핑
    URLconf라는 간편한 라우팅 시스템을 제공해주어 개발자가 각 URL 패턴을 해당하는 뷰(함수 또는 클래스 기반)와 연결
    - URLconf :클라이언트로부터 요청을 받으면 요청에 들어있는 URL을 분석

  • 장고 템플릿 시스템
    HTML과 장고 변수,태그 등을 조합하여 동적인 웹 페이지 생성
    템플릿 상속 기능을 통해 중복된 코드를 줄일 수 있다.

  • 미들웨어
    요청을 처리하는 과정에 추가적인 처리를 하는 구성 요소
    request와 response사이의 과정에서 인증,캐싱,에러처리 등의 기능을 수행
    • 인증
      사용자의 인증 상태를 확인하고, 필요한경우 세션을 생성
      AuthenticationMiddleware는 이러한 로그인 및 로그아웃 처리를 도와주며 사용자 인증 정보를 요청 객체에 첨부

    • 캐싱
      웹 애플리케이션의 성능을 향상 시키기 위해 일부 데이터를 저장하고 요청 시 재사용하는 기능을 수행
      CacheMiddleware는 이를 위한 기능을 제공하고 캐싱을 설정할 수 있는 여러 옵션을 제공

    • 에러처리
      애플리케이션에서 발생하는 예외나 에러를 처리하고 적절한 응답을 반환하는 기능을 수행
      404, 401 등등


| 4 | Django가 다른 Python 웹 프레임워크와 비교되는 특징이 있다면 무엇입니까?

MTV 아키텍처

Django는 Model-Template-View (MTV) 아키텍처를 사용하여 코드 가독성을 높이고 유지보수가 용이하다.

ORM

데이터베이스 조작시 복잡한 SQL 문을 작성할 필요 없이 파이썬 객체와 메소드를 사용하여 쉽게 데이터베이스 작업을 수행할 수 있다.

Admin interface

개발자는 기본적인 관리자 인터페이스를 제공 받고,
손쉬운 데이터 관리 및 CRUD 작업이 수행 가능하다.

보안

데이터베이스 처리, 사용자 인증 등을 위한 보안 기능들을 제공



| 5 | Django의 프로세스는 어떤 순서로 동작합니까?

  • 요청 수신
    사용자의 HTTP request 요청 수신

  • URL 라우팅
    요청된 URL을 urls.py 파일에 있는 URL 패턴들과 비교하며,
    적절한 뷰 함수나 클래스 탐색
    만약 일치하는 URL 패턴이 없다면 404 에러 페이지를 반환

  • 미들웨어 처리
    미리 등록된 미들웨어들이 순서대로 요청을 처리
    각각의 미들웨어는 요청을 가로채서 추가 처리를 할 수 있으며
    인증, 국제화, 정보 유지 등의 작업을 수행

  • 뷰 실행
    앞서 찾은 뷰 함수나 클래스가 실행
    모델과 상호작용하여 데이터베이스의 데이터를 읽거나 수정

  • 템플릿 처리
    뷰의 반환 결과로 HTML 페이지를 렌더링할 때,
    Django는 템플릿 시스템을 사용해 사용자에게 보여질 최종 페이지를 구성
    템플릿 시스템은 뷰에서 받아온 정보를 HTML에 바인딩하며,
    반복, 조건문 등의 구성 요소를 활용해 동적인 페이지를 생성합니다.

  • 응답 반환
    완성된 HTML 페이지와 함께 HTTP 응답을 웹 서버를 통해 사용자에게 반환
    이 과정에서 미들웨어들이 역순으로 처리되며,
    응답과 관련된 작업 수행

  • 결과 대기
    다음 요청이 들어올 때까지 대기하며, 위의 과정들이 반복적으로 수행


| 6 | Django의 MTV 패턴 시스템은 무엇입니까?

Model-Template-View

  • MVT(Model-View-Template) 패턴이란 웹 애플리케이션의 구성 요소를 분리하여 개발 및 설계 방식의 패턴입니다.
    각 기능별로 코드를 분리 및 모듈화를 통해 가독성과 유지 보수성을 향상 시킬 수 있습니다.

  • Model
    데이터베이스와 상효작용하는 레이어
  • Template
    HTML, 데이터를 표시하는 레이어
  • View
    로직 과 데이터를 처리하고 템플릿에 전달

동작

  • 클라이언트로부터 요청을 받으면 URLconf를 이용하여 URL을 분석한다.
  • URL 분석 결과를 통해 해당 URL에 대한 처리를 담당할 뷰를 결정한다.
  • 뷰는 자신의 로직을 실행하면서 만일 데이터 베이스 처리가 필요하면 모델을 통해 처리하고 그 결과를 반환받는다.
  • 뷰는 자신의 로직 처리가 끝나면 템플릿을 사용하여 클라이언트에 전송할 HTML 파일을 생성한다.
  • 뷰는 최종 결과로 HTML 파일을 클라이언트에게 보내 응답한다.


| 7 | ORM에 대해서 설명하시오

ORM(Object Relational Mapping)

  • 객체 지향 프로그래밍 언어를 사용하여 데이터베이스와 상호 작용
  • 프로그래밍 코드와 데이터베이스 간의 중간 레이어를 제공하여 객체 지향 데이터 모델을 관계형 데이터베이스에 매핑
  • 객체 지향 프로그래밍을 사용하여 데이터베이스 작업을 처리
  • 데이터베이스의 테이블을 객체(Object)와 연결하여 테이블에 CRUD를 할 때, SQL 쿼리를 사용하지 않고도 가능


| 8 | Django ORM의 장단점은 무엇입니까?

ORM (Object Relational Mapping)

객체와 관계형 데이터베이스의 데이터를 자동으로 매핑(연결)

관계형 데이터 베이스(Relational Database)

  • 데이터를 테이블 형식으로 저장하고 관리
  • 테이블은 행(row)과 열(column)을 갖으며, 각 행은 고유한 식별자를 통해 구분
  • 열(column)은 데이터의 속성

장점

  • 생산성 향상
    SQL 쿼리를 작성하지 않아도 되기 때문에 개발 시간을 줄일 수 있다.
    • 완벽한 객체지향적인 코드 -> 직관적인 이해가 쉬움
      SQL문이 아닌 클래스의 메서드를 통해 데이터베이스를 조작할 수 있다.

    • SQL 문을 사용하면서 같이 필요한 선언문, 할당, 종료 같은 부수적인 코드가 사라지거나 줄어들며, 각종 객체에 대한 코드를 별도로 작성하여 코드의 가독성을 높일 수 있다.
  • 코드의 재사용성
    모델과 각 모델 간의 관계는 쉽게 재사용될 수 있다.
    • ORM을 통해 작성한 객체를 재활용할 수 있다는 측면에서 재사용 및 유지보수의 편리성이 증가

단점

  • 성능
    프로젝트의 복잡성이 커질 수록 난이도도 올라가고 부족한 설계로 잘못 구현되었을 경우 속도 저하 및 일관성을 무너뜨리는 문제점 발생 가능

  • 제한된 기능 사용
    Django ORM은 일반적인 데이터베이스 작업을 수행할 수 있게 해주지만,
    특정 데이터베이스 시스템의 고유한 기능에 접근하기 어려울 수 있다.

  • 복잡한 쿼리문의 경우 오히려 SQL문으로 사용이 직관적이면서 효율적일 수 있다.


| 9 | Django Admin은 무엇이고 어떤 기능을 제공합니까?

Django Admin

  • 웹 기반 인터페이스를 통해 데이터베이스의 데이터를 관리할 수 있는 관리 도구
  • 모델의 데이터를 조회, 생성, 수정 및 삭제(CRUD)할 수 있다.

기능

  • 인증 및 권한 관리
    사용자 인증과 그룹별 권한 설정을 지원,
    다양한 역할에 맞게 데이터베이스 관리

  • 데이터 검색 및 필터링
    검색 기능과 필터링 옵션을 제공하여,
    원하는 데이터를 쉽게 찾고 조건에 맞게 필터링

  • 관계형 데이터 관리
    모델 간의 관계를 인지하고 이에 기반한 폼을 자동으로 생성하여,
    데이터를 업데이트 및 수정이 가능

  • 사용자 정의 가능
    필요에 따라 인터페이스를 구성하거나 기능을 확장할 수 있습니다.


| 10 | Django Template Engine은 무엇이고 어떤 기능을 제공합니까?

  • Django에서 제공하는 서버 사이드 렌더링으로 Template 엔진을 통해서 반환된 데이터를 HTML상에서 코드를 작성하여 웹을 구현할 수 있게 하는 도구를 의미하며, HTML상에서 Python 문법을 통해 여러 기능을 조작 할 수 있는 기능을 제공한다.

기능

  • 변수 사용
    데이터를 표현하기 위해 서버에서 넘겨받은 변수를 사용할 수 있다.

  • 태그(Tag)와 필터(Filter)
    템플릿 태그는 complex logic(반복문, 조건문 등)을 정의하고,
    필터는 변수의 값을 조작 혹은 변환하는 데 사용된다.

  • 상속
    템플릿 상속을 통해 여러 페이지에서 공통적으로 사용하는 요소(헤더, 푸터 등)를 분리하여 관리할 수 있다.


| 11 | Django를 통해 CRUD를 구현하는 방법에 대해서 HTTP Method와 함께 설명하시오

먼저, MVT 패턴에 의해 동작방식입니다.

    1. 클라이언트로 부터 요청을 받은 URL을 분석하고,
      분석 결과를 통해 해당 URL에 대한 처리를 담당할 View를 결정합니다.

    1. View는 사용자 요청에 대한 로직을 실행하며 Model, 데이터 베이스와 적절한 상호작용을 주고 받습니다.

    1. Template으로 구성된 결과값, HTML을 클라이언트에게 응답합니다.

Http method는 다음과 같이 나뉘게 됩니다.

  • GET
    데이터를 조회하는 용도로 사용됩니다.
  • POST
    데이터를 생성하는 용도로 사용됩니다.
  • PUT
    전체 데이터를 수정하는 용도로 사용됩니다.
  • PATCH
    일부 데이터를 수정하는 요도로 사용 됩니다.
  • DELETE
    데이터를 삭제하는 용도로 사용됩니다.

View에서 Http method를 이용하여 사용자의 데이터를 처리하는 방식은
두가지로 나뉘게 됩니다.

  • CBV (Class Based View)
    API 응답 처리를 클래스를 사용하여 뷰를 정의하는 방식
    상속과 다형성을 사용하여 중복 코드를 줄일 수 있다.
    APIView,GenericView를 상속 받아 CRUD의 기본 동작을 쉽게 구현이 가능 하다.
    URL연결을 클래스 자체를 지정하고, 하나의 URL에 CRUD 동작이 가능하다.

  • FBV (Funtion Based View)
    API응답 처리를 함수를 기반으로 정의하는 방식
    간단한 로직 처리에는 빠르고, 간결한 구현이 가능하지만
    구조의 복잡성이 올라간다면 중복된 코드가 생길 수 있으며
    가독성이 좋지 않다.


| 12 | Django에서 테이블을 설계하고 데이터베이스에 반영하는 방법에 대해서 설명하시오

1. app 생성하기

먼저, 프로젝트의 각 기능을 구분할 app을 생성해야합니다.

python manage.py startapp app_name

app 이란 무엇인가요?

프로젝트 내에서 독립적인 기능이나 목적을 수행하는 모듈이며,
프로젝트의 방향성에 맞춰 각각의 기능별로 app을 나눔에 따라,
개발 및 유지보수를 향상시킵니다.

app의 구성 요소는 어떻게 이루어지나요?

  • model.py
    앱의 데이터베이스 모델을 정의하는 파일이며,
    테이블과 필드를 정의합니다.

  • view.py
    Http request를 응답 및 반환하기위한 로직으로 구성됩니다.

  • template.py
    사용자에게 보여줄 HTML 파일로 구성됩니다.

  • admin.py
    장고에서 기본적으로 지원하는 관리자 시스템에,
    정의한 모델을 등록 합니다.
    따라서, 손쉬운 데이터 CRUD처리를 할 수 있습니다.

  • urls.py
    URL요청에 따라, 앱의 views.py와 연결할 URL을 매핑합니다.

2. Model 정의하기

장고의 Model은 class와, 그 속성을 이용해서 데이터베이스를 설계합니다.
여기서 class는 테이블로 구성 되며,
class의 각 속성, 멤버 변수들은 필드로서 구성됩니다.

from django.db import models
class table_name(models.Model):
	field_name = models.CharField(max_length=20)

상속받은 models.Model은 어떤 기능을 하나요?

데이터베이스 테이블과 관련된 다양한 기능을 제공하는 간편한 장고의 라이브러리입니다. 다양한 데이터 타입의 필드 옵션을 통해
기능별 필드 옵션을 지정하여 데이터베이스 스키마를 설계합니다.

3. 변경 사항 저장하기

정의한 model을 데이터 베이스에 적용하는 단계는
makemigrations,migrate로 나뉘게 됩니다.

  • makemigrations
python manage.py makemigrations

모델의 변경 사항을 추적하고, 데이터 베이스에 적용할
마이그레이션 파일을 생성합니다.
모델의 구조가 변경될 때 마다 새로운 마이그레이션 파일을 생성하며,
유지 보수및 버전 관리가 가능하게 됩니다.

  • migrate
python manage.py migrate

생성된 마이그레이션 파일을 기반으로 데이터베이스에
변경 사항을 적용합니다.

두 명령어를 나눈 이유가 무엇인가요?

  • 버전 관리
    마이그레이션 파일은 각각의 변경 사항에 대한 버전 정보를 포함합니다.
    따라서 변경 사항을 추적하고, 비교하여 문제 발생시 원할한 조정이 가능합니다.
  • 검토
    직접적인 데이터베이스 적용전에,
    개발자는 마이그레이션 파일을 검토하여 문제점이 없는지 확인할 수 있습니다.


| 13 | 회원가입을 할 때 비밀번호를 암호화하여 저장하는 이유는 무엇입니까?

암호화가 필요한 이유

비밀 번호는 사용자의 개인정보이며, 데이터 베이스에 저장하고,
사용자의 다양한 정보 제공이 될 수 있는 민감한 정보입니다.
데이터 베이스에 저장된 데이터도 유출된다면 심각한 보안사고이지만,
유출됬을 경우 사용자의 정보를 보호하기 위해서 암호화 하여 저장합니다.
또한, 서비스의 관리자 역시 데이터베이스를 조회할 수 있기 때문에
사용자의 개인 정보를 침해할 여지가 있기 때문입니다.

그렇다면 어떻게 암호화 하여 저장 하나요?

장고에서는 PBKDF2해싱 알고리즘을 제공하고,
개발자는 간단히 비밀번호 암호화를 구현할 수 있습니다.

from django.contrib.auth.hashers import make_password
password = make_password(비밀번호 입력값)
  • AbstractBaseUser
    AbstractBaseUser를 상속받아 부모 클래스의 메서드를 호출하여
    암호화를 할 수 있습니다.
.. model 정의
from django.contrib.auth.models import AbstractBaseUser
class User(AbstractBaseUser):
...serializer
user = super().create(validated_data)
user.set_password(user.password)

make_password와 set_password의 차이점은 뭔가요?

make_password는 평문 데이터를 암호화 하고 반환하지만
set_password는 전달받은 인자값을 암호화 하여 저장합니다.

로그인시 비밀번호가 같은지 어떻게 판단할 수 있나요?

장고의 check_password를 import하여 사용할 수 있습니다.
check_password는 좌항의 평문 데이터와, 우항의 해싱된 암호화 데이터가
같은지 비교하며, 같다면 True, 다르다면 False를 반환합니다.

from django.contrib.auth.hashers import check_password
....
if check_password(attrs.get("password"), user.password):
....


| 14 | JWT에 대해서 설명하시오

Json Web Token

Client Server와 Server 사이에서 통신할 때 권한을 위해 사용하는 토큰이며, 웹 상에서 정보를 Json 형태로 주고 받기 위해 표준 규약에 따라 생성한 암호화된 토큰으로 구성되어 있습니다.

JWT의 구성 요소

JWT는 header,payload,signature로 구성되어 있습니다.

  • header
    어떠한 암호화 알고리즘 및 어떠한 토큰을 사용할 것인가에 대한 정보가 담겨 있습니다.

  • payload
    id 및 개발자가 임의로 추가한 데이터와 토큰의 발급일과 만료일자가 담겨 있습니다.
  • signature
    server가 지정한 secret key로 암호화된 임의의 값이 담겨 있으며,
    server는 signature를 확인하여 토큰의 변조를 확인할 수 있습니다.

JWT를 왜 사용해야 하나요?

  • Stateless
    JWT는 클라이언트와 서버간의 세션을 유지할 필요가 없습니다.
    토큰 자체에 인증에 필요한 정보를 담고 있기 때문에,
    매 요청마다 토큰을 통해 사용자 인증이 가능합니다.
    따라서 서버에 부가적인 인증 요청을 보낼 필요가 없으며,
    데이터 베이스에 세션 정보를 저장할 필요가 없기 때문에
    서버의 부하를 감소 시킬 수 있습니다.
  • 보안성
    암호화된 signature를 토대로,
    토큰 정보가 위조되지 않음을 보장 받을 수 있습니다.

JWT의 단점은 무엇인가요?

  • JWT에 담긴 데이터를 확인하기 위해서 인코딩 과정을 거칩니다.
    따라서 JWT에 담긴 데이터가 커지면 커질 수록, 트레픽에 영향을 끼치게 됩니다. 따라서 너무 많은 데이터를 담는것은 바람직하지 못합니다.

JWT의 주의점은 무엇인가요?

  • payload의 내용은 암호화 되어 있지 않습니다.
    따라서 민감한 정보를 payload에 담는다면
    보안 사고가 발생할 수 있습니다.

Django에서 JWT을 어떻게 발급할 수 있나요?

JWT 인증 방식은 Simple JWT를 이용하여 손쉽게 구현할 수 있습니다.
설치한 라이브러리의 TokenObtainPairView, TokenRefreshView
메서드를 이용하여 Token을 발급할 수 있습니다.
SIMPLE JWT 공식 문서

... simple jwt 라이브러리 설치
pip install djangorestframwork_simplejwt
poetry add djangorestframwork_simplejwt
..settings.py
INSTALLED_APPS = [
    "rest_framework_simplejwt",
]
...
REST_FRAMEWORK = {
    "DEFAULT_AUTHENTICATION_CLASSES": (
        "rest_framework_simplejwt.authentication.JWTAuthentication",
    ),
}
...urls.py
from django.urls import path
from rest_framework_simplejwt.views import TokenObtainPairView, TokenRefreshView
...
urlpatterns = [
    ...
    path('api/token/', TokenObtainPairView.as_view(), name='token_obtain_pair'),
    path('api/token/refresh/', TokenRefreshView.as_view(), name='token_refresh'),
    ...
]


| 15 | JWT의 Access Token과 Refresh Token은 왜 필요한가요?

각각의 토큰은 기능과 보안성을 위해 필요합니다.

  • access token은 사용자의 인증 정보와, 보안성을 위해 토큰의 만료기간이 포함되어 있습니다. 따라서 만료 기간이 지난 access token은 인증을 위한 도구로 사용할 수 없습니다.

  • refresh Token은 사용자의 요청에 따라 access token 다시 발급해주는 용도로 사용됩니다.


    따라서, 사용자에게 안전하고 효율적이며, 복잡한 로그인 절차 없이 간편히 재 인증을 하기위한 기능으로 사용됩니다.


| 16 | Django의 기본 기능을 사용하는 것과 JWT를 사용하여 로그인 기능을 구현하는 것에는 어떤 차이점이 있습니까?

세션 기반 인증

  • Django의 기본 로그인 기능은 세션 기반 인증 시스템입니다.
  • 로그인한 사용자의 세션 데이터를 저장하고 관리합니다.
  • 클라이언트 단에서는 세션 ID를 쿠키에 저장하여 인증상태를 유지합니다.
  • 서버는 세션 데이터를 저장하고 관리하므로,
    서버의 리소스를 더 사용하게 됩니다.

JWT 로그인 기능

  • 서버는 직접 세션을 저장하고 관리할 필요가 없습니다.
    API 요청 시마다 헤더에 토큰을 포함하여 인증을 확인합니다.
  • Stateless
    서버는 세션 데이터를 저장하거나 관리할 필요가 없어,
    서버 부하가 줄어들게 됩니다.


| 17 | 데이터 테이블 간의 관계를 나타내는 FK, OneToOne, ManyToMany 필드에 대해서 설명하시오

ForeignKey (N to One)

  • 하나의 엔트리가 다른 테이블의 여러 엔트리에 연결될 수 있습니다.

OneToOneField

  • 하나의 엔트리가 다른 테이블의 한 엔트리에만 연결될 수 있습니다.

ManyToManyField

  • 하나의 엔트리가 여러 엔트리와 연결될 수 있습니다.

엔트리란 무엇인가요?

  • 엔트리는 데이터베이스 테이블에서 을 의미합니다.
  • 장고의 ORM은 class의 생성된 object를 엔트리로서 관리할 수 있습니다.

무엇을 참조하고 관계를 맺게 되나요?

관계된 테이블의 primary key를 참조합니다.
또한, One To One 관계의 경우, PK값을 공유할 수 있습니다.

primary_key=True

그리고 역참조 이름을 지정할 수 있습니다.

related_name="역참조 이름",
user = models.OneToOneField("users.User", related_name="article", on_delete=models.CASCADE, primary_key=True)

관계가 맺어진 테이블 또는 테이블의 엔트리가 삭제된다면 어떻게 되나요?

  • ForeignKey,OneToOne의 경우, on_delete 설정을 통해
    열견된 엔트리가 삭제될 경우의 설정을 지정할 수 있습니다.
    그러나 ManyToMany의 관계의 경우, on_delete 옵션을 사용할 수 없으며,
    삭제될 경우의 특정한 로직은, 직접 비즈니스 로직을 구현해야 합니다.

  • CASCADE
    관련된 모든 연결된 데이터를 삭제합니다.
user = models.ForeignKey(User, on_delete=models.CASCADE)
  • PROTECT
    연결된 엔트리가 존재하는 경우에는 해당 엔트리를 삭제할 수 없습니다.
user = models.ForeignKey(User, on_delete=models.PROTECT)
  • SET_NULL
    엔트리가 삭제되면 관련된 엔트리의 참조 값을 NULL로 설정합니다.
user = models.ForeignKey(User,on_delete=models.SET_NULL,null=True)


| 18 | Django에서 ManyToMany필드를 만드는 방법에 대해서 설명하시오

ManyToMany필드란

하나의 객체가 다수의 연관 객체와 연결 될 수 있으며,
반대로 연관 객체도, 여러 객체와 연관될 수 있는
다대다 관계를 표현하는 필드입니다.

Many To Many 필드를 만드는 방법

  • 서로 다른 두 모델에서, 장고의 models를 import하여
    ManyToMany필드의 행을 생성합니다.
  • 연결할 Model을 지정합니다.
  • related_name 옵션을 사용하여 역참조 이름을 지정할 수 있습니다.
from django.db import models
...
class User(models.Model):
    name = models.CharField(max_length=100)
    like = models.ManyToManyField(Article, related_name='liking_people')
...
class Article(models.Model):
    title = models.CharField(max_length=100)
  • 사용자와 게시글의 ManyToMany 관계를 설정하여,
    사용자 객체는, 다양한 게시글 객체와 관계를 맺을 수 있고
    게시글 객체는, 다양한 사용자 객체와 관계를 맺을 수 있습니다.
    따라서 사용자는 다양한 객체를 좋아요 등록과,
    게시글은 다양한 좋아요 등록 사용자를 보유할 수 있는 기능을
    구현할 수 있습니다.

다른 방법으로 다대다 관계를 설정할 수 있나요?

중간 다리 역할을 지정할 Model을 지정하고,
서로 다른 두 Model과 OneToMany 관계를 맺는
ForeignKey행을 각각 연결하여 다대다 관계를 설정할 수 있습니다.

from django.db import models
...
class User(models.Model):
    name = models.CharField(max_length=100)
...
class Article(models.Model):
    title = models.CharField(max_length=100)
...
class Like(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    article = models.ForeignKey(Article, on_delete=models.CASCADE)

ManyToMany와 ForeignKey를 이용하여 다대다 관계를 설정한건 어떤 차이점이 있나요?

ForeignKey를 이용하여 중간 모델을 지정할 경우,
추가적인 데이터를 제공할 수 있습니다.
예를 들어서 중간 모델에 updated_at과 같은
datetime필드를 추가로 지정하여,
좋아요를 등록한 날짜 정보를 추가적으로 제공할 수 있습니다.



| 19 | FBV와 CBV는 각각 무엇이며, 어떤 차이가 있습니까?

CBV (Class Based View)

API 응답 처리를 클래스를 사용하여 뷰를 정의하는 방식 입니다.
상속과 다형성을 사용하여 중복 코드를 줄일 수 있으며,
APIView,GenericView를 상속 받아
CRUD의 기본 동작을 쉽게 구현이 가능 하고
URL연결을 클래스 자체를 지정하고서
하나의 URL에 CRUD 동작이 가능합니다.

FBV (Funtion Based View)

API응답 처리를 함수를 기반으로 정의하는 방식
간단한 로직 처리에는 빠르고, 간결한 구현이 가능하지만
구조의 복잡성이 올라간다면 중복된 코드가 생길 수 있으며
가독성이 좋지 않을 수 있습니다.



| 20 | 테스트코드를 작성하는 이유는 무엇이며 어떤 장점이 있습니까?

테스트 코드는 소프트웨어 개발 프로세스를 안정화시키고
품질을 높이는 데 많은 도움이 됩니다.
프로젝트 실행 시 발생할 수 있는 오류를 사전에 찾아내고
대응하기 위한 목적으로 작성됩니다.

  • 개발 시간 단축
    수많은 기능들의 API를 직접 조회하고 문제점을 파악하는것 보다
    모든 기능들의 테스트 코드를 작성하여 개발 시간을 줄일 수 있습니다.

  • Refactoring
    구현된 로직이 수정되거나, 추가적인 로직이 구현되었을 경우
    미처 발견하지 못한 오류를 쉽게 파악할 수 있습니다.

장고에서 코드를 어떻게 작성하나요?

각각의 app의 test.py에 테스트 코드를 작성합니다.
장고의 테스트 케이스는 class를 묶음으로, 해당 메서드를 테스트하는 형식으로 진행됩니다.
APITestCase를 상속받고, 메서드의 앞에 test_를 붙이는것으로 약속되어 있습니다.

from rest_framework.test import APITestCase
...
class UserTestCase(APITestCase):
	def test_login(self):
    	....

어떻게 테스트를 진행하나요?

터미널 명령어를 입력하여 테스트를 진행하게 됩니다.
프로젝트의 모든 테스트 코드를 실행하여 검증할 수 있으며,
또한, 각각의 app으로 구분하여 테스트를 진행할 수 있습니다.

python manage.py test
python manage.py test app_name


| 21 | 테스트코드에서 setup 함수와 setupclass의 차이는 무엇입니까?

테스트 코드는 APITestCase를 상속받아
class를 묶음으로 테스트가 진행 됩니다.
이때 class에 구현된 메서드들은 순서를 보장 받지 못하기 때문에
테스트를 위해 선행적으로 준비되어야 할 로직이 필요하다면
setUp, setUpClass, setUpTestData를 이용하여 선행될 로직을 구현할 수 있습니다.

setUp

테스트 클래스의 각 테스트 메서드가 실행되기 전에 호출됩니다.
따라서 n개의 테스트 케이스가 있다면, n번 호출됩니다.

class MyTestCase(TestCase):
    def setUp(self):
        self.user = User.objects.create(username='testuser')

setUpClass

테스트 클래스에 공통으로 사용되는 데이터를 설정할 수 있습니다.
따라서 클래스별로 단 한번만 호출됩니다.

class TestCase(TestCase):
    @classmethod
    def setUpClass(cls):
        super(TestCase, cls).setUpClass()
        cls.user = User.objects.create(username='testUser')

setUpTestData

테스트 클래스에 공통으로 사용되는 데이터를 설정할 수 있습니다.
따라서 클래스별로 단 한번만 호출됩니다.

class MyTestCase(TestCase):
    @classmethod
    def setUpTestData(cls):
        cls.user = User.objects.create(username='testuser')


| 22 | Template Engine을 사용할 때, 발생하는 CSRF Error가 무엇이고 어떻게 해결합니까?

CSRF란

  • Cross Site Request Forgery의 약자로, 사이트간 요청 위조를 뜻합니다.

  • CSRF는 웹 보안 취약점의 일종이며, 사용자가 자신의 의지와는 무관하게 공격자가 의도한 행위(데이터 수정, 삭제, 등록 등) 을 특정 웹사이트에 요청하게 하는 공격입니다.

  • 예를 들어, 피해자의 전자 메일 주소를 변경하거나 암호를 변경하거나 자금이체를 하는 등의 동작을 수행하게 할 수 있습니다.
    특성에 따라, 공격자는 사용자의 계정에 대한 완전한 제어권을 얻을 수 있을 수도 있습니다.

CSRF Error란

CSRF 보호 기능을 활성화 하기위해 Middleware에 csrf 설정을 추가합니다.
만약 HTML의 form태그의 post method에 csrf token을 첨부하지 않았다면
CSRF Error가 발생하게 됩니다.

해결하기 위한 방법

from 태그 밑에 템플릿 문법을 이용하여 csrf_token을 추가합니다.

<form method="POST">
  {% csrf_token %}
  ... 특정한 로직 구현 ...
  <input type="submit" value="제출">
</form>


| 23 | Django ORM에서 queryset과 object의 차이점에 대해서 설명하시오

queryset

데이터베이스에서 전달받은 객체들의 집합입니다.
필터링 및 정렬을 통해 데이터를 조작할 수 있습니다.

# 모든 사용자의 집합, 쿼리셋 생성
all_users = User.objects.all()
# 사용자의 쿼리셋중, 활성화 계정 탐색1
active_users = User.objects.filter(is_active=True)
  • object

    데이터베이스 에서 전달받은 개별 객체입니다.
user = User.objects.get(pk=request.user.pk)


| 24 | Django ORM에서 정참조와 역참조에 대해서 설명하시오

ORM의 참조란?

Table, Model의 구조상 OneToOne,ForeignKey등
객체가 관계 되어 연결된 Model의 데이터를 참조하는 의미 입니다.

정참조

  • Model, Table이 연결한 다른 Table을 참조합니다.
  • ex) 내가 연결한 다른 사람을 참조

역참조

Model, Table을 연결한 Table을 참조합니다.

  • ex) 다른사람이 나를 연결했을 경우, 내가 참조하는 방법

어떻게 정참조, 역참조 할 수 있나요?

  • 정참조
    생성된 오브젝트에 dot을 붙여, 참조하고 싶은 데이터를 호출합니다.
user = User.objects.get(pk=1)
print(user.profile.nickname)
  • 역참조
    생성된 오브젝트에 dot과 모델명_set을 붙여 데이터를 호출합니다.
profile = Profile.objects.get(pk=1)
print(profile.user_set.email)

또한 역참조 이름을 지정하여, 역참조시 모델명_set을 대체할 수 있습니다.

...Profile Model의 필드 
user = models.OneToOneField("users.User", related_name="user_profile", on_delete=models.CASCADE, primary_key=True)
... 비즈니스 로직
profile = Profile.objects.get(pk=1)
print(profile.user_profile.email)

참조할 데이터가, 객체가 생성되어 있지 않다면 어떻게 되나요?

  • 해당 모델의 DoesNotExist 에러가 발생하게 됩니다.
    따라서 try - except를 이용하여 예외처리를 해야 합니다.


| 25 | Response 결과와 함께 status code를 반환하는 이유는 무엇입니까?

| 26 | 회원탈퇴, 게시글 삭제와 같은 기능을 구현할 때 실제 레코드를 삭제합니까? 그렇지 않다면 그 이유는 무엇입니까?

| 27 | RESTful API는 무엇을 의미합니까?

| 28 | DRF를 사용해 API를 개발할 경우 어떤 장점이 있습니까?

| 29 | Django 와 DRF를 통한 개발의 차이점은 어떤 것이 있습니까?

| 30 | Django User 모델과 DRF Custom User 모델의 차이는 무엇입니까?

| 31 | DRF Serializer는 무엇이며, 어떤 기능을 수행합니까?

| 32 | JSON 형식으로 데이터를 받고, Serializer를 통해서 JSON형식으로 데이터를 반환하는 이유는 무엇인가요?

| 33 | Serializer를 통해서 특정 모델에 존재하지 않지만, 관계 있는 테이블의 필드 레코드를 반환하는 방법에 대해서 설명하시오

| 34 | Serializer를 통해서 역참조 하는 방법에 대해서 설명하시오

| 35 | DRF 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는 어떤 장단점이 있습니까?

| 43 | AWS를 통해 배포할 경우, sqlite를 사용하지 않는 이유는 무엇입니까?

| 44 | Django settings에서 DB 스택을 변경하는 방법은 무엇입니까?

| 45 | Django 프로젝트를 배포할 때, 노출되어서는 안되는 값은 어떤 것이 있습니까?

| 46 | Django 프로젝트를 배포할 때, 시크릿키를 노출하지 않는 방법에 대해서 설명하시오

| 47 | Django 프로젝트 진행 시 발생하는 CORS 오류를 처리하는 방법에 대해서 설명하시오

| 48 | Django 프로젝트를 배포할 때 Allow Host에 * 가 들어가면 안되는 이유는?

| 49 | Django 프로젝트를 배포할 때 사용되는 Gunicorn이 무엇이며, WSGI를 왜 사용해야 하는지 설명하시오

| 50 | Django 프로젝트를 배포할 때 사용되는 NGINX가 무엇이며, 웹서버를 왜 사용해야 하는지 설명하시오

| 51 | Django에서 PostgreSQL을 선호하는 이유는 무엇입니까?

| 52 | HTTP가 아닌 HTTPS로 배포했을 때의 장점에 대해 설명하시오

profile
더 노력하겠습니다

1개의 댓글

comment-user-thumbnail
2023년 7월 19일

훌륭한 글이네요. 감사합니다.

답글 달기

관련 채용 정보