부트캠프

    [부트캠프] 실전 프로젝트 정리

    실전프로젝트 최종 제출을 완료하고 회고해보고자 합니다. 1. 피드(게시글) CRUD 저희가 만든 서비스에 퀘스트를 완수함에 있어서 3가지 타입의 퀘스트가 있습니다. 그 중 피드(게시글)를 작성하는 퀘스트가 있습니다. 지도에서 피드에 해당하는 퀘스트가 뜬 장소에 도착하여 피드를 작성할 수 있습니다. 피드 목록은 이웃 커뮤니티에 초점을 맞춰서 현재 위치의 동에서 생성된 피드만 볼 수 있습니다. 피드를 보여줄 때 최신순, 인기순, 거리순 세 카테고리로 정렬하여 보여줍니다. 2. 댓글 작성 위에서 작성한 피드에 댓글을 작성, 수정, 삭제할 수 있는 기능입니다. 댓글은 해당 피드가 작성된 위치가 아니어도 어디서든 자유롭게 작성할 수 있습니다. 3. 좋아요 자신의 동네에서 올라온 피드 목록을 보고 마음에 드는 피드..

    [실전프로젝트] 메인서버와 채팅(socket)서버를 분리하는 이유

    프로젝트를 하는 중 메인서버와 채팅서버를 분리했습니다. 처음엔 당연히 "다들 이렇게 하니깐" 이라고 넘겼습니다. 하지만 하나의 인스턴스에 넣고 로드밸런싱을 통해 서버가 자동적으로 증설되면 되는거 아닌가 라는 생각이 들었습니다. 이에 관해 멘토님께 질문을 드렸고 명확한 답변을 얻을 수 있었습니다. 답변 하나의 인스턴스에 넣고 서버를 올려도 됩니다. 하지만 채팅서비스의 트래픽으로 인해 서버가 자동적으로 추가될 때 채팅과 관련없는 메인서버까지 추가 되기 때문에 불필요한 자원이 추가됩니다. 채팅서비스의 트래픽이 증가된다면 채팅관련 서버만 추가 되는 것이 불필요한 자원이 추가되는 것을 막을 수 있습니다. 따라서 메인서버와 채팅서버를 나누고 각 서버의 트래픽이 증가하면 해당 서버만 증설되어야 하는 것입니다.

    [Socket] socket 채팅 서버 부하 테스트하기

    Artillery 설치하기 $ npm i artillery 간단하게 테스트 해보기 $ npx artillery quick --count 100 -n 50 http://localhost:[port] --count 옵션: 가상의 사용자 수 --n 옵션: 요청 횟수 --rate: 초당 요청 지금 저는 로컬에서 테스트 했지만 AWS등의 클라우드에서 테스트할 경우 요금 폭탄이 나올 수 있습니다. 따라서 실제 서버와 같은 사양의 컴퓨터에서 테스팅하는 것을 추천드리며 이를 staging서버라고 부릅니다. report 생성하기 $ artillery run -o testResult.json test_ver1.yml test_ver1.yml 경로에 testResult.json이라는 report 파일이 생깁니다. 보기 편하..

    [WIL] 이번주에 마주했던 문제들 (typeORM, socket.io, DB index)

    1. TypeORM에 queryBuilder 적용하기 이전에 ORM에 대해서 글을 쓴 적이 있습니다. 개념적으로 이해했지만 프로젝트에 적용을 하는 것은 또 다른 문제였기에 만났던 문제들을 적어보고자 합니다. 현재 NestJS와 typeorm을 사용하여 프로젝트를 진행 중입니다. DB에서 데이터를 뽑아올 일이 굉장히 잦은데 처음엔 queryBuilber를 사용하지 않고 sequelize와 같은 문법으로 사용하여 데이터를 뽑아오다가 좀 더 복잡한 쿼리가 필요하여 queryBuilder를 사용하여 보았습니다. 제가 예시를 들 부분은 feed(게시글) 조회 부분입니다. 현재 지역에서 발생한 피드를 클라이언트에 보내줘야하는데 각 피드의 작성자에 대한 정보를 응답해야합니다. 단순히 join하는 경우에는 문제가 되지..

    [WIL] 실전 프로젝트 1주차

    1. 테이블간의 매핑된 필드의 경우 직접적으로 데이터를 넣지 못하는 현상 ManyToOne / OneToMany 필드로 묶인 필드의 경우 entity형식의 데이터를 넣어야 조인 칼럼의 데이터를 넣을 수 있었습니다. 다음은 예시입니다. async commentQuest( // user: User, feed: Feed, comment: string ) { const newComment = this.create({ comment, feed, }); await this.save(newComment); return newComment; } comment에 feedId를 넣고자 할때 feedId를 직접적으로 넣을 수 없고 feed: Feed와 같이 entity를 불러와서 넣어야합니다. 2. 채팅 서버 구현 nest..

    [WIL] Middleware, N+1 문제 정리 및 해결

    Middleware 서버에 클라이언트로부터 들어온 요청을 처리하는 중간에 기능상의 목적에 맞게 넣어 거쳐가는 함수들을 미들웨어라고 합니다. 여러 기능이 필요한 경우 여러 미들웨어를 넣을 수도 있습니다. 각각의 미들웨어는 next()라는 함수가 실행됨으로서 다음 미들웨어가 호출되어 실행됩니다. 또한 값을 담아서 다음 미들웨어로 해당 값을 전달해 줄 수도 있습니다. 1. 어플리케이션 레벨 미들웨어 어플리케이션 레벨 미들웨어란 express() 로 생성할 수 있는 app 객체의 app.use()나 app.METHOD() 함수를 이용해 미들웨어를 app 인스턴스에 바인딩하는 미들웨어 입니다. 마운트 경로가 없는 미들웨어 함수는 앱이 요청을 수신할 때마다 실행하게 됩니다. ex) app.use((req, res,..

    [26일차] TIL - Dynamic Programming

    동적 계획법(Dynamic Programming) 동적계획법이란 복잡한 문제를 간단한 여러개의 문제로 나눠푸는 방법을 말합니다. 이것은 부분 문제반복과 최적 부분 구조를 가지고 있는 알고리즘을 일반적인 방법에 비해 더욱 적은 시간 내에 풀 때 사용합니다. 재귀 알고리즘과 비슷해보이지만 결과를 매번 기록하여 연산을 중복하지 않기에 속도가 더 빠릅니다. 1. 퇴사 https://www.acmicpc.net/problem/14501 """ dp(n번째 날, 여태까지 번 돈) -> 근무를 한다면 dp(n + t, 여태까지번돈, + n번쨰날에 번돈) -> 근무를 안한다면 dp(n + 1, 여태까지번돈) """ n = int(input()) lst = [] for _ in range(n): # 소요일수, 돈 a, ..