회사 프로젝트 중간정리

호밀빵 굽는 쿼카·2022년 3월 18일
2

NHN Cloud 인턴

목록 보기
39/48
  1. 현재, Django( backend )와 vue( frontend )를 통한 팀내 웹페이지 제작중
  2. 팀 프로젝트 지금까지의 과정 정리 + 앞으로 진행하는 방식 정리

1. vue( frontend )

  • 버전 : vue 2
  • vuetify 사용
  • 운영서버에는 전역 vue-cli 없음
    (node ./node_modules/@vue/cli-service/bin/vue-cli-service serve명령어로 run server)
  • ES6 기본
  • webpack 을 통해 Django 서버로 연동
  • CORS 이슈 해결 필요

    vue (client) 디렉토리 구조



2. Django(backend)

  • 버전 : django 4.0.1
  • mysql 사용예정
  • Restful API 구축예정
  • 직접 SQL을 사용해서 쿼리문 짤 예정

1) 직접 SQL을 사용해서 쿼리문 짤 예정

여기서 잠깐! 🖐

Django는 ORM이라고 하는 기능을 제공합니다. ORM이란, Object-Relational Mapping의 약자로 객체(Object)관계형 데이터베이스(Relational Database)의 데이터를 매핑(Mapping)해주는 것을 의미합니다. 객체 간의 관계를 바탕으로 SQL을 자동 생성하여 sql쿼리문 없이도 데이터베이스의 데이터를 다룰 수 있게 해줍니다. 즉, 파이썬과 데이터베이스의 SQL사이의 통역사 역할이라는 뜻!
ORM은 SQL 쿼리문 없이도 데이터베이스의 데이터들을 다룰 수 있게되는데, Model Class를 통해서 객체를 만들고 이 객체를 통해서 DB에 접근하는 형식입니다. 하지만 저희는 직접 SQL문을 짜고 적용할 것이기 때문에 그와 관련된 RAW SQL 쿼리문을 사용해 Django 백엔드 코드를 짜는 정보를 찾아봐야합니다!

RAW SQL문을 사용해서 백엔드 환경을 구축하는 방법 관련 document
Django에서 RAW SQL문을 사용하는 방법

실제 서비스에서는 보통 ORM을 통해서 개발을 많이 진행합니다. 하지만 이 ORM의 무서운 점은 실제 안에서 어떤 쿼리문을 발생시켜서 저렇게 쉽게 쓸 수 있도록 해주는지 알 수 없습니다.(특정 명령어를 사용하면 쿼리문 볼 수 있긴함). 또한 시간이 오래걸린다는 단점이 있다고 합니다. 따라서 RAW SQL을 사용


<Django에서 RAW(원시) SQL 사용하는 법>
1. Manger.raw ()를 사용하여 원시 쿼리를 수행하고 모델 인스턴스를 반환하는 것
2. 모델 레이어를 완전히 파괴하고 사용자 정의 SQL을 직접 실행시키는 것

# 예시
def student_list(request):

    # posts = Student.objects.all()

    sql = "SELECT * FROM student_student"
    posts = Student.objects.raw(sql)[:2]

    print(posts)
    #print(connection.queries)
    return render(request,'output.html',{'data': posts})


2) Restful API 구축예정

하지만 위에서 얘기해듯이, 우리는 Restful API 환경을 구축해야합니다.

Restful API ???

웹 서버에서 DB 서버의 데이터도 읽어오고 사용자들이 글을 남기면 DB 서버에 저장까지 하는 기능을 모두 담당했습니다. 하지만 스마트폰이 출시되고, 어플리케이션의 등장으로 더이상 웹으로만 서비스를 제공하는 것에는 한계가 있었습니다. 따라서 HTML로 렌더링 하는 웹서버가 아닌, JSON 혹은 XML 과 같은 형식을 통해서 데이터를 다루는 별도의 API 서버가 필요했습니다.
따라서 RESTful 아키텍쳐를 HTTP Method와 함께 사용해 웹, 데스크탑 앱, 스마트폰 어플들까지 하나의 API 서버를 생성할 수 있습니다.

이 Restful API 를 만들기 위해서는 Django-rest-framework(Django 안에서 RESTful API 서버를 쉽게 만들게 도와주는 라이브러리)에서 제공하는 Serializer가 필요합니다.

Serializer 란?

"데이터 변환 / 직렬화 지원해줍니다."

