본문 바로가기
부트캠프TIL, WIL/AI웹개발(스파르타코딩클럽)

[TIL]2023년 8월 21일 월요일.

by 우지uz 2023. 8. 22.

안녕하세요! 살아있나 ? 싶을때 돌아온 우지입니다. 
지금까지 대략적으로, 여름휴가도 보내고 
공부는 ... 좀 게을리 했고 
운동습관을 만들어왔습니다 ~~!
유산소 90분, 근력 60분정도 매일하고 있어요. 일주일에 하루이틀 쉬구요 !

저번주부터 뭔가 공부에 대한 집중이나, 습관을 만들어 가야겠다 싶어서
몇몇 동료들과 함께 스터디를 만들어서 

8월 21일부터 9월 10일까지(3주간) 순공 시간을 매일 측정해서
개발 스터디 배틀을 하기로 했습니다.

함께하고 싶으신 분들은 언제든지 이야기해주세요 !

매일 꾸준히 블로그에 포스팅 & 깃허브에 커밋을 쌓을 수 있도록 노력하겠습니다. 

매주마다, 매달마다 성장하는 내 자신을 보면서 미래를 그려나가보려 합니다. 

목표 순공 시간 : 6시간

저녘 8시 순공 시간 : 3시간 45분

부족한 순공 시간을 채우기 위해 11시 15분부터 1시 30분까지 추가 공부했습니다.

오늘은 

1. 자바스크립트(JS) 변수형 및 자료형, 제어문 - 강의자료 보고 복습하기 : https://wikidocs.net/260

2. 코테 - 좌표압축

3. 테스트코드(장고) - 유저, 게시글 관련 (장고실무심화 5주차 17강까지)

4. 개발 용어 - 인스턴스 메서드, 클래스 메서드, 스태틱 메서드의 차이와 개념에 대해

를 공부했고, 내일은 테스트코드 복습 마무리
알고리즘 심화 공부를 할 것입니다.


1. 알고리즘(코딩테스트) 공부

링크 : https://www.acmicpc.net/problem/18870

풀이 : 

import sys

n = int(sys.stdin.readline())
numbers_list = list(map(int, sys.stdin.readline().split()))
sorted_array_list = sorted(set(numbers_list))

dic = {sorted_array_list[i]:i for i in range(len(sorted_array_list))}
for i in numbers_list:
    print(dic[i], end=" ")

처음 알게 된것 : sys.stdin.readline() => 파이썬에서 입력값을 받아오는 함수
dic = {sorted_array_list[i]:i for i in range(len(sorted_array_list))} : 리스트 뽑아오는 법

느낀점 : 기본 방법론에 대해 꾸준히 공부하고 기록하자


2. 인스턴스 메서드, 스태틱 메서드, 클래스 메서드 공부

https://www.daleseo.com/python-class-methods-vs-static-methods/

 

[파이썬] 정적(static) 메서드와 클래스(class) 메서드

Engineering Blog by Dale Seo

www.daleseo.com

느낀점

인스턴스 및 메서드에 대한 기본적인 개념은 예전에 익혀두어서 잘 알고 있지만
정적 메서드와 클래서 메서드의 차이점과 사용법에 대해서는 이해하지 못하고 있었습니다.


클래스(class) 메서드 VS 정적(static) 메서드

두 메서드는 별도로 인스턴스를 생성하지 않고도 메서드를 실행시킬 수 있다는 점에서는 공통점을 가지고 있습니다.

하지만, 클래스 메서드는 init 함수를 통해 클래스 속성에 접근할 수 있고 
첫번째 인자로 self 클래스 자체가 넘어오기 때문에 다른 클래스메서드를 호출할 수도 있습니다.

반면에 정적 메서드를 호출 할때는, 첫번째 인자로 self를 받아오지 않기 때문에 명시적으로 넘긴 다른 인자만 접근 가능합니다.

자바에서는 이 두 가지 개념이 동일하게 사용하기 때문에 자바에서 건너온 분들이 많이 햇갈려하는 부분이기도 한데요. 
자바에서는 이 두 가지 개념을 굳이 구분할 이유가 없습니다. 왜냐하면 정적 메서드에서도 클래스 이름을 통해 자유롭게 클래스에 접근할 수 있기 때문입니다. 

하지만 파이썬에서는 클래스에 접근이 필요할 때는 클래스 메서드, 접근이 필요없을 때는 정적 메서드를 사용하도록 되어 있습니다.

참고 : https://www.daleseo.com/python-class-methods-vs-static-methods/


3. 테스트코드 관련 공부

유저 테스트 코드 

from rest_framework.test import APITestCase
from django.urls import reverse
from rest_framework import status
from user.models import User
# Create your tests here.

