Skip to content

Commit c212905

Browse files
authored
Merge pull request #18 from seoki180/main
[4주차/서키] 워크북 제출합니다.
2 parents 265f3b6 + 554c8e1 commit c212905

File tree

4 files changed

+287
-0
lines changed

4 files changed

+287
-0
lines changed

keyword/chapter04/README.md

Lines changed: 131 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,131 @@
1+
* ES
2+
ECMA scrpit의 약자로 JS의 표준사양이다. ecma(European Computer Manufacturers Association)에서 1997년부터 표준화되어 관리하기 시작했다. ECMAScript는 구문(Syntax), 타입(Type), 문(statement), 키워드(keyword), 예약어(reserved words), 연산자(operator), 객체(object) 등 언어의 핵심적인 문법과 기능을 정의한다.
3+
* ES6
4+
5+
* ES6의 주요 변화 및 특징
6+
ES6는 2015년 발표되어 let, const, arrow function, class, Promise, module을 도입하였다.
7+
ES5에서 패키지를 불러올때 module이 없었기에 commonJS방식으로 불러왔다.
8+
9+
```json
10+
var fs = require("fs") // commonJS
11+
12+
<->
13+
14+
import fs from "fs" // es6
15+
..
16+
{
17+
"type" : "module" //package.json에서 명시적으로 module을 사용한다고 해야함
18+
}
19+
```
20+
* ES6를 중요시 하는 이유
21+
module을 사용할때 commonJS와는 달리 es6방식은
22+
23+
1. 정적분석 : import는 compile-time에 분석되어서 사용하지 않는 코드를 런타임전에 제거해 번들 크기를 줄일수 있다.
24+
2. 비동기 로딩가능 : es6 module은 비동기적으로 로딩되도록 설계되어서 브라우저에서 효율적인 네트워크 처리가 가능하다. 특히 동적으로 import할 수 있어, 코드 분할에 유용하다.
25+
3. 자체적인 모듈 스코프 : es6 module은 파일마다 자체적으로 모듈스코프를 가져 전역 변수 오염방지에 유리하다.
26+
27+
모듈 측면 외에도 현대적인 문법(let, const 도입, arrow funciton ⇒ 사용, class 진관적 문법 제공), 비동기 처리 개선(async, await)등으로 안정적이고 구조적인 코드를 작성할 수 있게 되었다.
28+
* ES Module
29+
30+
```json
31+
//commonJS
32+
function hello(){ //greet.js
33+
return "hello"
34+
}
35+
36+
module.exports = hello
37+
----------------------------------------------------------------
38+
const hello = require("./greet") //index.js
39+
40+
console.log(hello())
41+
```
42+
commonJS에서는 module.exports - require을 사용한다. require할때는 파일의 확장자를 따로 명시하지 않아도 되는데 이는 require()로 모듈을 불러올 때 Node.js가 내부적으로 자동으로 확장자를 유추해서 찾는 로직을 가지고 있기 때문이다.
43+
44+
또한 commonJS는 패키지를 불러오는 시점이 런타임이고, 동기방식으로 불러온다.
45+
46+
```json
47+
//ES Module
48+
export default function hello(){ //greet.mjs
49+
return "hello"
50+
}
51+
----------------------------------------------------------------
52+
import hello from "./greet.mjs"; //index.js
53+
54+
console.log(hello())
55+
```
56+
ES module에서는 export(export default) - import를 사용한다. ESM을 쓰려면 package.json에 "type": "module"을 추가하거나 .mjs 확장자를 사용해야 한다. 또 ES module은 패키지를 불러오는 시점이 컴파일 타임이기 때문에 정적분석이 가능하고, 비동기 방식으로 불러온다.
57+
* 프로젝트 아키텍처
58+
59+
* 프로젝트 아키텍처가 중요한 이유
60+
**유지보수성 향상** : 코드가 체계적으로 구성되어 있어 수정 및 확장이 용이.
61+
**협업 효율성** : 역할 분리가 명확해 팀원 간 협업이 쉬움.
62+
**테스트 용이성** : 레이어가 나뉘어 있어 단위 테스트가 간단.
63+
**재사용성 증가** : 공통 로직이 재사용 가능한 구조로 분리됨.
64+
**스케일링 준비** : 구조적으로 성장 가능한 코드 베이스 구축 가능.
65+
* Service-Oriented Architecture(Service Layer Pattern)
66+
![image.png](attachment:1e301780-c835-4b97-b6b0-9a0ce08196c3:image.png)
67+
**정의** : 도메인 로직을 Controller, Repository 등과 분리해 Service 레이어에 모아 관리.
68+
Service Layer Pattern은 코드를 모듈화하고 재사용성을 높여서, 애플리케이션을 쉽게 확장하고 유지보수 하기 위해 사용한다.
69+
즉, 각 계층이 독립적으로 개발되고, 테스트될 수 있으며, 따라서 애플리케이션 전체의 유지보수성이 향상된다.
70+
각 계층은 분명 서로 상호작용이 일어나지만, 다른 계층에서 발생하는 일에 대해선 전혀 몰라도 된다(캡슐화)
71+
**장점** :
72+
비즈니스 로직과 웹 레이어 분리
73+
로직 재사용성 증가
74+
테스트 코드 작성 용이
75+
**구성 예시** :
76+
Service: 핵심 비즈니스 로직 처리
77+
Controller: 요청 처리 및 응답 반환
78+
Repository/DAO: 데이터 접근 처리
79+
* MVC 패턴
80+
![image.png](attachment:e1a42a59-6083-495e-a76b-7028fed1fb9a:image.png)
81+
![image.png](attachment:de742c89-d773-4f69-98e3-0f626292f9e8:image.png)
82+
**정의** : 사용자 인터페이스, 데이터 처리, 비즈니스 로직을 분리하는 전통적인 구조
83+
좀 더 쉽고 편리하게 사용할수 있게 만드는 디자인패턴중 하나이다.
84+
순서는 다음과 같다.
85+
User가 컨트롤러를 조작한다. → 컨트롤러는 모델에서 데이터를 가져온다 → 가전온 정보를 바탕으로 뷰를 제어해서 User에게 보여준다.
86+
model, view는 서로에 대해서 어떤 정보도 알지 말아야 한다.
87+
모든 데이터의 변경과 통제는 controller를 통해서 이뤄져야한다. 즉 애플리케이션의 메인로직을 controller가 담당한다.
88+
**구성** :
89+
**Model** : 데이터 구조 및 DB 연동
90+
**View** : 사용자에게 보여지는 UI
91+
**Controller** : 사용자 입력 처리 및 흐름 제어
92+
**장점** :
93+
역할 분리가 명확
94+
UI 변경이 로직에 영향 없음
95+
유지보수 쉬움
96+
프레임워크에서 mvc를 채용한 기술은 AngularJS, Python Django등이 있다.
97+
* 그 외 다른 프로젝트 구조
98+
**Hexagonal Architecture (Ports & Adapters)** :
99+
의존성을 내부 도메인 중심으로 설계
100+
외부 시스템(DB, API 등)은 Adapter로 분리
101+
![image.png](attachment:bada3d1f-7928-45a7-80b7-d6d8d91a12eb:image.png)
102+
**Clean Architecture** :
103+
내부(core)에 가까운 계층일수록 순수 비즈니스 로직만 포함
104+
외부 프레임워크에 의존하지 않도록 구성
105+
![image.png](attachment:50b267ab-4ef8-430b-ae69-d72c5ece0485:image.png)
106+
**Layered Architecture** :
107+
일반적인 3계층 구조 (Presentation → Business → Data Access)
108+
![image.png](attachment:b4ee2286-8a02-489d-8132-2b71858fd1bf:image.png)
109+
* 비즈니스 로직
110+
**정의** : 소프트웨어 시스템이 해결하려는 실제 문제(=도메인 문제)를 어떻게 처리할 것인가에 대한 규칙과 흐름. 즉, 이 시스템이 어떤 일을 하고, 그걸 어떤 방식으로 처리할지에 대한 핵심 로직
111+
**위치** : 보통 Service Layer 혹은 Domain Layer에 위치
112+
**예시** : 온라인쇼핑몰 서비스에서
113+
114+
* 결제 시 할인율 계산
115+
* 재고 수량 확인
116+
* 포인트 적립
117+
* 주문 상태 변경
118+
119+
**중요성** :
120+
제품의 가치를 결정하는 로직
121+
변경 가능성이 높아, 잘 분리해두는 것이 중요
122+
* DTO
123+
Data Transfer Object, 시스템 내부 혹은 시스템간 데이터를 주고받을때 필요한 데이터를 담아서 전달하는 객체
124+
DB entitiy를 외부에 노출하면 보안/유지보수의 문제가 생기니 객체로 담아 외부에서 볼 수 없게 한다. 또한 프론트엔드에 맞는 형식으로 데이터를 가공해 응답할 수 있도록 해준다.
125+
Entity와 DTO의 차이점
126+
127+
| **구분** | **목적** | **변경 가능성** | **예시** |
128+
| -------------- | ------------------------------- | --------------------- | ------------------- |
129+
| Entity | DB와 직접 매핑되는 클래스 | 있음 | User, Product |
130+
| DTO | 계층 간 or 외부와의 데이터 전달 | 있음 | UserDTO, ProductDTO |
131+
| | | | |

