일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 와글와글
- 스터디
- Type Challenge
- 타입챌린지
- TypeScript
- configservice
- 월간cs
- HTTP
- mysql boolean
- 타입 챌린지
- type-safe configservice
- typeorm
- 회고록
- 굿바이 2024년
- 이펙티브 타입스크립트
- 2024년 회고록
- 해커톤
- network
- 회고
- TypeScript 타입챌린지
- 백엔드
- mysql
- npm
- typescript type challenge
- node.js
- microsoft azure openai
- configmodule
- 코딩테스트
- 타입스크립트
- nestjs
- Today
- Total
목록백엔드 (26)
iamkanguk.dev

현재 맵필로그 개발서버를 배포할 때 다음과 같은 Flow로 배포를 했다. Local 환경에서 build build 결과물인 dist 디렉토리를 파일질라를 통해 원격서버에 이동 PM2로 동작하고 있는 프로젝트 서버 reload 하지만 어느 순간부터 너무 귀찮기 시작했고 파일질라를 사용하는 시간이 너무 아까워서 자동배포를 구현해보았다. 원래는 GitHub Actions를 활용해서 Docker + CI/CD 작업을 하려고 했는데, 1인 개발이기도 하고 아직은 그정도까지는 필요하지 않겠다고 생각이 들었다. 그리고 요즘에는 거의 Code Deploy를 사용해서 배포 자동화를 적용하는데 나는 좀 다르게 하고 싶기도 했다. 그래서 1차 개발에서는 쉘 스크립트를 활용해서 자동 배포를 구현하고 2차 개발에서는 Docke..

오늘은 맵필로그 프로젝트에서 로그아웃과 회원탈퇴 기능을 어떻게 구현했는지에 대해서 설명해보려고 한다. 먼저, 맵필로그에서는 카카오 로그인과 애플 로그인을 제공하고 있다는 것을 먼저 말씀드립니다! 크게 어렵지 않은 내용인 것 같아서 맛있는 거 드시면서 보셔도 충분합니당 ㅎㅎ 1. 로그아웃 기능 로그아웃 기능에서는 소셜쪽으로는 크게 기능구현을 할 게 없는 것 같다. 왜냐하면 애플 로그인은 회원탈퇴 시에만 Token을 Revoke 시켜주면 되기 때문에 따로 로그아웃 쪽에서는 할 게 없다. 그리고 카카오 로그인은 공식 문서를 보면 카카오에서 제공하는 Access-Token을 만료시키는 로직이 있는데 맵필로그 프로젝트에서는 카카오에서 주는 토큰을 따로 사용하지 않기 때문에 굳이 따로 처리하지는 않았다. 애플리케이..

우리 맵필로그 프로젝트에서는 이제 배포를 슬슬 준비하고 있다. Android와 iOS 모두 준비하고 있는데 알아보니까 iOS 앱스토어 배포를 위해서는 로그인 기능을 제공할 경우에는 애플 소셜 로그인이 필수로 구현되어 있어야 한다고 한다. 그래서 오늘은 약 3일간 고생한 애플 로그인을 어떻게 구현했는지에 대해서 알아보려고 한다. 아마 NestJS로 구현을 하시는 분들은.. 아실 거지만 생각보다 자료가 많이 없다는 것을 느끼셨을 것이다. 그래서 필자는 Spring으로 구현한 개발자분들의 자료도 많이 참고했었다. 지금부터 쭉 설명을 해보도록 하겠다. 1. 사전 준비물 및 언급 - 애플 개발자 계정이 꼭 필요하다. 혹시나 애플 로그인 기능을 구현하고자 하는 분들은 개발자 계정을 꼭 구매하길 바란다. - 그리고 ..

