반응형

백엔드 Back-end 95

Q. JWT(JSON Web Token)란?

A. JSON 웹 토큰은 양 당사자 간에 전송되는 속성 정보(Claim)를 표현하는 단순하고, URL 안전한(URL로 이용할 수 있는 문자로만 구성된) 수단이다."JSON Web Token (JWT) is a compact, URL-safe means of representing claims to be transferred between two parties." (출처: IETF JSON Web Token (JWT)) 위 설명으로는 잘 이해가 되지 않는다. 실제 어떻게 구성되어 있는지 살펴보자.JWT 구성JWT 예 eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI6InRhcHRvcmVzdGFydCIsInJvbGUiOiJhZG1pbiIsInN0YXJ0X2F0IjoxNjQ0MT..

Q. 네스트NestJS에서 HTTP 요청 시 로그 찍는 방법은?

A. NestMiddleware 커스텀 클래스를 구현하면 된다. 문제 기본 설정에서는 HTTP 요청을 해도 로그가 찍히지 않는다. 아무리 localhost:3000을 방문해도 로그는 그대로다. 해결 방법 NestMiddleware 커스텀 클래스를 구현한다. 이때 Request, Response 객체 등을 받아서 로그로 출력하면 된다. 아래는 코드 예이다. 로그가 찍히는 것을 볼 수 있다. 코드 전체 보기 참고 NestJS Middleware How-to : Logging request/response in Nest.js properly

Q. 장고Django에서 unsigned integer로 primary key를 변경하는 방법은?

A. custom 모델을 따로 만들어 줘야 한다. 보통 MySQL에서 auto increment primary key 설정할 때 unsigned로 하는데 장고는 integer를 쓰든, bigint를 쓰든 signed가 기본으로 설정된다. 왜 그렇게 하는지 이유는 모르겠다. 장고 기본 설정과 달리 unsigned로 하고 싶다면 custom 모델을 만드는 방법 밖에 없다. 아래 코드가 custom 모델 예이다. 위 모델을 불러다가 Book이란 모델을 만든다면 아래처럼 작성해야 한다. 이렇게 하면 auto increment되는 unsigned primary key를 만들 수 있다. class Author(models.Model): id = UnsignedAutoField(primary_key=True) .....

시계열 데이터베이스Time Series Database, influxDB v1.8 튜토리얼, python으로 데이터 입력과 조회하기

데이터베이스 만들기 먼저 데이터베이스를 만들어야 한다. influx를 실행한다. 그리고 weather란 데이터베이스를 만들자. $ influx Connected to http://localhost:8086 version 1.8.9 InfluxDB shell version: 1.8.9 > create database weather Python 코드 예 만들고 나면 아래처럼 코드를 적고 실행하자. influxdb 파이썬 팩키지 설치가 필요하다. 관계형 데이터베이스와 influxDB의 용어 차이를 다시 보면 아래와 같다. 관계형 데이터베이스 RDB influxDB v1.8 influxDB v2.0 database database bucket table measurement measurement indexed ..

시계열 데이터베이스Time Series Database, influxDB v1.8 튜토리얼, 데이터 수집과 조회 예제

influxDB v1.8 설치가 끝났다면 실제 데이터를 수집해보고 사용을 해보자. 설치 방법은 시계열 데이터베이스Time Series Database, influxDB 소개와 설치 방법을 참고하자. 권장 환경 AWS EC2 Ubuntu18.04 프리티어에서 실습해보기를 권한다. 데이터가 쌓이는 것을 경험하고, 실제 시각화툴에 익숙해지기 위해서는 일주일 이상 데이터를 수집할 필요가 있기 때문이다. 서버 컴퓨터가 있다면 서버에서 실습하기를 권한다. 계정 추가 v1.8에서는 웹UI가 없기 때문에 직접 계정을 추가해야 한다. 아래는 사용자명이 admin이고, 비밀번호가 verysecret!인 사용자를 만들고, 해당 사용자한테 모든 권한을 부여하는 경우다. $ influx > CREATE USER admin WI..

시계열 데이터베이스Time Series Database, influxDB 소개와 설치 방법

시계열 데이터베이스란? 시계열(시간과 값이 쌍을 이루는) 데이터를 저장하고 서비스하는데 최적화된 데이터베이스다. influxDB란? influxdata에서 만든 시계열 데이터베이스. 전세계에서 가장 인기 있는 시계열 데이터베이스 중 하나다. 참고: InfluxDB와 SQL 데이터베이스 비교 TICK Stack이란? 보통 Influxdb만 사용하지 않고, Telegraf, Influxdb, Chronograf, Kapacitor를 함께 사용한다. 앞글자를 따서 TICK라고 부른다. Telegraf 데이터 수집 InfluxDB 데이터 저장 Chronograf 데이터 시각화 Kapacitor 이벤트 감지, 알림 influxDB 버전에 따른 차이는? 버전 1.x 2.x 데이터베이스 명칭 database buck..

