공부기록3_멋쟁이사자처럼부트캠프+백엔드파이썬3기

heeyoung_1023·2026년 4월 17일

멋부사_기록

목록 보기
13/13

필드. 데이터 필드명 데이터명? 테이블 생성? 속성값
피그마 ERD
(https://claude.ai/chat/5ea439d8-faba-4930-a033-8a663747fc6d)

변수, 객체 , 리스트 , 함수형 클래스형 제너릭형

파이브라인

model-> url->view->templete

model-> url-> serealize ->view -> templete


데이터를 찾는방법과 설계법

각각 폴더들이 어떤 역할을 하는지

view.set을 몰랐고
drf 헷갈렸고
api 와 그 데이터 연결받아오는게 헷갈렸음
어드민.
데이터를 가져와서 저장하고 그 다음에 마이그레이션 마이그레이트

그런다음에 뷰로 봐야하는데 어드민슈퍼 명령어
미리 템플릿 준비

앱...? 미리 준비?

각각 앱들에서 코드를 보면서 class가 들어가는 파일 path가 들어가는 파일 구별할줄알아야 하는데 못함

결국 이 모든것이 연결구조 그안에 해석 능력 그리고 파일의 이름연결구조 더 나아가서 문법


브라우저 기반 CRUD는 이미 완성됨
→ 구조를 더 정리해보고 싶다
→ 클래스형 / 제너릭 View를 배운다
→ 같은 데이터를 API로도 열어주고 싶다
→ DRF Serializer / ViewSet / Router를 사용한

브라우저에서 공부기록 CRUD 사용
→ 같은 데이터를 API 브라우저에서 JSON으로 확인
→ Insomnia로 POST / PATCH / DELETE 테스트
즉 이번 편은 “새로운 기능을 하나 더 만든다”기보다는, 이미 만든 기능을 더 Django답게 정리하고, API까지 확장하는 편이라고 이해하면 좋습니다.



질문

-get post 처리구조?
-함수view,클래스형view,제너릭형view
-제너릭형view에서 장고패턴을 이해해야됨

-장고DRF?


5번부터 함수형 클래스형 제너릭형view에 대해서


12번부터 API에 대해서


13번부터 DRF , Restframework


14번 Serializer ---> JSON데이터를 다루는 Form비슷한역할


일반 Django vs Django DRF 비교

구성요소일반 DjangoDjango DRF
Model동일동일 (변화 없음)
URL거의 동일router 추가됨
View변화 있음변화 있음
Serializer없음새로 생김
TemplateHTML 렌더링JSON 응답 (분리)
Forms입력 검증에 사용Serializer가 대체

핵심 차이 설명

Model은 완전히 동일합니다.

# 일반 Django도, DRF도 똑같이 씀
class Agent(models.Model):
    name = models.CharField(max_length=100)
    region = models.CharField(max_length=50)

Serializer가 새로 생깁니다 — Form을 대체하는 역할이에요.

# DRF에서 새로 생기는 것
class AgentSerializer(serializers.ModelSerializer):
    class Meta:
        model = Agent
        fields = '__all__'

View 방식이 달라집니다.

# 일반 Django
def agent_list(request):
    agents = Agent.objects.all()
    return render(request, 'agents.html', {'agents': agents})

# DRF
class AgentListView(APIView):
    def get(self, request):
        agents = Agent.objects.all()
        serializer = AgentSerializer(agents, many=True)
        return Response(serializer.data)  # JSON으로 반환

URL에 router가 추가됩니다 (ViewSet 사용 시).

# 일반 Django
path('agents/', views.agent_list),

# DRF ViewSet 사용 시
router = DefaultRouter()
router.register('agents', AgentViewSet)
urlpatterns += router.urls

Model은 그대로, Serializer가 새로 생기고, View 방식이 바뀌고, URL에 router가 추가되는 것이 DRF의 변화입니다.

Form → Serializer로 역할이 넘어간다고 이해하면 가장 쉬워요. 더 궁금한 부분 있으시면 말씀해주세요!


가장 큰 차이입니다. render() 대신 Response()를 사용하고, JSON을 반환합니다. 하나의 View 안에서 GET/POST를 메서드로 구분해서 처리해요.

APIView 사용 시 URL은 거의 동일합니다. ViewSet을 쓰면 Router가 URL을 자동 생성해줘서 훨씬 간단해져요. 초보자는 APIView부터 시작하는 걸 추천합니다.

질문

-APIView 사용 시 URL은 거의 동일합니다. ViewSet을 쓰면 Router가 URL을 자동 생성해줘서 훨씬 간단해져요. 초보자는 APIView부터 시작하는 걸 추천합니다.

DRF에서 Template은 화면(HTML 구조)만 담당합니다. 데이터는 JS가 API를 호출해서 가져와요. 그래서 JS는 반드시 static 폴더로 분리해야 합니다.

질문

-DRF에서 Template은 화면(HTML 구조)만 담당합니다. 데이터는 JS가 API를 호출해서 가져와요. 그래서 JS는 반드시 static 폴더로 분리해야 합니다.

-Templete은 일반 Django 템플릿이 데이터 출력
-DRF 템플릿은 화면만, 데이터는 API호출

두개의 차이점?


-기초세팅 헷갈림 이 앱이 어떤이유로 사용하고 왜 이런 데이터를 사용하는지 알아야함


settings.py에 rest_framework를 INSTALLED_APPS에 추가하고, REST_FRAMEWORK 설정 블록이 새로 생깁니다. 인증 방식, 권한, 페이지네이션 기본값을 여기서 전역으로 설정해요.


결론


질문

순서가 모델이 변경되면 마이그레이션 마이그레이트를 해주고 어드민설정 url view 템플릿으로 화면에 띄어주기 순서로 알고있는데 이부분은 Django DRF 여서 순서가 달라지는거니?

좋은 질문이에요! 결론부터 말하면 기본 순서는 거의 동일한데, DRF에서 Serializer가 중간에 끼어들고, Template 대신 JS(fetch)로 화면을 띄우는 것만 달라져요.


순서 비교

단계일반 DjangoDjango DRF
1Model 작성Model 작성
2makemigrationsmakemigrations
3migratemigrate
4admin 등록admin 등록
5URL 연결Serializer 작성 ← 새로 추가
6View 작성URL 연결
7Template으로 화면 출력View 작성 (APIView/ViewSet)
8Template + JS(fetch)로 화면 출력

핵심 차이 딱 2가지

Serializer가 URL 전에 먼저 작성됩니다.

View에서 Serializer를 import해서 써야 하기 때문에, View보다 먼저 만들어야 해요.

Model → migrate → admin → Serializer → URL → View → 화면

화면 출력 방식이 달라집니다.

# 일반 Django → View가 데이터를 Template에 직접 넘김
return render(request, 'list.html', {'agents': agents})

# DRF → View는 JSON만 반환, JS가 API 호출해서 화면에 뿌림
return Response(serializer.data)

실제 작업 순서 (주거 플랫폼 기준)

1. models.py 작성        ← Agent, Property, Review 등
2. makemigrations
3. migrate
4. admin.py 등록         ← 관리자 페이지에서 데이터 확인용
5. serializers.py 작성   ← AgentSerializer, PropertySerializer 등
6. urls.py 연결
7. views.py 작성         ← APIView 또는 ViewSet
8. templates/ + static/js/ 작성  ← fetch로 API 호출해서 화면 출력

기존에 알고 계신 순서에서 5번에 Serializer만 추가되고, 마지막 Template에서 JS fetch가 추가되는 거예요. 크게 달라지지 않으니 걱정 안 하셔도 됩니다!


질문

  1. models.py 작성 ← Agent, Property, Review 등
  2. makemigrations
  3. migrate
  4. admin.py 등록 ← 관리자 페이지에서 데이터 확인용
  5. serializers.py 작성 ← AgentSerializer, PropertySerializer 등
  6. urls.py 연결
  7. views.py 작성 ← APIView 또는 ViewSet
  8. templates/ + static/js/ 작성 ← fetch로 API 호출해서 화면 출력

1번 모델에대해 설명과 5번의 종류에 대해 7번 차이 8번의 기초적인개념에 대해 설명


property 속성
agent 대리인 행위자
statics 정적 --> 더 알아보기
API 호출
const container
fetch
catch
.then


4개 주제를 하나씩 자세하게 설명해드릴게요.


1. models.py — 데이터베이스 설계도

Model은 DB 테이블을 Python 코드로 표현한 것이에요. 클래스 하나 = 테이블 하나입니다.

from django.db import models

class Agent(models.Model):
    # CharField → 문자열 (max_length 필수)
    name = models.CharField(max_length=100)
    region = models.CharField(max_length=50)
    
    # FloatField → 소수점 숫자
    avg_rating = models.FloatField(default=0.0)
    
    # BooleanField → True/False
    is_deleted = models.BooleanField(default=False)
    
    # DateTimeField → 날짜+시간
    created_at = models.DateTimeField(auto_now_add=True)  # 생성 시 자동 저장
    updated_at = models.DateTimeField(auto_now=True)      # 수정 시 자동 갱신
    
    # ForeignKey → 다른 테이블과 연결 (1:N 관계)
    user = models.ForeignKey(
        'accounts.User',
        on_delete=models.CASCADE  # User 삭제 시 Agent도 삭제
    )

자주 쓰는 필드 타입 정리:

필드용도예시
CharField짧은 문자열이름, 주소
TextField긴 문자열리뷰 내용
IntegerField정수가격, 층수
FloatField소수평점, 면적
BooleanFieldTrue/False삭제여부
DateTimeField날짜+시간생성일
ForeignKey1:N 관계매물→중개사
ManyToManyFieldN:N 관계북마크

5. serializers.py — 종류 3가지

Serializer는 DB 데이터 ↔ JSON 변환 + 입력값 검증을 담당해요. 종류가 3가지 있어요.

종류 1 — Serializer (직접 다 정의)

from rest_framework import serializers

class AgentSerializer(serializers.Serializer):
    # 필드를 하나하나 직접 선언해야 함
    id = serializers.IntegerField(read_only=True)
    name = serializers.CharField(max_length=100)
    region = serializers.CharField(max_length=50)
    
    def create(self, validated_data):
        return Agent.objects.create(**validated_data)
    
    def update(self, instance, validated_data):
        instance.name = validated_data.get('name', instance.name)
        instance.save()
        return instance

→ 유연하지만 코드가 많아짐. 모델과 관계없는 데이터 처리할 때 사용.


종류 2 — ModelSerializer (가장 많이 씀)

from rest_framework import serializers
from .models import Agent

class AgentSerializer(serializers.ModelSerializer):
    class Meta:
        model = Agent                    # 어떤 모델인지
        fields = ['id', 'name', 'region', 'avg_rating']  # 노출할 필드
        # fields = '__all__'            # 전체 필드 노출
        read_only_fields = ['avg_rating', 'created_at']  # 읽기 전용
    
    # 특정 필드 검증 추가
    def validate_name(self, value):
        if len(value) < 2:
            raise serializers.ValidationError("이름이 너무 짧습니다")
        return value

→ Model 기반으로 자동 생성. 코드 짧고 편함. 3차 프로젝트에서 주로 이걸 사용.


종류 3 — 중첩 Serializer (연결된 데이터 함께 출력)

class ReviewSerializer(serializers.ModelSerializer):
    class Meta:
        model = Review
        fields = ['id', 'rating', 'content']

class AgentSerializer(serializers.ModelSerializer):
    # Agent 조회 시 리뷰 목록도 함께 출력
    reviews = ReviewSerializer(many=True, read_only=True)
    
    class Meta:
        model = Agent
        fields = ['id', 'name', 'region', 'avg_rating', 'reviews']

→ 연결된 테이블 데이터를 한 번에 같이 보여줄 때 사용.


7. views.py — APIView vs ViewSet 차이

APIView — HTTP 메서드를 직접 제어

from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status

class AgentListView(APIView):
    # GET 요청 → 목록 조회
    def get(self, request):
        agents = Agent.objects.filter(is_deleted=False)
        serializer = AgentSerializer(agents, many=True)
        return Response(serializer.data)
    
    # POST 요청 → 생성
    def post(self, request):
        serializer = AgentSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=201)
        return Response(serializer.errors, status=400)

