내일배움캠프 14주차 주간 회고(WIL)

HJ Koo·2022년 3월 22일
1

주간회고

목록 보기
14/17

💻14주차 공부내용

-final project 진행 중
-final project 백엔드: 비번 리셋, 메일 전송(스팸으로 분류 안 되고 정상 전송 완료), 
                     프로필 편집(부분 동기식, 이미지 update S3연결, 비동기식으로 구현 중)
-매일 백준 알고리즘 문제 풀이

Django ORM, Query, QuerySet

https://docs.djangoproject.com/en/4.0/ref/models/querysets/
https://django-orm-cookbook-ko.readthedocs.io/en/latest/index.html
https://docs.djangoproject.com/en/4.0/ref/django-admin/#makemigrations
https://velog.io/@suasue/Django-QuerySet-method1-CRUD-fa811za4
---앞서 정리한 부분이기도 하지만 문법과 함께 다시 정리하고자 한다.

  • ORM(Object Relational Mapping)

    객체지향 언어 ≠ 관계형 데이터베이스
    객체지향 언어와 관계형 데이터베이스는 전혀 다른 목적과 다른 구성으로 되어 있기에, ORM은 이 둘을 연결해 주기 위해 객체 지향적인 방법을 사용하여 데이터베이스의 데이터를 쉽게 조작할 수 있게 해준다. 즉 ! Django ORM은 SQL을 파이썬 언어로 통역해 주는 역할을 하는 것.
    <장점>
    ‣생상성 향상, 비즈니스 로직 집중
    ‣재사용 및 유지보수 용이
    ‣DBMS 종속되지 않음(오라클, SQLite, 마리아DB 등, 각 SQL문이 다르다)
    <단점>
    ‣프로젝트가 복잡한 경우 난이도 상승
    ‣Raw Query 보다 성능이 낮음
  • Query
    DB에 정보를 요청하는 것이다. 쿼리는 웹 서버에 특정한 정보를 보여달라는 웹 클라이언트 요청에 의한 처리이다.
  • QuerySet
    전달 받은 모델 객체 목록. 쿼리셋은 DB로부터 데이터를 읽고, 필터를 걸거나 정렬할 수 있다.
    QuerySet은 1개의 Query와 N개의 QuerySet으로 구성된다.

CRUD를 하다 보면 모델에 무슨 목록을 들고 왔는지 바로 바로 볼 수 없으니 답답한 경우가 많은데, 터미널에 python manage.py shell 입력하여 바로 확인 가능하다.
위의 명령어를 입력 후, 필요한 모듈을 import한다. from .models import User

1 ) Create 데이터 생성

  • create()
    DB에 새로운 객체를 생성하고 저장
    생성된 인스턴스를 반환한다.
    User.objects.create(name='강아지')
  • bulk_create()
    한 번에 여러 개의 객체를 생성하고 저장
    생성된 인스턴스를 리스트에 담아 반환
    User.objects.bulk_create([name='강아지', name='고양이'])
  • get_or_create()
    데이터베이스에 객체가 있으면 가져오고, 없으면 객체를 생성
    (<object>, created: bool) 튜플 형태로 반환
    object - 가져오거나 생성된 객체가 담기고, created - 객체의 생성 여부가 담기는데 해당 객체가 생성된 것이라면 True, 데이터베이스에서 가져온 것이라면 False
    User.objects.get_or_create(name='강아지', name_id='1')
  • update_or_create()
    데이터베이스에 객체가 있으면 수정하고, 없으면 객체를 생성
    튜플과 bool 형태를 반환한다
    https://docs.djangoproject.com/en/4.0/ref/models/querysets/#update_or_create()

2 ) Read 조회

  • get()
    해당 테이블에서 조건에 맞는 하나의 객체를 조회
    조회된 인스턴스를 반환한다.
    User.objects.get(id=1) -> <User: 강아지>
  • all()
    해당 테이블의 모든 레코드를 조회
    해당 쿼리셋의 모든 요소를 복사본으로 반환한다
    User.objects.all()
  • values()
    해당 테이블의 모든 레코드를 조회
    iterable로 사용될 때 인스턴스가 아닌 딕셔너리를 포함하는 QuerySet을 반환
    인자값으로 필드 이름을 넘겨 원하는 필드 정보만 딕셔너리로 구성할 수도 있다.
    User.objects.values() , User.objects.values("name")
  • filter()
    해당 테이블에서 조건에 맞는 레코드를 조회
    QuerySet을 반환하며, QuerySet 안에는 각각의 인스턴스가 들어있다.
    User.objects.filter(first_name="Koo")

3) Update 변경

  • update()
    이미 존재하는 객체에 대한 필드값을 수정
    업데이트된 행(row) 수를 반환한다.
    User.objects.filter(id=6).update(first_name='Gu')

4 ) Delete 삭제

조건에 맞는 모든 행 삭제
삭제된 객체 수와 객체 유형별 삭제 횟수가 있는 dictionary를 반환
get(), filter(), all()과 함께 사용 가능
Product.objects.filter(category_id=8).delete()

📚느낀점

CRUD를 하면서 어렵게 느끼는 부분은 update이다. 아직 DB와 친하지 않아서 그런 것이겠지 생각하지만.. 웹사이트를 보면 update(수정) 기능은 필수이다.. 먼저는 django ORM 으로 DB와 친해져야겠다 : )
우주 최강 무한 삽질러로 기능 구현 중에 있으나.. 정말 조금씩 조금씩 기본 원리에 눈을 뜨고 있는 것 같다. 개미 같은 발전도 내게는 황금같으니.. 삽질을 하더라고 그 끝은 깨달음이길 바란다 ㄸㄹㄹㄹ

🍜다짐, 다음 계획

-Django shell에서 ORM 문법 많이 사용하면서 친해지기 ^^
-final project 맡은 백엔드 기능 구현 진행ing ...
-정신없이 흘러간 2주~3주 벌써 2022년 1분기가 끝나간다.. 아자!

profile
날마다 꾸준히 성장하는 Software Engineer

1개의 댓글

comment-user-thumbnail
2022년 3월 24일

ㅋㅋㅋ 작성 중이 점점 사라지길!

답글 달기

관련 채용 정보