반응형

전체 글 397

Q. 장고Django ORM에서 n+1 이슈란? n+1 이슈 해결 방법은?

A. n+1 이슈란 목록을 조회할 때 주로 발생하며, 연관된 데이터까지 가져올 때 데이터 개수(n으로 표현)만큼 추가로 데이터베이스를 조회하는 이슈를 뜻한다. 해결 방법은 쿼리셋을 가져올 때 select_related 또는 prefetch_related를 사용하는 것이다. n+1 이슈 예아주 간단히 카페 메뉴 정보를 저장하는 API 서버를 만드는 경우를 생각해보자. (예제 코드: DRF - CRUD) 카테고리 테이블과 음료 테이블 두 개가 있다. 카테고리 테이블에는 커피, 티를 입력했고, 음료에는 카테고리를 커피로 선택해서 아메리카노, 카페 라떼, 에스프레소, 카푸치노를 입력했다. 카테고리 테이블과 음료 테이블 사이의 관계는 카테고리 1개에 여러 음료가 연결될 수 있으니 1 : n(일 대 다) 관계다. ..

Stack Overflow보다 ChatGPT가, 아니 검색보다 ChatGPT가 더 편한 거 같다

예를 들어 Python에서 리스트 순서를 유지하면서 중복을 제거하는 방법을 알고 싶다. 구글에서 검색하면 아래처럼 나왔다. 맨 위에 구글이 만들어 준 방법이 나오긴 하지만 부족하다. 다시 검색 결과를 눌러서 들어가서 실제 코드도 보고 테스트도 해봐야 한다. ChatGPT한테 물었다. 와. 사람이 알려주듯 1번 2번 3번 정리해서 알려주고, 코드 예시까지 제공해준다. 아직 약간 부족하긴 하다. 한국어로 질문해서 그럴 수도 있겠지만 갑자기 문체가 바뀌니 어색하게 느껴진다. 다른 질문도 해봤다. ChatGPT가 나보다 면접을 잘 볼 거 같다. ChatGPT 서비스를 계속 무료로 쓸 수 있다면 코드 궁금한 건 검색보다 ChatGPT한테 먼저 물어보게 될 거 같다. 검색 광고에 의존하는 구글은 어떻게 될까... ..

Q. 파이썬Python에서 타입 힌트Type hints를 적으면 타입이 변경될까?

A. 아니다. 변경되지 않는다. 아래처럼 text란 변수의 type을 int로 선언했다. 값은 "hello!"를 저장하고, type을 찍어보면 어떻게 될까? text: int = "hello!" print(type(text)) 입력값인 "hello!"의 타입인 str이 된다. int가 아니다. 에러도 발생하지 않는다. 너무 단순한 예라 그런 거고 다른 경우는 다를 거 같다고 생각할 수 있다. DRF(Django Rest Framework)에서 아래처럼 테스트를 해보자. request를 엉뚱하게 str이라고 선언한다. 그리고 type을 확인한다. 역시나 원래 타입인 rest_framework.request.Request로 나오는 것을 확인할 수 있다. 타입 힌트는 말 그대로 힌트다. 정적 타입 언어인 다른..

Q. 쿠키cookie에서 HttpOnly 속성의 기능은?

A. 자바스크립트로 document.cookie로 쿠키에 접근할 수 없게 된다. Set-Cookie: =; HttpOnly 위 예처럼 Cookie를 설정했다면 자바스크립트로는 접근이 안 된다. 실제 사례 아래 예(소스코드)를 보면 sessionid의 경우 HttpOnly인 상태인 것을 알 수 있다. document.cookie로 sessionid를 얻으려고 확인해보면 값이 없는 것을 확인할 수 있다. MDN 설명을 보자. A cookie with the HttpOnly attribute is inaccessible to the JavaScript Document.cookie API; it's only sent to the server. For example, cookies that persist in s..

Q. 장고Django의 View와 DRF의 APIView의 인증 관련 차이는?

A. CSRF 보호 제외 여부다. DRF(Django Rest Framework)의 APIView 자체도 from django.views.generic import View를 상속받아서 만든 것이다. View에 API에 주로 쓰도록 기능이 추가된 형태로 볼 수 있다. APIView의 as_view 메소드를 보자. @classmethod def as_view(cls, **initkwargs): """ Store the original class on the view function. This allows us to discover information about the view when we do URL reverse lookups. Used for breadcrumb generation. """ if i..

