일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | |
7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | 30 |
- 개발자취업
- 엘리스sw트랙
- 방송대
- 데이터베이스시스템
- 자격증
- aws
- CSS
- 방송대컴퓨터과학과
- HTML
- TiL
- 파이썬프로그래밍기초
- 코드잇
- 코딩테스트
- 중간이들
- 파이썬
- 오픈소스기반데이터분석
- Git
- nestjs
- 항해99
- node.js
- Cookie
- 유노코딩
- redis
- JavaScript
- 99클럽
- Python
- 꿀단집
- 코딩테스트준비
- 프로그래머스
- mongoDB
- Today
- Total
목록BackEnd/Database (8)
배꼽파지 않도록 잘 개발해요

프로젝트에서 여행 피드(Feed)를 조회할 때, 여행 계획(TravelPlan)과 그 하위 일정(DailyPlan, DailySchedule)을 populate하여 thumbnailUrl을 뽑아내는 기능을 구현하고 있었다. 그런데 실제 데이터베이스에는 DailySchedule이 분명 존재하는데도, API 응답에서는 thumbnailUrl이 null만 나오는 문제가 발생하였다.문제 1. thumbnailUrl이 계속 null만 나옴증상Atlas 에서는 TravelPlan의 dailyPlans 안에 DailySchedule이 잘 들어가 있음.그런데 로그 찍어보면 항상 빈 배열.결과적으로 thumbnailUrl이 null만 반환됨.======= travelPlan['dailyPlans'] [] ========..

공개 여행 피드 API 흐름과 구조 현재 내가 만든 서비스에서는 GET /our-trip API를 호출하면 다음과 같은 흐름으로 실행된다.GET /our-trip → Controller → fetchOurFeeds() → getPaginatedFeeds() → extractFeeds() 즉, 컨트롤러는 서비스 계층(OurTripService)의 fetchOurFeeds() 메서드를 호출하고,다른 모듈의 서비스 계층(FeedService)의 메서드(getPaginatedFeeds)를 호출,해당 메서드는 같은 모듈의 헬퍼 클래스(feed-extractor)의 메서드(extractFeeds)를 호출하는 구조이다. 공개 여행 피드를 페이지네이션으로 조회하고, 클라이언트에 필요한 데이..

N+1 문제란? N+1 문제는 ORM을 사용할 때 자주 발생하는 성능 저하 현상이다.한 번의 쿼리로 여러 데이터를 가져온 뒤, 각 데이터마다 개별 쿼리를 추가 실행하면서 총 N+1번의 쿼리가 발생하는 상황을 말한다.N = 조회된 레코드 수 (행의 개수)+1 = 이를 조회하기 위한 최초의 메인 쿼리즉, 초기 쿼리 1번 + 레코드 개수 N번 = 총 N + 1번의 쿼리가 실행된다. *** ORM: Object-Relational Mapping(객체-관계 매핑)의 약자객체와 관계형 데이터베이스의 데이터를 자동으로 매핑해주는 것 MySQL에서 직접 데이터를 넣고 실행해 보면서, 실제로 쿼리 횟수가 얼마나 늘어나는지 수치로 확인해보았다.간단하게 데이터 3개로 테스트 하기1. 스키마 생성CREATE TABLE aut..
Stateful (상태 유지 시스템)- 상태(state)를 시스템이 기억하고, 사용자가 이전에 했던 작업이나 데이터를 다음 요청에서도 계속 유지- 예를 들어, 사용자가 로그인하면 세션을 통해 로그인 상태가 유지되며, 이후 요청에서도 로그인 상태가 계속 유지됨. 상태가 유지되기 때문에, 이전 작업의 결과나 데이터를 바탕으로 추가 작업을 진행할 수 있음.- 장점 : 사용자의 이전 데이터를 기억하여, 연속적인 작업을 할 수 있음.- 단점 : 상태를 관리하기 위한 서버 자원과 비용이 필요하고, 여러 서버 간에 상태를 일관되게 유지해야하므로 복잡할 수 있음.- 예시 : 데이터베이스의 세션 정보는 stateful한 방식. 사용자가 세션을 종료하거나 시간이 지나면 그 상태가 사라짐. Stateless (상태 비유지 ..

현재 프로젝트의 NestJS 서버에서는 Redis를 사용하고 있다.다른 백엔드 개발자분의 브랜치를 dev에 merge를 하고, 그걸 현재 내가 작업하는 브랜치에 merge를 하였다.Conflict가 나서 코드는 해결하였으나, 실행할 때 다음과 같은 오류가 났다. 로컬에서 6379 포트로 Redis가 접속이 되지 않는다는 오류가 떴다.그런데 나는 분명히 로컬에서 Redis를 연결하여 사용한 적이 없다. Redis Cloud에서 받은 Host, Port, Password를 입력하여 Redis Module을 만들어 사용하였기 때문이다. 가장 최근에 변경된 posts.service.ts 코드를 확인해보니 Redis Client를 생성할 때 어떠한 인자도 넣지 않고 있었다.this.redis = new Redis..

이번 프로젝트에서 Redis를 사용할 일이 많아졌다. 회원가입 후 이메일에 발급하는 토큰회원의 세션 정보좋아요 수 업데이트 등 Redis에 데이터를 입출력할 일이 많아졌다. 그래서 데이터를 직접 확인해야할 일이 생겼다. Redis를 활용할 때는 Redis Cloud와 Redis insignt를 사용하면 된다. Redis Cloud : 클라우드 기반의 서비스, 데이터베이스와 관련된 정보만 확인 가능. 세부적인 데이터 내용은 직접 확인할 수 없고 관리도 불가능함.Redis Insight : Redis의 GUI 도구, 실제 데이터베이스 내의 데이터를 직접 확인할 수 있으며, CLI 명령어를 사용하여 데이터를 관리할 수 있음.Redis Cloud 사용은 아래 블로그의 글을 참고하였다.https://inpa.t..

프로젝트 리팩토링을 아직도 하고 있는데, 검색 API를 만들다가 쿼리를 제대로 사용하지 못하여 시간을 엄청 허비하는 일이 있었다.결론부터 말하면 1번 코드로 작동해서 안 되다가 2번 코드로 수정하니 잘 해결되었다.이게 왜 안 되는지 파악하는데 꽤 많은 시간이 걸렸다. 상황 : feed 모델 안에 travelPlan 모델을 populate한 상태임.1번결과 : 모든 글이 다 조회됨. // 제목 // travelPlan의 title if (title) { const feeds = await this.feedModel .find() .populate({ path: 'travelPlan', match: { title: title..

현재 NestJS, MySQL, TypeORM을 사용하는 프로젝트를 진행하고 있다. 구현 중 발생한 오류와 진행상황을 문서화할 계획이다. 우선 MySQL과 TypeORM을 config 폴더 안에 orm.config.ts 파일을 만들어서 설정을 해준다. NestJS에서 TypeORM와 MySQL의 세팅은 다음 링크를 참조하였다. https://codegear.tistory.com/116 1. TypeORM 개념과 셋팅 (2023, NestJS)이 글은 TypeORM의 기본적인 개념에 대해 설명하고, 샘플 소스를 통해 TypeORM의 기본적인 사용법에 대해 설명합니다. 이 글의 동영상 강의를 보고 싶으시면 아래를 클릭하세요. https://youtu.be/yzsN620ZYpcodegear.tistory...