전체 글 106

JWT 파헤치기

JWT는 json web token의 줄임말이다 로그인 인증 방식에는 대표적인 두 가지가 있다. 세션 인증 방식 토큰 인증 방식 세션 인증은 로그인 시 유저마다 만들어지는 세션을 저장할 데이터베이스가 필수이다. 서버를 여러 대 사용 중이라면 이 세션 데이터베이스를 공유하고 있어야 한다. 그렇지 않으면 로그인을 해서 세션이 만들어졌지만 다음 요청 시 다른 데이터베이스를 살펴보므로 세션이 없는 줄 알고 다시 로그인을 요청하게 되는 문제가 발생할 수 있다. 매 요청 시 세션을 확인하는 게 일반적이다. 토큰 인증은 어디에 토큰을 저장하는 지에 따라 또 나뉘게 된다. 브라우저의 로컬 스토리지나 세션 스토리지에 저장할 수도 있고 브라우저의 쿠키에 저장해서 서버에게 요청을 보낼 때마다 알아서 토큰도 같이 보내지게 할..

js 2021.08.12

MongoDB를 써보다. 장점과 단점

이번에 시작할 프로젝트에서는 MongoDB를 써보려고 mongoDB 공식 문서를 비롯해 폭풍 구글링 중이다. 기존에 MySql(관계형 데이터베이스)를 썼을 때는 불편한 점이 꽤나 많았다. 테이블을 다 따로 만들어야 하며 일대다(oen to many) 관계를 표현하기 위해 '다(many)'에 해당하는 테이블에서 '일(one)'에 해당하는 테이블을 참조하는 id가 필요했다. mysql workbench를 사용해서 ER diagram을 만들었었는데 익숙하지 않아서인지 가끔 데이터베이스 동기화가 안 되거나 기존에 어렵게 만들어놓은 테이블이 날아가는 일도 있었다. 애초에 sequelize를 사용해서 코드로 모델링 해놓으면 이런 일은 발생하지 않았을 테지만 실제 쇼핑몰이라고 생각하고 데이터베이스를 짰을 때 그 테이..

DB 2021.08.11

express 앱을 aws ec2에 올리는 과정(에러 많음)

sudo apt-get install nginx aws가 깔린 우분투에 접속해서 위 명령을 치고 인바운드 규칙에서 http(포트 80)을 추가해준다. nginx가 서버 앱에 요청을 할 수 있어야 하기 때문이다. sudo service nginx start 를 하면 nginx가 켜진다. sudo service nginx status 를 통해 잘 켜졌는지 확인이 가능하다. 도메인을 통해 오는 모든 요청이 nginx로 가기 때문에 nginx가 express 서버 앱으로 요청을 보내주게 해야한다. 인바운드 규칙에 3000번 포트를 추가해줄 수도 있지만 리버스 프록시와 캐싱을 제공해주는 nginx를 사용하는 게 더 좋다. cd /etc/nginx/sites-available sudo rm default sudo ..

js 2021.08.07

다이나믹 프로그래밍 DP 테이블 만들기 전략

반복되는 부분 문제를 가진 경우 시간 복잡도를 줄일 수 있는 방법에는 재귀에서 memoization dp 테이블 만들기 두 가지 방법이 있다. 재귀는 예외 케이스만 잘 처리해주고 이미 계산된 값이면 리턴해주면 된다. 재귀의 관점은 어느 정도 익숙해졌지만 항상 재귀로 풀다 보니 dp 테이블 만드는 방식이 감이 안 왔다. DP 테이블 만들 때 유용한 사고 전략 몇 가지를 생각해봤다. 문제들을 풀어보며 확인한 패턴이다. 보통 dp 테이블을 만들 때는 처음 인덱스부터 하나씩만 훑으면서 테이블을 갱신해간다. 1. 해당 인덱스를 포함하거나 포함하지 않거나 어찌 보면 2번과 같은 맥락으로 생각할 수 있지만 직관적으로 1번 표현이 좀 더 자연스러울 때가 있다. 2. 해당 인덱스부터 / 해당 인덱스까지 '해당 인덱스부터..

이진 탐색 Binary Search 경계 설정을 어떻게 해야 하는가

