전체 글 40

[TypeScript] 인터페이스를 활용한 커스텀 Repository 만들기(w.typeorm)

이전 게시물에서 커스텀 레포지토리를 활용한다고 했다. typeorm에서 커스텀 레포지토리 문서를 제공하긴 하나 typeorm에 지나치게 의존하게 된다는 느낌이 들어 인터페이스를 활용해보기로 했다. 인터페이스 user.repository.ts export interface UserRepository { findById(id: number): Promise; } 인터페이스를 사용하게 된 이유? - 확장성. typeorm 구현체를 사용하게 될 경우, 다른 orm 라이브러리로 갈아타게 될 일이 생길 때 리팩토링 비용이 많이 들 것이다. 또한 typeorm에서만 통하는 문법이 있어 다른 개발자가 봤을 때 이해하기까지 시간이 더 걸릴 수 있다. 이에 공통으로 통용되는 방식을 차용해 접근성을 높이고, 다른 라이브러리..

[TypeScript] ts-mockito 로 테스트하기. 그런데 트랜잭션을 곁들인

개발환경 - Nest.js - Jest (+) ts-mockito (+) typeorm-transactional-cls-hooked Jest에 기본으로 있는 Mock을 사용하면서 다양한 불편함(문자열로 메소드 주입하기, 모킹하는 과정이 구구절절 뭔가 많음...) 을 느꼈는데 조졸두님의 글을 보고 ts-mockito를 사용해보기로 했다. 자세한 사용법은 해당 라이브러리 공식 깃허브에서 확인할 수 있다. 테스트할 User Service import { InjectRepository } from '@nestjs/typeorm'; import { Injectable } from '@nestjs/common'; import { Transactional } from 'typeorm-transactional-cls-..

[ TypeScript ] TypeORM - Cannot read properties of undefined (reading 'column') 에러 해결하기

nest.js 웹 프레임워크를 활용해 프로젝트를 만들고 있었는데 어느 정도 도메인을 짜고 yarn start를 누르니 해당 에러가 떴다. [Nest] 24529 - 02/18/2022, 6:08:29 PM ERROR [TypeOrmModule] Unable to connect to the database. Retrying (1)... TypeError: Cannot read properties of undefined (reading 'id') at new Menu... (중략) at EntityMetadata.create (...link...) at EntityMetadataValidator.validate (...link...) 첫번째 시도 찾아보니 Controller, Service 단에서 리턴 타입..

[TypeScript] 에러 TS2589: Type instantiation is excessively deep and possibly infinite 해결하기

typeorm을 통해 레포에 도메인 정보를 저장하려는데 위와 같은 에러가 떴다. 잘 되던 코드가 갑자기 안 되는 거였기에 코드를 잘못 짠 줄 알고 계속 살펴봤지만 찾을 수 없었다;; 결국 타입스크립트가 또? 하면서 언어 탓하는 나쁜 개발자 마인드가 되었는데... 이번엔 정말로 타입스크립트가 타입스크립트한 거였다 🙄 결론부터 말하자면 타입스크립트의 버전 문제였고, 버전을 낮추면서 해결되었다. 에러가 날 당시 프로젝트의 typeorm과 typescript 버전은 다음과 같았다. 검색해보니 typeorm 깃허브에 관련 버그 이슈가 있었다. (당시 typescript 버전 3.6.x) TypeORM thwors “Type instantiation is excessively deep and possibly in..

[TypeScript] 어떤 ORM을 써야할까? (TypeORM vs MikroORM vs Sequelize)

타입스크립트로 간단한 웹 서비스 만들기를 해보고 있는데 ORM을 고를 일이 생겼다. 프로덕션에서는 TypeORM을 사용하고 있으나 내가 하는 건 개인 과제 같은 거라 다른 ORM을 사용해도 무방했다. 무작정 따라가도 되겠지만... 기술을 쓸 땐 어떤 이유로 쓰게 되었다, 를 알아둬야 기술에 확신을 가지고 사용할 수 있다고 봐 좀 더 알아보기로 했다. 찾아보니 타입스크립트를 지원하는 ORM 중에서 유명한 건 TypeORM, Sequelize(3.1 이상), MikroORM이 있었다. 보통 기술을 선택할 땐 아래 기준으로 고르게 되는 것 같다. 기술을 사용하는 풀의 크기 (다운로드수, Github Stars 등등) 성능 코드 스타일 풀의 크기 npm trends 를 확인하면 라이브러리, 모듈 별로 기간당 다..