플라스크Flask Ajax 예제 프로젝트

Ajax란? Asynchronous JavaScript + XML의 앞 글자를 따온 것. mozilla.org에 나온 소개 "Asynchronous JavaScript + XML(AJAX)은 그 자체가 특정 기술은 아닙니다. 2005년 Jesse James Garrett이 처음 만들어낸 말로, HTML 또는 XHTML, CSS, JavaScript, DOM, XML, XSLT, 그리고 제일 중요한 XMLHttpRequest 객체를 비롯해 기존의 여러 기술을 사용하는 "새로운" 접근법을 설명하는 용어입니다. 이렇게 다양한 기술을 AJAX 모델로서 결합했을 때, 웹 어플리케이션은 전체 페이지를 새로 고칠 필요 없이 사용자 인터페이스에 빠르고 점진적인 업데이트를 적용할 수 있습니다. 덕분에 어플리케이션은 보다..

pandas, pymysql을 활용해서 자동으로 데이터베이스 명세서 만들기

여러 데이터베이스 명세서를 만들어야 할 일이 생겼다. 한개도 아니고 여러개. 일일이 복사해서 붙여 넣을 수는 없어서, 자동으로 만들어주는 프로그램을 짰다. 아래 코드 또는 첨부한 주피터 노트북에 데이터베이스 연결 정보를 넣고 실행하면 자동으로 데이터베이스명으로 엑셀 파일이 만들어진다. 위와 같이 table, field, type, collation, null, key, default, extra, privileges, comment 정보를 쉽게 얻을 수 있다.

플라스크Flask ORM 예제 프로젝트

ORM이란? ORM(Object-relational mapping)은 객체와 관계형 데이터베이스를 연결해주는 것을 뜻한다. ORM을 이용하면 객체를 다루듯 관계형 데이터베이스를 다룰 수 있다. SQL문 없이 데이터베이스에 내용을 추가Create, 조회Read, 변경Update, 삭제Delete CRUD 할 수 있다. 파이썬Python에서 장고Django가 ORM으로 유명한데 플라스크Flask에서도 할 수 있다. flask_sqlalchemy 팩키지를 이용하면 쉽게 ORM을 구현할 수 있다. 프로젝트 예제 Flask ORM Example Project 위 프로젝트를 내려받아서 실행해보면 어떤 식으로 작동하는지 쉽게 이해할 수 있다.

Q. MySQL 외래키 추가 시 'Cannot Add Foreign Key Constraint' 오류 원인은?

A. 원인이 여러가지가 있는데 내 경우에 타입이 달라서였다. 같은 INT인데 왜 안 되지 한참 헤맸다. 이유는 테이블 A의 INT 타입은 UNSIGNED였고, 참조하는 테이블의 필드는 INT 타입이지만 SIGNED였다. desc 테이블명; 실행해서 정확히 type을 확인해보자. type을 정확히 맞춘 뒤에는 정상적으로 foreign key 추가할 수 있었다.

MySQL에서 사용자를 추가하고 특정 데이터베이스만 권한 허용하기

MySQL에 우선 관리자 계정으로 접속한다. 꼭 CLI커맨드라인인터페이스 기반 mysql-client 같은 걸로 접속하지 않아도 된다. 맥 사용자라면 SequelPro 같은 프로그램으로 접속해도 된다. 데이터베이스 추가 test란 데이터베이스를 만든다면 아래처럼 명령어를 실행하면 된다. CREATE DATABASE test; 사용자 추가하기 사용자 아이디는 test 비밀번호는 Te067813!3812@라면 아래 두 명령어를 실행한다. 내부 접속만 허용할 경우에는 'test'@'localhost'로 모든 IP주소를 허용할 경우에는 'test'@'%'로 적는다. 아래 명령어를 실행한다. USE mysql; CREATE USER 'test'@'%' IDENTIFIED BY 'Te067813!3812@'; 특정..

Mac에서 mysql client 설치하고 MySQL 원격 접속하는 방법

Mac에서 mysql client 설치 Homebrew가 설치 되어 있지 않다면 아래 명령어를 터미널에서 실행한다. % /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" 설치되어 있다면 brew install을 활용해서 mysql을 설치한다. % brew install mysql % brew install mysql-client 설치가 제대로 되어 있다면 $ mysql --version mysql --version을 실행해서 버전 정보를 확인한다. 원격 접속하기 접속주소 test.com 포트 3307 아이디 root 인 경우 mysql -h 접속주소 -P 포트번호 -u 유저명 -p m..