이진 탐색은 쉬운듯 하면서도 어려운 알고리즘이다. 경계를 잘못 설정하면 while 문을 빠져나오지 못 하게 된다. 그렇다고 여러 테스트 케이스를 매번 고려하면서 짜기에는 시간이 너무 오래 걸린다. 어느 조건에 =을 넣어줘야 하며 left, right 갱신 시 mid로 할지 mid -1 혹은 mid + 1로 할지 고민하는 건 꽤나 골치 아픈 일이다. 그래서 나름의 템플릿이 있으면 빠르게 이진 탐색 코드를 짤 수 있겠다는 생각이 들어서 정리하는 중이다. 가장 기본 형태 left, right = 0, len(arr) - 1 while left < right: mid = left + (right - left) // 2 if arr[mid] < target: left = mid + 1 else: right = m..

[리뷰집] 프로젝트 소개

크롤링 공개가 문제가 될까 하는 걱정에 도메인은 닫아둔 상태입니다. 필요성 이 프로젝트를 만든 사람은 독해력이 약합니다. 기억력도 그다지 좋지 않습니다. 그리고 돈이 많지 않아 무엇이든 하나 살 때 리뷰를 꼼꼼하게 읽어봅니다. 읽다 보면 어느새 모든 리뷰를 읽고 있습니다. 하지만 너무 많은 리뷰를 한 번에 읽었기 때문에 시간은 많이 소비했지만 머릿속에 잘 기억이 남지를 않습니다. 그 제품이 그래서 어떤 특징을 가지고 있는지, 장점은 뭔지, 단점은 뭔지 요약할 수 있어야 하는데 그게 쉽지 않습니다. 그래서 리뷰에서 자주 등장하는 단어를 뽑아내서 해당하는 문장들만 읽고 싶었습니다. 자주 등장하는 단어는 곧 그 제품의 특징을 말해줍니다. 하지만 여기에서 그치지 않고 제품의 장점을 대표하는 단어, 단점을 대표하..

PyKomoran 사용법 정리

PyKomoran github 페이지에 사용법을 확인할 수 있게 링크가 걸려있다. 그런데 링크를 눌러보면 서버가 망가진 건지 도메인 갱신을 안 하신 건지 페이지 오류가 떠서 확인할 수가 없다. PyKomoran 덕분에 프로젝트를 성공적으로 배포할 수 있었기 때문에 PyKomoran 함수들에 대해 정리 해본다. PyKomoran install pip install PyKomoran 대문자, 소문자가 섞여있으니 주의가 필요하다 import from PyKomoran import Komoran, DEFAULT_MODEL 보통은 이 두가지만 import 하면 문제 없이 사용 가능할 것이다. 생성자 komoran = Komoran(DEFAULT_MODEL['LIGHT']) 이와 같이 LIGHT 모델을 사용하는 k..

python 메모리와의 전쟁[종지부] - konlpy를 버리고 PyKomoran을 선택하다

정말 나의 리뷰 프로젝트를 heroku 무료 서버에 올리기 힘들었다. 메모리 개선만을 위해 거의 일주일을 불태웠다. 저장 용량은 단 500MB만 허락되는데 konlpy, django를 비롯해 꼭 필요한 패키지들과 RNN 학습 모델, 토크나이저 등 꼭 필요한 파일들만 heroku에 올렸을 때 497.8MB로 간당간당하게 올라갔었다. 하지만 메모리 제한에 막혔었다. heroku 무료 서버 기준 512MB까지 RAM을 사용할 수 있지만 1024MB까지는 ERROR R14를 띄우면서 허용해준다. worker가 죽지 않는다는 뜻이다. 1024MB를 넘어가면 ERROR R15를 띄우면서 강제 종료된다. 저장 용량부터 거의 500MB였기 때문에 쉽게 worker가 강제 종료됐다. 자연어 처리를 heroku 무료 서버..

OrderedDict의 배신 - not ordered

keras의 tokenizer가 학습을 하고 나면 tokenizer.word_counts()를 사용하여 단어가 몇 번 등장했는지 쉽게 파악이 가능하다. 내가 배운 예제에서는 tokenizer.word_index()와 tokenizer.word_counts()의 단어 순서가 동일했다. 그러니 당연히 항상 같을 거라고 생각해왔다. tokenizer.word_index()는 가장 많이 등장한 단어부터 인덱스 번호 1번을 매긴다고 배웠다. 게다가 tokenizer.word_counts()는 print시 OrderedDict라고 나온다. OrderedDict는 이름에서 자기가 순서를 가지고 있다고 어필하고 있다. 난 당연히 이 순서가 주요 key에 의해 정렬된 순서라고 생각했다. 단어 등장 횟수에 의해 정렬된 순..