TIL_20230307_Django 프레임워크 제대로 배우기 04(끝)

창고·2023년 3월 7일
0

8. 게시판 기능 구현

(3) GET vs POST (C)

  • GET, POST 분기 처리
def write(request):
    # request 객체는 사용자가 폼 페이지를 통해서 입력한 폼 데이터 값들을 받는다
    # request.GET, request.POST, request.COOKIE -> 딕셔너리형 데이터 GET, POST, COOKIE 정보들을 받음

    # 분기 처리하였음
    if request.method == "GET": # 작성 폼 이동
        return render(request, 'write_form.html')
    
    if request.method == "POST": # 작성 폼에서 작성
        memoContent = request.POST['memoContent']
        
        # DB 입력
        article = Memo(description = memoContent)
        article.save() # 별도의 DAO 없이 바로 가능하구나....

        # 리다이렉트를 위한 HttpResponseRedirect, reverse
        # redirect() - 특정 url로 리다이렉션
        # reverse() - URL을 역으로 계산하여 path가 변경되어도 url을 외울 필요가 없음, urls.py에서 만든 URL Patterns의 name을 이용, name을 통해 해당 name의 url을 반환
        # name 정보 틀릴 경우 페이지 에러 발생

        return HttpResponseRedirect(reverse('main'))

(4) U, D

  • 수정 'views.py'
def modify(request, idx):

    if request.method == "GET":

        article = Memo.objects.get(id = idx)
        data = {'article' : article}
        
        return render(request, 'modify_form.html', data)
    
    if request.method == "POST":

        memoContent = request.POST['memoContent']

        db_article = Memo.objects.get(id = idx)
        db_article.description = memoContent
        db_article.save()

        return HttpResponseRedirect(reverse('main'))
  • 수정 폼
<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>메모 작성 폼</title>
        <style>
            form > label{
                display: inline-block;
                width: 120px;
            }
            form > input {
                padding: 4px;
                margin-bottom: 4px;
            }
        </style>
    </head>
    <body>

        <h1>메모 수정 폼</h1>

        <form action="./{{article.id}}" method="POST" id="memoModifyForm"> <!--상대 경로 지정 시 주의-->
            {% csrf_token %}
            <input type="hidden" name="idx" value="{{article.id}}">

            <label for="memo">메모 입력</label>
            <input type="text" id="memo" name="memoContent" size="100" placeholder="내용을 입력하세요" value="{{article.description}}" autocomplete="false">
            <button type="submit" form="memoModifyForm">메모 등록</button>
        </form>

    </body>
</html>
  • 삭제 'views.py'
def delete(request, idx):
    
    db_article = Memo.objects.get(id = idx)
    db_article.delete()

    return HttpResponseRedirect(reverse('main'))

(개인적) Java + Spring Boot + JPA와의 비교

  • 환경, 설정 관련
    • Spring : application.yml 파일 + 코드로 Bean을 설정하는 방식
    • Django : 코드로 설정하는 방식 (위의 두 가지를 .py로 합친 느낌)
  • 계층 관련
    • Spring : Controller <-> Service <-> Repository가 명확히 구분된 느낌
      • Controller : @Controller 애노테이션 클래스
      • Service : @Service 애노테이션 클래스
      • Repository : @Repostiory 애노테이션 클래스
      • 사실 Controller에서 바로 Repostiory 접근도 가능하긴 하다 권장되지 않을 뿐
    • Django : Controller <-> Service + Repository 느낌 (물론 더 쪼갤 수 있으면 쪼갤 수 있을 것 같음... 기본 강의만 본 것이니)
      • 요청에 대한 URL 매핑은 urls.py에서 진행 (Controller의 @RequestMapping)
      • 요청 + URL에 대한 비즈니스 로직 처리는 views.py에서 진행 (Service의 비즈니스 로직. 여기서 별도의 Repository는 필요하지 않음)
  • 템플릿 관련
    • 문법 간 약간의 차이만 있을 뿐 느낌은 똑같은 것 같음

(번외) 참고사항

  • 테스트를 해보니 DB 데이터가 변경될 때마다 db.sqlite3 파일도 수정이 되고 있음
profile
공부했던 내용들을 모아둔 창고입니다.

0개의 댓글