기본 개념

Django
Python 웹 프레임워크로, 웹 애플리케이션의 전반적인 백엔드 개발을 돕는 도구입니다. HTML 템플릿 렌더링, ORM(Object-Relational Mapping), 라우팅, 인증 등 웹 개발 전반에 필요한 도구를 제공합니다.

  • 사용 사례: 블로그, 커머스 사이트, 포럼 등.

Django REST Framework (DRF)
Django 위에 추가되는 라이브러리로, RESTful API를 쉽게 개발할 수 있게 도와줍니다. DRF는 JSON 응답, API 인증, 직렬화(Serialization) 등을 기본적으로 지원하며, Django ORM과 잘 통합됩니다.

  • 사용 사례: 모바일 앱 백엔드, 데이터 제공용 API 서버, SPA(Single Page Application) 백엔드.

기능 비교

기능  Django DRF 
템플릿 렌더링 HTML 페이지를 렌더링하는 데 적합 JSON이나 XML 같은 데이터 응답을 제공
직렬화 지원하지 않음 Serializer를 통해 Python 객체를 JSON으로 변환 (반대도 가능)
ORM 지원 Django ORM으로 데이터베이스 연동 Django ORM을 기반으로 직렬화와 통합
라우팅 URL 패턴 매핑 (장고의 urlpatterns) API 전용 라우터 (routers) 제공
인증 기본 인증 시스템 (세션, 사용자 관리) 토큰 기반 인증(JWT), OAuth 등 다양한 인증 방식 지원
목적 전통적인 웹 애플리케이션 개발 API 개발 전용
브라우저에서의 디버깅 기본 Django Admin 제공 API를 테스트할 수 있는 Browsable API UI 제공

코드 예시 비교

Django로 구현 (HTML 렌더링)

사용자 정보를 보여주는 HTML 페이지 작성.

# views.py
from django.shortcuts import render
from .models import User

def user_list(request):
    users = User.objects.all()
    return render(request, 'user_list.html', {'users': users})

# urls.py
from django.urls import path
from .views import user_list

urlpatterns = [
    path('users/', user_list, name='user_list'),
]

# user_list.html
<!DOCTYPE html>
<html>
  <body>
    <ul>
      {% for user in users %}
        <li>{{ user.name }}</li>
      {% endfor %}
    </ul>
  </body>
</html>

결과: /users/로 접속하면 사용자 리스트를 보여주는 HTML 페이지가 렌더링됩니다.

 

DRF로 구현 (JSON API)

사용자 정보를 제공하는 RESTful API 작성.

# views.py
from rest_framework.views import APIView
from rest_framework.response import Response
from .models import User
from .serializers import UserSerializer

class UserListAPIView(APIView):
    def get(self, request):
        users = User.objects.all()
        serializer = UserSerializer(users, many=True)
        return Response(serializer.data)

# serializers.py
from rest_framework import serializers
from .models import User

class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ['id', 'name', 'email']

# urls.py
from django.urls import path
from .views import UserListAPIView

urlpatterns = [
    path('api/users/', UserListAPIView.as_view(), name='user_list_api'),
]

 

결과: /api/users/로 요청을 보내면 JSON 형식으로 사용자 데이터를 응답합니다

[
  {"id": 1, "name": "Alice", "email": "alice@example.com"},
  {"id": 2, "name": "Bob", "email": "bob@example.com"}
]

Django와 DRF를 함께 사용하는 이유

Django는 HTML 기반 웹 애플리케이션을 빠르게 개발하는 데 강력하지만, JSON과 같은 데이터를 주고받는 API 개발에는 적합하지 않습니다. DRF는 이를 보완하여 Django의 강력한 ORM과 인증 기능을 활용하면서도 RESTful API를 간단히 설계할 수 있도록 합니다.

  • Django로 전통적인 웹 페이지와 관리자(Admin) 페이지를 개발하고,
  • DRF로 모바일 앱이나 프론트엔드(SPA)와 통신하는 API를 추가 개발하는 방식으로 두 도구를 결합할 수 있습니다.

DRF의 장점

  1. 간편한 직렬화: Serializer 클래스로 데이터를 직렬화/역직렬화하는 작업이 쉽습니다.
  2. API 문서화: 자동으로 브라우저에서 테스트 가능한 UI 제공 (Browsable API).
  3. 다양한 인증 방식 지원: OAuth2, JWT 등.
  4. 필터링과 페이징: 데이터의 검색, 정렬, 페이지네이션 기능 내장.
  5. 확장성: 커스터마이징 가능한 강력한 구조.

