SMAIVNN
article thumbnail
[Nest.JS] 에러 처리 더 잘하기
Web 2024. 4. 30. 21:28

최근 프로젝트를 진행하며 http status code와 에러처리에 대해서 나름대로의 규칙을 정하는게 좋겠다는 생각이 들었습니다.특히, try-catch문에 대해서는 왜 쓰는지보다는 그냥 무작정 쓰고 본다는 느낌으로 코드를 작성했는데 오늘 자세히 정리해보고자 합니다. try-catch 의 작동try-catch는 아래의 작동 알고리즘을 갖습니다.먼저, try {...} 안의 코드가 실행됩니다.에러가 없다면, try 안의 마지막 줄까지 실행되고, catch 블록은 건너뜁니다.에러가 있다면, try 안 코드의 실행이 중단되고, catch(err) 블록으로 제어 흐름이 넘어갑니다. 변수 err(아무 이름이나 사용 가능)는 무슨 일이 일어났는지에 대한 설명이 담긴 에러 객체를 포함합니다.만약 try {…} 블록 ..

article thumbnail
[Nest.JS] TypeORM 삽입 최적화
Web 2024. 4. 27. 00:52

TypeORM을 활용하며 데이터를 삽입할 때 주로.save()를 사용하곤 합니다.하지만 성능 최적화를 위해서 .insert()와 .update()를 적극 활용하면 좋은데요. 단순하게 계산하면 2배 이상 차이나는 이 메서드들에 대해 알아보려고 합니다. .save()의 동작.save()는 아래와 같이 동작을 합니다.아직 존재하지 않는 경우 엔티티를 삽입한다.엔티티가 존재하는 경우 기존 엔티티를 업데이트 하려고 시도한다.그럼 이미 존재하는지에 대한 확인은 어떻게 할까요?우선 SELECT 쿼리를 통해 엔티티 객체에 정의된 Primary Key (기본 키)를 사용하여 데이터베이스 내 해당 엔터티의 존재 여부를 확인합니다.만약 없다면 TypeORM은 이를 새로운 엔티티로 간주하고 삽입 작업을 수행합니다. 만약 엔티..

article thumbnail
[Nest.JS] TypeORM의 soft-delete와 회원 탈퇴 정책
Web 2024. 4. 17. 23:31

프로젝트 시작 전, 기존 몽고DB로 생성되었던 boilerPlate 코드를 TypeORM과 RDB로 변경하는 작업을 진행하고 있습니다. 또한 추가적으로 기본적인 Auth 관련 코드를 작성중입니다. 오늘은 서비스에서 회원 탈퇴시 고려할만한 사항들과 구현에 대해서 알아보고자 합니다. 회원 탈퇴 정책회원 탈퇴는 우선 '개인정보 보호법'을 준수하는게 우선입니다. 하지만 이 글에서는 개인정보 보호법과 관련 내용은 다루지 않고 서비스 운영에서 회원의 탈퇴시 고려할 상황에 관해 알아보겠습니다.자원 보유 검토사용자가 서비스에서 갖고있는 포인트 / 주문 내역 등 여러가지 자원에 대해서 인지하고 있는지, 이에 대한 삭제를 인지하고 있는지 등을 검토해야합니다.  서비스 측에서도 이러한 자원이 필수..

article thumbnail
프로젝트 시작은 항상 쉽지 않음
Project 2024. 4. 12. 01:59

9월 서비스를 목표로 하는 프로젝트를 시작하게 되었습니다. 새로운 서비스를 만들어보는건 항상 설레는 일이긴합니다. 그런데 막상 프로젝트를 시작하면 머리가 지끈지끈 합니다. 프로젝트의 구조를 설계하는 셋업 단계에서 특히 더더욱 그런것 같습니다 ㅠㅠ 구조 설계 단계가 끝났고 이제 1차 스프린트를 시작하기에 앞서.. 시작하기도 전에 했던 여러가지 고민들과 결론에 대해서 말해보고자 합니다. 무슨 데이터베이스를 선택할까? 이번 프로젝트에서는 데이터베이스 선택부터 너무 힘들었습니다. 저는 주로 도큐먼트db인 MongoDB를 써왔고, 이번 프로젝트에서는 RDB를 써볼까하는 생각을 하였습니다. 혼자 하는 프로젝트이기도 하고 공부도 할 겸 TypeORM + PostgreSQL을 사용할 계획이였습니다. 하지만, 막상 하나..

article thumbnail
[WebRTC] mediasoup을 사용한 SFU 영상 통화 미디어 서버 구현 (24.10.01 업데이트)
Web 2024. 3. 21. 18:23

목적프로젝트에서 mediasoup을 사용하며 많은 사건 사고가 있었다. 이것을 기록 할 겸 공유하고 싶어 mediasoup을 한국에서 가장 쉽게 설명해보고자 기록을 남긴다.... 코드 업데이트를 하며 설명과 github에도 자세한 내용을 작성해놨으니 언제든 댓글 부탁드립니다. mediasoup이란화질 조정, 재생 시간 등을 전문적으로 다룰 수 있는 음성 통화, 영상 통화 등 미디어를 다루는 미디어 서버를 구축하는 것은 굉장히 어렵다. mediasoup은 이를 편리하게 가능하게 해 주는 미디어 서버 오픈 소스 라이브러리이다. webRTC를 기반으로 하며 그렇기에 낮은 지연률, 높은 확장성을 보장한다. 이는 mediasoup이 SFU 기반의 중계된 peer-to-peer(이하 p2p)서버라는 이유도 한 몫 ..

