본문 바로가기

분류 전체보기

(19)
[NestJS] iterable 객체 병렬처리 하기(feat.Bluebird JS) 이번 포스팅에서는 iterable 객체 병렬처리에 대해 알아보겠습니다. iterable 객체체인 updateDtoList 배열을 돌면서, db에서 updateDto에 담겨있는 도메인 idx로 find하고 해당 엔티티를 업데이트 하는 작업을 하고 있었는데요. 아래 예시 코드처럼 처리하게 되면, updateDtoList 배열을 순차적으로 순회하면서 실행되기 때문에 속도적인 측면에서 좋지 않다고 생각했습니다. const updateEntities = await updateDtoList.map(async (updateDto) => { const updateEntity = await this.entityRepository.findOne(updateDto.idx); updateEntity.startDate = up..
[NestJS] class-validator를 사용한 필수값 체크(feat.다음 우편번호 API) 이번 포스팅은 작업한 내용을 간단히 메모하는 느낌의 포스팅입니다. 현재 프로젝트에서는 HTTP 리퀘스트 데이터의 유효성을 검증하기 위해 class-validator라는 라이브러리를 사용하고 있습니다. 기존에는 필수로 받아야 하는 프로퍼티를 체크하기 위해 @IsNotEmpty() 데코레이터를 사용했는데, 이렇게 했을 때 문제가 되는 부분이 생겨서 간단하게 정리 용도로 작성하겠습니다. 문제가 생겼던 부분은 주소를 검색해서 서버로 주소를 넘겨주는 부분입니다. 유저 회원가입시에 다음 주소 API를 사용하여 특정 값들만 서버에 넘겨주고 있는데, 기존에는 아래 코드처럼 @IsNotEmpty()로 유효성 검사를 하는 것 을 볼 수 있습니다. export default class AddressDto { @ApiProp..
[NestJS] DTO의 사용범위에 관한 고찰 및 리팩토링(feat.Layered Architecture) 이번 포스팅에서는 최근 작업을 하면서 느꼈던 점을 정리해보려 합니다. 현재 프로젝트에서는 서버를 계층형 구조로 개발을 진행하고있는데, 다들 아시는것처럼 (모두 그런건 아니지만) 컨트롤러, 서비스, 레포지토리로 계층을 나눠서 각각의 역할에 맞게 개발하는 것을 말합니다. 이는 결합도와 응집도에 관한 문제인데, 그 부분 이야기는 다음에 하도록 하겠습니다. 우선 저는 작업을 하던 도중 하나의 의문이 들었습니다. DTO 즉, 계층간에 데이터를 전달해 주기 위한 객체인 DTO의 사용범위에 대한 것이었는데요. 예를 들어, 클라이언트 컨트롤러 서비스 레포지토리 각 계층간에 데이터 전달을 위해 필요한 것입니다. 좀더 구체적으로 말하면, DTO와 엔티티간의 변환 위치에 관한 것 이었습니다. 여기에서 기존에 작성했던 코드를..
[NestJS] 이벤트 드리븐으로 기능 구현하기(feat.Event Emitter) 현재 프로젝트를 진행하면서 회원가입 성공시 혹은 리소스 생성시 구현되어야 할 기능들이 추가 및 변경되는 일이 잦았다. 그래서 기존의 로직은 영향을 받지 않으면서 변경 및 추가되는 기능에 대해 대응하기 위해 이벤트 드리븐으로 개발해야 겠다는 생각이 들었다. 예를 들어, 기존에는 회원가입 성공시에 추가 로직이 없었지만, 현재는 인증 메일 전송 및 가입 축하 알림톡 기능이 추가 되어야 하고, 리소스 생성시(예를 들면 선생님이 신규 클래스를 등록하는 등) 알림 db에 insert 하여 해당 그룹의 유저들이 확인 하고, 그 알림이 실시간으로 전송되어야 한다는 요구가 있었다. 예시에서는 신규 클래스 생성 완료 되면 이벤트를 발생시켜서 알림을 등록하는 부분을 작성하겠다. async create(createArtCla..
[NestJS] 쿼리빌더를 사용한 코드 리팩토링 (feat.TypeORM) 쿼리빌더를 사용해서 코드 리팩토링 한 것을 알아보기 전에, 우선 어떤 작업인지 간단하게 설명하겠습니다. 현재 개발하고 있는 서비스는 학원을 관리하는 LMS 서비스로 수업을 조회하는 부분에서 필터링이 필요했습니다. 수업 상태를 기준으로 전체, 수업 예정/ 진행중, 수업 종료 3가지에 상태가 있고 수업 종류를 기준으로 전체, 정규 클래스, 원데이 클래스 3가지 종류가 있었습니다. 처음에는 switch case문을 중첩으로 사용하여 아래와 같이 짰는데요.. async findAll(pageRequest: ArtClassPageRequest, currentAcademy: Academy) { let getRes: ArtClass[]; const [artClasses, count] = await this.artCl..
[NestJS] Many-to-Many 생성시에 할당하는 코드 리팩토링 (feat.TypeORM) 오늘 작성 할 포스팅은 Nest.js로 작업하면서 리팩토링 한 코드입니다. 작성에 앞서 현재 작업 중인 프로젝트에서 관련 부분에 대해 간단히 설명하면 미술 교육 프로그램(커리큘럼)에 준비물과 키워드, 주차별 정보가 각각 N:M 관계로 할당 되어 있는 구조이다. 그 중 준비물을 대표로 해서 설명해 보자면 create-proram.dto export default class CreateProgramDto { @ApiProperty({ description: '프로그램명', default: '프로그램1', }) readonly name: string; @ApiProperty({ description: '준비물', default: ['스케치북', '연필'], }) readonly tools: string[]; ..
WebBrowser 웹브라우저는 기본적으로 html,css,js 코드를 가지고 웹페이지를 그려주는 역할을 합니다. 브라우저마다 차이는 있지만, 공통적인 구조는 크게 7가지로 구성되어있었습니다. 첫 번째로 주소 표시줄, 이전/다음/새로고침 버튼 등 웹페이지를 제외하고 사용자와 상호작용하는 User Interface 두 번째 HTML과 CSS를 파싱하여 요청한 웹 페이지를 표시하는 렌더링 엔진, 세 번째 유저 인터페이스와 렌더링 엔진을 연결하는 브라우저 엔진 네 번째, 각종 네트워크 요청을 수행하는 네트워킹 파트 다섯 번째, 체크박스나 버튼과 같은 기본적인 위젯을 그려주는 UI 백엔드 파트 여섯 번째, 로컬 스토리지나 쿠키와 같이 보조 기억장치에 데이터를 저장하는 파트 마지막으로, 자바스크립트 코드를 실행하는 인터프리터가 있습..
HTTP HTTP란? HTTP는 Hypertext Transfer Protocol의 약자다. 즉 Hypertext 인 HTML을 전송하기 위한 통신규약을 의미한다. Web browser와 Web server가 통신할 때 사용하는 통신 규칙 처음 발표한 HTTP는 매우 단순한 통신 규칙이었습니다. 그러나 웹이 폭발적으로 성장하면서 단순한 HTTP의 기능만으로는 성능, 보안, 안정성을 확보하는것에 문제가 생겼습니다. 이러한 문제를 해결하기 위해서 HTTP는 보다 풍부한 기능을 가진 프로토콜로 발전했습니다. 오늘날에는 단지 HTML과 같은 텍스트 파일뿐만 아니라 이미지, 오디오, 동영상과 같은 다양한 멀티미디어 파일을 전송하는 인터넷에서 가장 중요한 통신규칙이됐고, 웹을 넘어서서 인터넷이 동작하는 근간이라고 할 수 있..