[TypeScript] Decorator에 관하여

서론 스프링에서 어노테이션을 통해 AOP를 적용했던 기억이 있어 타입스크립트에서도 비슷하게 적용할 수 있는지 궁금해졌다. 사실 타입스크립트로 로또 뽑기를 구현하다가 try-catch가 너무 반복되는게 신경 쓰여서 AOP를 쓰려고 한건데, 결론적으로 적용은 못하고(ㅋㅋ) 공부만 했다. 나중에 써먹을 데가 있겠지...🥲 각설하고 AOP를 타입스크립트에 적용하기 위해 찾아서 알게 된 건 Decorator 였다. 타입 스크립트 공식 문서에선 Decorator를 이렇게 소개한다. 데코레이터는... - 클래스 선언과 멤버에 어노테이션과 메타-프로그래밍 구문을 추가할 수 있는 방법을 제공한다. - 클래스 선언, 메서드, 접근자, 프로퍼티 또는 매개 변수에 첨부할 수 있는 특수한 종류의 선언이다. - @expressi..

[TypeScript] Java처럼 enum 사용하기

문제 자바를 쓸 때 enum으로 열거형 상수를 줄곧 사용했었다. // 추억의 로또 미션~ public enum WinningBoard { ZERO(0, 0, ""), FIFTH(3, 5_000, "3개 일치"), FOURTH(4, 50_000, "4개 일치"), THIRD(5, 1_500_000, "5개 일치"), SECOND(5, 30_000_000, "5개 일치, 보너스 볼 일치"), FIRST(6, 2_000_000_000, "6개 일치"); private final int hitCount; private final int reward; private final String message; WinningBoard(int hitCount, int reward, String message) { this..

[TypeScript] readLine 사용시 try-catch로 unhandled Error가 잡힐 때

문제 import readline from "readline"; const rl = readline.createInterface({ input: process.stdin, output: process.stdout, }); const createCars = (): Array => { try { rl.question("do something", (carNames) => { return new Cars(carNames); }); } catch (error) { console.log(error); return createCars(); } } 처음 짠 코드는 이러했다. try 블록 내에서 에러가 터지면 커스텀 에러가 잡혀야 하는데, unhandled 에러만 잡히고 커스텀은 안 잡혔다. 추측한 원인 타입스크립트의 ..

[JAVA] 네이버 소셜 로그인 REST API 적용하기

Java SpringBoot 환경에서 네이버 소셜 로그인을 구현하기로 했다. OAuth는 사용하지 않았다. 이전에 카카오 소셜 로그인을 진행했기에 한결 수월하게 하지 않을까? 했지만 어쩌다보니 삽질을 많이 했다... 🥲 아무튼 나처럼 삽질하는 사람이 늘지 않기를 바라며 과정을 정리해보기로 했다. 순서는 다음과 같다. 1. Naver Developer 에서 클라이언트 ID, 클라이언트 시크릿을 발급받는다. 2. 키들을 이용해 인가 코드 발급받기 3. 인가 코드를 활용해 토큰 발급받기 4. 토큰으로 사용자 정보 가져오기 1. Naver Developer 에서 키 발급받기 Naver Developers 에 접속해 Application - 애플리케이션 등록을 클릭한다. 애플리케이션 등록을 위해 애플리케이션 이름..

[JAVA] 카카오 소셜 로그인 REST API 적용하기 (OAuth2 X)

원래 자체 서비스에서도 OAuth2를 사용하려고 했는데 Spring Security를 사용하지 말라는 공지가 들어왔다. 아쉽지만 OAuth2를 사용하지 않고 서비스에 소셜 로그인을 적용하기로 했다. (어차피 카카오 소셜 로그인 API는 OAuth2 기반이라 괜찮을 지도 모른다는 생각도 ...ㅎ-ㅎ) 카카오 소셜 로그인을 자바에 적용시키는 방법은 크게 아래와 같은 차례를 따른다. 1. Kakao Developer에서 클라이언트 키 발급받기 2. 키를 사용해 API에 인가 코드 요청 보내기 3. 받은 인가 코드를 사용해 API에 토큰 발급 요청 보내기 4. 받은 토큰을 활용해 사용자 정보 가져오기 5. 로그아웃 하기 리팩토링을 거치지 않은 코드다... 🙃 흐름을 이해한다는 데 의의를 두자ㅎㅎ (+) 2020..