데이터베이스 트랜잭션 격리 수준데이터베이스 트랜잭션의 격리 수준은 격리성(각각의 트랜잭션은 서로 간섭없이 독립적으로 수행되어야한다는 규칙)의 견고함 정도를 말합니다.트랜잭션 격리 수준트랜잭션의 격리 수준은 총 네 단계로 나뉩니다.READ UNCOMMITEDREAD COMMITEDREPEATABLE READSERIALIZABLEREAD-UNCOMMITED가 가장 성능이 낮은 대신 가볍고, SERIALIZABLE이 가장 성능이 높으며 무겁습니다.때문에 프로덕트 케이스에 맞는 트랜잭션 격리 수준을 선택하면 되겠습니다. 성능이 좋고 나쁘고는 어떻게 판단하나요?성능을 판별하는 기준은 격리성을 얼마나 잘 유지하느냐입니다.위에서 설명한 네가지 격리 수준에서는 아래와 같은 이슈가 발생합니다.DIRTY READNON-R..
트랜잭션(Transaction) postgresql을 기준으로 작성되어있습니다. 트랜잭션: 데이터베이스 관리 시스템에서의 최소 상호작용의 단위 개요 데이터베이스 트랜잭션은 데이터베이스에서 수행되는 일련의 작업이며 모두 단일한 논리적 작업 단위입니다. 즉, 특정 트랜잭션을 일부만 수행하거나 결과를 저장하는 경우는 절대 존재할 수 없습니다. 결과는 무조건 성공 / 실패만 존재합니다. 트랜잭션은 여러개의 DML으로 이루어질 수 있습니다. DML(Data Manipulation Language)이란 데이터 조작 언어라는 뜻으로 CRUD의 행동을 제어합니다. SELECT (READ) INSERT (CREATE) UPDATE (UPDATE) DELETE (DELETE) 트랜잭션을 쪼개면 여러 DML이 존재할 수 있..
jest로 테스트코드를 작성하던 도중, it()와 test()의 차이가 궁금해졌다. 결론부터 말하자면, it()와 test()는 같은 함수다. 둘다 jest.It.()를 가르키고 있다. 기능 적으로는 차이가 없으니, 문서를 읽을 때 이를 참고하자. 개인 취향에 따라 사용하면 되고, 가독성을 생각하며 사용하자.
OAuth 로그인을 하는데 새로운 계정이 생성되면 안된다. 서론 애플리케이션 프로젝트 기획 회의에서 회원의 로그인 방식에 대해 이야기했다. 우리 애플리케이션은 회원간의 팀 활동을 통해 함께 성장할 수 있는 커뮤니티 애플리케이션이다. 로그인 방식을 개발하며 기획 개선사항이 있어 이를 기획 팀에 건의했다. 우선, 현재 기획에서의 로그인 방식은 이렇다. OAuth2 인증을 통해 카카오,네이버, 구글, 애플 로그인 등을 제공하기로 하였다. 여기서 백엔드 개발자가 설계할 수 있는 방향은 크게 2가지다. 새로운 OAuth 로그인 시, 새로운 계정으로 회원가입되도록 설계 새로운 OAuth 로그인 시, 이전에 가입한 계정으로 로그인되도록 설계 2번 방식이 애플리케이션 기획과 UX를 해치지 않을 것이라고 생각하여, 2번..
서론CS 스터디를 준비하다가 웹 보안에 대한 주제로 스터디를 진행하기로 하였다. 그 중 JWT에 대한 내용을 조사하다가 고민해본 점을 정리한다. What is JWTJSON Web Token의 준말입니다. 자바스크립트의 Object(Key Value) 자료구조를 가지고 있으며, Web Token으로써 사용할 수 있다는 의미다. JWT 사용 이유HTTP는 기본적으로 state-less를 지향합니다. state-less(무상태)란? 서버-클라이언트 구조에서 서버가 클라이언트의 상태를 가지고 있지 않는 것.장점1: 서버의 확장성이 높으며 대량의 트래픽이 발생해도 대처할 수 있음.장점2: (서버가 분리되어 있는 경우) 특정 DB/서버에 의존하지 않아도 인증할 수 있음.단점1: state-ful(세션) 방식보다 ..
개발바닥 2사로에서 진행되는 CS 면접 스터디에 참가하게 되었습니다. 스터디 목적 리마인드 목적은 인턴 준비 면접 준비 두괄식으로 말하기 면접관이 질문했던 내용을 다시 말하며 답변 시작하기. (면접관 질문 리마인드 + 생각할 시간 창출..) 면접관의 의도가 이해가 되지 않는다면 의도에 관해 재질문하기. 애매한 용어는 사용하지 않기. CS 지식 습득 네트워크, DB, 운영체제, SQL 등 프레임워크 지식 습득? 이번에 참여한 스터디원 중 저를 제외한 모두가 JVM 개발자라 프레임워크보단 CS부분을 많이 얻어가려고합니다. 나만의 스터디 룰 본인이 맡은 부분에 대해서는, 이 부분 외에는 더이상 공부할 것이 없을 정도로 준비해 오기. 블로그에 작성할 수 있는 정도로 조사하기. 각 키워드별 예상 질문 뽑아오기. ..
토이프로젝트에서 API 명세서를 작성을 담당하게 되었는데, 꽤나 반응이 좋아 블로그로 공유합니다. 출처 없이 막 공유하셔도 상관없습니다. URL: https://www.notion.so/puleugo/API-060ef34cec6c45e982c2c773600602b6 옵션 ··· → 그룹화 → 그룹화 기준 → API 분류 / 태그 를 선택하여 그룹화 조건을 변경할 수 있습니다. 개선 아이디어 말씀해주시는거 환영입니다. 추가했을 때 "오히려 별로다." 하는거 아니면 웬만해서 해드려요.
await/ async에 대한 문법 소개 글을 작성하다가 기초가 부족해서 이 질문까지 왔다. await / async 설명 작성 중.. → “아.. 이걸 설명하려니까 Promise를 배워야겠다.” → “어 Promise를 보면 비동기 처리가 가능하다고 하는데 자바스크립트는 싱글스레드가 아닌가?“ → “Node.js는 다른가? Node.js는 JS의 단순 런타임이 아닌가?” JS가 싱글 스레드인데 어떻게 비동기 처리가 가능한지 학생 분들이 계신 방에 질문해봤다. → 저학년들이 많고, Node 진형 개발자분들이 적어 스레드 풀 얘기까지는 나왔지만, 제대로 된 답이 나오지 않았다. 현직자 분들이 많은 개발바닥 채팅방에 질문해봤다. → Node.js에 포함된 libuv라는 라이브러리가 비동기 처리를 책임져준다...
백그라운드 실행은 nohup과 forever이 있지만, nohup은 자동으로 꺼지는 에러를 발견하고 forever을 사용해보려고합니다. Forever은 개발자가 업데이트를 포기한 상황입니다. 새로 개발 하시는 경우에는 Docker, nodemon, pm2를 추천드립니다. 구동환경 Ubuntu 22.04.1 LTS Nest.js 9 Forever 설치 yarn: yarn global add forever npm: npm install -g forever Forever 실행 forever start --minUpdate 1000 --spinSleepTime 1000 -c "yarn start" ./ main.js를 실행했을 때는 DI 쪽으로 에러가 나서 직접 yarn start를 호출하는 방식을 이용했습니다..
참고자료: https://www.youtube.com/watch?v=d3PYoBwow9I 위 영상을 보고 복기 및 재정리 용도로 적은 글입니다. 영상으로 보셔도 충분합니다. 영상에서는 3가지의 온라인 공부팁을 공유합니다. 공식문서를 읽으세요. 기술에 대한 지식 습득용이 아닌 스택 오버 플로우, GPT한테 얻은 코드 복붙은 거의 성장이 안될거에요. 커뮤니티의 글을 복사-붙여넣기만 반복한다면 코파일럿 미만의 결과물을 얻을 것이고, 개발자 본인의 성장도 더뎌질 것 입니다. 공식문서는 모든 시니어 개발자가 말하는 옳은 공부 방법입니다. 현직자도 꾸준히 읽고 있으며, 본인이 사용하는 기술에 대한 공부를 하는 데에는 개발문서만한 자료가 없습니다. 공식 문서가 도움되는 방식: 초보자: 기본 쌓기 주니어: 지식 강화 ..
$ nest g mo auth Error: Cannot read properties of undefined (reading 'properties') Failed to execute command: node @nestjs/schematics:module --name=auth --no-dry-run --no-skip-import --language="ts" --source-root="src" --spec --no-flat 에러 해결 방법은 2가지가 있는듯하다. @nestjs/schematics 재설치 yarn이라면: yarn global add @nestjs/schematics npm이라면: npm i -g @nestjs/schematics 다만 이 방법으로 해결되지 않았고, 다른 방법을 찾았다. typsc..
서론 온라인 인기글, 핫한 주제등을 한 눈에 보여줌으로 통하여 영감을 제공하는 사이트를 개발하고 있다. 다시 말해서 종합 크롤러 사이트인데, 우리 서비스에서 사용하는 크롤러들을 관리할 수 있는 페이지를 개발하였다. 여기서 사용한 라이브러리가 AdminJS이다. Nest.js에서 사용할 수 있는 Admin 라이브러리는 3가지다. Admin Bro (Beta) AdminJS NestJs Admin 선택 및 비선택 사유 Admin Bro: Admin Bro는 Beta 버전이라고 적혀있어서 패스했다. 다만, 개발을 진행해보면서 많은 깃헙 레퍼지토리를 확인해보니 Admin Bro를 이용하여 개발한 프로젝트도 꽤나 있었고, 개발 커뮤니티에서 질문글도 많았으며, 무엇보다 AdminJS와 같은 사에서 만들어서 거의 유..
서론 NESTJS에서 커뮤니티 크롤러를 만들던 중 용량이 큰 자료가 많은 스압(스크롤 압박) 글들 때문에 크롤러가 Timeout Error가 뜨는 일이 발생했다. 생각해보니, 불필요한 이미지는 수신할 필요가 없었다. JS 크롤러 라이브러리인 puppeteer을 이용해서 효율적으로 크롤링을 진행해보려고 한다. 사용 스택 Nest.JS 9 // 무관 es2017 puppeteer 19.4.1 (준비하기..) 혹시 설치도 안되어있다면 설치하자.. yarn add puppeteer 공식 문서 설치 관련 페이지 시작하기 import * as puppeteer from 'puppeteer'; const browser = await puppeteer.launch({ headless: false }); const pa..
정보 Reddit은 공식 REST API, Python 모듈인 PRAW 를 지원합니다. 본 글은 Reddit API를 통한 OAuth 및 게시글 가져오기를 진행하며, 해당 내용을 공부하면서 겪었던 시행착오를 공유합니다. 이번 강의 플로우 레딧 개발자 계정을 생성하고, 앱을 등록합니다. 등록한 앱의 정보와 Reddit 계정을 통해 엑세스 토큰을 얻습니다. 얻은 엑세스 토큰으로 게시글을 얻어옵니다. 어떤 언어에서든 따라할 수 있도록, Postman에서 진행합니다. 1. 레딧 개발자 계정 생성 레딧 계정이 없다면, 회원가입 해줍니다. 구글이나 애플을 통한 OAuth 로그인이 아닌, 이메일을 통한 일반 회원가입으로 진행해주세요. 레딧 개발자 앱 등록을 진행합니다. 아래 사이트에 접속해 로그인해주세요. 레딧 개발..
이번년도 있었던 일 SW마에스트로 13기 수료 메가콘(대학교 동아리 기술 컨퍼런스 발표) 참여 2021년 작년 말 기계공학과 마이스터 고등학교에 다니다 취업을 포기하고 컴공으로 진로를 바꾸게 되었어요. 2021년도 초에 코딩을 시작해서 파이썬을 조금 만져보고 컴퓨터 공학에 매력을 느껴서 이 진로를 선택했습니다. 컴공을 진학하는걸 선택했을 때는 수능일이 지나고 수시 마감 1주일 전이었어요. 대학을 갈지 말지 고민하다가 현직 개발자분들한테 메일을 보내보았어요. 다들 일단 대학을 가는것 을 추천하고 대학이 마음에 안들면 중간에 나갈 수도 있으니 수시로 대학에 지원해서 합격하게 됐어요. 그리고 개발 오픈채팅방에서 SW마에스트로를 추천해서 지원해봤어요. 2022년 대학 입학 후 대학을 합격하고 제 목표는 SW마에..
쿠키와 세션을 함께 설명하는 이유: 이 둘의 특징이 비슷하며 차이점이 명확하기 때문에 비교하면서 배우면 습득하기 편함. 먼저, 개요부터 봅시다. 개요 쿠키란? 쿠키는 브라우저에 휘발성 데이터를 저장하는 방식 세션이란? 세션은 서버에 휘발성 데이터를 저장하는 방식 이 둘은 자주 사용되는 데이터를 빨리 꺼내사용해야 하는 경우 사용됩니다. 세션, 쿠키로 사용하는 이유는 뭘까요? HTTP의 특징 때문입니다. Connectionless(비 연결지향): HTTP의 기본적으로 요청&응답만 하고 끊어버립니다. Stateless(상태정보유지안함): HTTP는 상태정보 저장 안함. 그래서 세션 혹은 쿠키로 데이터를 저장합니다. 쿠키와 세션의 차이 쿠키 세션 저장 위치 브라우저(로컬) 서버 보안성 낮음 높음 수명 반영구 브..
백엔드에서 삭제를 하는 방식은 두가지가 있습니다. 논리 삭제: 저장된 데이터를 사용하지 않아서 논리적으로만 삭제하는 방법 물리 삭제: 저장된 데이터를 실제로 삭제해버리는 방법 그렇다면 왜 논리 삭제를 사용할까요? 이유는 다양합니다. AI 학습 데이터로 사용하기 위함. 주고받은 채팅일 시, 법적인 문제가 생겼을 때 증거로 사용해야 하기 위함. 관계(릴레이션)가 맺어져 있을 때 문제가 생김. 물리 삭제는 위험하며 귀찮은 방식이기 때문에 대부분의 서비스에서 논리 삭제를 이용합니다. 여기까지가 이론이고 이제 코드로 봅시다. TypeORM이 논리 삭제와 물리 삭제를 확인해봅시다. 논리 삭제(soft delete) @Entity('users') export class User { @PrimaryGeneratedCo..
[추천글] 크롤러 성능향상, 이미지 수신 차단 대학교 애플리케이션에 정보시스템의 정보를 크롤링하는 기능을 구현했다. 크롤러는 다른분한테 들은 Node.js 크롤러인 puppeteer을 이용했다. yarn add puppeteer yarn add @types/puppeteer 이 둘을 설치한 후 service에만 puppeteer을 임포트해서 사용할 수 있다. 사용법 https://github.com/puppeteer/puppeteer GitHub - puppeteer/puppeteer: Headless Chrome Node.js API Headless Chrome Node.js API. Contribute to puppeteer/puppeteer development by creating an accou..
헬스 기구 처리 로직 소개 바디로 여러개의 타입 중 하나를 선택해서 입력하는 로직을 구현하고 있었다. 우선, 운동 레퍼지토리는 이렇게 생겼다. 무산소, 유산소 타입의 합집합이다. 이걸 저장하는 방식은 2가지가 있다. 1개의 저장 컨트롤러에 2가지 타입의 DTO를 받는 것. 2개의 저장 컨트롤러를 만들어서 DTO와 1:1로 연결하여 저장하는 것 저는 관리 측면이 편하기 때문에 1번 방식을 이용하기로 했습니다. 여기서 발생한 문제는 스웨거에 어떻게 넣을 것인가.. enum으로 넣으면 터집니다. 하나만 넣으면 문서화 작업의 의미가 사라집니다. 2개의 클래스를 타입으로 사용하면 에러가 납니다. 그래서 어떻게 구현했는데? 구현 방법이 있었습니다. @POST('저장 경로') @ApiOperation({ summar..
e2e 테스트는 매번 데이터베이스를 초기화해줄 필요가 있습니다. 다만.. 저는 Jest를 쓰는데 따로 초기화 해주는 함수가 없었습니다. (있으면 알려주세요!) 그런 이유로 방법 계속 찾아봤는데 따로 메소드를 제공해주지 않아서 팁 정도를 찾아서 이를 공유하고자 합니다. import { Test, TestingModule } from '@nestjs/testing'; import { TypeOrmModule } from '@nestjs/typeorm'; import { Connection } from 'typeorm'; import ormConfig from './orm-config'; import { AppController } from '@app/app.controller'; import { UserMo..