Q. HTTP/0.9에서 사용한 HTTP 요청 메소드는?

A. GET이다. GET밖에 없었다. This request consists of the word "GET", a space, the document address , omitting the "http:, host and port parts when they are the coordinates just used to make the connection. (If a gateway is being used, then a full document address may be given specifying a different naming scheme). 출처: The Original HTTP as defined in 1991 요청과 응답 예가 아래와 같았다고 한다. 출처: HTTP/0.9 – 원-라인 프로토콜 ..

파이참Pycharm에서 장고Django 중지점Breakpoint 찍어서 디버깅하는 방법

파이참Pycharm 같은 IDE를 사용하는 이유는 자동완성과 디버깅의 편의성 때문이다. 간단한 DRF(Django Rest Framework) 예제 코드다. 실행/디버그 구성 등록 디버깅을 위해서는 Run/Debug Configuration 등록이 필수다. 아래 예처럼 추가해준다. 가장 중요한 것은 환경 변수 등록이다. DJANGO_SETTINGS_MODULE=project.settings을 제대로 등록해야 설정을 읽어와서 실행 가능해진다. 중지점Breakpoint 찍기 원하는 곳에 중지점Breakpoint을 찍자. 사실 필요 없는 코드지만 중지점을 찍기 위해서 원래 정의된 create을 그대로 복사붙여넣기 했다. 디버깅 모드로 실행하기 디버깅 모드로 실행하자. 오른쪽 상단 벌레 아이콘이 디버깅 모드 실..

Q. HTTP GET 메소드로 Body에 데이터를 실어서 보내면 데이터가 갈까?

A. 간다. 패킷을 보면 전송되는 것을 확인할 수 있다! GET의 경우 Body에 데이터를 실어서 보내도 안 갈거라고 생각했는데 간다는 얘기를 듣고 직접 해보게 되었다. 같은 네트워크 상에 두 컴퓨터를 켜서 요청을 받는 컴퓨터에 WireShark를 설치했다. 192.168.1.23 컴퓨터에서 PostMan으로 메소드는 GET 요청 바디(Request Body)에 Content-Type: application/x-www-form-urlencded로 userId=1이란 값을 입력하고 전송 버튼을 눌렀다. 따라서 192.168.1.23 컴퓨터가 Source 출발지, 192.168.1.2가 Destination 도착지이다. 192.168.1.2에서 WireShark를 실행해서 패킷을 확인했다. userId=1을..

Q. 파이썬에서는 어떤 값들이 False일까?

A. 0, '', (), [], {}, set(), range(0), None 등이 False다. 공식 문서 설명은 다음과 같다. constants defined to be false: None and False. zero of any numeric type: 0, 0.0, 0j, Decimal(0), Fraction(0, 1) empty sequences and collections: '', (), [], {}, set(), range(0) 출처: Truth Value Testing, Python Documentation 아래 값들은 모두 False다. bool(0) bool('') bool(()) bool([]) bool({}) bool(set()) bool(range(0)) bool(None) bo..

Q. 잡플래닛jobplanet에서 괜찮은 회사 파악하는 방법은?

A. 기업리뷰에 게시 중단된 게시물이 없으면서 평점 3.0 이상이고 평점의 분포가 대체로 고르다면 꽤 괜찮을 회사일 가능성이 큽니다. 게시 중단된 게시물이 많은 회사는 거르기 게시 중단된 게시물 예입니다. 위 예처럼 해당 기업에서 게시 중단시킨 게시물이 많다면 거르는 게 좋습니다. 위와 같은 게시물은 점수를 낮게 주며, 회사에 대한 날선 비판을 담고 있는 경우가 많습니다. 해당 게시물이 중단되면 해당 점수도 평균점수에 반영되지 않아 평점이 높아집니다. 위와 같은 게시물이 많다면 해당 게시물을 1점으로 계산해서 다시 평점을 계산해보면 실제 평점에 더 가까운 평점을 얻을 수 있습니다. 평점 분포가 고르지 않다면 거르기 평점의 분포가 고르지 않고 1점이 많고, 반대로 5점 만점이 많다면 무조건 거르는 게 좋습..

Q. 크롬브라우저에서 사전 등 좀 더 검색을 쉽게 하는 방법은?

