[Nest.js] 데코레이터로 트랜잭션 주입해보기
·
BackEnd/Nest.js
Spring에서는 @Transactional을 이용해 트랜잭션 사용이 가능하다.이는 DB 라이브러리 개발자들이 Spring의 트랜잭션 추상화에 맞게 구현했기 때문이다.하지만 Nest.js는 트랜잭션 관련한 추상화된 스펙을 제공하지 않는다.그렇기에 라이브러리에서 제공하는 트랜잭션 명세에 전적으로 의존하게 된다.예를 들면 Prisma의 트랜잭션 사용 방법은 다음과 같다. import { Injectable } from '@nestjs/common';import { PrismaService } from '../prisma.service';import { User } from '@prisma/client';@Injectable()export class UserService { constructor(privat..
[Nodejs] 비동기 API라고 해서 다 같은 비동기가 아니다.
·
BackEnd/Node.js
비동기 API를 이용할 때 Promise.all로 비동기 요청을 병렬 처리하는 경우가 많다.그런데 병렬 처리시 어떤 비동기 API를 사용하느냐에 따라서 몇몇 요청이 지연되는 케이스가 생길 수도 있다. 비동기 API 처리 과정Nodejs에서 비동기 처리는 libuv 라이브러리가 담당한다.libuv는 비동기 요청이 들어오면 커널단에서 비동기적으로 처리가 가능한지 확인한다. 커널에서의 비동기 처리 가능 유무에 따라 다음과 같이 동작한다.- 커널에서 비동기 처리 지원 O -> 메인스레드에서 커널에 비동기 작업 요청- 커널에서 비동기 처리 지원 X -> 스레드풀의 스레드에서 커널에 동기 작업 요청 libuv는 비동기 요청에 대해서 non-blocking 방식으로 시스템콜을 날린다.(non-blocking 방식이기..
[딥러닝] 퍼셉트론과 신경망
·
프로그래밍/기타
딥러닝은 사람의 신경망을 모방하여 구현한다. 신경망에 대해 알아보기 전에 더 단순한 퍼셉트론부터 알아보자. 퍼셉트론이란? 퍼셉트론은 다수의 신호를 받아서 하나의 신호를 출력하는 알고리즘이다. 출력하는 신호는 0 혹은 1이다. (이진 출력) 아래 그림은 2개의 신호를 받는 퍼셉트론의 예다. 가중치 입력 신호와 가중치를 이용하여 출력을 내는데, 이때 사용되는 함수를 활성함수라고 한다. 퍼셉트론의 활성함수는 아래와 같다. 가중치가 큰 신호일수록 출력 신호에 주는 영향도 클 것이다. 즉, 가중치는 입력 신호의 중요도를 결정한다. 편향 하지만 실제 구현에서는 가중치 외에도 편향이라는 값을 사용한다. 위 식에서는 θ가 편향에 해당한다. 편향을 좌변으로 옮기면 -θ가 되는데, b라는 변수로 치환하여 아래와 같이 표..
[Flutter] CERTIFICATE_VERIFY_FAILED 에러
·
프로그래밍/발생한 에러들
플러터에서 개인 서버와 https 통신중에 에러가 발생했다. 에러 내용을 보면 unable to get local isser certificate 라고 한다. 이 에러는 요청하는 서버의 인증서가 유효하지 않다는 것이다. 처음에는 인증서 자체가 잘못된 줄 알았다. 하지만 Postman으로 요청 보내면 문제 없이 잘 되더라... 스택오버플로우나 구글링을 해보면 아래와 같은 코드를 본 경우도 있을 것이다.class MyHttpOverrides extends HttpOverrides{ @override HttpClient createHttpClient(SecurityContext? context){ return super.createHttpClient(context) ..badCertificateCallback..
NestJS v10.0.0 redis 에러 이슈
·
BackEnd/Nest.js
Nest can't resolve dependencies of the RedisCoreModule (Symbol(REDIS_MODULE_OPTIONS), ?). Please make sure that the argument ModuleRef at index [1] is available in the RedisCoreModule context. NestJS v10.0.0 부터 발생하는 이슈다. 이와 관련한 이슈에 대한 해결책으로 대부분의 블로그에서 nestjs-redis 모듈 대신 @liaoliaots/nestjs-redis 사용하라고 권하고 있다. https://www.npmjs.com/package/@liaoliaots/nestjs-redis 그런데 이 모듈 또한 에러가 발생했고, 레포지토리 이슈를 보..
사이드 프로젝트에 사용하기 좋은 서비스
·
프로그래밍/기타
요즘 사이드 프로젝트를 진행하고 있다. 일도 바쁘고 시간이 지날수록 자꾸 늘어져서... 개발 속도가 점점 늦어지고 있다. 리프레쉬 겸 상용 서버에서 사용할 인프라좀 찾아보고 있다. 사이드 프로젝트에서 배포를 고려할 때 가장 큰 문제는 역시 비용이다. 나 역시 비용을 고려하며 쓸만한 서비스가 있나 찾아보았다. 오늘은 내가 찾아본 정보들을 정리해보려 한다. 최대한 간단하게 적을 것이므로 대략 이런 서비스가 있구나 하고 훑어보면 좋을 것 같다. 어차피 프리티어 혹은 바로 윗 단계의 비용을 지불할 가능성이 높다고 생각하기에 비용 정책은 따로 설명하지 않겠다. Firebase, Vercel과 같이 널리 알려진 서비스는 제외하고 서술한다. Server Supabase Supabase | The Open Source..
[JS] bytecode로 분석해보는 var, let, const 호이스팅
·
BackEnd/Node.js
해당 글은 node v16.13.0을 기준으로 작성되었습니다. 본인이 사용하는 node 버전에 따라 인터프리터가 생성하는 바이트코드가 달라질 수도 있습니다. 일반적으로는 var는 호이스팅이 되어서 중복 선언이 가능하다고 알려져있고, let, const는 호이스팅이 되지 않아 중복 선언이 되지 않는다고들 알고 있다. 여기서 더 나아가서 let, const가 호이스팅이 되지만 TDZ에 의해서 변수가 초기화되기 전까지는 접근이 불가능하다는걸 알고 있는 사람들도 많을 것이다. 그러면 여기서 더 더 나아가서, v8 엔진이 자바스크립트 코드를 어떻게 해석하길래 호이스팅이나 TDZ가 우리가 생각하는대로 동작하는지 알아보자. 바이트코드를 출력하기 위해서는 --print_bytecode 옵션을 이용하면 된다. ex) n..
git push 취소하기 (push한 커밋 되돌리기)
·
프로그래밍/git
가끔 협업하다가 브랜치 따는걸 깜빡하고 main에 push하는 경우가 있다. 시간을 되돌려 과거로 돌아가보자. 아래 명령어를 이용하면 push하기 직전의 커밋으로 돌아갈 수 있다. git reset --mixed HEAD^ git push --force 이제 브랜치를 생성해서 git add부터 다시 진행하자. 1. 만약 커밋 변경 내역까지 싹 날리고 싶으면 위의 명령어에서 --mixed => --hard 로 바꾸던가 하면 된다. 2. 커밋 히스토리를 1개가 아닌 2개 이전으로 날리고 싶으면 HEAD^ => HEAD~2 로 바꾸면 된다. (3커밋 전으로 가고싶으면 HEAD~3)
java.lang.NoClassDefFoundError: javax/persistence/Entity
·
프로그래밍/발생한 에러들
Spring에서 querydsl 세팅하다가 이러한 에러가 발생했다. 해결 방법 (build.gradle.kts를 사용하여 groovy gradle과 코드 포맷이 다를 수 있습니다.) 1. gradle에 annotationProcessor 추가 여기서 안되면 2번 방법까지 해야한다. implementation("com.querydsl:querydsl-jpa:5.0.0") annotationProcessor("com.querydsl:querydsl-apt:5.0.0:jpa") // 아래 두줄 추가 annotationProcessor("jakarta.persistence:jakarta.persistence-api") annotationProcessor("jakarta.annotation:jakarta.anno..
[GCP] 클라우드에 개인 DB를 설치해보자 - 2
·
Cloud/GCP
이전글 : [GCP] 클라우드에 개인 DB를 설치해보자 - 1 저번 포스팅에서 만든 개인키로 인스턴스에 접속할 수 있다. 1. cmd에 아래와 같이 입력하여 인스턴스로 접속한다. 사용자이름은 Compute Engine - 메타데이터 - ssh 키 에서 확인할 수 있고, 인스턴스 외부 IP는 Compute Engine - VM 인스턴스 에서 확인할 수 있다. ssh -i "개인키파일경로" "ssh에 등록한 사용자 이름"@"인스턴스 외부 IP" # ssh -i ~/.ssh/gcp_rsa_4096 l4279625@11.111.11.111 2. postgresql을 설치한다. sudo apt update sudo apt -y install postgresql postgresql-client postgresql-..
[GCP] 클라우드에 개인 DB를 설치해보자 - 1
·
Cloud/GCP
주의: 해당 방법은 보안은 고려하지 않았으므로 토이 프로젝트 같은 가벼운 용도로만 사용하는것을 추천드립니다. 라즈베리파이와 같은 초소형컴퓨터로 개인서버를 만들어서 사용해도 되지만, 라즈베리파이를 상시로 켜놔야한다는 불편함이 있다. 그래서 클라우드에서 무료로 제공하는 인스턴스를 이용하여 db를 만들것이다. 클라우드는 aws, gcp, azure, oci 등이 있다. 처음엔 Oracle Cloud로 인스턴스를 생성하려 했는데 회원가입이 잘 안되더라... AWS는 프리티어를 1년만 제공하기 때문에 패스했다. 업무용으로 GCP를 사용하고 있기도 해서 겸사겸사 GCP로 서버를 만들기로 했다. https://console.cloud.google.com/ 1. 구글 클라우드에서 Compute Engine - VM 인..
[TypeORM] join한 릴레이션이 property로 추론되는 이슈
·
BackEnd/Nest.js
User 엔티티에 managerSeq라는 Foreign Key가 존재한다면 아래처럼 관계를 명시해주어야 한다. @Entity class User { @Column() seq: number @Column() id: string @Column() name: string @Column() managerSeq: number @ManyToOne(() => Manager) manager: Manager } User 엔티티의 manager는 foreign key인 managerSeq와의 관계를 설명하기 위해 작성했을 뿐, 실제로는 User가 가지고 있지 않은 값이다. 하지만 그럼에도 find, findOne와 같은 함수로 response를 가져오면 manager가 property로써 타입 추론이 된다. 2022-10..