일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 코딩테스트
- 방송대
- 항해99
- 방송대컴퓨터과학과
- 데이터베이스시스템
- 개발자취업
- 99클럽
- 중간이들
- 유노코딩
- mongoDB
- 프로그래머스
- 코드잇
- CSS
- HTML
- Python
- Cookie
- Git
- redis
- 코딩테스트준비
- 꿀단집
- aws
- 엘리스sw트랙
- node.js
- JavaScript
- 파이썬프로그래밍기초
- SQL
- 파이썬
- 자격증
- nestjs
- TiL
- Today
- Total
목록분류 전체보기 (224)
배꼽파지 않도록 잘 개발해요

프로젝트에서 여행 피드(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..
NestJS로 API를 개발하다보면 흔히 이런 상황을 마주하게 된다.@Get('our-trip')async getTrips( @Query('pageNumber', ParseIntPipe) pageNumber: number,) { return this.tripService.findAll(pageNumber);} 여기서 /out-trip 경로로 쿼리 파라미터 없이 요청을 보내면 어떤 일이 생길까? 바로 ParseIntPipe(undefined)가 실행되면서 에러가 난다. 왜 기본값(= 1)을 줘도 안 될까? 보통 TypeScript에서는 기본값을 이런식으로 지정한다.@Query('pageNumber', ParseIntPipe) pageNumber: number = 1;"쿼리가 없으면 그냥 1이 들어가겠지..

자격증 시험 개요응시 배경필기 시험시험 개요 일반적인 공부 방법내 공부 방법시험 후기 (23년 2회)실기 시험시험 개요 원서 접수 팁일반적인 권장 공부법 (인강, 링크, 교재 등)내 공부 방법시험 후기 (24년 2회)마무리자격증 시험 개요주관: 한국산업인력공단시행: 연 3회 (필기·실기 별도 진행)접수: 큐넷 홈페이지 (q-net.or.kr)응시 절차: 필기 합격 → 실기 응시 가능 (필기 합격 후 2년 유효)자격 유효기간: 없음 (한 번 취득하면 평생 유효)응시 자격: 관련 학과 졸업자, 4년제 대학 졸업자 등📌 시험 준비는 블로그, 유튜브 등으로 개요 파악 후, 큐넷에서 최신 공고로 사실 확인하는 것이 좋다. 응시 배경 1) 왜 정처기를 준비하게 되었는가 비전공자로서 개발 공부를 시작하면서 가장 먼..

재작년 여름, 파이썬으로 처음 본격적인 코딩을 시작했다. 2개월간의 단기 교육으로 단순히 ‘맛보기’ 수준이었지만, 그 경험이 계기가 되어 개발자로 진로를 정하게 되었다. 데이터 분석도 고민했지만, 웹 개발이 가장 흥미로웠고 현실적인 진입 장벽도 비교적 낮다고 판단해 웹 개발자를 목표로 삼았다. 그러던 중, 5년에 한 번 있는 K-Digital Training 무료 교육 과정 중 하나인 엘리스트랙을 알게 되었고, 그중 프론트엔드를 배우는 SW 엔지니어 트랙 8기로 참여해 수료하게 되었다. 이 글에서는 웹 개발자로 진로를 정한 이후 처음으로 체계적인 커리큘럼을 따라가 본 엘리스 트랙 수료 경험을 바탕으로,1년을 돌아보며 느낀 좋았던 점, 아쉬웠던 점, 그리고 전체 교육 과정에 대한 솔직한 후기를 나눠보려 한..

https://docs.uaparser.dev/intro/quick-start/using-es-modules-typescript.html 만약 named export를 default export처럼 import 하면 다음과 같은 일이 발생한다.This expression is not constructable. Type 'typeof UAParser' has no construct signatures.ts(2351)(alias) namespace UAParser import UAParser "This expression is not constructable": new UAParser()로 인스턴스를 만들 수 없다 "Type 'typeof UAParser' has no construct signatures"..
Stateful (상태 유지 시스템)- 상태(state)를 시스템이 기억하고, 사용자가 이전에 했던 작업이나 데이터를 다음 요청에서도 계속 유지- 예를 들어, 사용자가 로그인하면 세션을 통해 로그인 상태가 유지되며, 이후 요청에서도 로그인 상태가 계속 유지됨. 상태가 유지되기 때문에, 이전 작업의 결과나 데이터를 바탕으로 추가 작업을 진행할 수 있음.- 장점 : 사용자의 이전 데이터를 기억하여, 연속적인 작업을 할 수 있음.- 단점 : 상태를 관리하기 위한 서버 자원과 비용이 필요하고, 여러 서버 간에 상태를 일관되게 유지해야하므로 복잡할 수 있음.- 예시 : 데이터베이스의 세션 정보는 stateful한 방식. 사용자가 세션을 종료하거나 시간이 지나면 그 상태가 사라짐. Stateless (상태 비유지 ..
1. 세션 vs jwt : 세션 기반 인증은 요청마다 세션을 조회해야하므로 시간이 더 걸리지만, jwt는 별도의 세션 조회 없이 유효성만 확인하면 되어 속도가 더 빠름. 2. 백엔드와 데이터베이스가 같은 데이터센터에 있는지 확인 : 백엔드와 데이터베이스가 같은 AWS 리전 내에 있으면 물리적 거리가 짧아져 통신 속도가 빨라짐. 3. VPN 사용 : 같은 데이터센터 내에서는 VPN을 통해 통신하면 더욱 빠른 속도가 가능함. 4. 서버와 클라이언트의 거리 : 서버가 클라이언트와 물리적으로 가까운 곳에 있을 수록 응답 시간이 짧아짐. 예를 들어, 서울에 서버가 있고 클라이언트가 한국에 있으면 더 빠르고, 미국이나 유럽에 있으면 더 느려짐. 5. 글로벌 서비스의 경우 : 전 세계에서 빠르게 서비스를 하려면 백엔..

현재 마무리하고 있는 프로젝트에서는 NestJS, express-session, connect-redis, passport를 사용하여 인증을 처리하고 있다.express-session은 세션을 생성하고 관리하며, passport는 인증을 처리하고 인증 정보를 세션에 저장한다.express-session에서 세션을 생성할 때 발급해주는 쿠키는 기본적으로 이름이 'connect.sid'이다. 프론트엔드에서 세션 상태를 확인하는 API를 만들어달라고 해서 작성하던 도중,request의 cookies에서 세션 ID를 추출해야겠다고 생각하였다. 원래 쿠키에서 세션 ID 추출하는 함수는 이런식으로 사용하고 있었다. 이게 connect.sid 쿠키의 값이라고 하면s%3AtWwtNorRjA3u5-SVHMecRQblBv..