A. 브라우저 검색 사이트에 등록하면 좀 더 쉽게 검색할 수 있습니다. 크롬 설정Settings > 검색 엔진Search engine으로 들어갑니다. 거기 보면 Site search가 있습니다. 다음 사전 추가해보기 다음 사전으로 가서 단어를 검색합니다. algorithm을 검색해봤습니다. 주소가 아래처럼 됩니다. https://dic.daum.net/search.do?q=algorithm https://dic.daum.net/search.do?q=단어란 것을 확인 할 수 있습니다! Site search 옆에 Add를 누릅니다. 아래처럼 입력합니다. 그리고 Add를 누릅니다. 검색 창에서 Shortcut으로 등록한 dict까지 입력하고 탭 키를 누릅니다. 그 뒤에 찾을 단어를 입력하면 바로 다음 사전으로..

Q. 깃허브Github 위키Wiki를 로컬에서 Git clone해서 수정할 수 있을까?

A. 수정할 수 있다! 위키 페이지를 가서 보면 Clone this wiki locally라고 적혀 있는 것을 볼 수 있다. https://github.com/taptorestart/wiki.wiki.git 네 깃허브 위키 clone을 위한 주소 예다. 잘 보면 taptorestart/wiki.wiki.git이니 계정명/저장소명.wiki.git이란 것을 알 수 있다. 로컬에서 아래 명령어처럼 입력하면 클론이 된다. $ git clone https://github.com/taptorestart/wiki.wiki.git 수정 작업을 한 뒤에 커밋하고 푸시하면 깃허브에도 반영이 된다. PR은 지원되지 않는다. 로컬에서 하면 이미지나 파일 추가도 다른 곳에 올리지 않고 위키 내에 올려서 쉽게 할 수 있다. wi..

개발 Dev/깃 Git 2022.12.23

인공지능 관점으로 수학능력시험을 바라본다면?

인공지능에서 딥러닝의 경우 사람 뇌의 작동원리, 신경망을 본땄다. 이름도 인공신경망이다. 인공지능 관점으로 수학능력시험, 수능을 바라본다면 어떨까? 지능과 수학능력, 튜링 테스트와 수학능력시험 지능을 정의하기는 어렵다. 인간이 갖고 있는 지능을 설명하기도 어렵다. 다른 사람들이 지능을 정의하기 위해서 노력하고 있을 때, 앨런 튜링은 다른 방법을 제시했다. 튜링이 제시한 방법은 튜링 테스트다. The Turing test, originally called the imitation game by Alan Turing in 1950, is a test of a machine's ability to exhibit intelligent behaviour equivalent to, or indistinguishab..

어떤 개발자가 되어야 할까? 개발을 잘 하는 개발자가 되어야 한다!

당연한 이야기 맞다. 당연한 소리다. 하지만 가끔 우리는 당연한 것을 본질을 잊고 지낼 때가 많다. 다른 무수한 장점이 있다고 해도 개발자가 개발을 잘 못한다면, 개발 생산성이 떨어진다면 개발자로서 인정받을 수 없다. 스포츠 선수들을 보면 여러 유형의 선수가 있다. 야구를 예로 들면 1. 무뚝뚝하지만 타자로서 타율, OPS(출루율+장타율) 등 주요 지표가 최상위인 선수. 2. 타율 평균. 후배들을 잘 챙기는 리더십이 좋은 선수. 3. 타율 평균에 팀내 분위기 메이커인 선수. 등 선수가 있다. 어떤 선수가 팬, 감독, 다른 선수들한테 가장 인정받을 것인가? 당연히 1번이다. 자 여기 아래처럼 개발자가 있다. 개발 생산성 평균을 3이라고 하자. 1. 성격이 엄청 좋아 주변을 잘 챙기는 개발자. 개발 생산성 ..

HTML을 Markdown으로 바꿔주는 파이썬 팩키지 만들기

HTML을 Markdown으로 바꿀 필요가 생겨서 관련 파이썬 팩키지를 찾아봤다. 찾아보니 몇개 있긴 했지만 수준이 그리 높지 않기도 했고, 간단한 거니 연습삼아 따로 하나 만들어보자는 생각으로 만들었다. 팩키지명은 htmltomd다. pypi 주소는 여기! https://pypi.org/project/htmltomd/ 아래처럼 실행하면 import htmltomd html = """ htmltomd htmltomd is a simple package for converting HTML to Markdown. Getting Started pip install htmltomd Source code github.com/taptorestart/htmltomd Image """ result = htmltomd...