6. 어떤 것을 선택해야 할까?

  • HTML 페이지 중심의 프로젝트라면 Django만으로 충분.
  • 모바일 앱 또는 React/Vue.js 같은 SPA와 통신할 API가 필요하다면 Django + DRF 조합 추천.

https://www.acmicpc.net/problem/11726

 

11726번: 2×n 타일링

2×n 크기의 직사각형을 1×2, 2×1 타일로 채우는 방법의 수를 구하는 프로그램을 작성하시오. 아래 그림은 2×5 크기의 직사각형을 채운 한 가지 방법의 예이다.

www.acmicpc.net

문제

2×n 크기의 직사각형을 1×2, 2×1 타일로 채우는 방법의 수를 구하는 프로그램을 작성하시오.

아래 그림은 2×5 크기의 직사각형을 채운 한 가지 방법의 예이다.

입력

첫째 줄에 n이 주어진다. (1 ≤ n ≤ 1,000)

출력

첫째 줄에 2×n 크기의 직사각형을 채우는 방법의 수를 10,007로 나눈 나머지를 출력한다.

정답

n= int(input())
dp=[0]*1001
dp[1]=1
dp[2]=2
for i in range(3,1001):
	dp[i]=dp[i-2] +dp[i-1]
print(dp[n]%10007)

 

풀이 

먼저 점화식을 생각해야한다. 

1,2,3,5,8,13... 이런 식으로 n은 n-1과 n-2를 더해주는 규칙을 찾을 수가 있다. 

 

이후 dp[1]=1, dp[2]를 dp에 집어 넣어주고 

for i in range를 통해 식을 만들어준다.

https://www.acmicpc.net/problem/25083

 

25083번: 새싹

아래 예제와 같이 새싹을 출력하시오.

www.acmicpc.net

문제 

아래 예제와 같이 새싹을 출력하시오 

         ,r'"7
r`-_   ,'  ,/
 \. ". L_r'
   `~\/
      |
      |

입력

입력은 없다

출력

새싹을 출력한다 

정답

print('         ,r\'\"7')
print('r`-_   ,\'  ,/')
print(' \. \". L_r\'')
print('   `~\\/')
print('      |')
print('      |')

https://www.acmicpc.net/problem/10172

 

10172번: 개

문제 아래 예제와 같이 개를 출력하시오. 입력 출력 예제 입력 1 복사 예제 출력 1 복사 |\_/| |q p| /} ( 0 )"""\ |"^"` | ||_/=\\__|...

www.acmicpc.net

문제 

아래 예제와 같이 개를 출력하시오 

|\_/|
|q p|   /}
( 0 )"""\
|"^"`    |
||_/=\\__|

입력 

없음

출력

개를 출력한다 

정답

print("|\\_/|")
print("|q p|   /}")
print("( 0 )\"\"\"\\")
print("|\"^\"`    |")
print("||_/=\\\\__|")

 

https://www.acmicpc.net/problem/10171

 

10171번: 고양이

아래 예제와 같이 고양이를 출력하시오.

www.acmicpc.net

문제

아래 예제와 같이 고양이를 출력하시오

\    /\
 )  ( ')
(  /  )
 \(__)|

입력

없음

출력

고양이를 출력한다 

정답

print("\\    /\\")
print(" )  ( \')")
print("(  /  )")
print(" \\(__)|")

 

https://www.acmicpc.net/problem/2588

 

2588번: 곱셈

첫째 줄부터 넷째 줄까지 차례대로 (3), (4), (5), (6)에 들어갈 값을 출력한다.

www.acmicpc.net

문제 

(세 자리 수) × (세 자리 수)는 다음과 같은 과정을 통하여 이루어진다.

(1)과 (2)위치에 들어갈 세 자리 자연수가 주어질 때 (3), (4), (5), (6)위치에 들어갈 값을 구하는 프로그램을 작성하시오.

입력

첫째 줄에 (1)의 위치에 들어갈 세 자리 자연수가, 둘째 줄에 (2)의 위치에 들어갈 세자리 자연수가 주어진다.

출력

첫째 줄부터 넷째 줄까지 차례대로 (3), (4), (5), (6)에 들어갈 값을 출력한다

정답

A=int(input())
B=input()
print(A*int(B[2]))
print(A*int(B[1]))
print(A*int(B[0]))
print(A*int(B))

+ Recent posts