mission/chapter04/README.md

Lines changed: 156 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,156 @@
1+
https://github.com/seoki180/9th_node_practice.git
2+
3+
![1760203613055](image/README/1760203613055.png)
4+
5+
![1760203617624](image/README/1760203617624.png)
6+
7+
# 시니어 미션
8+
9+
10+
## ✅ 핵심 내용 1: ES6
11+
12+
### ▪ ES6란?
13+
14+
ES6는 JavaScript의 **2015년 ECMAScript 표준**을 의미하며, 공식적으로는 **ECMAScript 2015**라고도 불린다.
15+
이전 버전에 비해 많은 새로운 기능과 문법이 추가되어 JavaScript 개발에 큰 변화를 가져왔다.
16+
17+
대표적인 기능들은 다음과 같다:
18+
19+
* `let`, `const` 키워드
20+
* 화살표 함수 (Arrow Function)
21+
* 템플릿 리터럴 (Template Literals)
22+
* 디스트럭처링 할당 (Destructuring Assignment)
23+
* 모듈 시스템 (import/export)
24+
* 클래스 문법 (class)
25+
* 프라미스 (Promise)
26+
27+
### ▪ 소프트웨어 아키텍처란?
28+
29+
소프트웨어 아키텍처는 시스템의 전반적인 구조와 설계 방식이다. 쉽게 말해서, 건물로 치면 건축 설계도 처럼. 어떤 기술을 쓸지, 어떤 방식으로 모듈을 나눌지, 컴포넌트 간에 어떻게 데이터를 주고받을지를 정의한것을 말한다.
30+
31+
아키텍처가 중요한 이유는 다음과 같다.
32+
33+
* 유지보수성 향상: 코드가 체계적으로 구성되어 있어 수정 및 확장이 용이.
34+
* 협업 효율성: 역할 분리가 명확해 팀원 간 협업이 쉬움.
35+
* 테스트 용이성: 레이어가 나뉘어 있어 단위 테스트가 간단.
36+
* 재사용성 증가: 공통 로직이 재사용 가능한 구조로 분리됨.
37+
* 스케일링 준비: 구조적으로 성장 가능한 코드 베이스 구축 가능.
38+
39+
---
40+
41+
## 🚨 미션 1 해결 과정
42+
43+
> ECMAScript의 의미, 그리고 ES6 이후에는 각 버전에 따라 어떤 기능들이 새로 추가되었는지 찾고 정리해주세요.
44+
45+
### ▪ ECMAScript란?
46+
47+
ECMA scrpit의 약자로 JS의 표준사양이다. ecma(European Computer Manufacturers Association)에서 1997년부터 표준화되어 관리하기 시작했다. ECMAScript는 구문(Syntax), 타입(Type), 문(statement), 키워드(keyword), 예약어(reserved words), 연산자(operator), 객체(object) 등 언어의 핵심적인 문법과 기능을 정의한다
48+
49+
### ▪ ES6 이후 주요 기능 정리
50+
51+
#### ✅ ES7 (2016)
52+
53+
* **지수 연산자 (`** `)**
54+
* **Array.prototype.includes**
55+
56+
#### ✅ ES8 (2017)
57+
58+
* **async/await**
59+
* **Object.entries / Object.values**
60+
61+
#### ✅ ES9 (2018)
62+
63+
* **for-await-of**
64+
* **Promise.prototype.finally**
65+
66+
#### ✅ ES10 (2019)
67+
68+
* **Array.prototype.flat / flatMap**
69+
* **Object.fromEntries**
70+
71+
#### ✅ ES11 (2020)
72+
73+
* **BigInt**
74+
* **Optional Chaining (`?.`)**
75+
* **Nullish Coalescing (`??`)**
76+
77+
#### ✅ ES12 (2021)
78+
79+
* **String.prototype.replaceAll**
80+
* **Logical Assignment Operators (`&&=`, `||=`, `??=`)**
81+
82+
---
83+
84+
## 🚨 미션 2 해결 과정
85+
86+
> 워크북에서 소개한 프로젝트 아키텍처(Controller, Service, Data Access) 구조에 대해 더 정리하고, Data Access(DB) 레이어와의 결합도를 낮출 수 있는 구조를 고민해주세요.
87+
88+
### ▪ 기본 아키텍처 구성
89+
90+
* **Controller** : 클라이언트 요청을 받아 적절한 서비스 로직을 호출한다.
91+
* **Service** : 비즈니스 로직을 처리한다.
92+
* **Data Access (Repository)** : DB와의 직접적인 연결을 담당한다.
93+
94+
![](https://velog.velcdn.com/images/seoki180/post/49a06774-d588-4b6a-aedc-6dc6ca180f8c/image.png)
95+
96+
백엔드 아키텍처는 크게 3가지로 나눠진다.
97+
클라이언트가 서비스를 요청한다 -> Controller가 해당 요청에 적합한 서비스 로직을 호출한다 -> Service에서 받은 서비스를 해결하고 필요할시 DB에 접근하기 위해 Repository에 접근한다 -> Repository는 DAO를 통해 DB와 통신하여 데이터를 받아온다
98+
99+
이때 Repository를 쓰는 이유는 뭘까?
100+
101+
1. 비지니스로직과 데이터접근로직을 분리하기위해
102+
SQL이나 DB접근을 Service에서 처리하면 유지보수와 재사용이 어렵다. 이때 Repositoy Layer를 통해 '어디서 어떻게 데이터를 가져오는지'를 숨기고 비지니스로직은 '무엇을 달라'에만 집중할 수 있다.
103+
2. DDD(Domain Driven Design)에서 핵심 구성요소
104+
DDD에서는 Entity, Value Object, Aggregate, Repository 등이 핵심인데,
105+
Repository는 Aggregate Root 객체들을 저장소처럼 다루는 역할을 한다.
106+
즉 "유저" 도메인의 일부로 동작하게 된다.
107+
108+
이때 DB레이어와의 결합도를 낮출 수 있게 하려면
109+
110+
1. Interface 기반 설계
111+
비지니스 계층은 DB로직이 아니라 "계약"에 대해서만 알고있게 한다. 즉 구현체가 아닌 인터페이스에만 의존하게 만든다.
112+
2. 의존성 주입(DI)
113+
인터페이스로 추상화를 하고, 구현체는 외부에서 주입하여 둘을 분리시켜 구현한다.
114+
3. 도메인 모델과 엔티티 분리
115+
DB엔티티를 그대로 비지니스 로직에 쓰지 않고 DTO를 DB와 무관한 순수 구조체로 분리한다.
116+
4. 쿼리언어, ORM에 대한 의존 줄이기
117+
비지니스로직에 SQL, JPA, Mongo등 쿼리문법이 섞이면 안된다. Repository내에서만 ORM을 쓰고 외부에는 노출하지 않는다.
118+
119+
등의 방법이 있다.
120+
121+
---
122+
123+
### 🚨 미션 3 해결과정
124+
125+
> 클린 아키텍처(Clean Architecture)와 의존성(Dependency)의 방향에 대해서도 찾아본 후 정리해주세요.
126+
127+
클린 아키텍처(Clean Architecture)는 소프트웨어 시스템을 유지보수성, 확장성, 테스트 용이성을 높이기 위해 의존성의 방향을 내부(core)로 향하게 설계하는 원칙을 강조한다.
128+
129+
![](https://velog.velcdn.com/images/seoki180/post/2efc95a0-2bd1-4d8a-bde6-26fc06ccfb1c/image.png)
130+
131+
오늘날 아키텍처는 '관심의 분리(Seperation of Concerns)'와 '테스트 가능성(Testability)'를 요구한다. 클린 아키텍처는 이러한 요건을 만족하는 추상화의 개념으로 관심사를 분리하고 의존도를 낮추는것에 목적을 둔다.
132+
133+
의존도를 낮추기 위해 '종속성 규칙(Dependency Rule)' 을 지키도록 하는데 각 코드의 종속성은 외부에서 내부 즉 core의 방향으로만 가리킬수 있고, 고수준의 변경이 저수준의 변경에 영향을 끼치지 않도록 한다.
134+
135+
1. 엔티티
136+
도메인 계층이라고도 불리며, 높은 재사용성을 염두해두고 만든다. 여기서 비지니스 데이터를 포함하거나 비지니스 규칙을 캡슐화 한다.
137+
2. 유즈케이스
138+
애플리케이션 계층이라고도하며 비지니스 규칙을 포함한다. 인프라단의 DB, UI, 라이브러리같은 외부에 의해 영향을 받지 않도록 한다.
139+
3. 인터페이스 어뎁터
140+
DB나 WEB, UI같은 바깥계층에서 사용하기 편하도록 하위 계층을 변환하는 계층이다.
141+
4. 프레임워크
142+
인프라 계층이라고도 하며 DB,웹프레임워크같은 세부정보를 나타내는 계층이다.
143+
144+
#### 의존성의 방향과 관리
145+
146+
의존성이란 어떤 모듈(클래스, 계층)이 다른 모듈에 의존해서 동작한다는 것을 말한다.
147+
148+
의존성 관리의 핵심은
149+
150+
1. 의존성은 반드시 안쪽을 향해야한다.
151+
외부가 내부를 참조해야지, 내부가 외부에 의존하면 안된다는 것이다.
152+
2. 의존성 역전 (DIP)
153+
상위 모듈이 하위 모듈에 의존하지 말고 둘다 인터페이스에 의존해야한다.즉, 상위 계층이 하위 구현을 모르도록 해야한다.
154+
![](https://velog.velcdn.com/images/seoki180/post/005818d5-6851-41de-962d-9fa6ff75cc23/image.png)
155+
3. 의존성 주입(DI)
156+
객체가 필요로 하는 의존 객체를 직접 생성하지 않고, 외부에서 주입받아야 한다.즉, 상위 계층은 하위 계층의 구현을 몰라야 한다.
81.1 KB
Loading
86.1 KB
Loading

0 commit comments

Comments
 (0)