class UserRegistrationAPIViewTestCase(APITestCase):
    def test_registration(self):
        url = reverse("sign_up_view")
        user_data = {
            "username":"testuser",
            "account":"tester",
            "email":"test@kakao.com",
            "password":"popk1214",
        }
        response = self.client.post(url, user_data)
        self.assertEqual(response.status_code, 201)

    # def test_token_login(self):
    #     url = reverse("token_obtain_pair")
    #     user_data = {
    #         "username":"testuser",
    #         "account":"tester",
    #         "email":"test@kakao.com",
    #         "password":"popk1214",
    #     }
    #     response = self.client.post(url, user_data)
    #     print(response.data)
    #     self.assertEqual(response.status_code, 200)


class LoginUserTest(APITestCase):
    def setUp(self):
        self.data = {'email':'test@kakao.com','account':'tester','username':'testuser','password':'popk1214',}
        self.user = User.objects.create_user('test@kakao.com','tester', 'testuser','popk1214')

    def test_login(self):
        response = self.client.post(reverse('token_obtain_pair'), self.data)
        self.assertEqual(response.status_code, 200)

    def test_get_user_data(self):
        access_token = self.client.post(reverse('token_obtain_pair'), self.data).data['access']
        response = self.client.get(
            path=reverse("user_view"),
            HTTP_AUTHORIZATION=f"Bearer {access_token}"
            )
        self.assertEqual(response.status_code, 200)
        self.assertEqual(response.data['account'], self.data['account'])
        # self.data는 34번째줄에서 셋업 데이터를 의미함.

 

게시글 테스트 코드

from django.test import TestCase
from django.urls import reverse
from rest_framework.test import APITestCase
from rest_framework import status
from user.models import User
# 이미지 관련 import
from django.test.client import MULTIPART_CONTENT, encode_multipart, BOUNDARY
from PIL import Image
import tempfile # 임시파일 만드는 것

# 파이썬 장고 실무 심화 5주차, 10강 - setUp 함수를 모든 클래스에 대해서 늘 새로 만들어 주는건 비효율적이기 때문에, 수정되지 않고 반복해서 써야하는 함수 같은 경우 "클래스 메소드"중 하나인 setUpTestData를 쓰는게 좋음. 11강때 클래스메소드, 12강때 스태틱 메소드에 대해서 배움


class ArticleCreateTest(APITestCase):
    """ 주석처리. 12강에서 13강으로 넘어가면서, setUp 함수에서 setUpTestData 클래서 메소드를 사용하기 시작함. 이유는 알지???
    def setUp(self):
        # user_data 에는 로그인 시, access_token 과 refresh_token 을 받을 수 있음.
        # self.user_data).data['access'] 와 같은 방식으로 접근함.
        self.user_data = {'email':'test@kakao.com','account':'tester','username':'testuser','password':'popk1214',}
        # user.models.py 에 있는 create_user 함수로 유저를 생성함.
        self.user = User.objects.create_user('test@kakao.com','tester', 'testuser','popk1214')
        # title과 content로 게시글 데이터를 생성
        self.article_data = {'title':'some title', 'content':'some content'}
        # access_token 을 user_data 를 통해서 받아옴.
        self.access_token = self.client.post(reverse('token_obtain_pair'), self.user_data).data['access']
    """
    @classmethod
    def setUpTestData(cls):
        cls.user_data = {'email':'test@kakao.com','account':'tester','username':'testuser','password':'popk1214',}
        cls.article_data = {'title':'some title2', 'content':'some content2'}
        cls.user = User.objects.create_user('test@kakao.com','tester', 'testuser','popk1214')

    """
    access_token을 만들때 self.client 는 cls.client로 쓰면, 에러가 발생함. cls는 client라는 함수가 없기때문임. 그래서 access_token 는 setUpTestData함수가 아닌, setUp 함수안 작성함
    """
    def setUp(self):
        self.access_token = self.client.post(reverse('token_obtain_pair'), self.user_data).data['access']

    def test_fail_if_not_logged_in(self):
        url = reverse("article_view")
        response = self.client.post(url, self.article_data)
        self.assertEqual(response.status_code, 401)

    def test_create_article(self):
        response = self.client.post(
            path=reverse("article_view"),
            data=self.article_data,
            HTTP_AUTHORIZATION=f"Bearer {self.access_token}" # setUp에서 받아온 access_token을 넣어주었음.
        )
        self.assertEqual(response.status_code, 200)
        print(self.user, self.user_data)

느낀점 : 기본 -> 응용 -> 심화까지 놓치지 말고 꼼꼼히 공부하자.

테스트코드 중요하니까 잘 적어두고, 가끔 복습하기