Django

[Django] 시험 오답노트

kinggoddino 2024. 9. 2.

장고 기초 주차가 끝나고 테스트를 봤다. 어제 이거 공부한다고 날샜다

다시는 보고싶지 않은 시험지

하지만 오늘까지 오답노트를 제출해야하기 때문에 다시 보고있는 시험지

놀랍게도 정답 여부와 상관없이 모든 문제에 대해 오답노트를 작성해야한다


 

 

1.  Django 프로젝트에서 다양한 관리 명령을 실행할 수 있게 하는 파일은?

 

A)  settings.py

B)  urls.py

C)  views.py

D)  manage.py

 

A랑 둘 중에 헷갈렸는데 settings.py 에 관한 문제는 아래에 또 있길래 D 골랐다. 이참에 제대로 알아둬야지..

파일 역할
settings.py 프로젝트 설정.  DB 정보, 앱 목록, 템플릿 경로 등 전반적인 환경 설정
urls.py URL 라우팅 담당.  특정 URL이 호출될 때 어떤 뷰가 실행될지 매핑
views.py 요청 처리 로직 정의.  요청을 처리해서 응답을 생성하고 결과를 반환
manage.py 프로젝트 관리.  웹서버 실행, 생성, DB 업데이트 등의 관리 명령어 실행

 

그러고 보니 뭔가 명령을 할때 manage.py 쓴다

python manage.py runserver                  # 서버실행

python manage.py startapp <app_name>        # 앱생성

python manage.py makemigrations             # 마이그레이션 생성
python manage.py migrate                    # 마이그레이션 적용
python manage.py showmigrations             # 마이그레이션 목록 표시
python manage.py migrate <app_name> <num>   # 롤백

python manage.py shell                      # 셸실행
python manage.py shell_plus                 # 셸실행(모델 자동 import)

 

 


 

 

2.  다음 중 Django에서 제공하는 기본적인 데이터베이스는?

 

A)  PostgreSQL

B)  MySQL

C)  SQLite

D)  MongoDB

 

사실 sqlite 말고는 다 모르는 것들이어서 쉬웠다. 다른것도 알아두기

데이터베이스 사용
PostgreSQL 큰회사, 대규모 프로젝트, 복잡한 데이터 작업에 쓰이는 고급 DB라고 함
MySQL 웹 어플리케이션에서 자주 쓰인다고 함. 속도가 빠르고 안정적인 데이터 처리
SQLite 아주가벼운 DB임. 파일 하나로 데이터를 관리해서 간단한 개발에 유용함
MongoDB 비정형 데이터를 유연하게 저장할 수 있는 NoSQL임. 테이블 대신 문서형태로 저장함

 

 


 

 

3.  Django의 QuerySet 메서드 중 DB에서 특정 조건에 맞는 모든 레코드를 반환하는 메서드는?

 

A)  filter()

B)  get()

C)  exclude()

D)  all()

 

거의 대부분의 코드는 영어 뜻만 알아도 대충 어떤 기능인지 파악할 수 있는 것 같다. 영어공부를하자

메서드 기능
filter() 특정 조건에 맞는 모든 레코드를 반환
get() 특정 조건에 맞는 단일 레코드를 반환 (결과 == 여러개 or 없을 경우: 오류발생)
exclude() 특정 조건에 맞지 않는 레코드를 반환 (filter랑 반대 개념)
all() 조건 없이 데이터베이스에 있는 모든 레코드를 반환

 

 


 

 

4.  Django 템플릿 시스템에서 변수의 값을 출력할 때 사용하는 문법은?

 

A)  {{ 변수 }}

B)  { 변수 }

C)  {% 변수 %}

D)  [[ 변수 ]]

 

Django 개발자들이 정한 장고적약속이다. C는 태그에 해당하고, B랑 D같은 문법은 없다.

*DTL(Django Template Language): 장고 템플릿에서 사용하는 문법

*DTL 기본 형태 사용
변수, Variables {{ variable }} view에서 context로 넘긴 변수의 value에 접근할 수 있다
태그, Tags {% tag %} 반복문, 조건문 등의 특수한 기능을 수행한다 ex) if~, endif
필터, Filters {{ variable|filter }} 변수에 어떠한 작업을 추가적으로 더해 수정한다 ex) lower
주석, Comments {# comment #} 주석달고싶을때

 

 


 

 

5.  웹 어플리케이션에서 쿠키(Cookie)의 주요 목적은?

 

A)  사용자의 세션 데이터를 서버에 저장하기 위해

B)  사용자의 브라우저에 데이터를 저장하여 다음 방문시 사용하기 위해

C)  데이터베이스 쿼리를 최적화 하기 위해

D)  사용자의 암호를 안전하게 저장하기 위해

 

