분류 전체보기 23

계층형 아키텍처

1. 아키텍처의 기본 관심사 - 소프트웨어 아키텍처의 가장 기본적인 관심사는 "소프트웨어의 구성요소를 관심사에 따라 분리하는 것"이다. - 관심사에 따라 구성요소를 분리함으로써 얻을 수 있는 가장 큰 이득은 "구성요소의 관심사 축소에 따른 코드 가독성/유지보수의 용이성 개선"이다. => 그도 그럴 것이, 소스코드가 모두 한 파일에 저장된 소프트웨어와 관심사에 따라 분리된 소프트웨어만 비교하더라도, 후자가 코드 가독성도 좋고, 유지 보수도 그에 따라 더 편리할 것이 당연하다. - 부가적으로(?), 수월한 테스트 환경 조성과 같은 이득이 수반될 수 있다. - 이 글에서는 가장 일반적으로 활용되고 있는 아키텍처로 간주되는 "계층형 아키텍처"를 다뤄보고자 한다. 2. 계층형 아키텍처 개요 - 계층형 아키텍처는 ..

도메인, 어플리케이션 서비스, 엔티티

1. 개요: 특정 키워드가 제목인 블로그 글의 배경 - Express에서 NestJS로 스택을 바꾼지 어느덧 몇 달이 흘렀다. - 자유도가 높은 Express와 달리, NestJS는 자체적으로 권장하는 아키택처에 입각하여 어플리케이션을 개발하도록 유도한다. - 이에 따라, NestJS에 익숙해지면서 자연스럽게 소프트웨어 아키텍처 지식에 대한 갈증이 생겼다. - 여러 블로그들을 통해, 일단 필자가 개발 공부를 통해 몇 번 접해본, 또 적용해본 계층형 아키텍처/클린 아키텍처 등에 대해 공부를 해보았다. - 하지만 역시나 "벽"에 부딪혔다. 블로그들에서 서술한 내용들 중 "도메인", "엔티티"와 같은 용어들에 대한 개념정립이 아직 모호했기 떄문이다. 부끄러운 일이다. - 그래서 최근에는 한 키워드를 공부하면서..

SOLID 원칙

0. 개요 - SOLID 원칙이란 객체 지향 프로그래밍(OOP) 설계 5원칙을 의미한다. - OOP는 프로그래밍을 객체 간 상호작용으로 간주한다. 그리고 그 객체는 1) 추상화, 2) 상속, 3) 다형성, 4) 캡슐화라는 특징을 기반으로 설계될 것을 권장한다. - 이를 통해, 개발자는 코드 재사용성, 유지보수의 용이성, 개발 생산성 제고라는 이익을 취할 수 있다. - SOLID 원칙은 그러한 OOP를 통한 이익을 극대화하기 위한 설계 원칙이라고 간주된다. - 그러한 SOLID 원칙은 다음과 같이 5개 원칙으로 구성되어 있다. SRP(단일 책임 원칙) OCP(개방 폐쇠 원칙) LSP(리스코프 치환 원칙) ISP(인터페이스 분리 원칙) DIP(의존 역전 원칙) - 각 원칙이 강조하는 개념은 명확히 구분되는 ..

객체와 OOP의 4가지 특징

1. 객체란? - 객체란 현실 세계에서 실재하는 모든 "대상"을 "변수"(상태/속성)와 "함수"(행동)로 추상화 시킨 개념이다. * 여기서 추상화는 대상의 본질적인 특징을 추출하여 표현한 것이라고 이해하고 있다. 2. OOP란? - OOP란 Object Oriented Programming의 약자이다. 말 그대로, 객체 지향 프로그래밍이다. - 즉, 하나의 소프트웨어가 동작하는 원리를 그것을 구성하는 여러 객체 간의 상호작용으로 정의하고, 이에 따라, 객체를 중심으로 소프트웨어를 설계/개발해야한다는 프로그래밍 패러다임인 것이다. 3. OOP의 4가지 특징 - 이러한 OOP는 크게 1) 추상화, 2) 상속, 3) 다형성, 4) 캡슐화라는 특징에 기반한 프로그래밍 패러다임이다. - 요컨대, 위 4가지 특징에..

카테고리 개요 | 좋은 소프트웨어 설계

