일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- typeorm
- coarse-grained
- 오블완
- 셀렉트어드민
- 추상 클래스
- 파일조회
- 책임부과
- YouTube Data API
- Mock
- 티스토리챌린지
- Connection pool
- 어드민 페이지
- fine-grained
- 멀티테넌시
- 오브젝트
- SW마에스트로
- java
- 권한검증
- API 개발
- jest
- API 설계
- mailerservice
- NestJS
- nestjs decorator
- SROOM
- guard
- 자바
- nestjs libraries
- monorepo
- nestjs library
- Today
- Total
목록전체보기 (17)
독산구너
글의 목적인턴 과정 중 투입된 프로젝트에서 '업무'와 '업무가 포함되는 그룹' 정보를 다루게 되었습니다. task와 group으로 칭하겠습니다.group은 하위 group은 가질 수 있고, 하나의 task는 하나의 group에만 포함되는 구조입니다. 이러한 트리구조를 가장 잘 다룰 수 있는 데이터 저장방식을 고민하였고, 그 과정을 기록하고자 합니다 요구사항그룹-태스크 트리구조 저장그룹 내 다수의 그룹이 생성될 수 있으며, 없을수도 있다.그룹 내 다수의 태스크가 생성될 수 있으며, 없을수도 있다.태스크 하위에는 그룹 또는 태스크 생성이 불가하다드래그 앤 드롭으로 그룹간 그룹이동, 그룹간 태스크 이동그룹 삭제, 태스크 삭제Group A│├── Task 1├── Task 2└── Group B ├── T..
글의 목적API를 설계하고 개발하면서 고민했던 주제인 '페이지별 API 제공'과 '공통 API 제공'에 대해 적어보고, 지금 저희 서비스에는 뭐가 적절한지 알아보고자 합니다. 글의 계기백엔드 개발 인턴쉽 과정에서, DB, Architecture, API 등 서버측 소프트웨어를 처음부터 설계할 기회가 주어졌습니다. API 설계 과정에서 이사님과 논의했던 주제 중 하나가 바로 '공통 API'를 만들것인지, '페이지별 API'를 만들것인지에 대한 것이었습니다. 두 설계 방식의 장단점을 생각해보고, 지금 개발중인 서비스에는 뭐가 적절할지 이야기하면서 몇가지 인사이트를 얻을 수 있었습니다. Fine-Grained APIFine-Grained, 말 그대로 섬세한, 세분화되있는 이라는 뜻입니다. 작업의 단위를 잘게 ..
글의 목적현재 개발중인 NestJS 프로젝트에서는 이메일로 전송된 코드를 입력해 로그인하도록 합니다. 이 기능의 테스트코드를 작성하면서 발생한 문제점과 해결방안을 써보고자 합니다. 이 글을 통해 Jest 테스트에서 꼭 필요하지 않은 특정 외부 서비스 의존성을 제거하는 방식을 알게됩니다. 문제점이메일 전송 기능은 @nestjs-modules/mailer의 MailerService를 통해 구현됩니다.export declare class MailerService { ... constructor(mailerOptions: MailerOptions, transportFactory: IMailerTransportFactory); ... verifyAllTransporters(): Promise..

글의 목적어드민 페이지를 쉽게 만들 수 있는 셀렉트 어드민 사용기에 대해 써보고자 합니다.https://www.selectfromuser.com/ 셀렉트 | 어드민, 운영툴, 관리자 페이지를 만드는 새로운 방법비즈니스, 운영 지원 시스템을 만드는데 반복적으로 일어나는 비효율을 해결하고 있습니다. 셀렉트로 어드민, 백오피스를 더 쉽게 만드세요.www.selectfromuser.comyml 파일 작성만으로 db 조회 및 뷰 생성, 그래프 포함 어드민 페이지 생성이 가능합니다. 구현하고자 하는 기능Database 연동 및 데이터 조회서버에 저장되어 있는 첨부파일 다운로드셀렉트 어드민으로 주로 서버 데이터를 가공해 조회하는데 사용하는데, 이번에는 서버 내 파일에도 접근할 수 있도록 해서 어드민 페이지를 통해 사..
글의 목적인턴 과정에서, NestJS를 사용하여 사용자 레벨을 나누고 레벨별로 API 호출 권한을 설정했습니다. 이때 사용한 Guard, jwt, 데코레이터 생성 방식에 대해 써보고자 합니다. 요구사항워크스페이스 내 멤버는 4개의 레벨로 나눠집니다. 레벨 1이 가장 높으며, 가장 높은 권한을 가지고 있습니다. 레벨 숫자가 커질수록 적은 권한을 가집니다.Guard를 통해 API를 호출한 멤버가 해당 권한을 가지고 있는지 확인해야 합니다. 이때 DB를 조회하지 않습니다 (사용자가 api 호출 권한이 있는지 guard에서 db를 조회해 확인할 수는 있으나, controller의 메서드가 호출되기도 전에 db에 접근하는 것이 리소스 낭비이고 알맞지 않다고 생각했습니다) 구현 방법JWT 페이로드에 해당 멤버의 l..
목차글의 목적제 주력 언어는 자바이고 자바의 타입과 논리구조가 익숙합니다. 그렇기에 최근 인턴과정에서 사용하게 된 Typescript를 다루는것이 생각보다 어려웠습니다. 어려움 중 하나였던, 타입(Type)의 차이에 대해 일부분 알아보고, 이를 공유하고자 합니다. 글을 쓰게 된 이유이광근 교수님의 '컴퓨터 과학이 여는 세계'에서는 컴퓨터의 타입(Type)을 '프로그램이 최종적으로 만드는 데이터의 종류' 라고 설명합니다. 언어가 포함하는 논리식의 결과물(데이터)를 '종류' 까지만 초점을 가지고 분류한 결과물이라는 것입니다. 이 대목에서 "그럼 자바와 자바스크립트의 논리식의 차이점이 있는건가?" 라는 질문이 들었습니다. 자바스크립트는 자바와 다르게 undefined, NaN, Infinity와 같은 더 세부..
목차 글의 목적인턴과정에서 SaaS 형태, 멀티테넌시 구조의 서비스 개발 수행을 맡았습니다. 그때 고민하고 구현했던 것들에 대해 기록을 남기고자 합니다. 멀티테넌시란?단일 인스턴스에서 여러 테넌트(사용자 또는 사용자 조직)가 수용되고, 각 테넌트의 데이터는 다른 테넌트와 격리되어 보이지 않아 모든 테넌트에 대한 데이터 보안 및 개인정보 보호가 보장되는 소프트웨어입니다.출처: https://www.ibm.com/kr-ko/topics/multi-tenant 멀티 테넌트란? | IBM여러 사용자가 소프트웨어 애플리케이션 및 해당 리소스의 단일 인스턴스를 공유할 수 있도록 하는 멀티 테넌트 소프트웨어 아키텍처에 대해 자세히 알아보세요.www.ibm.com 멀티테넌시 격리수준1. 공유 데이터베이스, 공유 스..

목차 글의 목적NestJS의 Library를 사용해서 얻을 수 있는 이점을 알아보고, 이를 멀티테넌씨 DB 구조 설계에 이용해보고자 합니다. NestJS LibrariesNestJS에서는 공통으로 사용되고, 자주 재사용되는 코드를 구성하는 여러가지 방식이 존재합니다. 1. 모듈화 -> NestJS의 핵심 개념으로, 특정 로직을 모듈화시켜 다른 모듈에서 import 받아 사용할 수 있도록 지원합니다. 하지만 Single Application 내에서만 사용 가능하므로, 회사 내 또는 조직 내 공유해 사용하기에는 부족합니다. 2. Npm pachaging -> 모듈은 재사용을 위해 npm 패키지가 가능합니다. 패키지는 npm install을 통해서 쉽게 사용이 가능합니다. 하지만 이는 조직 내 특화된 기능을..

글의 목적컴퓨터에서는 고유한 주소가 주어졌을 때, 곧바로 그 주소에 해당하는 메모리를 읽을 수 있다고 알려져 있습니다. 어떻게 그게 가능한 것인지, 어떻게 구현되는지 알아보고, 코드를 통해 간단히 구현해보고자 합니다. 결과물 미리보기다음과 같이 주소가 주어졌을 때, random access 없이 논리게이트 만으로 해당 주소의 값을 불러와야 합니다.0번부터 3번까지 각각 170, 85, 240, 15가 저장되어있다고 가정합니다주소 0: [false, false]값 (binary): [true, false, true, false, true, false, true, false]값 (decimal): 170주소 1: [false, true]값 (binary): [false, true, false, true, f..

글의 목적 스프링 서버에서의 INFO 레벨 로그를 kibana를 통해 시각화, 분석하는 과정을 설명하고자 합니다. ELK 로그는 LogStash를 통해 검색 엔진인 ElasticSearch로 전달되고, Kibana는 ElasticSearch에서 빠른 검색을 통해 데이터를 시각화 및 분석하게 됩니다. 스프링에서의 로그, Logstash 스프링 로그는 Java에서 가장 많이 사용되었던 로깅 라이브러리인 log4j의 후속 버전인 Logback을 통해 로그 전송 설정이 가능하다. src/main/resource에서 xml 파일인데, 다음과 같이 설정했다. %d{yyyy:MM:dd HH:mm:ss.SSS} %-5level --- [%thread] %logger{35} : %msg %n 15.164.211.18..

1. vo와 entity, dto 구분 기존 id (식별자) 없는 entity를 사용하였다. 이로인해 어떤 필드가 정의되어 있는지, 어디서 수정되었는지, 어디서 생성되었는지 알 수 없는 문제가 발생한다. 위 코드는 youtube 로부터 VideoVo 객체를 받아 video (entity)를 리턴하는 메서드이다. db에 저장하기 전까지 videoId 가 없으므로 videoId는 정의하지 않고 다른 필드를 채웠다. 리팩토링 식별자 (id) 가 없이 모든 속성값이 같으면 같은 객체인 VO (value object) 를 생성했다. Video, Playlist, Quiz, Summary, Course, CourseVideo 등의 vo가 생성되었으며, 이를 entity로 바꾸거나 entity에서 vo로 매핑하는 과..

글의 목적 '스룸' 프로젝트에서 Dto, Vo, Entity를 구분하여 사용함으로써 각 객체의 역할을 정의하고자 합니다. DTO란? Data Transfer Object, 계층간 데이터 전송을 위해 사용되는 객체입니다. 특징 1. Getter, Setter만 가지며, 오직 통신 용도로만 쓰여 로직을 포함하지 않습니다. 스룸에서의 쓰임 controller와 service의 데이터 전송, service와 repository(대부분 entity를 전달하지만 특정 형태의 데이터를 받아오는 경우)사이의 데이터 전송, 각 service간의 데이터 전송에서 쓰입니다. VO란? value object, 불변객체로써, 모든 속성값이 같으면 같은 객체입니다. 특징 1. equals(), hashCode()를 재정의하여 모..
이 글의 목적 - '스룸' 프로젝트의 리팩토링 과정을 설명하고자 합니다. - '스룸' 프로젝트의 공동 개발자들에게 재설계한 객체 협력 구조를 설명하고, 피드백 받고자 합니다. 설계 원칙 '코드로 이해하는 객체지향 설계, 오브젝트' 를 읽고 데이터 중심 설계가 아닌 객체 지향 설계를 하여 '스룸' 프로젝트 BE 소스코드를 리팩토링 하고자 합니다. 많이 부족하지만, 다음과 같은 기준을 두고 설계를 해보았습니다. 1. 책 오브젝트에서는 객체들에게 적절한 책임을 부과하고 객체간의 협력관계를 가지게 하는것은 어려우며, 데이터 중심 설계로 먼저 코딩한 뒤, 이를 바꾸는 방식도 괜찮다고 하였습니다. 이미 모든 서비스 로직이 마련되어 있으니, 최대한 객체의 데이터가 아닌 책임과 역할에 집중하고자 합니다. 2. 객체보다..
이 글의 목적 - '스룸' 프로젝트의 BE 구조 리팩토링의 필요성을 설명하고자합니다. 리팩토링을 하게 된 과정 '스룸' 프로젝트를 진행하는 '4m9d' 팀의 SW마에스트로 백엔드 담당 멘토님께 BE repo 코드 피드백을 받았습니다. 내용은 다음과 같습니다. - service에서 하는 일이 너무 많다. - 의존관계가 복잡하다. 이상하다. - private과 public 인 경우를 구별해라 - 자바 공부를 해라 이러한 피드백을 자바 스프링을 사용하여 개발을 하는 과정에서 '객체지향적인 코드를 작성하지 않았다'라는 의미로 받아들였고, 조영호 저자인 '코드로 이해하는 객체지향 설계, 오브젝트' 를 읽고 이를 프로젝트에 적용하여 리팩토링 하게 되었습니다. '오브젝트' 의 내용 간략하게 책 '오브젝트' 의 내용을..

SROOM 프로젝트에서는 다음 화면과 같이 youtube 에 있는 영상, 재생목록을 키워드로 검색하고, 상세정보를 불러와 학습 코스에 등록하는 기능이 존재합니다. 이때 정보를 불러오기 위해 Youtube Data API 를 사용하는데, 이곳에서 제공하는 api는 다음과 같습니다. 출처 : https://developers.google.com/youtube/v3/docs [search] -> 키워드 검색결과를 가져오는 api 입니다. GET https://www.googleapis.com/youtube/v3/search 이때, 쿼리 파라미터로 여러 값이 입력될 수 있습니다. (이외에도 여러 파라미터가 존재합니다) - q : 검색된 키워드 - part : 필요한 정보 (snippet, id, kind .....

SROOM 프로젝트에서는 다음 화면과 같이 youtube 에 있는 영상, 재생목록을 키워드로 검색하고, 상세정보를 불러와 학습 코스에 등록하는 기능이 존재합니다. 이때 정보를 불러오기 위해 Youtube Data API 를 사용하는데, 이곳에서 제공하는 api는 다음과 같습니다. 출처 : https://developers.google.com/youtube/v3/docs [search] -> 키워드 검색결과를 가져오는 api 입니다. GET https://www.googleapis.com/youtube/v3/search 이때, 쿼리 파라미터로 여러 값이 입력될 수 있습니다. (이외에도 여러 파라미터가 존재합니다) - q : 검색된 키워드 - part : 필요한 정보 (snippet, id, kind .....

SROOM 프로젝트에서는 애자일 방법론 중 스크럼 방식을 도입해 프로젝트를 진행합니다. Jira, Confluence를 사용해 스크럼을 효율적으로 진행하고자 합니다. 이번 글에서는 스프린트 플래닝을 다루고자 합니다. 스프린트 플래닝 스프린트 플래닝에서는 해당 스프린트에서 진행할 백로그를 선택 또는 생성하고, 스프린트 목표를 설정합니다. SROOM 프로젝트를 진행하는 4m9d 팀에서는 스프린트 주기를 2주로 설정하였습니다. 스프린트 플래닝은 Confluence에 작성합니다. 멘토가 제안하는 아이템의 경우 진행 아이템은 스크럼 마스터를 맡아주신 멘토님이 제안하는 아이템입니다. 장기 Task 아이템은 현재 스프린트를 포함해서 장기적으로 이루어져야 할 Task에 대한 아이템입니다. 예를들어 기획심의 준비를 위해..