ES(ECMA Script)
ES란, ECMA International이 ECMA-262 기술 수격에 따라 정의하고 있는 표준화된 스크립트 프로그래밍 언어이다.
JavaScript의 표준화를 위한 규격을 의미
ES6
ES는 지속적으로 업데이트되고 있는데, ES 뒤에 붙은 숫자가 버전이라고 생각하면 된다.
ES6은 6번째 버전이라고 생각하면 되는데
ES5 이하 버전에서 문제가 되었던 부분들이 해결되고, 많은 기능들이 추가되어서 가독성과 유지 보수 측면에서 큰 향상을 가져왔기 때문에
더 중요하게 다뤄지고 있다.
Node.js의 경우, ES6 이상의 최신 자바스크립트 문법으로 작성된 코드가 Node.js에서 실행되지 않는 경우가 종종 있다.
여러 방법이 존재하지만, 바벨(Babel)이라는 트랜스파일러를 이용하였다.
Babel
ES6 이상의 버전 등의 코드를 하위 버전의 자바스크립트 코드로 변호나시켜 제대로 동작할 수 있도록 하는 역할
저번 실습에서 바벨을 깔았는데도 깔기 전과 같은 오류(ES 모듈 관련)가 떴다.
'.babelrc' 또는 'babel.config.json' 파일을 수정하여
Babel이 ES 모듈을 올바르게 처리하도록 설정해야 했다.
'.babelrc' 파일을 생성 또는 수정하여
ES 모듈을 CommonJS 모듈로 변환하는 설정을 추가하면 된다.
나는 파일이 없길래 프로젝트 루트 디렉토리에 새로 생성하였다.
{
"presets": ["@babel/preset-env"],
"plugins": [
"@babel/plugin-transform-modules-commonjs"
]
}
위 코드를 추가하여 다시 yarn start를 실행하였더니 오류가 해결되었다.
프로젝트 구조
다양한 구조들이 고안되어 있다.
프로젝트마다 사용하기에 편하고, 적합하다고 판단되는 구조로 선택하면 된다.
3 Layer Architecture
- Controller Layer
- 클라이언트의 요청을 받아 서비스에 전달
- 서비스에서 작업을 마친 데이터를 받아 클라이언트에게 응답
- 단지 요청을 받아 응답 처리를 진행한다. (routing)
- Service Layer
- 비즈니스 로직 캡슐화 및 추상화
- Controller로 부터 전달된 요청에 로직을 적용하는 계층
- Data Access Layer (Repository Layer)
- 쿼리를 수행하며 DB와 상호작용
- Service 계층에서 데이터베이스 접근이 필요한 경우가 발생하는데 데이터에 대한 코드가 작성되는 계층
클라이언트에서 요청 -> Controller 요청 받고 Service에 전달 -> Service는 DB가 필요한 경우, DAO를 통해 DB와 상호작용하여 얻어낸 결과로 비즈니스 로직 처리 -> 처리 결과를 Controller에게 전달하고 응답을 클라이언트에게 전달
라우팅 관련 코드는 controller, 서비스 관련 코드는 service/provider, 데이터 관련 코드는 repository에서 관리한다.
DTO (Data Transfer Object)
데이터를 객체로 옮기는 역할
계층 간 데이터를 전송할 때도 이용되고 클라이언트로부터 전송 받은 데이터를 객체로 변환할 때도 사용된다.
DTO를 사용해야 하는 이유 ?
데이터를 받아오는 과정에서 하나가 빠질 수도 있고, 원하는 형태로 전달되지 않을 수도 있다.
그럴 때 유효성 검사 등을 진행하며 오류가 발생하지 않도록 할 수 있다.
전달되는 데이터가 달라질 경우, DTO의 내용만 수정하면 Service를 건들지 않아도 되니 이 또한 편리하다.
Service에서 req.body의 jsonObject를 바로 사용하는 것이 아니라,
Controller 단에서 req.body를 DTO 형태로 받아 Service에게 DTO로 값을 전달한다.
라고 생각하면 된다.
DTO를 어디서 만들어야 할까 ?
1. Service에서 생성
- Service -> Controller
- DTO로 데이터를 걸러 컨트롤러를 작업하기에 DB의 민감한 정보를 숨길 수 있다.
2. Controller에서 생성
- Controller -> Service
- 서비스 함수의 범용성이 늘어나서 유지 보수에 용이하다.
동일한 DB 테이블을 필요로 하는 여러 컨트롤러 등의 함수를 재활용할 수 있어 코딩이 더욱 편해진다.
디렉토리 구조 (폴더 구조)
디렉토리 구조에 정답은 없다. 편한 대로 만드는 것이 정답
1. 계층 별로 (기능 별)
2. 모델 별로 (도메인형)
키워드 정리
- ES
- ECMAScript(ES)는 JavaScript의 표준 사양으로, 자바스크립트의 공식 이름이다.
- ES는 ECMA 인터네셔널이 제정한 스크립트 언어 사양으로, 웹 개발을 포함한 다양한 애플리케이션에서 사용된다.
- ES 사양은 주기적으로 업데이트된다.
- ES6
- ES6의 주요 변화 및 특징
- 추가된 기능
- let, const : 블록 범위 변수를 선언할 수 있는 키워드
- Arrow Functions : 간결한 함수 표현식
- Template Literals : 문자열 내에서 변수를 포함할 수 있는 백틱(’’’) 문자열
- Destructuring Assignment : 배열 및 객체의 값을 쉽게 추출할 수 있는 문법
- Classes : 객체 지향 프로그래밍을 지원하는 클래스 문법
- Promises : 비동기 작업을 관리하기 위한 새로운 객체
- 추가된 기능
- ES6를 중요시 하는 이유
- 현대적인 자바스크립트 개발의 기본
- 많은 개선과 새로운 기능 도입
- 최신 기능을 활용하여 더 효율적이고 성능이 우수한 코드를 작성할 수 있음
- ES6의 주요 변화 및 특징
- Babel(바벨)
- 바벨 이란?예를 들어, 화살표 함수나 클래스와 같은 ES6 문법을 기존의 함수 표현식과 프로토타입 기반 코드로 변환한다.플러그인은 특정 JavaScript 기능을 변환하는 역할을 하며, 프리셋은 여러 플러그인을 모아놓은 구성바벨 설정은 프로젝트의 루트 디렉토리에 있는 ‘babel.config.json’ 또는 ‘.babelrc’ 파일에서 구성할 수 있고, 이 파일에서 사용할 프리셋과 플러그인을 지정한다.
- 바벨은 기본적으로 코드 변환을 수행하지만, 새로운 API나 내장 객체가 구현 환경에서 사용될 수 있도록 하는 polyfill도 제공한다.
- 바벨은 플러그인과 프리셋을 사용하여 변환 과정을 유연하게 구성할 수 있다.
- 바벨(Babel)은 최신 자바스크립트 기능을 지원하지 않는 구형 브라우저에서도 코드를 실행할 수 있도록 ES6/ES2-15 이상의 코드를 ES5 이하의 코드로 변환한다.
- 바벨을 사용하는 이유
- 바벨은 최신 JavaScript 기능을 사용하면서도 다양한 브라우저 환경을 지원할 수 있도록 도와준다.
- 개발자는 최신 표준의 장점을 활용하여 더 나은 성능과 가독성을 가진 코드를 작성할 수 있으며, 동시에 구형 브라우저 호환성 문제를 해결할 수 있다.
- 바벨은 특히 프론트엔드 개발에서 중요한 도구로 자리 잡고 있으며, 현대적인 프레임워크 및 라이브러리와 함께 널리 사용됨.
- 프로젝트 아키텍처
- 프로젝트 아키텍처가 중요한 이유
- 일관된 설계 및 개발
- 통일된 구조 : 프로젝트의 기본 구조를 정의하여 모든 팀원이 동일한 방식으로 시스템을 이해하고 접근할 수 있도록 함
- 재사용성 : 코드와 모듈의 재사용성 높임
- 확장성
- 모듈화 : 시스템을 독립적인 모듈로 분할하여 각각의 모듈이 독립적으로 개발되고 테스트될 수 있게 함 → 새로운 기능 추가나 확장이 용이함
- 유연성 : 시스템이 변경 요구사항에 유연하게 대응할 수 있도록 해줌
- 유지보수성
- 가독성 : 코드의 가독성을 높이고, 개발자들이 쉽게 이해하고 수정할 수 있게 해줌
- 문제 해결 : 아키텍처가 잘 정의되어 있으면 문제가 발생했을 때 원인을 빠르게 파악하고 해결할 수 있음
- 성능
- 최적화 : 시스템 성능을 최적화할 수 있도록 설계됨 → 리소스 사용 최소화, 시스템 응답 속도 향상
- 로드 밸런싱 : 대규모 트래픽을 처리할 수 있도록 로드 밸런싱을 구현하여 안정성 높임
- 프로젝트 관리
- 예측 가능성 : 프로젝트의 진행상황을 예측하고, 일정과 비용을 더 정확히 계획할 수 있음
- 위험 감소 : 초기 단계에서 아키텍처를 정의함으로써 잠재적인 기술 문제와 리스크를 사전에 식별하고 관리
- 일관된 설계 및 개발
- 3-Layer-Architecture
- 소프트웨어 애플리케이션을 세 개의 주요 계층으로 분리하여 개발하고 관리하는 설계 방식
- Controller Layer : 사용자 인터페이스와 관련된 모든 것 담당, 사용자 입력을 수집하고 이를 Service Layer에 전달, 서비스 계층으로부터 받은 데이터를 사용자에게 표시
- Service Layer : 애플리케이션의 핵심 기능과 로직 처리, 컨트롤러 계층과 데이터 접근 계층 간의 중재
- Data Access Layer : 데이터베이스와의 상호작용 처리, 데이터베이스 연결 / SQL 쿼리 실행 / 데이터베이스 트랜잭션 관리 등을 담당
- 각 계층이 명확하게 분리되어 있어, 독립적으로 개발되고 유지보수될 수 있다.
- MVC 패턴
- 소프트웨어 디자인 패턴 중 하나로, 애플리케이션을 세 가지 주요 구성 요소인 모델(Model), 뷰(View), 컨트롤러(Controller)로 분리하여 구조화한다..
- 애플리케이션의 데이터, 사용자 인터페이스, 이 둘간의 상호작용을 분리하여 유지보수와 확장성을 높인다.
- 모델 : 애플리케이션의 데이터 및 비즈니스 로직 담당, 데이터베이스와의 상호작용
- 뷰 : 사용자 인터페이스 담당, 데이터가 변경될 때마다 이를 반영하여 화면 업데이트
- 컨트롤러 : 모델과 뷰를 중재하는 역할
- 유지보수성, 재사용성, 유연성, 테스트 용이성 등과 같은 장점 존재
- 그 외의 프로젝트 구조
- 모놀리식 아키텍처 ( Monolithic Architecture )
- 모든 기능이 하나의 코드베이스 안에 포함된 구조
- 모든 컴포넌트가 단일 배포 단위로 함께 배포된다.
- 단순한 배포와 성능 최적화가 쉽다는 장점 존재
- 규모가 커질 수록 유지보수가 어렵고, 특정 기능에 대한 변경이 전체 애플리케이션에 영향을 미친다는 단점 존재
- 마이크로서비스 아키텍처 ( Microservices Arichitecture )
- 애플리케이션을 여러 개의 독립적인 서비스로 분리하여 개발하고 배포하는 구조
- 각 서비스는 독립적으로 배포되고, 서로 다른 기술 스택을 사용할 수 있음
- 특정 서비스에 대한 변경이 다른 서비스에 영향을 미치지 않고, 다양한 기술 스택을 쓸 수 있다는 장점 존재
- 배포와 관리가 복잡하고, 서비스 간 통신의 오버헤드 및 데이터 일관성 유지가 어렵다는 단점 존재
- 분산 아키텍처 ( Distributed Architecture )
- 애플리케이션의 컴포넌트가 네트워크를 통해 분산되어 동작하는 구조
- 클라우드 기반 애플리케이션이나 대규모 시스템에서 자주 사용
- 높은 확장성과 고가용성의 장점 존재
- 통신 관리가 복잡하고 데이터 일관성 문제가 존재한다는 단점 존재
- 모놀리식 아키텍처 ( Monolithic Architecture )
- 프로젝트 아키텍처가 중요한 이유
- 비즈니스 로직
- 소프트웨어 애플리케이션에서 특정 도메인이나 문제 영역과 관련된 규칙, 절차, 정책 등을 구현한 코드
- 애플리케이션의 핵심 기능을 담당하며, 사용자 요구사항을 충족시키기 위해 데이터를 처리하고 조작하는 방법을 정의한다.
- 역할
- 데이터 처리 및 변환 : 데이터의 유효성을 검증하고 필요한 경우 데이터를 변환하거나 계산
- 비즈니스 규칙 적용 : 특정 도메인과 관련된 규칙을 코드로 구현하여 일관되게 적용한다.
- 데이터베이스 연산 중재
- 비즈니스 프로세스 관리
- 소프트웨어의 핵심 부분으로, 애플리케이션의 기능적 요구사항을 충족시키기 위해 반드시 명확하고 일관되게 구현되어야 한다.
- 시스템의 유지보수성과 확장성을 높이고, 사용자 요구사항을 효과적으로 반영할 수 있다.
- DTO
- Data Transfer Object는 소프트웨어 설계 패턴 중 하나로, 애플리케이션의 서로 다른 계층 간 데이터를 전송하기 위해 사용되는 객체이다.
- 주로 데이터의 전송에만 사용되며, 비즈리스 로직이나 데이터 접근 로직이 포함되지 않는 단순한 객체이다.
- 계층 간의 의존성을 줄이고, 데이터 전송을 간편하게 한다.
- DTO는 직렬화되어 네트워크를 통해 전송되거나, 파일에 저장될 수 있다.
- 필요한 데이터만 포함하도록 DTO를 설계함으로써, 민감한 데이터가 불필요하게 전송되는 것을 방지할 수 있다.
- 코드의 복잡성이 증가하고 변환 작업이 필요하다는 단점 존재
'Node.js' 카테고리의 다른 글
Node.js 프로젝트 세팅 (0) | 2024.05.15 |
---|---|
API URL의 설계 & 프로젝트 세팅 (0) | 2024.05.15 |
실전 SQL - 어떤 Query를 작성해야 할까? (1) | 2024.05.08 |
Web Server & Web Application Server(WAS), Reverse Proxy (0) | 2024.05.01 |
DATABASE 설계 & AWS RDS 설정 (0) | 2024.05.01 |