article thumbnail
[Smilegate] 2023 스마일게이트 개발 캠프 후기
Project 2024. 3. 4. 19:18

작년 이맘 때, 2022 Smilegate winter 캠프를 진행했다. 다만 코로나 시기였던 만큼 오프라인으로 진행되었고, 적극적으로 참여하기 어려운 환경이였다. 올해, 운이 좋게도 좋은 기회로 다시 한번 스마일게이트의 2023 개발 캠프에 참가할 수 있었다. 작년과는 달리 오프라인으로 캠프를 진행하였고 지금부터 약 세 달간 진행한 개발 캠프에 대해서 글을 남기려고 한다. 개발 환경이 어때? 우선 Smilegate 개발 캠프의 장점 먼저 말하고 싶다. 캠프 중간 진행한 인터뷰(링크)에서 말 하였는데, 요약하자면 온전히 캠프와 개발에 집중할 수 있도록 모든 환경을 제공해준다. 모니터와 노트북, 하루종일 개발을 진행하고 자유롭게 회의할 수 있는 오프라인 공간, 가까운 곳에 계시는 현역 멘토님들, 빵빵한 탕..

article thumbnail
[NestJs/트러블슈팅] mongoDB document 반환
Web 2023. 11. 20. 11:17

발단 프로젝트에서 아래 간단한 코드를 실행하던 도중 서버 오류가 발생하였다. 우선 발단이 된 코드는 다음과 같다. async createStat(stat: CreateStatDto): Promise { const newStat = { ...stat, }; const createdStat = await this.statModel.create(newStat); return createdStat } 발생한 서버 오류는 다음과 같다. [MyApp] error 2023-11-20 09:48:40 [ExceptionsHandler] callback is not a function - { stack: [ 'TypeError: callback is not a function\n' + ...code... 처음에는 인터셉..

article thumbnail
레벨업과 경험치 적용-2
Project 2023. 11. 17. 10:13

이전 게시글에서 레벨업, 경험치를 관련해서 어떻게 구현을 할지 기초적인 설계를 진행했다. 추가적인 설계를 조금 진행한 후 구현에 들어가려고 한다. 데이터베이스 구조 설계 캐릭터 생성 시 그 캐릭터는 약 4~5개의 스텟을 지닌다. 또한 이 스텟은 추가되거나 삭제되거나 등의 변동성을 갖는다. 문제는 나의 요구사항에 따르면 각 스텟별로 레벨과 경험치가 존재하여 각 스텟의 변동 사항을 개별적으로 관리하여야 한다는 것이다. 따라서 캐릭터 내에 스텟을 임베디드 시키는 것과 참조 시키는 것 중에서 어떤 방식이 더 나을까를 판단했을 때, 참조 방식이 더욱 적절하다고 판단하였다. 따라서, 캐릭터와 스텟은 One to Many 관계를 갖는 참조 방식으로 설계를 진행하였다. 실행 흐름 설계 간략히 생각해본 경험치 상승과 레..

article thumbnail
[unknown-epic] 레벨업과 경험치 적용 -1
Project 2023. 11. 15. 23:45

캐릭터를 육성하는 프로젝트를 하나 진행하고 있다. 퀘스트와 같은 행위를 완료할 경우 경험치가 증가하는 알고리즘을 작성해야하는데, 이를 위해 고려할 것이 조금 있다. 요구사항 특정 행동을 완료 했을 때 해당 행동의 카테고리에 속한 능력치의 경험치가 상승한다. 예를 들어 팔굽혀펴기를 하면 근력 경험치가 상승한다. 레벨이 상승할수록 행동에 대해 요구하는 역치가 증가한다. 예를 들어, 근력 레벨 1이 팔굽혀펴기 10개를 하면 힘들어 하지만, 레벨 3이 팔굽혀펴기 10개를 하면 쉬워한다. 이러한 것을 기반으로, 내가 구현할 것에는 다음과 같은 고민이 필요했다. 유저 행동은 정말 다양한데, 어떻게 카테고리화 시킬 것인가? 마찬가지로, 사람의 행동은 정말 다양한데 이것에 대한 경험치는 어떻게 정의할 것인가? 레벨 상..

article thumbnail
[NestJs/트러블슈팅] NestJs에서 mongoDB find(), virtual field
Web 2023. 10. 26. 18:59

더 공부하고 정리한 추가 게시물이 있습니다. node.js의 Express와 nestJs에서의 mongoDB find()메서드 차이점 mongoose의 find()메서드를 Express환경에서 사용할 경우 다음과 같이 출력된다. [ { "_id": "id항목입니다", "title": "test2", "content": "toDo Contents2", "status": true, "priority": 0, "dueDate": "2024-03-21T00:00:00.000Z", "category": "sports", "completedDate": "2023-10-25T07:59:36.295Z" }, ] 반면nestJs에서 find()를 사용할 경우 다음과 같이 메타데이터들이 출력된다. [ { "$__": { ..