장고django API 서버 개발 - 안드로이드Android retrofit2 이용 시 request body 처리

가끔 아무 것도 아닌 걸로 긴 시간을 보내게 된다. retrofit2에서 이런 식으로 구현했다면 @Headers("Content-type: application/json") @POST("test") Call postTest(@Body TestData testData); 당연히 post로 body로 보내지는 데이터 형태도 json 형태다. request.body.decode('utf-8')을 로그 찍어보면 데이터가 {"name"="ted", "age"=40} 이런 형태로 들어온다. django에서는 따라서 import json body = json.loads(request.body.decode('utf-8')) 이렇게 데이터를 받아야 한다. 하지만 이렇게 받고 있었다. from urllib.parse im..

Q. 장고django 같은 네트워크 상의 다른 기기 접속 허용하는 방법은?

A. 현재 실행 컴퓨터 IP address 나 0.0.0.0를 적어줘야 한다. 그래야 같은 네트워크 상의 다른 기기에서 접속 가능하다. python manage.py runserver 그냥 이렇게만 실행할 경우에는 같은 네트워크 상의 다른 기기에서 접속이 안 된다. 예를 들어 로컬에서 장고 실행시, 같은 네트워크 상의 모바일 기기에서는 장고를 실행한 로컬 컴퓨터의 ip 주소를 192.168.0.3:8000 이런 식으로 넣어도 접속이 안 된다. python manage.py runserver 0.0.0.0:8000 또는 python manage.py runserver 192.168.0.3:8000 로 실행하면 외부에서 접속 가능하다. 이 때 반드시 포트 번호를 적어줘야 한다. 포트 번호는 다른 번호로도 가..

Q. 장고에서 POST방식 x-www-form-urlencoded된 데이터를 딕셔너리로 바꾸는 법은?

A. parse_qsl을 사용하면 된다. 한줄로 끝난다. 주의할 점은 반드시 .decode('utf-8')을 추가해줘야 한다. 추가해 줘야 하는 이유는 request.body의 type이 bytes이기 때문이다. decode로 str으로 바꿔줘야 한다. from urllib.parse import parse_qsl body_data = dict(parse_qsl(request.body.decode('utf-8'))) 개발 환경 python 3.9 django 3.1.6

Q. HTTP POST방식으로 데이터 전송할 때 x-www-form-urlencoded란?

A. url encoding 방식과 같은 형태로 데이터를 전송하는 방식이다. 출처: 개발자를 위한 웹 기술 > HTTP > HTTP 요청 메서드 > POST POST 요청은 보통 HTML 양식을 통해 서버에 전송하며, 서버에 변경사항을 만듭니다. 이 경우의 콘텐츠 유형(Content-Type)은 요소의 enctype 특성이나 , 요소의 formenctype 특성 안에 적당한 문자열을 넣어 결정합니다. application/x-www-form-urlencoded: &으로 분리되고, "=" 기호로 값과 키를 연결하는 key-value tuple로 인코딩되는 값입니다. 영어 알파벳이 아닌 문자들은 percent encoded 으로 인코딩됩니다. 따라서, 이 content type은 바이너리 데이터에 사용하기에..

백엔드 Back-end 2021.02.19

Q. 장고django에서 post, put, delete 방식 사용 위해서 csrf 끄는 방법은?

A. @csrf_exempt 를 사용하면 된다. 참고: csrf란? 사이트 간 요청 위조 API를 만들 경우 CSRF 보안이 필요하지 않다. API 서버는 API Key 등 다른 인증 방식을 사용한다. 그래서 csrf를 끌 필요가 있다. 출처: Cross Site Request Forgery protection from django.http import HttpResponse from django.views.decorators.csrf import csrf_exempt @csrf_exempt def my_view(request): return HttpResponse('Hello world') 코드 예는 다음과 같다. from django.http import JsonResponse from django...

파이썬 장고Django request에서 파라미터parameter 값 갖고 오기

GET 방식으로 key란 파라미터의 값을 가져온다면? ?key=1234 key = request.GET.get('key', None) 로 가져오고 만약에 key란 파라미터가 없다면 None이 된다. 참고: django.http.request Documentation self.GET = QueryDict(mutable=True) self.POST = QueryDict(mutable=True) QueryDict에 대한 설명을 찾아보면 다음과 같다. (출처: django.http.QueryDict) QueryDict implements all the standard dictionary methods because it’s a subclass of dictionary. Exceptions are outlined..

반응형