🍪  쿠키(Cookie) 

  • 웹 브라우저에 작은 데이터 조각을 저장하는 방식
  • 웹 애플리케이션에서 사용자와의 상호작용을 더 원활하게 하기 위해 사용됨

🍪  쿠키의 주요 목적 

  • 세션 유지: 사용자가 웹사이트를 재방문할 때 로그인 상태를 유지
  • 맞춤 설정: 사용자가 특정 웹 사이트에서 설정한 설정(선호도,언어 등)을 저장
  • 추적,분석: 사용자의 방문 기록 추적을 통해 행동 분석 및 맞춤형 광고 제공

 


 

 

6.  Django에서 특정URL에 대한 요청을 처리할 뷰(View)와 연결할 때 주로 사용하는 함수는?

 

A)  path()

B)  url()

C)  include()

D)  route()

 

url()이랑 route()는 처음봄.

함수 기능
path() 특정 URL 패턴에 대한 요청을 처리할 View와 연결함
url() Django 2.x 이전 버전에서 path() 역할을 했다구 함. 이제 안씀
include() 특정 앱의 URL 패턴들을 메인 프로젝트의 URL에 포함시킬 때 사용
route() Django에서 쓰는거 아님.

 

 


 

 

7.  Django의 ModelForm을 사용하는 이유로 가장 적절한 것은?

 

A)  폼을 통해 입력된 데이터를 데이터베이스에 자동으로 저장하기 위해

B)  유저로부터 입력된 데이터를 검증하지 않고 직접 처리하기 위해

C)  Django의 인증시스템을 우회하기 위해

D)  HTML 템플릿에서 직접 쿼리셋을 사용하기 위해

 

✨  ModelForm 

  • 모델과 연결된 폼을 쉽게 만들 수 있게 도와주는 도구.
  • 사용자가 폼에 데이터를 입력하면, 데이터베이스와 자동으로 연동되어 저장과정이 매우 쉬워짐
  • 오히려 입력된 데이터를 검증한 후에 처리하기 위해 사용됨 (Validation, 유효성 검사)

 


 

 

8. Django의 MTV 패턴에서 각 요소(Model, Template, View)의 역할을 간단히 설명하세요.

 

 내 답안 

  • Model: 데이터와 관련된 로직 처리
  • Template: 레이아웃과 관련된 화면 처리
  • View: Model과 Template을 연결하는 메인로직 처리

 모범 답안 

  • Model: 데이터베이스 구조를 정의하고, 데이터를 관리하는 역할을 합니다. 데이터베이스 테이블과 매핑되며, 데이터를 저장, 조회, 수정, 삭제하는 기능을 제공합니다.
  • Template: 사용자에게 보여지는 화면을 담당합니다. HTML 파일과 같은 템플릿을 통해 데이터를 시각적으로 표현하며, 동적인 웹 페이지를 생성하는 데 사용됩니다.
  • View: 사용자의 요청을 처리하고, 적절한 데이터를 가져와서 템플릿과 결합하여 응답을 생성하는 역할을 합니다. View는 Model과 Template 사이에서 중개자 역할을 합니다.

아니 간단히.. 설명하라길래ㅎ 너무 간단하게 썼나ㅠ

 

 


 

 

9. Django에서 settings.py 파일의 주요 역할을 구체적인 예시를 들어 설명하세요.

 

 내 답안 

INSTALLED_APPS에 프로젝트에서 사용할 앱을 등록함으로써 장고가 해당 앱을 인식할 수 있음.

개발하는 과정에서 DEBUG 모드를 True로 설정하면 오류 발생 지점에 대한 정보를 파악할 수 있음.

STATIC_URL과 MEDIA_URL을 설정하여 정적 파일과 미디어 파일의 경로를 정의할 수 있음.

 

 모범 답안 

settings.py  파일은 Django 프로젝트의 설정을 관리하는 파일입니다. 데이터베이스 설정, 설치된 앱, 미들웨어, 정적 파일 경로, 템플릿 설정, 국제화 설정, 보안 키 등의 다양한 프로젝트 설정이 이 파일에 포함됩니다. 프로젝트 전반의 동작을 조정하고, 필요한 외부 리소스나 라이브러리를 연결하는 역할을 합니다.

 

 


 

 

10. Django ORM이란 무엇이며, 왜 사용하는지 설명하세요.

 

 내 답안 

데이터베이스와 파이썬객체 중간에서 매핑해주는 도구.
SQL 안쓰고도 파이썬으로 데이터베이스를 조작할 수 있게 해주기 때문에  복잡한 쿼리문 작성이 필요없고 생산성이 높다.

 

 모범 답안 