왜 꽤 큰 스타트업 개발팀에서는 코드 리뷰를 할까?

다음 중 코드 리뷰를 하는 이유에 해당하는 것을 모두 고른다면? ① 오류를 줄이기 위해서 ② 개발 속도를 높이기 위해서 ③ 팀원의 성장을 돕기 위해서 ① ② 이유가 크다. ③을 가장 최우선 목적에 두고 코드 리뷰를 하지는 않는다. 부수적 효과에 가깝다. ① 오류를 줄이기 위해서 이 이유가 가장 크다. 꽤 큰 스타트업이라면 이미 사용자가 많다. 아주 사소한 실수로 서비스 장애가 발생할 수도 있다. 이 장애로 인한 손실도 크다. 시간이 들더라도 당연히 미리 점검하는 게 더 이익이다. 코드 리뷰를 통해서 주로 장애 발생 가능성을 살펴보게 된다. 그래서 코드 리뷰 시 단골 사항이 데이터베이스 부하 관련, 메모리 부하 관련, 예외 처리 등이 된다. ② 개발의 속도를 높이기 위해서 단기적으로 코드 리뷰를 하면 개발..

반가산기half adder 회로도 이해하기

반가산기의 회로도 반가산기의 회로도를 보면 아래와 같다. A와 B 값이 입력되면 S와 C값이 출력된다. S는 합Sum, C는 올림수Carry를 뜻한다. 이진수 한자리수 덧셈 컴퓨터는 기본적으로 이진수로 이루어져 있으니 간단한 덧셈을 해보자. 이진수 덧셈을 해보면 아래와 같다. A+B A B 0 0 0 1 0 1 1 1 0 10 1 1 A+B가 S이면 좋겠지만 S는 오직 1과 0만 표현할 수 있다. 그래서 C가 따로 필요하다. 위 A+B를 나눠서 표현해보자. 아래처럼 나눠서 표현할 수 있다. A+B C올림수 S합 00 0 0 01 0 1 01 0 1 10 1 0 C올림수 C올림수의 결과를 다시 A와 B만 가지고 살펴보자. C A B 0 0 0 0 0 1 0 1 0 1 1 1 A와 B가 모두 1일 때만 1이..

Q. 깃허브Github로 나만의 공짜 위키Wiki 만드는 방법은?

A. 공개 저장소를 하나 만들고 위키를 사용하면 됩니다! 위키 검색도 가능합니다! 위키 저장소 만들기 우선 새 저장소를 하나 만들어요. Repository name에 wiki 또는 원하시는대로, Public으로 만들면 됩니다. 무료 계정의 경우 비공개 저장소는 위키를 사용할 수 없습니다. Public으로 하세요. 위키 활성화 Settings를 눌러서 위키를 활성화합니다. 위키 메뉴가 나타납니다. 위키를 눌러서 위키 문법대로 글을 작성하면 됩니다! 위키 페이지 검색 Pages를 보면 Find a page.. 라고 나옵니다. 페이지명 기준 검색입니다. 내용 자체는 검색이 안 됩니다. 위키 안의 콘텐츠 검색 내 깃허브 위키에 작성한 콘텐츠를 검색하고 싶다면 어떻게 해야 할까요? 왼쪽 위에 검색창이 있습니다. ..

Python requests와 pytest로 REST API 서버 테스트하기

자바스크립트 기반인 frisby.js로 REST API 서버 테스트를 할 수도 있지만, 파이썬이 익숙하다면 requests로도 쉽게 구현할 수 있다. 준비: API 서버 실행 우선 FastAPI 예제를 실행한다. 예제코드는 FastAPI - Email Login with Password.. 여기 있다. localhost:8000/docs로 접속했을 때 아래처럼 뜬다면 정상 작동하고 있는 것이다. API 테스트 코드 작성 위에 브라우저로 확인한 것을 그냥 코드로 아래처럼 작성해서 확인할 수도 있다. import requests def test_get_docs(): endpoint = "http://localhost:8000/docs/" response = requests.get(endpoint) asser..

반응형