1. 카테고리 개설 이유 - 개발 공부를 시작한 지 어느덧 1년째가 되어가고 있다. - 지난 1년 간은 개발에 익숙해지고 재미와 자신감을 붙이는 시간이었다고 생각한다. - 부트캠프를 수료하고, 두 차례 팀 프로젝트를 진행하면서, 내가 구현하고 싶은 기능은 어떻게 해서든 개발해낼 수 있게 되었다. - 그러면서 차차 좋은 설계에 대해 고민하게 되었다. 팀 프로젝트를 진행하면서 종종 프로그램을 리팩토링하게 되는 일이 있었는데, 프로그램의 구조에 대해 깊이 고민할 수 있는 지식이 없었기 때문에, 리팩토링을 할 때마다 생각보다 긴 시간을 할애하게 된 경험이 발단이 되었다. - 이에, 그동안 키워드만 인지하고 있고, 들여다볼 엄두를 감히 내지 못했던 "디자인 패턴/프로그래밍 패러다임"이란 주제에 대해 관심이 가게 ..

Carryduo | Jest를 이용한 Unit/E2E 테스트 (NestJS)

1. 개요 | 테스트 코드의 개념 - 테스트코드란 어플리케이션이 의도한대로 동작하는지 시험하기 위한 코드라고 생각한다. - 어플리케이션은 일반적으로 여러 모듈, 그리고 모듈을 구성하는 여러 함수들로 구성되어 있기 때문에, 테스트코드도 테스트 범위에 따라 다음과 같이 일반적으로 종류가 나뉜다. 1. Unit Test - 모듈을 구성하고 있는 단위 기능들에 대한 테스트 2. Integration Test - 어플리케이션을 구성하는 여러 모듈 간 상호작용에 대한 테스트 3. E2E Test - End to End Test로 사용자의 관점에서 어플리케이션이 의도대로(시나리오대로) 작동하는지에 대한 테스트 c.f) Intergration Test vs E2E Test - Integration Test와 E2E T..

Carryduo/Jest 2023.02.28

class 접근 제한자와 ()=> ({}) 용법

1. class 접근 제한자 - protected: 부모/자식 클래스 내부만 사용 가능. 인스턴스 불가 - private: 부모 클래스 내부에서만 사용 가능. 인스턴스 불가 - public: 부모/자식 클래스 사용 가능. 인스턴스 사용 가능 - static: 클래스 자체에 property와 method 저장, 외부에서 호출 가능. 인스턴스 사용 불가 2. () => ({}) - array function에 ()가 붙어 있어 당혹스러웠으나, 이 코드는 다음과 같다. - 즉, ()는 return을 의미한다. export default (): {dev:string, test:string} => ({ dev: 'dev', test: 'test' }) export defualt (): {dev:string, te..

TIL 2023.02.07

Redis X nestJS cache manager

1. redis 설치 관련 참고 블로그 - https://dejavuqa.tistory.com/153 Redis 설치 (on Ubuntu) Redis를 Ubuntu에 설치해 봅시다.ssh로 Ubuntu에 접속합니다. 그리고 먼저 apt-get을 업데이트 해줍니다. $ sudo apt-get update $ sudo apt-get upgrade apt-get으로 간단하게 redis-server를 설치해 줍니다. $ sudo apt-get inst dejavuqa.tistory.com - https://hayden-archive.tistory.com/429 [Redis] 우분투에 Redis 설치/접속/사용하기 참고 : dejavuqa.tistory.com/153 Redis 설치 (on Ubuntu) Redi..

TIL 2023.02.07

Carryduo | AWS CodeDeploy 배포본 수 줄이기

1. 개요 - carryduo 서비스를 지속적으로 운영하는 과정에서 "no space for device"에러가 발생했다. - 서버 용량을 확인해보니, CodeDeploy Agent에서 ubuntu에 저장하는 배포본의 용량이 가장 많았다. - 이에, 다음과 같은 과정을 통해 CodeDeploy Agent에서 ubuntu에 저장하는 배포본의 수를 줄여주었다. 2. 서버 용량 확인하기 - 서버 용량을 확인하는 linux 명령어는 다음과 같다. df -h // 파일 시스템별 용량/사용량/남은 용량/파일 시스템이 사용중인 경로 확인 for i in [경로]; do echo $i; find $i | wc -l; done // 특정 경로의 하위 경로에서 각각 차지하는 용량 확인 - 필자의 경우, df -h를 실행했..

Carryduo 2023.02.06

Carryduo | 비동기와 try, catch 에러 핸들링

1. 개요 - carryduo로 개발을 하던 중, try-catch로 에러 핸들링이 되지 않는 문제를 겪었다. - nodeJS에서 try-catch로 에러 핸들링을 하는 일반적인 사례는 다음과 같다. try{ throw new Error('a') } catch(err){ if (err.message === 'a'){ doSomething } else { return } } - 하지만 필자는 당혹스럽게도 다음과 같은 에러 문구를 만나게 되었다. uncaughtException: - 이에, 자연스럽게 throw new Error와 try catch에 대해 좀 더 알아보게 되었다. 2. Error() 객체 - error 객체는 name, message, stack으로 구성되어 있고, Error를 생성할 때는 ..

Carryduo 2023.01.27