Django ORM(Object-Relational Mapping)은 Python 객체를 데이터베이스의 테이블과 매핑하여 데이터베이스 조작을 간단하고 직관적으로 수행할 수 있게 해주는 도구입니다. SQL 쿼리를 작성하지 않고도 Python 코드만으로 데이터베이스와 상호 작용할 수 있게 해줍니다. 이를 통해 데이터베이스 독립성을 유지할 수 있으며, 데이터베이스 작업을 더 안전하고 효율적으로 수행할 수 있습니다.

 

 


 

 

11. Django의 Custom UserModel을 사용하는 이유와 장점을 설명하세요.

 

 내 답안 

필드를 커스터마이징해서 내 프로젝트의 요구사항에 맞게 인증 시스템을 구현할 수 있다.

 

 모범 답안 

Django의 기본 User 모델을 사용하는 대신 Custom UserModel을 사용하면, 사용자 모델을 확장하거나 수정할 수 있어 프로젝트의 요구사항에 맞게 사용자 정보를 관리할 수 있습니다. 예를 들어, 추가적인 사용자 필드가 필요하거나 로그인 방식(예: 이메일로 로그인)을 변경하고 싶을 때 유용합니다. Custom UserModel을 사용하면 향후 확장성도 더 좋아지고, 프로젝트 시작 시 이러한 커스터마이징을 도입하면 나중에 구조 변경이 필요할 때 발생할 수 있는 문제를 예방할 수 있습니다.

 

사실 잘 몰라서 그냥 영어 뜻 그대로 해석해서 너무 대충적은 것 같다.

이걸 맞았다고 해주시다니 감사..

모범 답안 보고 공부해야지

 

 


 

 

12. Django에서 Model 클래스는 데이터베이스 테이블과 매핑됩니다. Django ORM에서 모델을 정의할 때 필드를 정의할 수 있는 다양한 옵션 중 ManyToManyField에 대해 구체적인 사용 사례를 들어 설명하세요.

 

 내 답안 

두 모델이 다대다 관계(== 서로간에 1:n 관계)일 경우 사용한다.
ex) 게시글과 해시태그의 관계: 하나의 게시글은 여러 태그를 가질 수 있고, 하나의 태그도 여러 게시글을 참조할 수 있음.

 

 모범 답안 

Django의 ManyToMany는 두 모델간의 다대다 관계를 정의할 때 사용됩니다. 다대다 관계란 한 모델의 여러 인스턴스가 다른 모델의 여러 인스턴스와 연결될 수 있는 경우를 말합니다. 예를 들어, 하나의 학생이 여러 과목을 수강할 수 있고, 동시에 하나의 과목을 여러 학생이 수강할 수 있는 상황이 있을 수 있습니다.

Django는 이러한 관계를 처리하기 위해 자동으로 중간 테이블을 생성하며 이 테이블에는 두 모델의 외래 키가 저장되어 있습니다.

 

 


 

 

13. Django 모델을 작성하세요. "BlogPost"라는 이름의 모델을 만들고, 제목(title), 내용(content), 작성일(created_at), 수정일(updated_at) 필드를 추가하세요.

  • 제목은 문자열(CharField), 내용은 텍스트(TextField), 작성일과 수정일은 날짜/시간(DateTimeField) 필드로 정의합니다.
  • created_at과 updated_at 필드는 각각 자동으로 생성되도록 설정하세요.

 내 답안 

from django.db import models

class BlogPost(models.Model):
    title = models.CharField(max_length=20)
    content = models.TextField()
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

 

 모범 답안  

from django.db import models

class BlogPost(models.Model):
    title = models.CharField(max_length=200)
    content = models.TextField()
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    def __str__(self):
        return self.title

 

아하 __str__ 안썻다.

객체를 문자열로 표현할 때 사용하는 매직메서드. 이 모델의 인스턴스를 우리가 읽기 쉽게 출력해줌

 

 


 

 

틀림ㅠ 14. Django에서 사용자가 로그인할 수 있는 간단한 로그인 뷰를 작성하세요. 

  • 사용자가 로그인 폼을 제출했을 때, 해당 사용자를 인증하고, 성공적으로 로그인할 경우 'home' 페이지로 리디렉션합니다.
  • 로그인 실패 시 다시 로그인 페이지로 리디렉션하며, 실패 메시지를 출력하세요.
from django.shortcuts import render, redirect
from django.contrib.auth import authenticate, login

def login_view(request):
    if request.method == 'POST':
        username = request.POST['username']
        password = request.POST['password']
        
        # 이곳에 코드를 작성해 주세요.
        
    return render(request, 'login.html')

 

 내 답안 

        user = authenticate(request, username=username, password=password)
        if user:
            login(request, user)
            return redirect("home")
        else:
            return redirect("login")
            
