전체 글

Backend Engineer.
CONFERENCE

exception을 어떻게 관리해야 하는가

시작 오늘은…백엔드 api 서버에서 exception 핸들링 방법을 어떻게 해야할 지에 대한 고민의 흔적입니다… 기능 개발에 급급하다보니 종종 소홀하게 넘어간 부분들이 보일 때가 있는데, 최근 exception을 처리하는 부분이 전반적으로 좀 취약하다라는 생각이 들었습니다. 이번엔 이런 부분이 어떤 문제가 있고 어떻게 더 개선할 수 있을지에 대해 적어봤습니다. 이야기 하기 전에 전역적이고 자주 발생하는 exception 처리를 어떻게 하는지 간단하게 거치면 좋을 것 같습니다. 최소한의 에러 처리 1. Auth-Guard 많은 경우의 API들이 권한을 필요로 합니다. AuthGuard는 말 그대로 인증에 대한 방어 처리를 담당합니다. 요청이 들어오면 헤더에서 인증과 관련한 값(JWT, 쿠키, 세션 등)을 ..

KNOWLEDGE/OS

리눅스 커널 구성에 관하여

개요 커널을 수정하면 기존 OS의 임계점을 변경하는 것이 가능하다. 서버 상에서 최적의 효율을 끌어낼 수 있는 환경을 구축할 수 있게 되는 것이다(어떤 설정은 신중하게 선택해야 하겠지만). 본 내용은 철저하게 웹 서버의 관점에서 작성되었으며, 모든 글이 철저히 주관적인 관점에서 쓰였음을 염두에 두어야 한다! 무엇을 할 수 있을까? TCP 요청을 위한 튜닝 웹 서버를 위해 사용되는 환경이므로 TCP를 위한 환경 설정 일부는 제법 좋은 선택이 되어줄 것입다. TCP의 수락 대기열 큐 크기나 파일 연결 수 등을 늘리면 커넥션 상에서 발생하는 에러를 줄일 수 있을 것. 시스템 세션을 위한 튜닝 커널 세션과 파일 시스템 세션을 위한 주요 항목을 통해 공유 메모리나 메시지 큐의 크기를 결정하고, 패닉 시 재부팅 등..

DEVELOPMENT/JAVASCRIPT

tsconfig 설정에 대해

target 타입스크립트가 자바스크립트로 변환될 때, 그 버전을 지정함. 일반적으로 es2013 버전이나, 모던 브라우저 대부분이 es2015 이후의 버전을 지원하므로 조금 더 올려줘도 좋을 것 같음(서버의 경우에는 해당 없음). noImplicitAny true일 때, 암묵적 any 변수에 대한 오류를 발생시킴. strictNullCheck true일 때, null 및 undefined에 대한 처리를 엄격하게 관리. undefined 및 null에 대한 참조를 방지. https://www.typescriptlang.org/ko/docs/handbook/2/basic-types.html

DEVELOPMENT/NODEJS

NestJS :: param과 URI의 우선순위 문제

Nest.js에서 다음과 같은 경우 에러가 발생할 수 있다. @Get('/:testId') async testId(@Param('testId') testId: number) { return testId; } @Get('/test') async test() { } 이 경우 /test로 호출을 해도 /:testId에 요청이 간다. _testId_라는 변수는 Number 값이므로, NaN 에러가 발생하게 된다. 이런 문제는 익스프레스의 미들웨어가 순차적으로 실행되기 때문이다. 선언된 순서가 URI의 우선순위에 영향을 미친다. 즉 요청의 조건에 부합하는 두 개 이상의 api가 있을 때, 코드 내부에서 먼저 선언된 api가 호출되는 것이다. 때문에 /test가 위로 오게 되면, 이전과 같은 에러는 발생하지 않는다..

DEVELOPMENT/NODEJS

Node.js BASE64로 AWS S3에 이미지 업로드하기

base64 image 형식은 다음과 같다. data:image/png;base64,iVBORw0KGgoAAAAN...(여기에 버퍼 데이터)...이미지 형식을 파일이 아니라 base64로 받으면 다음 형식을 따르게 되는데, 이 상태로 putObject를 하면 이미지 변환에 실패한다 (실제 s3에 올리니 이렇게 올라갔다) 그래서 앞의 헤더? 부분을 제거할 필요가 있으므로, slice로 다음 내용을 지워주면 될 것 같다. await this.s3Uploader .putObject({ Bucket: this.configService.get('AWS_BUCKET_NAME'), Key: (디렉토리), Body: Buffer.from( brandData.brandImage.replace(/^data:..

카테고리 없음

Cascade 속성은 언제 적용해야 하는가?

다음과 같은 방식으로 적용할 수 있다. @ManyToOne(() => UserEntity, (user) => user.alarm, { onDelete: 'CASCADE', }) user: UserEntity;@OneToMany(() => AlarmEntity, (alarm) => alarm.user, { cascade: true }) alarm: AlarmEntity[];cascade 속성이 없으면 userEntity에서 delete 요청이 들어와도 수행에 실패한다. 이는 알림 엔티티가 유저 엔티티와 결부되어 있기 때문이다. 이때, cascade 속성을 적용하면 user가 삭제될 때 그 유저와 연관된 알림 내역도 전부 사라지게 된다. (아키텍처 면에서도 이 방향이 맞다고 본다.)

DEVELOPMENT/NODEJS

cookie 데코레이터에서 JWT payload 추출하기

공식 문서에서 나오는 쿠키 데코레이터는 다음 내용과 같다. export const Cookies = createParamDecorator( (data: string, ctx: ExecutionContext) => { const request = ctx.switchToHttp().getRequest(); return data ? request.cookies?.[data] : request.cookies; }, ); 우리는 JWT 토큰을 쓰기 때문에 페이로드를 뽑아 데이터를 가져오는 데는 대략 다음과 같은 로직을 거쳐야 한다. AuthGuard에서 JWT를 한번 검증한다. Cookie 데코레이터에서 accessToken 이름의 쿠키를 뜯어온다. 컨트롤러에서 JwtService.verify를 사용해 스트링 값..

DEVELOPMENT/NODEJS

cookie 데코레이터에서 JWT payload 추출하기

공식 문서에서 나오는 쿠키 데코레이터는 다음 내용과 같다. export const Cookies = createParamDecorator( (data: string, ctx: ExecutionContext) => { const request = ctx.switchToHttp().getRequest(); return data ? request.cookies?.[data] : request.cookies; }, );우리는 JWT 토큰을 쓰기 때문에 페이로드를 뽑아 데이터를 가져오는 데는 대략 다음과 같은 로직을 거쳐야 한다. AuthGuard에서 JWT를 한번 검증한다. Cookie 데코레이터에서 accessToken 이름의 쿠키를 뜯어온다. 컨트롤러에서 JwtService.verify를 사용해 스트링 값으..

정민아
DEV MINA