class AgentDetailView(APIView):
    # GET → 단건 조회
    def get(self, request, pk):
        agent = Agent.objects.get(pk=pk)
        serializer = AgentSerializer(agent)
        return Response(serializer.data)
    
    # PUT → 수정
    def put(self, request, pk):
        agent = Agent.objects.get(pk=pk)
        serializer = AgentSerializer(agent, data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data)
        return Response(serializer.errors, status=400)
    
    # DELETE → 삭제
    def delete(self, request, pk):
        agent = Agent.objects.get(pk=pk)
        agent.is_deleted = True  # Soft Delete
        agent.save()
        return Response(status=204)

ViewSet — CRUD를 자동으로 만들어줌

from rest_framework.viewsets import ModelViewSet

class AgentViewSet(ModelViewSet):
    queryset = Agent.objects.filter(is_deleted=False)
    serializer_class = AgentSerializer
    # 끝. GET/POST/PUT/DELETE 전부 자동 생성됨

핵심 차이 정리:

APIViewViewSet
코드량많음적음
제어직접 제어자동 생성
URL직접 연결Router 자동 생성
추천 대상초보자구조 익숙해진 후

초보자는 APIView 먼저 익히고, 익숙해지면 ViewSet으로 넘어가는 게 좋아요.


8. templates + static/js — 기초 개념