하..ㅜㅠㅠ messages나 HttpResponse를 import 하지 않고 실패메시지를 어떻게 출력하는지 모르겠어요

 

 모범 답안  

        user = authenticate(request, username=username, password=password)
        if user is not None:
            login(request, user)
            return redirect('home')
        else:
            messages.error(request, 'Invalid username or password')
            return redirect('login')

 

아니 이거 messages.error 사용하려면 messages 모듈 임포트 해야되지 않나ㅠ

from django.contrib import messages

 

나도 messages 아니면 HttpResponse 사용해보려고 했는데 추가 import 사용하면 안된다그래서 아ㅜㅜ 다른 방법이 있나보다.. 하고 시험 종료 1분 전까지 계속 고민하다가 못쓴건데 너무 서럽다. 어제 날새면서 공부했던 것 중에 이 messages도 공부했었어서 더 서러움ㅠ엉엉

근데 나도 확실하지 않았으니까 안쓴거겠지?ㅋㅋㅎ 그냥 공부를 더하자!

 

if user:                # 내 답안
if user is not None:    # 모범 답안

 

새롭게 알게된 사실! anthenticate 함수는 인증에 실패할 경우 None을 반환(↔인증된 사용자 객체를 반환)한다구 한다. 그래서 모범 답안 처럼 쓰는게 더 명시적이라고 함. 그렇군

 

 


 

 

15. 다음의 Post에 대해 CRUD를 하는 코드의 일부입니다. 아래 내용을 참고하여 코드를 완성해 주세요.

Post 모델은 다음과 같은 필드를 가진다고 가정합니다.

  • title: CharField(max_length=100) 
  • content: TextField() 
  • created_at: DateTimeField(auto_now_add=True) 

READ

 내 답안 

def post_list(request):
    posts = Post.objects.all()
    context = {'posts': posts}
    return render(request, 'posts/index.html', context)

 

 모범 답안 

def post_list(request):
    posts = Post.objects.all()
    return render(request, 'posts/index.html', {'posts': posts})

 

와웅 context 를 따로 변수에 저장하지 않고 바로 세 번째 인자로 대입해 줄 수도 있구나

 

 

CREATE

 내 답안 

def post_create(request):
    if request.method == "POST":
        form = PostForm(request.POST)
        if form.is_valid():
            form.save()
            return redirect('post_list')
    else:
        form = PostForm()
    return render(request, 'posts/form.html')

 

 모범 답안 

def post_create(request):
    if request.method == 'POST':
        form = PostForm(request.POST)
        if form.is_valid():
            form.save()
            return redirect('post_list')
    else:
        form = PostForm()
    return render(request, 'posts/form.html', {'form': form})

 

 

UPDATE

 내 답안 

def post_update(request, post_id):
    post = get_object_or_404(Post, id=post_id)
    if request.method == "POST":
        form = PostForm(request.POST, instance=post)
        if form.is_valid():
            form.save()
            return redirect('post_list')
    else:
        form = PostForm(instance=post)
	return render(request, 'posts/form.html', {'form': form})

 

 모범 답안 

def post_update(request, post_id):
    post = get_object_or_404(Post, pk=post_id) # 모두 정답
    post = get_object_or_404(Post, id=post_id) # 모두 정답
    post = Post.objects.get(pk=post_id) # 모두 정답
    post = Post.objects.get(id=post_id) # 모두 정답
    if request.method == 'POST':
        form = PostForm(request.POST, instance=post)
        if form.is_valid():
            form.save()
            return redirect('post_list')
    else:
        form = PostForm(instance=post)
    return render(request, 'posts/form.html', {'form': form})

 

 

DELETE

 내 답안 

def post_delete(request, post_id):
    post = get_object_or_404(Post, id=post_id)
    if request.method == "POST":
        post.delete()
        return redirect('post_list')
    return render(request, 'posts/confirm_delete.html', {'post': post})

 

 모범 답안 

def post_delete(request, post_id):
    post = get_object_or_404(Post, pk=post_id) # 모두 정답
    post = get_object_or_404(Post, id=post_id) # 모두 정답
    post = Post.objects.get(pk=post_id) # 모두 정답
    post = Post.objects.get(id=post_id) # 모두 정답
    if request.method == 'POST':
        post.delete()
        return redirect('post_list')
    return render(request, 'posts/confirm_delete.html', {'post': post})

 

 

 

 

끝 이제 장고심화 공부해라

 

 


 

'Django' 카테고리의 다른 글

commands - 샘플 커스텀 명령어 만들기  (0) 2024.09.25
[Django] #11 장고 Model  (0) 2024.08.16
[Django] #10 다중앱과 URL  (0) 2024.08.15
[Django] #9 HTTP Form  (0) 2024.08.15
[Django] #8 장고 Template System  (0) 2024.08.14