본문 바로가기

Web15

[Django] Unit 테스트 코드 작성하기 테스트 코드 그동안 PostMan으로 하나씩 API테스트의 수고로움을 덜기 위해 Django는 자동화된 테스트 도구들을 제공한다. 자동화된 테스트를 적용하면 직접 테스트하는 것보다 빠르고 정확하게 테스트를 진행할 수 있다. 테스트 코드 작성하는 것은 Django Shell을 사용하는 것과 다르지 않다. 그렇다면 테스트 코드를 한번 작성해보자. 테스트를 만들어야 하는 자세한 이유는 공식문서↗를 보면 자세히 나와있다. 테스트 코드는 테스트 주도 개발(TDD)라는 방법론이 있을 정도로 백엔드 개발에서 중요한 부분이다. 그러나 반드시는 아니다. 테스트 개발 방법론에 대한 설명은 해당 포스팅↗을 참고 하면 된다. 만약 프로젝트의 단위가 큰 프로젝트라면 자동적으로 생성되는 `tests.py`를 수정할 필요 있다. .. 2024. 1. 10.
[Django] 커스텀 Admin 페이지 Django는 사이트 편리하게 모델을 관리할 수 있도록 관리자 기능 페이지를 기본적으로 제공한다. 오늘은 Admin 페이지를 활용하는 방법에 대해 알아보려고 한다. Admin 페이지 접속하기 우선, Admin 페이지에 접속하려면, `superuser`(관리자)를 생성해야 한다. 다음 `createsuperuser` 명령어를 입력해서 Admin 페이지에 접근한다. python manage.py createsuperuser 사용자 이름(Username) : admin 이메일 주소: Password: Password (again): Superuser created successfully. 초기에 관리자 사이트에 들어가게 되면 user와 Groups만 볼 수 있다. 사전에 작성한 모델을 올려보도록 하자. 사전에.. 2024. 1. 10.
Django Rest Framework - (1 : API 테스트 해보기) DRF Django에서 RestAPI를 쉽게 구축할 수 있게 도와주는 프레임워크이다. 그렇다면 왜 Django가 아니라 REST한 프레임워크인 DRF를 사용하게 된 것일까? 예전에는 브라우저만으로 웹 서비스를 접근할 수 있었지만 스마트폰, 태블릿 PC등이 생기면서 여러가지 플랫폼에서도 웹/앱 서비스를 접근할 수 있어야한다는 중요성이 생기게 되었다. 그래서 Django Rest Framework가 필요해지게 된 것이다. Restful한 API를 개발할 수 있다는 이야기는 한마디로 사용자가 원하는 것을 잘 찾을 수 있게 정리해놓은 것을 말한다. 예를 들어, 클라이언트가 커피를 주문하면 `order/1` 이런식으로 찾아 줄 수 있는 것이다. DRF의 자세한 내용은 공식 문서를 참고하면 된다. DRF 설치하기 .. 2023. 12. 25.
[Django] DB 쿼리 최적화를 다양한 방법들을 정리해보았다. 지난 쿼리셋 포스팅에 이어서 최적화를 하는 다양한 방법에 대해 적어보려한다. 데이터 성능을 개선시키는 메서드들 `only()`메서드를 활용하자. 기본적으로 우리가 어떠한 데이터들을 가져온다고 가정했을 때 `Track.objects.all()`와 같은 식으로 쿼리한다. 해당 쿼리는 track 데이터의 모든 필드를 가져오는 명령어로 만약 우리가 전체 컬럼이 아닌 특정한 필드를 가져오고 싶다면 위와 같이 사용하지 않아도 된다. `only()`메서드를 이용하면 지정된 필드만 가져올 수 있게 설정할 수 있다. 만약 같은 `title`이란 필드만 조회한다고 가정하면 쿼리에 사용할 수 있는 메모리를 줄여 DB 부하를 줄여줄 수 있지 않을까 한다. 하지만 장점만 가지고 있는 것은 아니다. 만약 다음 코드와 같이 지정해.. 2023. 12. 20.
[Django] 쿼리셋으로 데이터 조회하기 먼저 이전에 예시 프로젝트를 생성하여 가상의 음원플랫폼으로 Spotify Developer 사이트에서 앨범, 트랙, 아티스트 API 요청으로 데이터를 가져와 DB에 넣었다. 쿼리셋(QuerySet) 먼저 쿼리셋은 무엇일까? 쿼리셋은 일반적으로 데이터베이스를 조회하기 위한 기능을 제공하는 개념을 의미한다. ORM을 통해 DB와 상호작용하는 인터페이스를 제공한다. ORM에 대한 개념은 이전에 작성했던 글을 참조하면 된다. 아래 그림을 보면 데이터를 조회하기 위해 필터링하는 구간까지가 쿼리셋을 의미하고 [0] 인덱싱으로 인스턴스를 얻을 수 있다. READ 먼저, 기본적으로 쿼리셋을 통해 데이터를 가져오는 실습을 진행해보자. 데이터를 가져올 때는 `all(), get(), filter(), exclude(), .. 2023. 12. 20.
전반적인 웹 통신 과정 이번 포스팅에서는 인터넷 브라우저에 www.google.com을 입력하면 어떤 일이 발생하는지 과정을 알아보려고 한다. 즉, 웹의 전반적인 HTTP 통신에 대해 알아보는 것이다. 이와 관련된 포스트들은 다른 블로그에도 충분히 많기 때문에 참고하면서 작성하였다. 더보기 웹 브라우저에 URL을 입력한다. 브라우저와 로컬에서 DNS 기록이 있는지 확인하고 없으면 ISP에서 DNS 쿼리를 통해 IP 주소를 찾는다. IP 주소를 찾았으면 라우터를 통해 경로를 설정하고 ARP 패킷을 보내 MAC 주소를 찾아내 통신할 준비를 한다. 웹 브라우저와 서버는 TCP 커넥션을 통해 연결을 수립한다. 웹 브라우저는 서버에 HTTP 요청을 보내고 서버는 이에 응답 메세지를 작성한다. 서버는 클라이언트와 TCP 커넥션을 맺고 응.. 2023. 12. 10.
JWT(Json Web Token)에 대한 이론적 이해 인증과 인가 인증에 대해서는 알겠지만 인가에 대해서는 잘 이해가 안될 것이다. 인증(Authentication)은 사용자가 이 서비스의 대한 권한을 부여받은 사용자라는 것을 인증하는 절차이고 인가(Authorization)은 이미 인증이 끝난 사용자가 해당 기능을 사용하기 위한 권한을 허가받는 절차라고 한다. 오늘은 지난 세션인증 방식에 이어 토큰 인증에 대해 중심적으로 다루고 대표적인 JWT(Json Web Token)에 대해서도 알아보려고 한다. 인증 방식 먼저, Client가 회원가입을 하게되면 해당 ID와 비밀번호가 서버 테이블에 저장되게 된다. 이때 테이블에 PW 그대로 저장되는게 아니라 한번 Salting + Hashing을 거쳐 저장되기 때문에 보안을 어느정도는 유지할 수 있다. 이렇게 해시.. 2023. 12. 6.
Django - 객체 참조 관계 🚩 문제 발생 우선, 제가 부딪혔었던 이슈는 다음과 같습니다. 유저가 게시글을 생성하는 요청을 할 때, 카테고리를 설정하지 않으면 기본 값으로 '기타'라는 값으로 저장하려고 했습니다. 문제는 '기타'라는 값은 애초에 DB 저장된 값이 아니기 때문에 NOT NULL 문제가 발생하게 된 것이죠. models.py class Article(CommonModel): author = models.ForeignKey("users.User", on_delete = models.CASCADE, related_name="articles",) title = models.CharField(max_length=100, blank=False, null=False) context = models.TextField() catego.. 2023. 11. 29.
[Django] CRUD 구현 오늘은 Django에서 모델을 만들어 보고, 실제로 CRUD 처리를 구현하는 연습을 포스팅하려고 한다. 모델 생성 먼저, 데이터를 처리하기 위해 모델을 생성해야 한다. SQL를 통해 이전 하는 방법도 직접 Model을 작성하는 방법도 있다. 여기서, 특별한 건, `ForeignKey`(외래키)를 사용했다는 것이다. 외래키 작성의 파라미터로 참조할 테이블, 개체 관계 이름, 개체시 동작을 넣는다. 참조할 테이블 : 연결할 모델 클래스를 가리키며 해당 외래키에서 어떤 테이블을 참조할지를 의미한다. 관계상 이름(related_name) : 개체 관계에 사용할 이름을 나타내는데 역방향에서 참조할 때 사용하는 이름이다. Categoty 테이블에서 category 속성을 통해 Memo의 category를 역참조한다.. 2023. 11. 29.