오늘은 포스팅을 2개나 작성한다..ㅎㅎ 그만큼 몰랐던 것들을 오늘은 좀 많이 알게 된 것 같아서 뿌듯해서 그런 것 같다 (사실 별건 아니지만) 이전 포스팅에서 strict 모드를 추가하면서 많은 에러가 발생했다고 언급했다. null parameter가 들어올 수 있는 가능성이 있는 코드들 등등을 수정하는 가운데 request의 user 변수의 type이 지정되지 않아서 발생한 문제가 있었다. 어떻게 request 안에 넣어놓은 user 데이터에 type을 부여할 까 고민하다가 좋은 글을 참고하게 되어서 조금 참고하고 작성해보려고 한다. 문제 상황 strict 모드에는 any 타입이 사용되는 경우 에러를 뱉는 옵션이 있다. 필자는 TypeScript로 개발을 하기 때문에 any 타입을 사용하게 되면 그 이..
이제 express가 아니라 NestJS를 하면서 자연스럽게 TS와 친해지려고 노력하고 있다. 최근에 Nest로 프로젝트를 하면서 tsconfig.json 파일을 만질 때가 있었는데, 정확히 이 파일이 어떤 역할을 하는지 모르고 사용을 했던 것 같다. 그리고 프로젝트를 하는 도중에 내가 작성한 소스를 한번 쭉 그냥 보고 있었는데 최대한 any 타입을 지양하고 각종 메서드나 변수 등에 타입을 꼭 달아주었다. 그런데도 몇 군데 빼먹은 곳이 있었는데 생각해보니까 얼핏 이런걸 에러로 보여주는 기능이 있는데? 라고 알고 있었는데 적용이 안되어서 내가 실수한 부분이 몇 군데 있구나 싶었다. 보니까 strict 모드가 활성화 되어있지 않은 것. 그래서 이번 포스팅에서는 strict mode를 어떻게 활성화 했는지 (..

필자는 맵필로그라는 프로젝트에서 사용자 인증에서 JWT 토큰을 사용하기로 결정했다. 하지만 단순히 Access Token만 사용하는 것이 아닌 Refresh Token 사용을 도입을 하기로 결정했다. 각 개발자분들 마다 어떤식으로 구현을 하는지 각각 다르기 때문에 인터넷에서도 각기 다른 자료들을 볼 수 있다. 그래서 필자는 이번 포스팅에서는 해당 프로젝트에서 JWT를 왜 도입했는지, 어떤식으로 Access Token과 Refresh Token 전략을 사용했는지에 대해서 정리를 해보려고 한다. 그리고 지금부터 Access Token은 AT로, Refresh Token은 RT로 표기하는 점 참고해주세요! 또한, 이 포스팅에서는 JWT의 자세한 개념에 대해서는 언급을 하지 않을 예정이니 다른 포스팅으로 한번 ..

해당 포스팅은 김영한님의 모든 개발자를 위한 HTTP 웹 기본 지식 강의를 토대로 작성된 글입니다. 인증 Authorization (요청) - 클라이언트 인증 정보를 서버에 전달할 때 사용한다. - value 값은 인증 방식에 따라 다양하다. 우리가 흔히 아는 Bearer도 이에 해당한다. WWW-Authenticate (응답) - 리소스 접근 시 필요한 인증 방법을 정의 - 401 Unauthorized 응답과 함께 사용한다. 쿠키 (Cookie) - 로그인하지 않은 사용자가 서버에 /welcome을 요청하게 되면 서버는 ~손님을 응답한다. - 사용자가 id, password 정보를 담아서 서버에 /login을 POST로 요청하면 서버에서는 로그인 성공 응답을 할 것이다. - 그리고 사용자가 로그인을 ..

해당 포스팅은 김영한님의 모든 개발자를 위한 HTTP 웹 기본 지식 강의를 토대로 작성된 글입니다. HTTP Header 개요 (1) HTTP Header - header-field = field-name ":" OWS field-value OWS (OWS는 띄어쓰기 허용을 의미한다) - field-name은 대소문자를 구분하지 않는다. 하지만 value는 구분한다. (2) HTTP 헤더의 용도 - 기본적으로 HTTP 전송에 필요한 모든 부가정보를 담는다. - 예를 들어 메시지 바디의 내용, 메시지 바디의 크기, 압축, 인증, 캐시관리 정보 등이 있다. - 그리고 우리는 필요시 임의의 헤더를 추가할 수 있다. (key-value) (3) HTTP Header 추가 정보 위의 사진은 RFC2616 기준인 ..

해당 포스팅은 김영한님의 모든 개발자를 위한 HTTP 웹 지식 강의를 토대로 작성된 글입니다. HTTP 상태코드 소개 상태코드는 클라이언트가 보낸 요청의 처리 상태를 응답에서 번호로 알려주는 것이다. 크게 5개의 상태코드가 있다. - 1XX (Informational): 요청이 수신되어 처리중 (거의 사용하지 않기 때문에 생략한다) - 2XX (Successful): 요청이 정상처리 되었음 - 3XX (Redirection): 요청을 완료하려면 추가적인 행동이 필요하다 - 4XX (Client Error): 클라이언트 오류. 잘못된 문법 등으로 서버가 요청을 수행할 수 없음 - 5XX (Server Error): 서버 오류. 서버가 정상 요청을 처리하지 못함 앞으로 시간이 흐르면서 새로운 상태코드가 나올..

보통 많이 사용하는 createQueryBuilder에서 getRawMany 메서드와 getMany 메서드가 있다는 것을 Nest 개발자 분들은 알고 계실 것이다. skip과 take는 pagination 작업을 처리할 때 주로 적용하는 option이다. 하지만 skip과 take는 getRawMany에서 적용되지 않는다고 한다. TypeORM의 createQueryBuilder에서 getRawMany 메서드는 Raw Data를 반환하는데 이 때 limit와 offset을 적용시켜주어야 한다고 한다. 필자는 skip과 take이 문제가 있을지 전혀 상상하지 못하고 코드 레벨에서 실수가 있었는지 계속 봐서 시간이 많이 소요되었는데 다른 분들은 이 포스팅을 보면서 삽질을 안하셨으면 좋겠다는 생각이 든다! 좋..