일반 Django는 View가 데이터를 Template에 직접 넘겼지만, DRF는 이렇게 분리돼요.

Template  →  화면 구조(HTML)만 담당
static/js →  API 호출해서 데이터 가져와 화면에 뿌림

폴더 구조:

properties/
  templates/
    properties/
      list.html       ← HTML 구조만 있음
  static/
    js/
      agent_list.js   ← fetch로 API 호출

list.html — 구조만 있고 데이터 없음:

<body>
  <div id="agent-list">
    <!-- JS가 여기에 데이터를 채워줌 -->
  </div>

  <!-- JS 파일 연결 -->
  <script src="{% static 'js/agent_list.js' %}"></script>
</body>

agent_list.js — API 호출해서 데이터 출력:

// 1. API 호출
fetch('/api/agents/')
  
  // 2. JSON으로 변환
  .then(response => response.json())
  
  // 3. 화면에 출력
  .then(data => {
    const container = document.getElementById('agent-list')
    
    data.forEach(agent => {
      container.innerHTML += `
        <div class="agent-card">
          <h3>${agent.name}</h3>
          <p>지역: ${agent.region}</p>
          <p>평점: ${agent.avg_rating}</p>
        </div>
      `
    })
  })
  
  // 4. 에러 처리
  .catch(error => {
    console.error('오류 발생:', error)
  })

흐름 한 줄 요약:

사용자가 페이지 열기
  → HTML(Template) 로딩
  → JS 실행 → API(/api/agents/) 호출
  → View가 JSON 반환
  → JS가 JSON 받아서 화면에 출력

이 흐름이 DRF의 핵심이에요. Template은 틀만 잡고, 실제 데이터는 JS가 API를 통해 가져오는 구조입니다. 궁금한 부분 있으면 더 질문해 주세요!

profile
개발언어를 배우는 과정 기록

0개의 댓글