Django의 ORM에서는 QuerySet(전달받은 모델의 객체 목록) 사용합니다.
기존 Django를 이용한 웹 개발에서 Django ORM의 Queryset은 Django template로 넘겨지며 HTML로 렌더링되어 Response로 보내지게 됩니다. 하지만 JSON으로 데이터를 보내야 하는 RESTful API는 HTML로 렌더링 되는 Django template를 사용할 수 없습니다. 따라서 이 Queryset을 JSON으로 매핑하는 과정을 거쳐야 하는데, 이 Serializer가 쿼리셋, 모델 인스턴스 등의 복잡한 데이터를 JSON,XML 등의 컨텐트 타입으로 쉽게 변환 가능한 python datatype으로 변환시켜줍니다.

사용법

  1. setting.pyINSTALLED_APPSrest_framework추가
  2. api/serializers.py 생성 후 내용 작성
  3. api/views.pyapi/serializers.py import 후 모델 생성
  4. api/urls.py 의 url 매핑

3) mysql 사용예정

django 프로젝트에 mysql 을 연결하고 잘 실행되는지 확인해야합니다.
참고 블로그 링크1
참고 블로그 링크2
참고 블로그 링크3
참고 블로그 링크4
참고 블로그 링크5

4) 장고의 MTV 패턴

MTV 패턴은 장고의 디자인 패턴입니다. MTV 패턴은 명칭이 조금 다를 뿐이지 기본적인 골자는 MVC 패턴과 동일합니다.

Model(모델)

  • MVC 패턴의 모델에 대응되며 DB에 저장되는 데이터를 의미합니다. 모델은 클래스로 정의되며 하나의 클래스가 하나의 DB Table입니다.
  • 원래 DB를 조작하기 위해선 SQL을 다룰 줄 알아야 하지만 장고는 ORM(Object Relational Mapping)기능을 지원하기 때문에 파이썬 코드로 DB를 조작할 수 있습니다.(ORM에 대해서는 추후 다루겠습니다.)
  • models.py

Template(템플릿)

  • MVC 패턴의 뷰에 대응되며 유저에게 보여지는 화면을 의미합니다. 장고는 뷰에서 로직을 처리한 후 html 파일을 context와 함께 렌더링하는데 이 때의 html 파일을 템플릿이라 칭합니다.
  • 장고는 자체적인 Django Template 문법을 지원하며 이 문법 덕분에 html 파일 내에서 context로 받은 데이터를 활용할 수 있습니다.
  • html

View(뷰)

  • MVC 패턴의 컨트롤러에 대응되며 요청에 따라 적절한 로직을 수행하여 결과를 템플릿으로 렌더링하며 응답합니다. 다만 항상 템플릿을 렌더링 하는 것은 아니고 백엔드에서 데이터만 주고 받는 경우도 있습니다.
  • views.py

Url(매핑)

  • URL 패턴을 정의하여 해당 URL과 뷰를 매핑하는 단계라고 생각하시면 됩니다.
  • urls.py

5) 질문

RAW Query 를 사용하면서, Rest Framework 환경을 구축할 수 있나요? Restful API 를 만들려면 ORM의 Serializer가 꼭 필요한 것 같은데,,
stackoverflow의 한 답변에는 아래와 같이 RAW Query를 쓰면서 Rest Framework 구축할 수 있다고 합니다.

RAW SQL문 공식 document

Manager.raw(raw_query, params=(), translations=None)

이 메서드는 원시 SQL 쿼리를 가져와 실행하고 django.db.models.query.RawQuerySet 인스턴스를 반환합니다. 이 RawQuerySet 인스턴스는 객체 인스턴스를 제공하기 위해 일반 QuerySet처럼 반복될 수 있습니다.

Manager.raw 사용하면 될듯싶다.

raw sql 사용할 때, sql injection을 주의해야한다고 함


6) 해야할 일

  • 로컬에서 django와 mysql 연동 해보기 (데이터 확인)->오픈소스로라도 해봅시다
  • raw query를 사용하면서도 serializer를 사용해서 rest framework를 구성할 수 있는지 확인해보기✅
  • 오픈소스(api구축된)가 있다면 공부하고 로컬에서 확인해보기
  • serializer 공식문서/ 공식문서해석 공부✅
  • query문 공부
  • db 모델링 엑셀파일✅
  • rest api CRUD 이해하기 쉬운 블로그
  • 기존 db를 django에 연결하는 방법 블로그 참고1블로그참고2->insepectdb 사용

7) 오픈소스 정리

잘못된 정보가 있을 수도 있습니다. 있다면, 댓글로 알려주세요😎



참고링크

profile
열심히 굽고 있어요🍞

0개의 댓글