본문 바로가기

전체 글307

save 와 upsert MySQL로 작업을 하던 시절 데이터베이스에 데이터를 저장시키기 위해 SQL 키워드 "INSERT"를 사용했다. 그리고 상황에 따라 데이터가 있으면 UPDATE, 없으면 INSERT하는 UPSERT에 대한 개념을 알게되었다. 새로운 직장에서 typeORM을 공부하며 CRUD를 구현하던 중 데이터를 저장하는 상황에서 나는 단순히 INSERT를 먼저 생각하게 되었고, 공식문서에서 Repository API 목록을 살펴보니 INSERT를 실행시킬 수 있는 API가 세 가지가 있더라... ① save ② insert ③ update ④ upsert 공식문서에서 정의하는 내용을 살펴 보면... ① saveSaves a given entity or array of entities. If the entity alre.. 2023. 4. 25.
[class-transformer] plainToInstance & instanceToPlain 모델 매퍼(ModelMapper) 스프링의 경우 DTO와 엔티티간의 변환을 할 때 ModelMapper나 Mapstruct라는 라이브러리를 많이 사용합니다. 그러면, 객체가 가질 수 있는 프로퍼티는 옮겨지게 되고, 아닌 프로퍼티는 버려지게 되죠. JS는 그러한 역할이 없어서 상당히 불편했습니다. Interface를 고집한다는 점과 Class instance와 Literal object 간 변환이 어렵다는 점이 이유입니다. 그나마 쓸만한 라이브러리가 AutoMapper인데 사용하기가 어렵고 유지보수가 중지되었죠. 그래서 최근에 나와서 핫한 라이브러리 중 하나가 class-transformer입니다. 이 라이브러리는 ModelMapper 역할을 훌륭하게 수행할 수 있고, 상당히 강력하고 간단합니다. 최근 c.. 2023. 4. 25.
스칼라 서브쿼리 테이블은 이전 게시글에서 사용해했던 pokemon 과 ability 이다. PRIMARY_ABILITY, SUB_ABILITY 값으로 ability 테이블 NAME 컬럼에서 이름을 가져오고 싶다. 우선 쿼리를 먼저 그려보면, SELECT "NAME", "NUMBER", (SELECT "NAME" FROM ability WHERE ability."ID" = pokemon."PRIMARY_ABILITY" ) AS p_ability, (SELECT "NAME" FROM ability WHERE ability."ID" = pokemon."SUB_ABILITY" ) AS s_abilityFROM pokemon; 이러하다. 정말 간단하지 않은가. 결과는,  원하는 형태로 잘나왔다. 그렇다면 스칼라 서브쿼리를 Ty.. 2023. 4. 7.
(relations: ManyToOne, OneToMany / JoinColumn), typeORM option: logging 으로 실행된 SQL 구문 보기 개발자 포지션으로 두 번째 회사인 이 곳에서... 새로운 기술스텍을 많이 발견하고 있는 중이다. 그 중 데이터베이스와 관련된 TypeORM을 공부하면서 정리해보자. 자... Type + ORM 에서 ORM이란, Object Relational Mapping 의 약자이다. 그리고 이것은 기술이다.어떤 기술이냐? 객체지향 프로그래밍과 관계형 데이터 베이스를 연결해주는 기술이라고 구글 선생님께서 말하신다. 즉, ORM은 SQL과 일반적으로 코드 에디터(Visual Studio Code 같은...) 우리가 작업하는 코드(자바스크립트)를 연결시켜준다고 이해하면 쉬울 것 같다. 뭐, 더 거창한 설명이 분명히 있을 것이다. 그리고 ORM 앞에 붙은 Type은 자바스크립트의 확장개념인 TypeScript를 말한다. 개.. 2023. 4. 6.
[NestJs] 끄적끄적 ■ NestJS 설치하고 새로운 프로젝트 생성하면 이것저것 생김.eslintrc.js : 개발자의 코드 스타일 정의prettierrc : 코드 포맷 형식 정의 ■ npm run start:dev 실행. 실행순서main.ts 순서 상 제일 먼저 로드되는 스크립트. 여기에 NestFactory.create()에 의해 루트모듈 정의, 포트설정 ■ 진입 순서?module → controller → service ■ 모듈의 구성① module, ② entity, ③ service, ④ repository, ④ pipe  ■ 모듈 파일 생성 명령어base: nest g module boards / nest g controller boards / nest g service boards option: --no-spec.. 2023. 3. 29.
HttpClient.jsonp 와 HttpInterceptor의 충돌 외부 서버에 HTTP 요청이 필요한 상황에서 CORS 문제로 접근이 제한된다면 HttpClient의 jsonp로 API 호출을 할 수가 있다. 우선 내가 겪은 상황에 대해 설명하자면, jsonp로 HTTP 요청을 보내면 "jsonp는 HttpRequest Header를 포함할 수 없습니다??"와 비슷한 문구의 에러 메시지를 출력해준다. Angular에서 제공하는 HTTP_INTERCEPTORS에 의해 HTTP와 관련된 로직들이 HTTP Request 중간에 가로채지며 발생한 문제였다. HTTP_INTERCEPTORS가 모든 HTTP 요청을 중간에 가로채어 request header에 특정 값들을 세팅해주고 있었고, 위에서 언급한 "httpRequest Header를 포함할 수 없습니다"가 출력된 것이다... 2023. 3. 23.