노트 삭제
This commit is contained in:
@@ -1,25 +0,0 @@
|
||||
---
|
||||
id: "DRY (Don't Repeat Yourself) 20260330"
|
||||
created: "2026-03-30 15:05"
|
||||
tags:
|
||||
aliases:
|
||||
---
|
||||
## 💡 생각
|
||||
코드의 반복을 줄여서 유지보수를 용이하게 하자.
|
||||
단, 코드의 반복을 무조건적으로 줄이는 것은 좋지 않은 결과를 낳을 수 있다.
|
||||
[[DRY (Don't Repeat Yourself)]] << [[KISS (Keep It Simple, Stupid)]]
|
||||
DRY한 코드보다 KISS한 코드를 만드는 게 더 중요하다.
|
||||
|
||||
---
|
||||
## 📑 개념
|
||||
**똑같은 일을 반복하지 마라**라는 뜻입니다.
|
||||
동일한 코드의 중복을 피하라는 의미.
|
||||
|
||||
## 📌 상세
|
||||
1. 코드의 정보나 로직은 시스템 내에서 **단 한 곳**에만 존재해야 합니다.
|
||||
2. 똑같은 로직이 여기저기 복사되어 있으면, 나중에 수정할 때 모든 곳을 다 찾아내서 고쳐야 합니다. 하나라도 놓치면 바로 버그로 이어집니다.
|
||||
3. 중복되는 코드가 보이면 함수나 클래스로 추출하여 공통화하세요.
|
||||
4. 3번 이상 반복되는 코드에 적용하는 것이 좋음.
|
||||
( 2번 이하로 반복되는 코드를 DRY하게 하다 보면 오히려 코드의 복잡성이 증가해서 [[KISS (Keep It Simple, Stupid)]] 원칙을 깨는 경우가 발생될 수 있음.)
|
||||
|
||||
---
|
||||
@@ -1,7 +0,0 @@
|
||||
|
||||
| **비교 항목** | **EC2 기반 컨테이너 (ECS/EKS)** | **Fargate 기반 컨테이너 (ECS/EKS)** |
|
||||
| ----------------- | -------------------------- | ----------------------------- |
|
||||
| **인프라 관리** | 사용자가 EC2 인스턴스 관리 (OS 패치 등) | **AWS가 인프라 완전 관리** |
|
||||
| **확장성 (Scaling)** | EC2 인벤토리와 컨테이너 개수 동시 고려 | **컨테이너(Task/Pod) 개수만 조절** |
|
||||
| **격리 수준** | 인스턴스 내 커널 공유 가능성 있음 | **Task/Pod 단위의 강력한 커널 격리** |
|
||||
| **과금 방식** | 인스턴스 크기 및 가동 시간 기준 | **할당된 CPU 및 메모리 리소스 사용량 기준** |
|
||||
@@ -1,27 +0,0 @@
|
||||
- 작성 **날짜:** 2026-02-27
|
||||
|
||||
## 📑 개념
|
||||
> [!abstract]
|
||||
> 클라우드에서 제공하는 **가상 서버**, EC2는 AWS 클라우드에서 확장 가능한 컴퓨팅 용량을 제공합니다. 하드웨어를 직접 구매할 필요 없이 가상 서버를 구축하고, 보안 및 네트워킹을 구성하며 저장소를 관리할 수 있습니다.
|
||||
- **Elastic (탄력적인):** 수요에 따라 서버 대수를 자유롭게 늘리거나 줄일 수 있습니다.
|
||||
- **Compute (컴퓨팅):** CPU, 메모리 등 계산 능력을 제공합니다.
|
||||
- **Cloud (클라우드):** 인터넷을 통해 어디서든 접근 가능한 가상 환경입니다.
|
||||
## 📌 상세
|
||||
> [!check]
|
||||
> |**요소**|**명칭**|**설명**|
|
||||
> |---|---|---|
|
||||
> |**운영체제**|**AMI** (Amazon Machine Image)|Windows, Linux 등 서버에 설치될 OS와 기본 설정이 담긴 이미지입니다.|
|
||||
> |**하드웨어 사양**|**인스턴스 유형**|CPU, RAM, 네트워크 성능에 따른 규격입니다. (예: t3.medium, c5.large)|
|
||||
> |**저장 장치**|**EBS** (Elastic Block Store)|서버의 하드디스크 역할을 하는 가상 디스크입니다.|
|
||||
> |**보안/네트워크**|**보안 그룹** (Security Group)|가상 방화벽으로, 어떤 포트(80, 443, 22 등)를 열어줄지 설정합니다.|
|
||||
> |**접속 인증**|**키 페어** (Key Pair)|서버 접속 시 사용하는 비밀번호 대신의 암호화 키 파일입니다.|
|
||||
|
||||
## 📝 노트
|
||||
> [!note]
|
||||
>
|
||||
> - AWS(혹은 클라우드 서비스 제공자)로부터 가상의 서버를 임대해서 사용하는 것
|
||||
> - 원하는 사양으로 요청하면 대여해서 사용할 수 있음
|
||||
>
|
||||
|
||||
## 🔗 지식 연결
|
||||
- **태그:** #zettelkasten #knowledge
|
||||
@@ -1,8 +0,0 @@
|
||||
| **구분** | **주요 한계점 및 단점** | **세부 설명** |
|
||||
| ----------------------- | ------------------------------- | -------------------------------------------------------------------------- |
|
||||
| **운영 관리 부담 (Overhead)** | **OS 및 소프트웨어 관리** | OS 패치, 보안 업데이트, 런타임 설치 및 관리를 사용자가 직접 수행해야 함 (Shared Responsibility Model). |
|
||||
| **확장성 (Scalability)** | **느린 오토스케일링 속도** | 새로운 인스턴스를 띄우고 OS 부팅, 애플리케이션 실행까지 수 분의 시간이 소요되어 급격한 트래픽 변화에 대응이 늦음. |
|
||||
| **자원 효율성** | **낮은 집적도 및 낭비** | 특정 프로세스가 CPU/RAM을 적게 쓰더라도 인스턴스 전체 비용이 발생함. 컨테이너 대비 자원 격리 및 배분 효율이 낮음. |
|
||||
| **배포 및 일관성** | **"It works on my machine" 문제** | 개발 환경과 운영 서버 OS 설정이 다를 경우 장애 발생 가능성이 높음 (컨테이너 대비 환경 일관성 부족). |
|
||||
| **고가용성 (HA)** | **복잡한 복구 프로세스** | 인스턴스 장애 시 단순히 프로세스를 재시작하는 것보다 교체 및 복구 과정이 더 무겁고 복잡함. |
|
||||
| **비용 (Cost)** | **유휴 자원 비용 발생** | 트래픽이 없는 시간대에도 최소 유지 인스턴스 비용이 계속 발생하며, 세밀한 과금 단위 설정이 어려움. |
|
||||
@@ -1,52 +0,0 @@
|
||||
---
|
||||
id: "ECR 20260305"
|
||||
created: "2026-03-05 09:49"
|
||||
tags:
|
||||
---
|
||||
## 💡 생각
|
||||
도커 이미지 허브 (유료)
|
||||
|
||||
|
||||
---
|
||||
## 📑 개념
|
||||
> [!abstract]
|
||||
> AWS에서 제공하는 **완전관리형 컨테이너 이미지 레지스트리 서비스**
|
||||
|
||||
## 📌 상세
|
||||
> [!check]
|
||||
> 1. 개발자들이 만든 도커(Docker) 이미지를 안전하게 보관하고 필요할 때 꺼내 쓸 수 있는 **'클라우드 보관함'**이라고 생각하시면 됩니다.
|
||||
> 2. 가장 유명한 'Docker Hub'의 AWS 버전이라고 이해하면 쉽습니다.
|
||||
|
||||
### 1. 주요 특징 및 기능
|
||||
|
||||
- **완전관리형 서비스:** 서버를 직접 관리하거나 스토리지 용량을 걱정할 필요가 없습니다. AWS가 인프라 운영과 확장을 알아서 처리합니다.
|
||||
|
||||
- **보안 및 통합:** AWS [[IAM(Identity and Access Management)]]과 통합되어, 특정 사용자나 EC2 인스턴스만 이미지에 접근할 수 있도록 세밀하게 권한을 제어할 수 있습니다.
|
||||
|
||||
- **이미지 스캔:** 업로드한 이미지에 보안 취약점이 있는지 자동으로 스캔하여 알려주는 기능을 제공합니다.
|
||||
|
||||
- **수명 주기 정책(Lifecycle Policy):** 오래된 이미지나 태그가 없는 이미지를 자동으로 삭제하도록 설정하여 저장 비용을 절감할 수 있습니다.
|
||||
|
||||
- **고가용성:** 이미지가 S3에 저장되므로 데이터 내구성이 매우 높으며, 여러 가용 영역(AZ)에 걸쳐 안정적으로 배포됩니다.
|
||||
|
||||
|
||||
### 2. 작동 방식 (워크플로우)
|
||||
|
||||
1. **빌드(Build):** 로컬 PC나 CI/CD 환경에서 Docker 이미지를 생성합니다.
|
||||
|
||||
2. **인증(Authenticate):** AWS CLI를 통해 ECR에 로그인합니다.
|
||||
|
||||
3. **푸시(Push):** 생성된 이미지를 ECR 리포지토리(Repository)에 업로드합니다.
|
||||
|
||||
4. **풀(Pull):** Amazon ECS, EKS, 또는 Lambda 같은 서비스에서 실행 시점에 해당 이미지를 내려받아 컨테이너를 구동합니다.
|
||||
|
||||
---
|
||||
|
||||
|
||||
#### ECR의 장점
|
||||
|
||||
|**구분**|**설명**|
|
||||
|---|---|
|
||||
|**속도**|AWS 내부 네트워크를 사용하므로 ECS나 EKS로 이미지를 배포할 때 속도가 매우 빠릅니다.|
|
||||
|**비용**|사용한 스토리지 용량과 데이터 전송량에 대해서만 비용을 지불하며, AWS 내부 서비스 간의 데이터 전송은 무료인 경우가 많습니다.|
|
||||
|**신뢰성**|퍼블릭 레지스트리(Docker Hub 등)의 장애나 속도 저하로부터 독립된 안정적인 환경을 구축할 수 있습니다.|
|
||||
@@ -1,9 +0,0 @@
|
||||
| **구분** | **Amazon ECS (Elastic Container Service)** | **Amazon EKS (Elastic Kubernetes Service)** |
|
||||
| ----------- | ------------------------------------------ | ------------------------------------------- |
|
||||
| **개념** | AWS 전용 컨테이너 관리 서비스 | AWS에서 제공하는 **관리형 쿠버네티스** |
|
||||
| **복잡도** | **낮음** (설정과 관리가 매우 간결함) | **높음** (쿠버네티스 숙련도 필수) |
|
||||
| **유연성/제어권** | AWS 환경에 최적화, 제어권은 제한적 | 매우 높음 (오픈 소스 기반의 무한한 커스텀) |
|
||||
| **이식성** | AWS 전용 기술로 타 클라우드 이동이 어려움 | **매우 높음** (어디서든 동일한 K8s 환경 구동) |
|
||||
| **관리 단위** | **Task** (태스크) | **Pod** (포드) |
|
||||
| **학습 곡선** | 완만함 (비교적 빨리 배울 수 있음) | 매우 가파름 (개념과 리소스 종류가 방대함) |
|
||||
| **적합한 상황** | AWS 서비스 위주의 빠르고 간결한 운영 | 복잡한 마이크로서비스, 표준 기술 스택 지향 |
|
||||
@@ -1,78 +0,0 @@
|
||||
---
|
||||
id: FHS(Filesystem Hierarchy Standard) 20260403
|
||||
created: 2026-04-03 11:04
|
||||
tags:
|
||||
aliases:
|
||||
---
|
||||
## 💡 생각
|
||||
파일구조에 자유도를 억제해서 어느정도 규격화를 해놓은 것,
|
||||
너무 자유로우면 무슨 파일이 어디에 있는지 확인하기가 매우 어려울텐데
|
||||
어떤 종류의 파일은 어디에 있어야 하고 이런 규칙을 정의해서
|
||||
어떤 리눅스를 사용하든 어느정도의 규칙이 존재하기 때문에 원하는 파일을 어느정도 쉽게 찾아갈 수 있게끔 함
|
||||
|
||||
---
|
||||
## 📑 개념
|
||||
뿌리가 되는 **루트(`/`)** 아래에 모든 것이 가지처럼 뻗어 나가는 **역트리 구조**
|
||||
리눅스나 유닉스 계열 운영체제를 사용하다 보면 폴더 구조가 왜 이렇게 복잡한지 궁금할 때가 있죠.
|
||||
**FHS(Filesystem Hierarchy Standard)**는 바로 이런 혼란을 방지하기 위해 파일과 디렉터리의 위치를 정의한 표준 규격입니다.
|
||||
|
||||
덕분에 사용자나 소프트웨어 개발자는 어떤 리눅스 배포판을 사용하더라도 특정 파일이 어디에 있을지 예측할 수 있습니다.
|
||||
|
||||
## 📌 상세
|
||||
|
||||
- **/ (root)**: 모든 파일과 디렉터리의 시작점
|
||||
: 모든 디렉토리의 시작점입니다. 윈도우의 `C:\`와 비슷하지만, 리눅스에서는 모든 장치(하드디스크, USB 등)가 이 아래의 특정 폴더에 연결(마운트)됩니다.
|
||||
|
||||
--- 📂 주요 디렉토리
|
||||
- **/bin**: 필수적인 사용자 명령 파일 (Binaries)
|
||||
: 모든 사용자가 쓸 수 있는 기본 명령어들이 들어 있습니다.
|
||||
|
||||
- **/sbin**: 시스템 관리용 실행 파일 (System Binaries)
|
||||
: 시스템 관리자(Root)가 사용하는 명령어들이 모여 있습니다.
|
||||
|
||||
- **/etc**: 시스템 설정 파일 (Editable Text Configurations)
|
||||
: **가장 중요한 폴더 중 하나입니다.** 시스템의 모든 **설정 파일**이 들어 있습니다.
|
||||
: 사용자 정보(`/etc/passwd`), 네트워크 설정, 설치된 프로그램의 환경 설정 등이 모두 여기에 텍스트 파일로 저장됩니다.
|
||||
|
||||
- **/home**: 일반 사용자들의 홈 디렉터리
|
||||
: 일반 사용자들의 개인 공간, 예를 들어 계정명이 `dihwang`이라면 `/home/dihwang` 폴더가 생기고, 그 안에 바탕화면, 다운로드, 개인 설정 등이 저장됩니다.
|
||||
: 관리자(root)를 제외한 모든 사용자는 자신의 홈 디렉토리 밖에서는 파일을 맘대로 만들거나 지울 수 없습니다.
|
||||
|
||||
- **/root**: 시스템 관리자(root)의 홈 디렉터리
|
||||
: 시스템 최고 관리자인 **root 사용자의 홈 디렉토리**입니다. 일반 사용자 홈 디렉토리(`/home`)와는 별도로 관리됩니다.
|
||||
|
||||
---
|
||||
|
||||
--- ⚙️ 시스템 운영을 위한 폴더들
|
||||
- **/usr**: 사용자 관련 모든 프로그램과 데이터 (User System Resources)
|
||||
: 사용자가 설치한 프로그램과 데이터들이 모이는 곳입니다. 윈도우의 `C:\Program Files`와 가장 비슷합니다.
|
||||
: `/usr/bin`: 나중에 설치한 응용 프로그램들의 실행 파일.
|
||||
: `/usr/lib`: 프로그램 실행에 필요한 공유 라이브러리들.
|
||||
|
||||
- **/var**: 가변적인 데이터 저장소 (Variable)
|
||||
: **내용이 수시로 변하는 데이터**가 저장됩니다.
|
||||
: `/var/log`: 시스템 로그가 쌓이는 곳입니다. 서버가 왜 죽었는지 확인할 때 필수입니다.
|
||||
: `/var/www`: 웹 서버(Apache, Nginx)의 소스 파일들이 기본적으로 위치하는 곳입니다.
|
||||
|
||||
- **/tmp**: 임시 파일 저장소 (Temporary)
|
||||
: **임시 파일** 저장소입니다. 부팅 시나 일정 시간이 지나면 자동으로 삭제되는 파일들이 머뭅니다. 누구나 파일을 쓰고 지울 수 있습니다.
|
||||
|
||||
- **/dev**: 장치 파일 (Devices)
|
||||
: 리눅스는 **모든 것을 파일로 관리한다**는 철학이 있습니다. 마우스, 키보드, 하드디스크 같은 물리적인 장치들도 이 폴더 안에 파일 형태로 존재합니다.
|
||||
|
||||
- **/mnt**: 수동으로 마운트하는 임시 지점 (Mount)
|
||||
: 관리자가 수동으로 하드디스크 등을 연결할 때 쓰는 임시 장소.
|
||||
- **/media**: 외부 장치 자동 마운트 지점 (USB, CD-ROM 등)
|
||||
: USB나 CD-ROM을 꽂으면 자동으로 연결되는 곳.
|
||||
|
||||
- **/opt**: 추가 패키지 소프트웨어 설치 (Optional)
|
||||
|
||||
- **/boot**: 부팅 관련 핵심 파일
|
||||
|
||||
- **/srv**: 시스템이 제공하는 서비스 데이터 (Service)
|
||||
: 요즘은 `/var/www` 등을 더 많이 씁니다.
|
||||
|
||||
- **/tmp**: 임시 파일 저장소 (Temporary)
|
||||
|
||||
- **/lib**: 공유 라이브러리 및 커널 모듈 (Libraries)
|
||||
---
|
||||
@@ -1,38 +0,0 @@
|
||||
---
|
||||
id: "GNU 20260407"
|
||||
created: "2026-04-07 14:17"
|
||||
tags:
|
||||
aliases:
|
||||
---
|
||||
## 💡 생각
|
||||
이곳에 하나의 생각 또는 아이디어를 작성합니다.
|
||||
|
||||
---
|
||||
## 📑 개념
|
||||
**GNU(그누)** 는 리처드 스톨먼이 1983년에 시작한 **자유 소프트웨어 프로젝트**이자, 그 결과로 만들어진 **운영체제**의 이름입니다.
|
||||
GNU라는 이름은 **GNU is Not Unix**(GNU는 유닉스가 아니다)의 약자로, 자기 자신을 이름 안에 포함해 정의하는 재귀적 약어입니다.
|
||||
|
||||
## 1. GNU 프로젝트의 목적
|
||||
|
||||
당시에는 소프트웨어 소스 코드를 기업이 독점하고 유료로 판매하는 것이 당연시되었습니다. 리처드 스톨먼은 이에 반대하며 **누구나 소프트웨어를 실행하고, 복제하고, 수정하고, 배포할 수 있는 자유**를 누려야 한다고 주장했습니다. 이를 실현하기 위해 완전히 자유로운 운영체제를 밑바닥부터 만드는 것이 프로젝트의 목표였습니다.
|
||||
|
||||
## 2. 주요 구성 요소
|
||||
|
||||
운영체제는 단순히 커널(알맹이)만 있다고 작동하지 않습니다. GNU 프로젝트는 운영체제에 필요한 거의 모든 도구를 직접 만들었습니다.
|
||||
|
||||
- **GCC (GNU Compiler Collection):** 프로그램을 만드는 컴파일러
|
||||
|
||||
- **Glibc:** 시스템 자원을 사용하기 위한 기본 라이브러리
|
||||
|
||||
- **Bash:** 사용자의 명령을 입력받는 셸
|
||||
|
||||
- **Emacs:** 강력한 기능을 가진 텍스트 에디터
|
||||
|
||||
|
||||
이러한 도구들은 현재 리눅스 환경에서도 표준처럼 사용되고 있습니다.
|
||||
|
||||
## 3. GNU와 리눅스의 관계 (중요!)
|
||||
|
||||
GNU 프로젝트는 운영체제의 거의 모든 구성 요소를 완성했지만, 정작 시스템의 두뇌 역할을 하는 **커널(Hurd)** 개발이 늦어지고 있었습니다.
|
||||
|
||||
이때 1991년, 리누스 토르발스가 **리눅스 커널**을 공개했습니다. GNU 프로젝트가 만든 수많은 소프트웨어와 리눅스 커널이 결합하면서 비로소 완벽하게 작동하는 자유 운영체제가 탄생했습니다. 우리가 흔히 부르는 리눅스는 정확히 말하면 **GNU/리눅스**인 셈입니다.
|
||||
@@ -1,60 +0,0 @@
|
||||
---
|
||||
id: "IAM(Identity and Access Management) 20260316"
|
||||
created: "2026-03-16 13:35"
|
||||
tags:
|
||||
---
|
||||
## 💡 생각
|
||||
사용자(User)가 가지는 권한이 무엇인지를 나열하고 필요한 사용자 혹은 그룹에 필요한 권한들을 원하는대로 부여할 수 있도록 구성해놓은 웹 서비스
|
||||
|
||||
AWS의 고유개념이 아니고 정보 보안 분야에서는 오랫동안 존재해온 표준적인 개념이자 기술 프레임워크.
|
||||
|
||||
---
|
||||
## 📑 개념
|
||||
"누가(인증)", "어떤 리소스에(권한)" 접근할 수 있는지를 중앙에서 관리를 해서 리소스에 대한 접근을 안전하게 제어할 수 있게 해주는 웹 서비스입니다.
|
||||
|
||||
## 📌 IAM의 핵심 구성 요소
|
||||
- **사용자 (User):** 실제 사람이나 서비스(애플리케이션)를 나타냅니다. 고유한 보안 자격 증명(ID/PW 또는 Access Key)을 가집니다.
|
||||
|
||||
- **그룹 (Group):** 사용자들의 집합입니다. 그룹에 권한을 부여하면 그 그룹에 속한 모든 사용자가 동일한 권한을 상속받습니다. (예: `Developers` 그룹, `Admins` 그룹)
|
||||
|
||||
- **역할 (Role):** 특정 사용자에게 귀속되지 않고, **필요할 때만 잠시 빌려 쓰는 권한**입니다. 주로 EC2 서버나 Lambda 함수 같은 AWS 서비스가 다른 서비스에 접근할 때 사용합니다.
|
||||
|
||||
- **정책 (Policy):** "무엇을 할 수 있는지"를 정의한 **JSON 문서**입니다. 사용자, 그룹, 역할에 이 정책을 연결(Attach)하여 권한을 부여합니다.
|
||||
|
||||
|
||||
### 주요 기능과 특징
|
||||
|
||||
| **기능** | **설명** |
|
||||
| ------------------------- | ------------------------------------------------------------------ |
|
||||
| **세분화된 권한 제어** | 특정 S3 버킷의 파일만 읽게 하거나, 특정 시간대에만 접속을 허용하는 등 매우 정밀한 설정이 가능합니다. |
|
||||
| **다요소 인증 (MFA)** | 아이디/비번 외에 OTP(Google Authenticator 등)를 추가하여 보안을 한층 강화할 수 있습니다. |
|
||||
| **자격 증명 연동 (Federation)** | 기업의 기존 계정(Active Directory 등)이나 구글/페이스북 계정으로 AWS에 로그인할 수 있게 지원합니다. |
|
||||
| **비용 무료** | IAM 서비스 자체 사용에 따른 추가 비용은 없습니다. |
|
||||
|
||||
## 📝 노트
|
||||
> [!note]
|
||||
>
|
||||
> ## IAM 설계의 황금률: "최소 권한의 원칙"
|
||||
>
|
||||
> 보안 사고를 막기 위해 IAM을 운영할 때 가장 중요한 원칙은 **최소 권한의 원칙 (Least Privilege)**입니다.
|
||||
>
|
||||
> - 사용자에게 업무에 **꼭 필요한 권한만** 부여합니다.
|
||||
>
|
||||
> - 루트(Root) 계정은 가급적 사용하지 않고, 일상 업무용 IAM 사용자를 따로 만들어 사용합니다.
|
||||
>
|
||||
|
||||
---
|
||||
|
||||
|
||||
![[Pasted image 20260316134417.png]]
|
||||
사용자가 하나 있고 역할은 21개가 있고 정책은 1개가 생성되어있음.
|
||||
|
||||
|
||||
![[Pasted image 20260316134502.png]]
|
||||
![[Pasted image 20260316134525.png]]
|
||||
사용자는 dihwang 하나가 있는데 AdministratorAccess 라는 이름의 정책을 가지고있다.
|
||||
|
||||
|
||||
![[Pasted image 20260316134705.png]]
|
||||
이 AdministratorAccess 정책에는 총 464개의 권한이 있다.
|
||||
즉, dihwang 사용자는 464개의 기능을 사용할 권한이 있다는 뜻이 된다.
|
||||
@@ -1,36 +0,0 @@
|
||||
---
|
||||
id: KISS (Keep It Simple, Stupid) 20260330
|
||||
created: 2026-03-30 14:53
|
||||
tags:
|
||||
aliases:
|
||||
---
|
||||
## 💡 생각
|
||||
[[단순한 코드]]를 만들어야 한다. 가독성을 항상 최우선시 하자.
|
||||
단순한 형태로 쉽게쉽게 읽히는 코드를 만드는 게 중요하다.
|
||||
코드의 유연성 확보는 그 다음 문제다.
|
||||
|
||||
---
|
||||
## 📑 개념
|
||||
**단순하게 유지해, 이 바보야**라는 뜻입니다. (여기서 바보는 나 자신이나 동료를 뜻하는 애칭 섞인 농담입니다.)
|
||||
해결책은 항상 **가장 단순한 형태**여야 합니다.
|
||||
|
||||
## 📌 상세
|
||||
코드가 똑똑해 보이고 화려할수록, 나중에 버그가 생겼을 때 고치기가 수십 배 더 힘들어집니다. 진짜 실력자는 어려운 문제를 어렵게 푸는 사람이 아니라, **어려운 문제를 누구나 이해할 수 있게 단순하게 푸는 사람**입니다.
|
||||
|
||||
복잡한 디자인 패턴이나 최신 기술을 억지로 끼워 넣지 마세요. `if-else`로 충분하다면 그렇게 짜는 것이 가장 좋습니다.
|
||||
|
||||
> [!question]
|
||||
> Q. kiss의 경우 나도 많이 궁금했고 어려웠던건데 디자인 패턴이나 MVC패턴같은 개발 패턴들을 굳이 쓰지말고 일단은 단순하게 if-else 로 만들어란 뜻으로 해석해야 하는거야?
|
||||
> A. 네, 정확하게 짚으셨습니다! **KISS** 원칙의 핵심은 **정답을 미리 정해놓고 끼워 맞추는 것이 아니라, 문제에 대한 가장 직관적인 해결책부터 시작하라**는 것입니다.
|
||||
|
||||
단순 if-else 로 구성된 코드가 무조건 잘못된 게 아님.
|
||||
미래에 내가 다시 보거나 내가 아닌 다른사람이 내 코드를 읽었을 때 코드의 의도가 잘 이해되면 잘 만든 코드임.
|
||||
디자인 패턴은 패턴의 이해가 필요하고 곧장 읽히지는 않기 때문에 디자인 패턴을 적용한 코드가 항상 가독성이 좋은 코드일수는 없음.
|
||||
일단은 if-else 등의 단순한 형태로 작동되는 코드를 만드는 것이 중요함.
|
||||
## 📝 노트
|
||||
> [!note]
|
||||
>
|
||||
> - 코드의 중복이 발생되고 코드의 유연성이 떨어진다고 판단될 때 디자인 패턴을 적용하면 됨
|
||||
>
|
||||
|
||||
---
|
||||
@@ -1,16 +0,0 @@
|
||||
---
|
||||
id: "MVP(Minimum Viable Product) 20260320"
|
||||
created: "2026-03-20 14:00"
|
||||
tags:
|
||||
aliases:
|
||||
---
|
||||
## 💡 생각
|
||||
당장 꼭 필요한 기능만 포함된 최소한의 제품을 최대한 빠르게 만들어내는 게 핵심 가치
|
||||
미완성본을 말하는 것이 아닌 최소한의 기능은 정상적으로 동작해야함.
|
||||
|
||||
---
|
||||
## 📑 개념
|
||||
직역하면 **생존 가능한 최소한의 제품**을 의미합니다.
|
||||
단순히 '대충 만든 제품'이나 '미완성본'이 아니라, **고객에게 가치를 제공할 수 있는 핵심 기능만 담은 가장 작은 단위의 결과물**입니다.
|
||||
|
||||
---
|
||||
@@ -1,34 +0,0 @@
|
||||
### 1. 공격 표면(Attack Surface)의 최소화
|
||||
|
||||
파드가 퍼블릭 서브넷에 있고 공인 IP(Public IP)를 직접 가지고 있다면, 전 세계 누구나 해당 파드에 직접 접속을 시도할 수 있습니다.
|
||||
|
||||
- **위험성:** 애플리케이션 코드의 작은 취약점이나 설정 오류만으로도 서버 전체가 해킹당할 수 있습니다.
|
||||
|
||||
- **해결:** 프라이빗 서브넷에 두면 외부에서는 아예 길 자체가 없어서 직접 접근이 불가능해집니다.
|
||||
|
||||
|
||||
### 2. 단일 진입점 강제 (로드 밸런서 활용)
|
||||
|
||||
사용자는 파드에 직접 붙는 것이 아니라, **로드 밸런서(ALB/NLB)**라는 검증된 관문을 통해서만 들어와야 합니다.
|
||||
|
||||
- 로드 밸런서는 퍼블릭 서브넷에서 외부 요청을 안전하게 걸러서 받고, 내부 네트워크를 통해 프라이빗 서브넷에 있는 파드에게 전달합니다.
|
||||
|
||||
- 이 구조를 통해 트래픽 제어, SSL 인증서 관리, WAF(웹 방화벽) 적용이 훨씬 쉬워집니다.
|
||||
|
||||
|
||||
### 3. IP 주소 자원 관리
|
||||
|
||||
퍼블릭 IP는 전 세계적으로 한정된 자원이며 비용이 발생합니다.
|
||||
|
||||
- 쿠버네티스 특성상 파드는 수십, 수백 개가 생성되었다가 사라집니다. 이때마다 퍼블릭 IP를 할당하는 것은 매우 비효율적이고 비용 낭비가 심합니다.
|
||||
|
||||
- 내부망(Private IP)을 사용하면 주소 부족 걱정 없이 자유롭게 스케일링할 수 있습니다.
|
||||
|
||||
|
||||
### 4. 아키텍처의 논리적 분리 (Tiering)
|
||||
|
||||
현대적인 3-Tier 아키텍처 원칙을 따르기 위함입니다.
|
||||
|
||||
- **Public Tier:** 로드 밸런서, 배스천 호스트 (외부 소통 창구)
|
||||
|
||||
- **Private Tier:** 애플리케이션 서버, 데이터베이스 (실제 핵심 데이터와 로직)
|
||||
@@ -1,27 +0,0 @@
|
||||
- 작성 **날짜:** 2026-02-27
|
||||
|
||||
## 📑 개념
|
||||
> [!abstract]
|
||||
> "AWS 클라우드 안에서 완벽하게 격리된, 사용자가 직접 정의하는 **가상 네트워크 환경**"
|
||||
> AWS가 만든 개념인데 현재는 클라우드 표준처럼 사용됨
|
||||
|
||||
## 📌 VPC의 핵심 구성 요소
|
||||
> [!check]
|
||||
|**구성 요소**|**명칭**|**설명**|**비유**|
|
||||
|---|---|---|---|
|
||||
|**CIDR 블록**|**IP 주소 범위**|VPC에서 사용할 IP 주소의 범위를 정의 (예: `10.0.0.0/16`)|내 구역의 **전체 주소지**|
|
||||
|**서브넷 (Subnet)**|**망 분할**|VPC를 더 작은 단위로 쪼갠 네트워크. 퍼블릭과 프라이빗으로 나뉨|큰 건물을 **여러 개의 방**으로 나눔|
|
||||
|**라우팅 테이블**|**길잡이**|네트워크 트래픽이 어디로 가야 할지 알려주는 이정표|건물 내의 **복도와 안내판**|
|
||||
|**인터넷 게이트웨이**|**IGW**|VPC와 인터넷 사이의 통로. 이게 있어야 외부 통신 가능|건물의 **정문 (바깥 세상으로 나가는 문)**|
|
||||
|**NAT 게이트웨이**|**NAT**|프라이빗 서브넷의 서버가 보안을 유지하며 외부로만 나갈 때 사용|안에서는 밖을 보지만, **밖에서는 안을 못 보는 창문**|
|
||||
|
||||
## 📝 노트
|
||||
> [!note]
|
||||
>
|
||||
> - 관련 사례나 반대되는 개념이 있다면 여기에 기록하세요.
|
||||
>
|
||||
> - 본인의 언어로 풀어서 쓰는 것이 제텔카스텔의 핵심입니다.
|
||||
>
|
||||
|
||||
## 🔗 지식 연결
|
||||
- **태그:** #zettelkasten #knowledge
|
||||
@@ -1,33 +0,0 @@
|
||||
---
|
||||
id: "VPN(Virtual Private Network) 20260305"
|
||||
created: "2026-03-05 15:00"
|
||||
tags:
|
||||
---
|
||||
## 💡 생각
|
||||
또다른 네트워크 연결 통로라고 생각하면 됨. 실제로 VPN 연결 시 네트워크 연결에 새로운 네트워크 연결이 추가됨.
|
||||
![[Pasted image 20260305150408.png]]
|
||||
|
||||
---
|
||||
## 📑 개념
|
||||
가상 사설망, **인터넷상에 나만의 안전한 비밀 통로를 만드는 기술**이라고 생각하면 됨.
|
||||
|
||||
## 📌 상세
|
||||
|
||||
VPN 사용 시 주요 장점
|
||||
|
||||
| **장점** | **설명** |
|
||||
| -------------- | -------------------------------------------------- |
|
||||
| **보안 강화** | 공공장소(카페, 공항)의 무료 와이파이를 쓸 때 해킹 위험으로부터 데이터를 보호합니다. |
|
||||
| **IP 주소 우회** | 나의 실제 위치(IP 주소)를 숨기고 VPN 서버가 있는 국가의 IP로 바꿀 수 있습니다. |
|
||||
| **검열 및 차단 해제** | 특정 국가에서 접속이 막힌 사이트나 콘텐츠(해외 넷플릭스 등)에 접근할 수 있습니다. |
|
||||
| **익명성 보장** | 방문하는 웹사이트나 서비스 제공자가 나의 실제 신원을 파악하기 어렵게 만듭니다. |
|
||||
|
||||
|
||||
VPN 사용 시 주의할 점
|
||||
- **속도 저하:** 데이터를 암호화하고 먼 거리에 있는 서버를 거치기 때문에 인터넷 속도가 평소보다 느려질 수 있습니다.
|
||||
|
||||
- **무료 VPN의 위험성:** "공짜" VPN 중 일부는 사용자의 활동 로그를 수집해 광고주에게 팔거나 보안이 취약할 수 있습니다. 가급적 신뢰할 수 있는 유료 서비스를 권장합니다.
|
||||
|
||||
- **완벽한 익명성은 없음:** VPN 업체는 내가 어떤 데이터를 주고받는지 알 수 있습니다. 따라서 '노 로그(No-log, 활동 기록을 남기지 않음)' 정책을 가진 업체를 선택하는 것이 중요합니다.
|
||||
|
||||
---
|
||||
@@ -1,45 +0,0 @@
|
||||
---
|
||||
id: "Woodpecker 20260320"
|
||||
created: "2026-03-20 16:56"
|
||||
tags:
|
||||
aliases:
|
||||
---
|
||||
## 💡 생각
|
||||
이거 아주 괜찮을거같음
|
||||
아주 경량화되어 사용하기 쉽고 빠릿빠릿한 젠킨스
|
||||
(물론 계속 써봐야겠지만..)
|
||||
|
||||
---
|
||||
## 📑 개념
|
||||
Woodpecker CI는 오픈 소스 기반의 경량 CI/CD 엔진으로, 과거 유명했던 Drone CI에서 포크(Fork)되어 발전한 도구입니다. 복잡한 설정보다는 **간결함**과 **컨테이너 기반의 확장성**을 중시하는 팀에게 특히 매력적인 선택지입니다.
|
||||
|
||||
## 📌 상세
|
||||
## 1. Woodpecker의 핵심 철학
|
||||
|
||||
Woodpecker는 모든 파이프라인 단계를 **도커(Docker) 컨테이너** 내에서 실행합니다. 이로 인해 환경 격리가 확실하며, 필요한 도구를 설치하기 위해 에이전트를 더럽힐 필요가 없습니다.
|
||||
|
||||
- **설정의 간소화:** `.woodpecker.yml`이라는 YAML 파일 하나로 전체 파이프라인을 정의합니다.
|
||||
|
||||
- **오픈 소스 정신:** 완전히 무료이며, 커뮤니티에 의해 유지보수됩니다. (Drone CI가 기업화되면서 라이선스 제약이 생긴 것에 반발하여 나온 프로젝트입니다.)
|
||||
|
||||
- **경량화:** 리소스 소모가 매우 적어 개인 서버나 사양이 낮은 VPS에서도 원활하게 돌아갑니다.
|
||||
|
||||
|
||||
---
|
||||
|
||||
## 2. 작동 방식 (Architecture)
|
||||
|
||||
Woodpecker는 크게 두 가지 컴포넌트로 구성됩니다.
|
||||
|
||||
- **Server:** 웹 UI를 제공하고, GitHub, GitLab, Gitea와 같은 소스 코드 관리 도구(Forge)와 연동하여 웹훅(Webhook)을 처리합니다.
|
||||
|
||||
- **Agent:** 실제로 파이프라인 작업을 수행하는 주체입니다. 서버로부터 할당받은 작업을 컨테이너를 띄워 실행합니다.
|
||||
|
||||
|
||||
## 주요 장점
|
||||
|
||||
- **멀티 플랫폼 지원:** x86_64는 물론이고 ARM64(라즈베리 파이 등)에서도 완벽하게 작동합니다.
|
||||
|
||||
- **다양한 Backend:** 기본적으로 Docker를 사용하지만, 최근에는 로컬 프로세스 실행이나 [[쿠버네티스(Kubernetes)]] 기반의 실행도 지원하기 시작했습니다.
|
||||
|
||||
- **플러그인 생태계:** Docker 이미지를 플러그인처럼 사용할 수 있습니다. 예를 들어, 빌드가 끝나고 Slack 메시지를 보내고 싶다면 이미 만들어진 Slack 플러그인 이미지를 파이프라인에 추가하기만 하면 됩니다.
|
||||
@@ -1,41 +0,0 @@
|
||||
---
|
||||
id: "YAGNI(You Ain't Gonna Need It) 20260317"
|
||||
created: "2026-03-17 16:54"
|
||||
tags:
|
||||
aliases:
|
||||
---
|
||||
## 💡 생각
|
||||
지금 당장 꼭 필요한 것만 만들어라. 미리 먼저 만들지 마라
|
||||
|
||||
---
|
||||
## 📑 개념
|
||||
소프트웨어 개발 원칙 중 하나로 직역하면 **그거 필요 없을걸요** 또는 **미리 만들지 마세요**라는 뜻을 담고 있습니다.
|
||||
개발자가 미래에 필요할 것으로 예상되는 기능을 미리 구현하지 말고, **실제로 그 기능이 필요한 시점이 되었을 때 구현하라**는 핵심 메시지를 전달합니다.
|
||||
## 📌 상세
|
||||
### 1. YAGNI가 필요한 이유
|
||||
|
||||
많은 개발자가 나중에 이 기능이 추가될 때를 대비해 미리 구조를 잡거나 범용적인 코드를 작성하려는 유혹에 빠지곤 합니다. 하지만 이런 **추측에 기반한 개발(Speculative Development)**은 다음과 같은 부작용을 낳습니다.
|
||||
|
||||
- **시간 낭비:** 결국 쓰이지 않게 될 기능을 만드느라 현재 꼭 필요한 작업에 집중하지 못하게 됩니다.
|
||||
|
||||
- **코드 복잡성 증가:** 당장 필요 없는 코드가 들어가면 전체적인 시스템 구조가 복잡해지고, 나중에 코드를 읽거나 수정하기 더 어려워집니다.
|
||||
|
||||
- **유지보수 비용 발생:** 사용되지 않는 기능이라도 버그가 생기면 수정해야 하고, 의존성 업데이트나 리팩토링 시 고려 대상이 되어 짐이 됩니다.
|
||||
|
||||
- **잘못된 예측:** 미래의 요구사항은 변하기 마련입니다. 미리 만들어둔 기능이 나중에 정작 필요한 형태와 달라서 결국 다시 만들어야 하는 경우가 많습니다.
|
||||
|
||||
|
||||
### 2. YAGNI를 실천하는 방법
|
||||
|
||||
- **현재의 요구사항에 집중:** 오늘 해결해야 할 문제와 기능에만 충실하게 코드를 작성합니다.
|
||||
|
||||
- **확장성보다는 단순성:** 나중에 확장될 것을 대비해 복잡한 추상화 계층을 미리 만들기보다는, 지금 당장 이해하기 쉽고 단순한 구조를 유지합니다.
|
||||
|
||||
- **리팩토링의 힘:** 나중에 정말로 기능 확장이 필요해졌을 때, 그때 가서 코드를 리팩토링하여 기능을 추가하는 것이 훨씬 효율적입니다.
|
||||
|
||||
## 📝 노트
|
||||
> [!note]
|
||||
>
|
||||
> - 작업의 가치는 그것이 실제로 사용될 때 발생합니다.
|
||||
|
||||
---
|
||||
@@ -1,3 +0,0 @@
|
||||
---
|
||||
title: note
|
||||
---
|
||||
@@ -1,6 +0,0 @@
|
||||
| **비교 항목** | **가상 머신 (EC2 등 VM)** | **컨테이너 (Docker 등)** |
|
||||
| --------- | -------------------------------------- | --------------------------------- |
|
||||
| **구조** | OS 위에 가상 하이퍼바이저와 **별도의 Guest OS**가 필요함 | 호스트의 **OS 커널을 공유**하며 프로세스 단위로 격리됨 |
|
||||
| **무게** | GB 단위 (매우 무겁고 부팅이 느림) | **MB 단위** (매우 가볍고 즉시 실행됨) |
|
||||
| **효율성** | 리소스 낭비가 큼 (OS마다 자원을 잡아먹음) | 필요한 자원만 사용하므로 집적도가 높음 |
|
||||
| **이식성** | 환경 설정에 따라 작동 여부가 달라짐 | **"어디서든 동일하게 실행"**됨을 보장함 |
|
||||
@@ -1,20 +0,0 @@
|
||||
- 작성 **날짜:** 2026-02-27
|
||||
|
||||
## 📑 개념
|
||||
> [!abstract]
|
||||
> 시스템이 장애 없이 정상적으로 서비스를 제공할 수 있는 상태
|
||||
> 언제든지 이상없이 잘 사용할 수 있는것도 가용성으로 봄
|
||||
|
||||
## 📝 상세 설명
|
||||
> [!note]
|
||||
>
|
||||
> -
|
||||
>
|
||||
|
||||
|
||||
$$가용성(\%) = \frac{업타임(정상 운영 시간)}{업타임 + 다운타임(장애 시간)} \times 100$$
|
||||
|
||||
|
||||
## 🔗 지식 연결
|
||||
- **태그:** #zettelkasten #knowledge
|
||||
|
||||
@@ -1,54 +0,0 @@
|
||||
---
|
||||
id: "고차 함수(Higher-Order Function) 20260407"
|
||||
created: "2026-04-07 15:55"
|
||||
tags:
|
||||
aliases:
|
||||
---
|
||||
## 💡 생각
|
||||
이곳에 하나의 생각 또는 아이디어를 작성합니다.
|
||||
|
||||
---
|
||||
## 📑 개념
|
||||
함수를 다루는 함수라고 생각하면 쉬워요.
|
||||
함수가 다음 중 **하나 이상**을 수행한다면 고차 함수라고 부릅니다.
|
||||
|
||||
## 고차 함수의 두 가지 조건
|
||||
|
||||
### 1. 함수를 인자로 전달받음
|
||||
|
||||
다른 함수를 매개변수(Parameter)로 넘겨받아 실행하는 경우입니다. 이때 인자로 전달되는 함수를 보통 **콜백 함수(Callback Function)** 라고 부릅니다.
|
||||
|
||||
- **예시:** `Array.prototype.map()`, `filter()`, `forEach()` 등
|
||||
``` javascript
|
||||
const numbers = [1, 2, 3];
|
||||
// 여기서 map은 고차 함수이고, (n => n * 2)는 콜백 함수입니다.
|
||||
const doubled = numbers.map(n => n * 2);
|
||||
```
|
||||
|
||||
|
||||
### 2. 함수를 결과로 반환함
|
||||
|
||||
함수 실행의 결과물로 새로운 함수를 만들어 내보내는 경우입니다. 이 방식은 **클로저(Closure)** 나 **커링(Currying)** 기법을 구현할 때 자주 쓰입니다.
|
||||
|
||||
- **예시:**
|
||||
``` javascript
|
||||
function makeMultiplier(multiplier) {
|
||||
// 함수 자체를 반환합니다.
|
||||
return function(value) {
|
||||
return value * multiplier;
|
||||
};
|
||||
}
|
||||
const triple = makeMultiplier(3);
|
||||
console.log(triple(10)); // 30
|
||||
```
|
||||
|
||||
---
|
||||
## 왜 고차 함수를 쓰나요?
|
||||
|
||||
고차 함수를 사용하면 코드의 **추상화 수준**을 높일 수 있습니다.
|
||||
|
||||
1. **코드의 재사용성:** 복잡한 로직(반복문, 조건문 등)은 고차 함수 내부에 숨기고, 실제 수행할 구체적인 작업만 함수로 갈아 끼울 수 있습니다.
|
||||
|
||||
2. **가독성 향상:** `for` 문을 돌리며 배열을 수정하는 대신, `filter`나 `map` 같은 명칭을 사용함으로써 코드가 무엇을 하려는지 의도를 명확히 드러낼 수 있습니다.
|
||||
|
||||
3. **함수형 프로그래밍:** 데이터를 직접 변경하지 않고 새로운 데이터를 생성하는 방식(불변성 유지)을 구현하기에 최적입니다.
|
||||
@@ -1,42 +0,0 @@
|
||||
---
|
||||
id: 단순한 코드 20260318
|
||||
created: 2026-03-18 09:55
|
||||
tags:
|
||||
aliases:
|
||||
---
|
||||
## 💡 생각
|
||||
결국 단순한 코드는
|
||||
가독성이 좋아야 하고: [[코드의 가독성]]
|
||||
유연성이 좋아야 한다. [[유연한 단순함]] [[유연성(Flexibility)]]
|
||||
|
||||
단순한 코드를 만들기 위해서는 이 두가지를 고민해야 하는데 이 자체가 고도의 작업이다.
|
||||
|
||||
---
|
||||
|
||||
> [!question]
|
||||
> Q. 단순한 코드라는게 가독성도 생각해야하고 스케일업도 고민해야해서 코드를 단순하게 만드는대에도 공수가 든다. 이렇게 이해하면 되는거야?
|
||||
> A. 네, 정확합니다! **단순함은 거저 얻어지는 것이 아니라, 치열한 고민과 비용(공수)이 들어가는 결과물**이라고 이해하시는 게 가장 올바른 접근입니다.
|
||||
>
|
||||
> 많은 초보 개발자들이 "그냥 생각나는 대로 빨리 짜는 것"을 단순하다고 착각하지만, 숙련된 개발자에게 단순함은 **불필요한 것을 깎아내는 고도의 설계 작업**을 의미합니다.
|
||||
|
||||
## 📌 상세
|
||||
### 단순함은 '방치'가 아니라 '정제'입니다
|
||||
|
||||
코드를 단순하게 만들기 위해 공수가 드는 이유는 다음과 같은 **판단 과정**이 필요하기 때문입니다.
|
||||
|
||||
- **가독성 고민:** "나중에 내가 이 코드를 다시 봤을 때, 10초 안에 로직을 파악할 수 있는가?"를 고민하며 변수명을 고치고 함수를 쪼개는 작업이 추가됩니다.
|
||||
|
||||
- **스케일업(유연성) 고민:** "지금은 간단히 짜지만, 나중에 로직이 추가될 때 코드 전체를 다 뜯어고쳐야 하나?"를 생각하며 최소한의 확장성(인터페이스 분리 등)을 확보하는 데 시간이 듭니다.
|
||||
|
||||
## 그래서 [[파레토의 법칙]]을 여기서 적용해야합니다.
|
||||
모든 코드를 이렇게 정성 들여 단순하게 만들려면 시간이 너무 많이 걸립니다. 그래서 **20%에 집중**해야 합니다.
|
||||
- **핵심 20% (비즈니스 로직, 복잡한 쿼리):** 가독성과 유연성을 위해 **충분한 공수**를 들여서 단순화합니다. 여기가 복잡하면 나중에 감당이 안 되기 때문입니다.
|
||||
|
||||
- **나머지 80% (일회성 툴, 단순 UI 연결 등):** 여기에는 너무 많은 공수를 들이지 않습니다. 적당히 돌아가게만 짜는 것이 오히려 전체적인 효율(단순함)을 높이는 길입니다.
|
||||
- [[80대20 원칙(The Pareto Principle)]]
|
||||
|
||||
## 📝 노트
|
||||
> [!note] 스티브 잡스의 유명한 말
|
||||
> "단순함은 복잡함보다 어렵다. 생각을 명확히 해서 단순하게 만들려면 정말 열심히 노력해야 한다."
|
||||
|
||||
---
|
||||
@@ -1,60 +0,0 @@
|
||||
---
|
||||
id: 리눅스에 Nginx를 설치할 때 일어나는 일들 20260403
|
||||
created: 2026-04-03 11:14
|
||||
tags:
|
||||
aliases:
|
||||
---
|
||||
### Nginx는 어디에 흩어져 있나요?
|
||||
Nginx를 설치하면 보통 다음과 같이 각기 다른 폴더에 파일들이 들어갑니다.
|
||||
|
||||
| **파일 종류** | **위치 (경로)** | **설명** |
|
||||
| ------------------ | ----------------- | ------------------------------------------- |
|
||||
| **실행 파일 (Binary)** | `/usr/sbin/nginx` | 실제 프로그램을 돌리는 "근육"입니다. `/etc`가 아니라 여기에 있습니다. |
|
||||
| **설정 파일 (Conf)** | `/etc/nginx/` | `nginx.conf` 등이 위치하는 "두뇌"입니다. |
|
||||
| **기본 웹 콘텐츠** | `/var/www/html` | 웹사이트에 보여줄 HTML 파일들이 있는 "창고"입니다. |
|
||||
| **로그 파일** | `/var/log/nginx/` | 접속 기록이나 에러가 쌓이는 "일기장"입니다. |
|
||||
[[FHS(Filesystem Hierarchy Standard)]] 참고
|
||||
|
||||
### 왜 `/etc/nginx`가 눈에 잘 띌까요?
|
||||
|
||||
우리가 Nginx를 다룰 때 가장 많이 수정하고 접근하는 곳이 `/etc/nginx`이기 때문입니다.
|
||||
|
||||
실행 파일인 `/usr/sbin/nginx`는 우리가 직접 건드릴 일이 거의 없습니다. 하지만 "포트 번호를 바꾼다", "도메인을 연결한다" 같은 작업을 할 때는 무조건 `/etc/nginx` 안에 있는 텍스트 설정 파일들을 편집해야 하죠. 그래서 마치 Nginx가 거기 설치된 것처럼 느껴질 수 있습니다.
|
||||
|
||||
|
||||
### 리눅스의 '관습' (설정과 실행의 분리)
|
||||
|
||||
리눅스에서 `/etc`는 **"시스템의 상태를 결정하는 텍스트 데이터"**만 담기로 약속되어 있습니다.
|
||||
|
||||
- **이유 1 (백업):** 서버를 옮길 때 `/usr`(프로그램)는 새로 설치하면 되지만, `/etc`(내 설정)는 백업하지 않으면 다 날아갑니다. 그래서 설정만 따로 모아두는 거죠.
|
||||
|
||||
- **이유 2 (보안):** 실행 파일이 있는 곳은 읽기 전용으로 보호하고, 설정 파일이 있는 곳만 관리자가 수정할 수 있게 권한을 나누기 위함입니다.
|
||||
|
||||
### 💡 확인해보기
|
||||
|
||||
궁금하시다면 터미널에 아래 명령어를 입력해 보세요. Nginx 실행 파일이 어디 있는지 바로 알려줄 거예요.
|
||||
|
||||
```bash
|
||||
which nginx
|
||||
```
|
||||
아마 `/usr/sbin/nginx`라고 답할 겁니다.
|
||||
|
||||
|
||||
> [!question]
|
||||
> Q. 아.. /usr 가 사용자 관련 모든 프로그램과 데이터가 있는 폴더고 거기의 system binary sbin 아래에 설치가 된거구나?
|
||||
> A. 정확합니다! 이해력이 정말 빠르시네요. 리눅스의 설계를 완벽하게 꿰뚫어 보셨습니다.
|
||||
>
|
||||
> 방금 말씀하신 내용을 조금 더 구체적으로 연결해 보면 리눅스의 구조가 더 선명해질 거예요.
|
||||
## 🏗️ /usr 디렉토리의 논리적 구조
|
||||
|
||||
리눅스에서 `/usr`는 **User System Resources**의 약자로, 시스템 운영에 필수적인 최소한의 도구(루트 폴더의 `/bin`)를 제외한 **나머지 모든 응용 프로그램**이 거주하는 거대한 도시와 같습니다.
|
||||
|
||||
### /usr/bin vs /usr/**s**bin
|
||||
|
||||
두개의 `sbin`의 차이는 **누가 실행하는가**에 있습니다.
|
||||
|
||||
- **`/usr/bin` (User Binaries):** 일반 사용자가 일상적으로 쓰는 프로그램들입니다. (예: `python`, `git`, `curl` 등)
|
||||
|
||||
- **`/usr/sbin` (System Binaries):** 시스템 관리자(Root) 권한이 필요한, 시스템 전체에 영향을 주는 프로그램들입니다.
|
||||
|
||||
- **Nginx**는 웹 서버라는 시스템 서비스를 제공하기 때문에 관리자 권한이 필수적이고, 그래서 `sbin`에 위치하게 됩니다.
|
||||
@@ -1,52 +0,0 @@
|
||||
---
|
||||
id: "리눅스와 유닉스의 파일 시스템 20260407"
|
||||
created: "2026-04-07 13:15"
|
||||
tags:
|
||||
aliases:
|
||||
---
|
||||
## 💡 생각
|
||||
아무튼 둘은 거의 비슷하고 리눅스의 경우 기준점을 정해놓고 가능하면 기준을 지키려고 노력하고 유닉스는 기준점이 딱히 없고 버전마다 차이점이 존재할 가능성이 높다.
|
||||
|
||||
---
|
||||
## 📑 개념
|
||||
유닉스(UNIX)와 리눅스(Linux)의 파일 시스템은 뿌리가 같기 때문에 구조적으로 매우 흡사하지만, 탄생 배경과 발전 과정에 따라 몇 가지 중요한 차이점이 있습니다. 두 시스템 모두 **계층적 트리 구조**를 사용하며 모든 것을 파일로 취급한다는 철학을 공유합니다.
|
||||
|
||||
## 📌 상세
|
||||
## 1. 기본 구조 및 철학 (유사점)
|
||||
|
||||
두 시스템 모두 최상위 루트 디렉터리($/$)를 기점으로 하는 단일 트리 구조를 가집니다.
|
||||
[[FHS(Filesystem Hierarchy Standard)]]라는 표준을 따르기 때문에 주요 디렉터리의 역할은 거의 동일합니다.
|
||||
|
||||
- **/bin, /sbin**: 실행 파일
|
||||
- **/etc**: 설정 파일
|
||||
- **/home**: 사용자 데이터 (유닉스는 시스템에 따라 `/usr/users` 등을 사용하기도 함)
|
||||
- **/dev**: 하드웨어 장치 파일
|
||||
|
||||
## 2. 주요 차이점
|
||||
|
||||
### 디렉터리 배치 표준 (FHS vs 전통적 유닉스)
|
||||
|
||||
- **리눅스**: [[FHS(Filesystem Hierarchy Standard)]]라는 엄격한 표준을 만들어 배포판(Ubuntu, CentOS 등) 간의 호환성을 유지합니다. 예를 들어 가변 데이터는 반드시 `/var`에, 사용자 설치 프로그램은 `/usr/local`에 두는 식입니다.
|
||||
|
||||
- **유닉스**: 시스템마다 독자적인 전통을 따릅니다. 예를 들어 **Solaris**나 **HP-UX**, **AIX**는 로그 파일이나 시스템 설정 파일의 위치가 리눅스와 미세하게 다를 수 있으며, `/opt` 디렉터리를 더 적극적으로 활용하여 추가 소프트웨어를 관리하는 경향이 있습니다.
|
||||
|
||||
### 파일 시스템 종류 (FS Types)
|
||||
|
||||
- **리눅스**: 기본적으로 **Ext4**를 가장 많이 사용하며, 최근에는 대용량 데이터와 스냅샷에 유리한 **Btrfs**, **XFS** 등을 채택합니다. 오픈 소스 특성상 새로운 파일 시스템 도입이 매우 빠릅니다.
|
||||
|
||||
- **유닉스**: 각 벤더사가 개발한 고유의 고성능 파일 시스템을 사용합니다.
|
||||
|
||||
- **Solaris**: ZFS (현존하는 가장 강력한 파일 시스템 중 하나)
|
||||
|
||||
- **IBM AIX**: JFS/JFS2
|
||||
|
||||
- **HP-UX**: VxFS (Veritas Filesystem)
|
||||
|
||||
|
||||
### 가상 파일 시스템 (VFS) 활용
|
||||
|
||||
- **리눅스**: `/proc`이나 `/sys` 같은 **가상 파일 시스템**을 통해 커널 정보와 하드웨어 상태를 실시간으로 노출하는 데 매우 적극적입니다.
|
||||
|
||||
- **유닉스**: 유닉스도 `/proc`을 사용하지만, 리눅스만큼 상세한 정보를 제공하지 않거나 시스템 관리를 위해 별도의 전용 명령어를 사용하는 경우가 더 많습니다.
|
||||
|
||||
결론적으로, 사용자 입장에서는 디렉터리 구조가 거의 비슷해 보이지만 **내부적인 관리 메커니즘**과 **사용 가능한 파일 시스템의 종류**에서 큰 차이가 발생합니다.
|
||||
@@ -1,30 +0,0 @@
|
||||
---
|
||||
id: 멀티 테넌시(Multi-tenancy) 20260305
|
||||
created: 2026-03-05 13:02
|
||||
tags:
|
||||
---
|
||||
## 💡 생각
|
||||
하나의 인스턴스가 여러 테넌시에 서비스를 제공해준다. 보통의 클라우드형 서비스는 멀티 테넌시라고 보면 됨.
|
||||
|
||||
---
|
||||
## 📑 개념
|
||||
하나의 소프트웨어 인스턴스가 **여러 명의 사용자(테넌트)**에게 서비스를 제공하는 구조**
|
||||
아파트 한 동에 여러 가구가 살면서 엘리베이터나 복도를 공유하는 것과 비슷합니다.
|
||||
## 📌 상세
|
||||
- **특징:** 데이터베이스나 애플리케이션 실행 환경을 공유하지만, 각 사용자의 데이터는 논리적으로 격리되어 서로 볼 수 없습니다.
|
||||
|
||||
- **장점:** * **비용 효율성:** 자원을 공유하므로 사용료가 저렴합니다.
|
||||
|
||||
- **업데이트 용이:** 서비스 제공자가 한 번만 업데이트하면 모든 사용자가 최신 기능을 쓸 수 있습니다.
|
||||
|
||||
- **단점:** * **보안 우려:** 논리적으로는 격리되어 있지만, 물리적으로 같은 자원을 쓰기 때문에 보안 민감도가 높은 기업은 꺼릴 수 있습니다.
|
||||
|
||||
- **성능 간섭:** 특정 테넌트가 자원을 과하게 쓰면 다른 테넌트의 속도가 느려질 수 있습니다 (Noisy Neighbor 현상).
|
||||
|
||||
- **예시:** 구글 드라이브, 네이버 MYBOX, **대부분의 SaaS**(Slack, Notion 등).
|
||||
|
||||
---
|
||||
|
||||
## 🔗 관련 노트
|
||||
- [[테넌시(Tenancy)]]
|
||||
- [[싱글 테넌시(Single-tenancy)]]
|
||||
@@ -1,43 +0,0 @@
|
||||
---
|
||||
id: 멀티유저(Multi-user) 20260407
|
||||
created: 2026-04-07 13:21
|
||||
tags:
|
||||
- operating-system
|
||||
- os
|
||||
aliases:
|
||||
---
|
||||
![[윈도우 서버의 멀티 유저#💡 생각]]
|
||||
참고: [[윈도우 서버의 멀티 유저]]
|
||||
|
||||
---
|
||||
## 📑 개념
|
||||
**멀티유저(Multi-user) 시스템**은 하나의 컴퓨터 자원(CPU, 메모리, 저장장치 등)을 여러 사용자가 **동시에** 혹은 **시분할 방식**으로 공유하여 사용할 수 있는 환경을 의미합니다. 단순히 여러 명의 계정이 있는 것을 넘어, 시스템이 각 사용자의 작업을 독립적으로 처리하고 관리하는 능력이 핵심입니다.
|
||||
|
||||
## 📌 상세
|
||||
## 1. 멀티유저 시스템의 핵심 메커니즘
|
||||
|
||||
시스템이 여러 사용자를 동시에 수용하기 위해 내부적으로는 다음과 같은 기술적 처리가 이루어집니다.
|
||||
|
||||
- **자원 공유와 할당:** 운영체제(OS)가 CPU 스케줄링을 통해 각 사용자에게 아주 짧은 시간 동안 자원을 배분합니다. 사용자 입장에서는 마치 혼자 시스템을 사용하는 것처럼 느껴지지만, 실제로는 시스템이 매우 빠르게 사용자들을 전환하며 작업을 처리합니다.
|
||||
|
||||
- **사용자 인증 및 권한 관리:** 각 사용자는 고유의 ID와 비밀번호를 통해 시스템에 접속하며, 시스템은 특정 사용자에게 허용된 파일이나 프로그램에만 접근할 수 있도록 보안 정책을 적용합니다.
|
||||
|
||||
- **데이터 독립성 및 보안:** 한 사용자의 작업이 다른 사용자의 데이터나 프로그램 실행에 영향을 주지 않도록 **프로세스 격리**와 **메모리 보호** 기능을 수행합니다.
|
||||
|
||||
|
||||
## 2. 주요 특징
|
||||
|
||||
|**특징**|**설명**|
|
||||
|---|---|
|
||||
|**자원 효율성**|고가의 서버 자원을 한 명의 사용자가 독점하지 않고 여러 명이 나누어 사용함으로써 하드웨어 활용도를 극대화합니다.|
|
||||
|**데이터 공유**|동일한 데이터베이스나 파일 시스템에 접근하여 협업하거나 정보를 공유하기 용이합니다.|
|
||||
|**동시성 제어**|여러 사용자가 같은 데이터를 동시에 수정하려 할 때 데이터 무결성을 유지하기 위한 잠금(Locking) 기술이 적용됩니다.|
|
||||
|**원격 접속**|물리적으로 떨어진 위치에서도 네트워크를 통해 시스템에 접속하여 작업할 수 있습니다.|
|
||||
|
||||
## 3. 대표적인 사례
|
||||
|
||||
- **서버용 운영체제:** Linux, Unix, Windows Server 등은 설계 단계부터 멀티유저를 상정하고 만들어졌습니다. 수백 명의 개발자가 하나의 서버에 SSH로 접속해 코딩하는 환경이 대표적입니다.
|
||||
|
||||
- **메인프레임:** 대규모 금융 기관이나 정부 기관에서 수천 건의 트랜잭션을 동시에 처리하는 대형 시스템입니다.
|
||||
|
||||
- **클라우드 컴퓨팅:** AWS, Azure와 같은 환경도 물리적인 서버 자원을 전 세계 수많은 사용자가 멀티테넌트(Multi-tenant) 방식으로 나누어 사용하는 멀티유저의 확장된 개념입니다.
|
||||
@@ -1,81 +0,0 @@
|
||||
---
|
||||
id: 미닉스의 한계 20260407
|
||||
created: 2026-04-07 13:51
|
||||
tags:
|
||||
aliases:
|
||||
---
|
||||
## 💡 생각
|
||||
자유로운 유닉스를 만들기 위해 직접 OS를 만들었다는게 대단하고 그걸 누구나 자유롭게 쓸 수 있도록 공개한게 정말 대단하다.
|
||||
|
||||
---
|
||||
## 📑 개념
|
||||
리눅스 개발자인 리누스 토르발즈가 리눅스를 개발하게 된 이유.
|
||||
|
||||
|
||||
## 1. 하드웨어 성능 활용의 제한 (386 프로세서)
|
||||
|
||||
당시 리누스는 최신 사양이었던 **Intel 80386** 프로세서가 탑재된 PC를 구입했습니다. 이 CPU는 32비트 보호 모드와 강력한 멀티태스킹 기능을 갖추고 있었죠.
|
||||
|
||||
- **미닉스의 한계:** 미닉스는 교육용이라는 목적 때문에 사양이 낮은 구형 컴퓨터에서도 돌아가야 했습니다. 그래서 386 CPU의 강력한 성능(세그먼트 하드웨어 등)을 제대로 활용하지 못하고 16비트 기반에 머물러 있었습니다.
|
||||
( CPU가 한번의 연산으로 처리할 수 있는 데이터의 양의 차이가 어마어마하게 많이 났다. )
|
||||
```
|
||||
- **16비트:** 한 번에 $2^{16}$ (65,536)가지의 상태를 표현하고 처리합니다.
|
||||
- **32비트:** 한 번에 $2^{32}$ (약 42억 9천만)가지의 상태를 처리합니다.
|
||||
```
|
||||
( CPU가 데이터를 처리할 때 접근하는 메모리 주소양의 한계의 차이가 어마어마하게 많이 났다. )
|
||||
```
|
||||
- **16비트:** 주소를 65,536개까지만 만들 수 있습니다. 용량으로 따지면 겨우 **64KB**입니다. 이 한계를 극복하려고 예전에는 메모리를 쪼개서 관리하는 복잡한 방식을 썼습니다.
|
||||
|
||||
- **32비트:** 약 42억 개의 주소를 가질 수 있습니다. 우리가 흔히 아는 **4GB** 메모리까지 인식할 수 있는 단계입니다.
|
||||
```
|
||||
|
||||
- **리누스의 선택:** 그는 자신의 386 컴퓨터 성능을 끝까지 뽑아낼 수 있는 운영체제를 직접 만들고 싶어 했습니다.
|
||||
( 이런 이유때문에 OS를 개발하기러 했다고..?;; 나였으면 미닉스 말고 유닉스를 샀을텐데)
|
||||
|
||||
---
|
||||
|
||||
## 2. 라이선스와 폐쇄적인 운영
|
||||
|
||||
미닉스는 네덜란드의 앤드류 타넨바움 교수가 운영체제 원리를 가르치기 위해 만든 소프트웨어였습니다.
|
||||
|
||||
- **미닉스의 한계:** 미닉스는 오픈 소스가 아니었습니다. 책을 사야 소스코드를 볼 수 있었고, 상업적으로 이용하거나 소스코드를 마음대로 수정해서 배포하는 것이 엄격히 제한되었습니다.
|
||||
|
||||
- **리누스의 선택:** 리누스는 ==누구나 자유롭게 기여하고 개선할 수 있는 시스템==을 원했습니다. (이후 리눅스가 GPL 라이선스를 채택하며 폭발적으로 성장한 배경이 됩니다.)
|
||||
|
||||
|
||||
---
|
||||
|
||||
## 3. 터미널 에뮬레이터 기능의 부재
|
||||
|
||||
실질적으로 리누스가 개발을 시작하게 된 아주 구체적이고 현실적인 이유입니다.
|
||||
|
||||
- **미닉스의 한계:** 리누스는 학교 서버에 접속하기 위해 [[터미널 에뮬레이터(Terminal Emulator)]]가 필요했습니다. 하지만 미닉스에 내장된 기능은 그의 마음에 들지 않았고 성능도 부족했습니다.
|
||||
|
||||
- **리누스의 선택:** 처음에는 단순히 "성능 좋은 터미널 프로그램"을 만들기 위해 어셈블리어로 하드웨어를 직접 제어하는 코드를 짜기 시작했습니다. 그런데 이 코드가 점점 커지면서 파일 시스템이 붙고 작업 스케줄러가 붙더니 결국 리눅스 [[커널(Kernel)]]이 된 것입니다.
|
||||
|
||||
##### 리누스 토르발즈가 이걸 왜 직접 만들었을까?
|
||||
리누스가 미닉스를 쓸 때 가장 답답했던 건, 학교의 거대한 유닉스 서버에 접속해서 공부하고 싶은데 미닉스에 내장된 터미널 프로그램의 성능이 너무 안 좋았기 때문입니다.
|
||||
|
||||
- **성능 문제:** 글자가 화면에 찍히는 속도가 느리거나, 특정 특수 문자가 깨지는 등의 문제가 있었습니다.
|
||||
|
||||
- **직접 개발:** 그래서 그는 386 CPU의 기능을 활용해 하드웨어를 직접 제어하며 **"화면에 글자를 아주 빠르게 뿌려주는 기능"** 과 **"키보드 입력을 서버로 바로 보내는 기능"** 을 담은 자신만의 터미널 에뮬레이터를 만들기 시작했습니다.
|
||||
|
||||
|
||||
그 결과물이 점점 살이 붙어 오늘날 전 세계 서버를 지배하는 **리눅스**가 된 것이죠.
|
||||
|
||||
---
|
||||
|
||||
## 4. 철학적 차이 (마이크로 커널 vs 모놀리식 커널)
|
||||
|
||||
이 부분은 타넨바움 교수와 리누스 토르발즈 사이의 유명한 논쟁(Tanenbaum–Torvalds debate)으로도 잘 알려져 있습니다.
|
||||
|
||||
- **미닉스의 설계 (마이크로 커널):** 기능들을 잘게 쪼개어 안정성을 높이는 구조였지만, 당시 기술로는 속도가 느리고 구조가 너무 복잡했습니다.
|
||||
|
||||
- **리눅스의 설계 (모놀리식 커널):** 리누스는 성능을 최우선으로 생각하여 모든 핵심 기능을 하나로 묶은 구조를 선택했습니다. 결과적으로 리눅스는 미닉스보다 훨씬 빠르고 강력한 성능을 보여주었습니다.
|
||||
|
||||
|
||||
결국 리누스 토르발즈는 **"내 마음에 쏙 드는, 최신 하드웨어를 제대로 쓰는, 자유로운 유닉스가 없다면 내가 직접 만들겠다"** 는 생각으로 리눅스를 시작한 셈입니다.
|
||||
|
||||
당시 리누스가 리눅스를 처음 발표하며 미닉스 뉴스그룹에 올린 메일에서 **단순히 취미일 뿐이고, GNU처럼 크고 전문적인 건 아니다(just a hobby, won't be big and professional like gnu)** 라고 겸손하게 말했던 것은 아주 유명한 일화입니다.
|
||||
|
||||
---
|
||||
@@ -1,27 +0,0 @@
|
||||
- 작성 **날짜:** 2026-02-27
|
||||
|
||||
## 📑 개념
|
||||
> [!abstract]
|
||||
> 코드가 작성된 순간부터 실제 사용자에게 서비스되기까지의 모든 과정(빌드, 테스트, 배포)을 자동화한 일련의 단계
|
||||
흔히 **CI/CD 파이프라인**이라고도 부릅니다.
|
||||
## 📌 파이프라인의 주요 단계
|
||||
> [!check]
|
||||
> |**단계**|**명칭**|**주요 작업**|
|
||||
> |---|---|---|
|
||||
> |**1. Source**|**코드 관리**|개발자가 코드를 수정하고 저장소(Git)에 푸시(Push)하는 단계.|
|
||||
> |**2. Build**|**컴파일/패키징**|코드를 실행 가능한 파일로 만들거나 컨테이너 이미지(Docker)로 빌드하는 단계.|
|
||||
> |**3. Test**|**검증**|단위 테스트, 통합 테스트 등을 통해 코드의 결함이나 성능을 체크하는 단계.|
|
||||
> |**4. Deploy**|**출시**|검증된 결과물을 실제 서버(EC2, Fargate 등)에 배포하여 서비스를 업데이트하는 단계.|
|
||||
|
||||
"소스 코드의 변경 사항을 사용자에게 전달하는 과정을 **표준화하고 자동화한 워크플로우**"
|
||||
## 📝 노트
|
||||
> [!note]
|
||||
>
|
||||
> - 주요 단계들을 표준화하고 자동화한 워크플로우를 배포 파이프라인이라고 함.
|
||||
> - Jenkins가 CI/CD 엔진, 즉 배포 파이프라인 엔진임
|
||||
> - git으로 코드를 푸시하면 푸시된 코드를 기준으로 Build, Test, Deploy 까지 자동으로 진행해주는걸 의미함
|
||||
> - CI/CD엔진으로 AWS의 CodePipeline 이 있고 Github의 Actions 가 있음
|
||||
>
|
||||
|
||||
## 🔗 지식 연결
|
||||
- **태그:** #zettelkasten #knowledge
|
||||
@@ -1,50 +0,0 @@
|
||||
---
|
||||
id: 보안 그룹(Security Group) 20260305
|
||||
created: 2026-03-05 10:54
|
||||
tags:
|
||||
---
|
||||
## 💡 생각
|
||||
방화벽이 허용(비허용)하는 범위를 그룹핑했다는 의미로 보안그룹이라고 이름붙인 것 같음.
|
||||
방화벽을 유연하고 쉽게 적용할 수 있도록 해놓은 형태
|
||||
하나 이상의 보안그룹을 동시에 설정 가능함. (합집합 형태로 적용됨)
|
||||
|
||||
> [!example]
|
||||
> 보안그룹1: A,B 허용
|
||||
> 보안그룹2: B,C,D 허용
|
||||
> 보안그룹 1,2 모두 지정하면 A,B,C,D 모두 허용됨
|
||||
|
||||
---
|
||||
## 📑 개념
|
||||
**"인스턴스(가상 서버)를 감싸고 있는 가상 방화벽"**입니다.**
|
||||
|
||||
## 📌 상세
|
||||
### 1. 허용(Allow) 규칙만 설정 가능
|
||||
|
||||
보안 그룹에는 "이 IP는 차단해!"라는 거부(Deny) 규칙을 만들 수 없습니다. 기본적으로 모든 통로를 막아두고, **"이 포트와 이 IP만 들어오게 해줘"**라는 허용 규칙만 추가하는 방식(화이트리스트)입니다.
|
||||
|
||||
### 2. 상태 저장(Stateful) 방식
|
||||
|
||||
가장 똑똑한 기능 중 하나입니다.
|
||||
|
||||
- **인바운드(Inbound):** 밖에서 안으로 들어오는 요청이 허용되었다면,
|
||||
|
||||
- **아웃바운드(Outbound):** 안에서 나가는 응답은 별도의 설정 없이도 **자동으로 허용**됩니다. (반대도 마찬가지입니다.)
|
||||
|
||||
|
||||
### 3. 인스턴스 단위의 보안
|
||||
|
||||
네트워크 전체(서브넷)를 막는 ACL(Network ACL)과 달리, 보안 그룹은 **개별 인스턴스 단위**로 적용됩니다. 예를 들어, 웹 서버용 보안 그룹과 DB 서버용 보안 그룹을 따로 만들어 각각 채워줄 수 있습니다.
|
||||
|
||||
### 4. 언제든지 변경 가능
|
||||
|
||||
규칙을 수정하면 해당 보안 그룹을 사용하는 모든 인스턴스에 **즉시 적용**됩니다. 서버를 껐다 켤 필요가 없습니다.
|
||||
|
||||
## 📝 노트
|
||||
> [!note]
|
||||
>
|
||||
> - 관련 사례나 반대되는 개념이 있다면 여기에 기록하세요.
|
||||
>
|
||||
> - 본인의 언어로 풀어서 쓰는 것이 제텔카스텔의 핵심입니다.
|
||||
>
|
||||
|
||||
---
|
||||
@@ -1,23 +0,0 @@
|
||||
- 작성 **날짜:** 2026-02-27
|
||||
|
||||
## 📑 개념
|
||||
> [!abstract]
|
||||
> 시스템, 데이터, 그리고 네트워크를 **비인가된 접근, 수정, 파괴**로부터 보호하는 능력
|
||||
|
||||
## 📌 상세
|
||||
|
||||
| **요소** | **설명** | **핵심 가치** |
|
||||
| ------------------------- | ----------------------------------- | ------------- |
|
||||
| **기밀성 (Confidentiality)** | 허가된 사용자만이 정보에 접근할 수 있어야 함. | 암호화, 접근 제어 |
|
||||
| **무결성 (Integrity)** | 데이터가 전송되거나 저장될 때 임의로 수정되지 않아야 함. | 디지털 서명, 해시 함수 |
|
||||
| **가용성 (Availability)** | 인가된 사용자가 필요할 때 언제든 자원을 사용할 수 있어야 함. | DDoS 방어, 이중화 |
|
||||
|
||||
|
||||
## 📝 상세 설명
|
||||
> [!note]
|
||||
>
|
||||
> - 말그대로 외부의 공격으로부터 보호가 잘 되어지는지를 말함
|
||||
>
|
||||
|
||||
## 🔗 지식 연결
|
||||
- **태그:** #zettelkasten #knowledge
|
||||
@@ -1,34 +0,0 @@
|
||||
- 작성 **날짜:** 2026-02-27
|
||||
|
||||
## 📑 개념
|
||||
> [!abstract]
|
||||
> 투입된 자원(시간, 인력, 비용) 대비 얻어낸 산출물(결과물, 가치)의 비율
|
||||
>
|
||||
> IT 아키텍처 관점에서의 생산성은 단순히 코드를 빨리 짜는 것을 넘어, 얼마나 효율적으로 서비스를 운영하고 비즈니스 가치를 빠르게 시장에 전달할 수 있느냐(**Time-to-Market**)에 초점이 맞춰져 있습니다.
|
||||
|
||||
### 1. 생산성의 정의
|
||||
|
||||
경제학적 관점과 소프트웨어 공학적 관점에서의 생산성은 다음과 같이 정의됩니다.
|
||||
|
||||
$$생산성 = \frac{Output (산출물)}{Input (투입 자원)}$$
|
||||
|
||||
- **IT에서의 Input:** 개발 시간, 운영 인력, 인프라 비용, 기술 부채.
|
||||
|
||||
- **IT에서의 Output:** 배포된 기능의 수, 서비스 안정성, 고객 만족도, 매출 가치.
|
||||
|
||||
### 2. 생산성을 결정짓는 3대 요소
|
||||
|
||||
|**요소**|**세부 내용**|
|
||||
|---|---|
|
||||
|**도구 및 기술 (Tools)**|자동화 도구(CI/CD), 클라우드 서비스(Fargate 등), 효율적인 프레임워크 사용.|
|
||||
|**프로세스 (Process)**|애자일(Agile) 방법론, 코드 리뷰 체계, 명확한 문서화(PARA/제텔카스텐 등).|
|
||||
|**인적 자원 (People)**|개발자의 숙련도, 팀 간의 원활한 커뮤니케이션, 집중할 수 있는 환경.|
|
||||
|
||||
## 📝노트
|
||||
> [!note]
|
||||
>
|
||||
> - 즉 생산성이 좋다는건 투입되는 리소스 대비 산출물이 많은 경우를 의미함
|
||||
> - 생산성 측정에 가치도 포함되어있기 때문에 단순히 양이 많다고 생산성이 좋은건 아니다
|
||||
|
||||
## 🔗 지식 연결
|
||||
- **태그:** #zettelkasten #knowledge
|
||||
@@ -1,17 +0,0 @@
|
||||
- 작성 **날짜:** 2026-02-27
|
||||
|
||||
## 📑 개념
|
||||
> [!abstract]
|
||||
> **서버리스(Serverless)**는 이름 그대로 "서버가 없다"는 뜻이 아니라, **"사용자가 서버를 관리할 필요가 없는 컴퓨팅 모델"**을 의미합니다. 인프라의 복잡한 추상화를 통해 개발자는 오직 **코드(비즈니스 로직)**에만 집중할 수 있는 환경을 말합니다.
|
||||
|
||||
## 📌 상세
|
||||
> [!check]
|
||||
|**특징**|**세부 설명**|
|
||||
|---|---|
|
||||
|**관리 서버 없음**|OS 설치, 패치, 하드웨어 관리에 신경 쓸 필요가 없음.|
|
||||
|**유연한 확장성**|트래픽에 따라 자원이 자동으로 늘어나거나 줄어듦 (Auto-scaling).|
|
||||
|**사용량 기반 과금**|서버를 켜둔 시간이 아니라, 실제 코드가 실행된 시간/횟수만큼만 비용 지불.|
|
||||
|**고가용성 내장**|클라우드 제공사가 여러 가용 영역에 걸쳐 리소스를 분산하여 안정성 보장.|
|
||||
|
||||
## 🔗 지식 연결
|
||||
- **태그:** #zettelkasten #knowledge
|
||||
@@ -1,33 +0,0 @@
|
||||
- 작성 **날짜:** 2026-02-27
|
||||
|
||||
## 📑 개념
|
||||
> [!abstract]
|
||||
> 거대한 네트워크인 [[VPC(Virtual Private Cloud)]]를 더 효율적이고 안전하게 관리하기 위해 **더 작은 단위로 쪼갠 가상 네트워크**
|
||||
|
||||
**참고로 VPC도 서브넷도 모두 논리적인 개념, 물리적인 동작은 가용 영역에서 이루어짐**
|
||||
|
||||
## 📌 서브넷을 나누는 이유
|
||||
> [!check]
|
||||
> - **보안 (Security):** 인터넷에 연결될 공간과 외부로부터 완전히 격리될 공간을 분리하기 위해서입니다.
|
||||
>
|
||||
> - **성능 (Performance):** 네트워크 트래픽이 한꺼번에 몰리는 것을 방지하고 관리 효율성을 높입니다.
|
||||
>
|
||||
> - **조직화:** 용도별(웹 서버용, DB용, 관리용 등)로 자원을 그룹화하여 관리하기 위함입니다.
|
||||
|
||||
## 📝 노트
|
||||
> [!note]
|
||||
>
|
||||
> - VPC가 아파트 단지라면 서브넷은 아파트단지의 동이라고 생각하면 됨.
|
||||
> - AWS의 클라우드를 VPC 단위로 쪼개서 사용하고 그 VPC는 서브넷 단위로 쪼개서 사용함
|
||||
> - 서브넷 단위로 분할하지 않으면 VPC로 접근하는 요청들은 VPC내에있는 모든 서비스들에게 전달해주어야함. 이를 막기위해 존재하는 개념(한번에 모든 동을 다 찾아가지 않게끔)
|
||||
|
||||
### 서브넷의 종류
|
||||
|
||||
| **구분** | **퍼블릭 서브넷 (Public)** | **프라이빗 서브넷 (Private)** |
|
||||
| --------- | ----------------------------- | ---------------------------- |
|
||||
| **특징** | 외부 인터넷과 양방향 통신 가능 | 외부 인터넷에서 직접 접근 불가 |
|
||||
| **연결 방식** | **인터넷 게이트웨이(IGW)**와 연결됨 | 인터넷 게이트웨이와 연결되지 않음 |
|
||||
| **배치 자원** | 로드 밸런서(ALB), 배스천 호스트(Bastion) | **백엔드 서버(.NET)**, 데이터베이스(DB) |
|
||||
| **비유** | 아파트 정문 안내소 (누구나 방문 가능) | 아파트 내부의 안방 (가족만 접근 가능) |
|
||||
## 🔗 지식 연결
|
||||
- **태그:** #zettelkasten #knowledge
|
||||
@@ -1,70 +0,0 @@
|
||||
---
|
||||
id: 순수 함수(Pure Function) 20260407
|
||||
created: 2026-04-07 15:50
|
||||
tags:
|
||||
aliases:
|
||||
---
|
||||
## 💡 생각
|
||||
[[유닉스의 철학과 필터]] 에서의 필터의 개념 중 한가지만 잘하게 + 함께 동작하게 를 지키기 위해서 지켜져야 할 최소한의 조건. 왜냐하면 순수하지 않은 필터는 함께 동작하기가 굉장히 어려워질 수 있고 동작중에 외부의 값을 바꿔버리면서 동작이 제대로 되지 않거나 멈춰버릴수도 있기 때문임.
|
||||
|
||||
---
|
||||
## 📑 개념
|
||||
외부 상태에 의존하지 않고 오직 입력값에만 반응하며, 외부에 아무런 영향을 주지 않는 '깨끗한' 함수를 의미합니다.
|
||||
|
||||
순수 함수가 되기 위해서는 다음 두 가지 조건을 반드시 만족해야 합니다.
|
||||
|
||||
## 1. 동일한 입력에는 항상 동일한 출력 (Deterministic)
|
||||
|
||||
함수가 실행되는 시점이나 환경에 상관없이, **매개변수(Input)**가 같다면 결과값은 늘 똑같아야 합니다.
|
||||
|
||||
- **순수 함수 예시:**
|
||||
``` javascript
|
||||
function add(a, b) {
|
||||
return a + b;
|
||||
}
|
||||
```
|
||||
|
||||
이 함수는 언제 어디서 실행하든 `add(2, 3)`을 호출하면 무조건 **5**를 반환합니다.
|
||||
|
||||
- **비순수 함수 예시:**
|
||||
``` javascript
|
||||
let tax = 0.1;
|
||||
function calculatePrice(price) {
|
||||
return price + (price * tax); // 외부 변수 tax에 의존
|
||||
}
|
||||
```
|
||||
|
||||
외부의 `tax` 값이 바뀌면 결과가 달라지므로 순수 함수가 아닙니다. `Math.random()`이나 현재 시간을 가져오는 함수도 실행할 때마다 결과가 달라지기 때문에 비순수 함수에 해당합니다.
|
||||
|
||||
## 2. 부수 효과가 없음 (No Side Effects)
|
||||
|
||||
함수 내부에서 함수 밖의 상태를 변경하거나, 외부와 상호작용(입출력 등)을 하지 않아야 합니다.
|
||||
|
||||
- **피해야 할 부수 효과들:**
|
||||
|
||||
- 외부 변수 수정
|
||||
|
||||
- 객체나 배열 등 참조형 데이터의 원본 수정
|
||||
|
||||
- 콘솔 출력(`console.log`)이나 파일 쓰기
|
||||
|
||||
- 네트워크 요청(API 호출)
|
||||
|
||||
|
||||
---
|
||||
|
||||
## 순수 함수의 장점
|
||||
|
||||
왜 굳이 이렇게 엄격하게 함수를 만들까요? 그 이유는 다음과 같은 이점 때문입니다.
|
||||
|
||||
1. **예측 가능성:** 코드가 어떻게 동작할지 머릿속으로 그리기가 훨씬 쉬워집니다.
|
||||
|
||||
2. **테스트 용이성:** 외부 환경을 설정(Mocking)할 필요 없이 입력값만 넣으면 되므로 단위 테스트가 매우 간편합니다.
|
||||
|
||||
3. **디버깅 효율:** 함수 내부에서 외부를 건드리지 않으니, 버그가 생겼을 때 추적 범위가 확 좁아집니다.
|
||||
|
||||
4. **캐싱(Memoization):** 동일 입력에 동일 출력이 보장되므로, 계산이 복잡한 경우 결과를 저장해두고 재사용할 수 있어 성능 최적화에 유리합니다.
|
||||
|
||||
|
||||
> [!note] 프로젝트를 진행할 때 모든 함수를 순수 함수로 만들 수는 없지만(결국 화면 출력이나 데이터 저장이 필요하니까요), 가능한 많은 로직을 순수 함수로 분리하면 전체적인 코드의 안정성이 크게 올라갑니다.
|
||||
|
||||
@@ -1,28 +0,0 @@
|
||||
---
|
||||
id: 신호 대 소음비(Signal-to-Noise Ratio) 20260317
|
||||
created: 2026-03-17 17:24
|
||||
tags:
|
||||
aliases:
|
||||
---
|
||||
## 💡 생각
|
||||
신호 대 소음비가 높다는건 아무리 생각해도 신호 대비 소음의 비율이 높다는걸로 보이는데..
|
||||
그냥 신호 대 소음비 라는거를 고유명사처럼 생각하는게 편할듯
|
||||
신호 대 소음비가 높다 -> 의미있는 정보의 비중이 높다
|
||||
|
||||
---
|
||||
## 📑 개념
|
||||
**무엇이 신호고 무엇이 소음인가?**
|
||||
**신호 대 소음비를 높인다**는 말은 **불필요한 소음(노이즈)을 최대한 제거해서 순수한 정보(신호)만 남긴다** 는 뜻
|
||||
|
||||
## 📌 상세
|
||||
신호중에 소음의 비율이 얼마인가? 라고 생각했는데...
|
||||
> [!question]
|
||||
> Q. 신호 대 소음비가 높단건 신호 : 소음 중 소음의 비율이 크다는거아냐?
|
||||
> A. 아, 그렇게 생각하실 수도 있겠네요! 수학적인 분수 구조를 떠올려보시면 바로 이해가 되실 거예요.
|
||||
> **신호 대 소음비($SNR$)**는 말 그대로 **신호($Signal$)를 소음($Noise$)으로 나눈 값**입니다.
|
||||
$$SNR = \frac{\text{Signal}}{\text{Noise}}$$
|
||||
|
||||
- **신호 대 소음비가 높다:** 노래 소리(신호)는 쩌렁쩌렁한데 지지직거리는 잡음(소음)은 거의 안 들리는 상태입니다. 아주 깨끗하게 들리겠죠?
|
||||
- **신호 대 소음비가 낮다:** 노래 소리는 작은데 잡음이 너무 커서 노래가 묻히는 상태입니다. 짜증이 나고 듣기 힘듭니다.
|
||||
|
||||
---
|
||||
@@ -1,41 +0,0 @@
|
||||
---
|
||||
id: "싱글 테넌시(Single-tenancy) 20260305"
|
||||
created: "2026-03-05 13:06"
|
||||
tags:
|
||||
---
|
||||
## 💡 생각
|
||||
이곳에 하나의 생각 또는 아이디어를 작성합니다.
|
||||
|
||||
|
||||
---
|
||||
## 📑 개념
|
||||
하나의 소프트웨어 인스턴스가 **단 한 명의 사용자**만을 위해 독립적으로 운영되는 구조
|
||||
단독 주택에 한 가족만 사는 것과 같습니다.
|
||||
|
||||
## 📌 상세
|
||||
- **특징:** 사용자마다 전용 인프라와 데이터베이스가 할당됩니다.
|
||||
|
||||
- **장점:**
|
||||
|
||||
- **높은 보안성:** 물리적/논리적으로 완전히 격리되어 있어 보안이 강력합니다.
|
||||
|
||||
- **커스터마이징:** 해당 사용자만을 위한 맞춤 설정이 자유롭습니다.
|
||||
|
||||
- **단점:** * **비용 부담:** 인프라 구축 및 유지보수 비용이 높습니다.
|
||||
|
||||
- **관리 복잡도:** 각 사용자별로 업데이트나 관리를 따로 해야 합니다.
|
||||
|
||||
- **예시:** 온프레미스 서버 구축, 특정 기업용 전용 클라우드 서비스.
|
||||
|
||||
## 📝 노트
|
||||
> [!note]
|
||||
>
|
||||
> - 관련 사례나 반대되는 개념이 있다면 여기에 기록하세요.
|
||||
>
|
||||
> - 본인의 언어로 풀어서 쓰는 것이 제텔카스텔의 핵심입니다.
|
||||
>
|
||||
|
||||
---
|
||||
|
||||
## 🔗 관련 노트
|
||||
[[테넌시(Tenancy)]], [[멀티 테넌시(Multi-tenancy)]]
|
||||
@@ -1,27 +0,0 @@
|
||||
---
|
||||
id: "안드로이드 스튜디오 무선디버깅 20260407"
|
||||
created: "2026-04-07 11:15"
|
||||
tags:
|
||||
aliases:
|
||||
---
|
||||
### android studio <-> smart phone 무선 디버깅 방법
|
||||
|
||||
휴대폰의 설정 > 개발자 옵션으로 들어갑니다.
|
||||
무선 디버깅 항목을 누릅니다 (스위치만 켜지 말고, 글자를 눌러 상세 페이지로 진입하세요).
|
||||
화면에 보이는 'IP 주소 및 포트' 정보를 확인합니다.
|
||||
예: 192.168.0.15:42135 (이 포트는 매번 바뀝니다!)
|
||||
|
||||
안드로이드스튜디오에서 터미널을 연다 (alt + f12)
|
||||
터미널에 아래와같이 입력한다.
|
||||
|
||||
#### 1. 혹시 모를 찌꺼기 프로세스 정리
|
||||
adb kill-server
|
||||
adb start-server
|
||||
|
||||
#### 2. 기기에 표시된 IP와 포트로 직접 연결
|
||||
adb connect 192.168.0.15:42135
|
||||
|
||||
adb 권한 타임아웃 해제
|
||||
개발자 옵션에 있는 'ADB 권한 타임아웃 해제(Disable adb authorization timeout)' 기능은 보안과 편의성 사이의 균형을 조절하는 옵션입니다.
|
||||
간단히 설명하자면, "이 PC를 신뢰할까요?"라고 물어봤던 그 인증 유효기간을 무제한으로 늘려주는 기능입니다.
|
||||
사용자님처럼 안드로이드 스튜디오로 개인 프로젝트나 업무를 하시는 분들은 이 기능을 '켬(Enable)' 상태로 두는 것을 추천합니다.
|
||||
@@ -1,62 +0,0 @@
|
||||
---
|
||||
id: "용량 공급자 전략 (Capacity Provider Strategy) 20260305"
|
||||
created: "2026-03-05 10:32"
|
||||
tags:
|
||||
---
|
||||
## 💡 생각
|
||||
이곳에 하나의 생각 또는 아이디어를 작성합니다.
|
||||
|
||||
|
||||
---
|
||||
## 📑 개념
|
||||
> [!abstract]
|
||||
> 하나 이상의 인프라(용량 공급자)를 **어떤 비율로 섞어서 쓸지** 결정하는 고도화된 방식입니다.
|
||||
> "평소엔 **[[파게이트(Fargate)]]**를 쓰되, 비용 절감을 위해 일부는 **[[파게이트 스팟(Fargate Spot)]]**을 섞어서 써줘" 같은 전략을 짤 수 있습니다.
|
||||
|
||||
## 📌 상세
|
||||
- **방식:** "평소엔 **[[파게이트(Fargate)]]**를 쓰되, 비용 절감을 위해 일부는 **[[파게이트 스팟(Fargate Spot)]]**을 섞어서 써줘" 같은 전략을 짤 수 있습니다.
|
||||
|
||||
- **핵심 요소:**
|
||||
|
||||
- **Base (기본값):** 최소한 이만큼은 특정 공급자에서 실행해라 (예: 최소 2개는 안정적인 Fargate에서 실행).
|
||||
|
||||
- **Weight (가중치):** 추가로 늘어나는 태스크는 어떤 비율로 나눌 것인가 (예: Fargate 1 : Fargate Spot 3 비율로 확장).
|
||||
|
||||
- **비유:** "기본 식사 2인분은 코스 요리로 주고, 그 이후 추가되는 음식은 뷔페식 3 : 단품 1 비율로 섞어와주세요"라고 정교하게 주문하는 것과 같습니다.
|
||||
|
||||
### 기본 (Base)
|
||||
|
||||
- **의미:** "무슨 일이 있어도 **최소 이만큼의 개수**는 이 공급자에서 실행해라."
|
||||
|
||||
- **작동 방식:** 서비스가 시작될 때 가장 먼저 채워지는 숫자입니다.
|
||||
|
||||
- **예시:** 만약 `기본`을 2로 설정하면, 전체 태스크가 10개든 100개든 상관없이 처음 2개는 무조건 지정된 공급자(Fargate)에서 실행됩니다.
|
||||
|
||||
### 가중치 (Weight)
|
||||
|
||||
- **의미:** "기본(Base) 개수를 채우고 남은 태스크들을 **어떤 비율**로 나눌 것인가?"
|
||||
|
||||
- **작동 방식:** 여러 공급자를 추가했을 때 상대적인 비율로 계산됩니다.
|
||||
|
||||
- **예시:** `FARGATE(가중치 1)`와 `FARGATE_SPOT(가중치 3)`으로 설정하면, 기본 개수를 채운 후 추가되는 4개의 태스크 중 1개는 Fargate, 3개는 Spot에 배치됩니다.
|
||||
|
||||
### 💡 왜 '용량 공급자 전략'을 써야 할까요? (핵심 이유)
|
||||
가장 큰 장점은 **비용 절감과 자동 스케일링**입니다. 특히 **[[EC2(Elastic Compute Cloud)]]**를 사용하신다면, 시작 유형 방식은 서버(EC2)가 모자랄 때 태스크 실행이 실패하지만, 용량 공급자를 쓰면 ECS가 직접 **Auto Scaling Group(ASG)**에 명령을 내려서 서버를 새로 받아온 뒤 그 위에 [[태스크(Task)]]를 띄워줍니다.
|
||||
|
||||
**[[파게이트(Fargate)]]**를 쓰실 때도 [[파게이트 스팟(Fargate Spot)]]을 적절히 섞으면 성능은 유지하면서 비용을 최대 70%까지 아낄 수 있기 때문에, ==요즘은 대부분 이 전략 방식을 사용합니다.==
|
||||
|
||||
---
|
||||
|
||||
|
||||
### 추천 시나리오
|
||||
**시나리오: "안정성도 챙기고 돈도 아끼고 싶을 때"**
|
||||
|
||||
|**용량 공급자**|**기본 (Base)**|**가중치 (Weight)**|**설명**|
|
||||
|---|---|---|---|
|
||||
|**FARGATE**|**2**|**1**|**최소 2개**는 절대 꺼지지 않는 일반 Fargate로 유지 (안정성)|
|
||||
|**FARGATE_SPOT**|**0**|**3**|그 이후 늘어나는 태스크는 **75% 비율**로 저렴한 Spot 사용 (비용 절감)|
|
||||
### 왜 이렇게 하나요?
|
||||
|
||||
1. **안정성:** `FARGATE_SPOT`은 AWS에서 자원이 부족하면 예고 없이 꺼질 수 있습니다. 하지만 `Base`를 일반 `FARGATE`로 잡아두면, 서버가 아예 먹통이 되는 사태를 방지할 수 있습니다.
|
||||
|
||||
2. **비용:** 트래픽이 몰려 태스크가 10개, 20개로 늘어날 때, 늘어난 분량의 대부분(75%)을 훨씬 저렴한 Spot으로 돌려 비용을 대폭 아낄 수 있습니다.
|
||||
@@ -1,69 +0,0 @@
|
||||
---
|
||||
id: 윈도우 서버의 멀티 유저 20260407
|
||||
created: 2026-04-07 13:26
|
||||
tags:
|
||||
aliases:
|
||||
---
|
||||
## 💡 생각
|
||||
> [!question]
|
||||
> Q. 윈도우서버의 경우에는 누가 원격접속중일 떄 내가 접속시도를 하면 같은 화면을 둘 이상의 사용자가 동시에 보게되거나 심하면 먼저 접속했던 유저가 접속종료되버리더라고. 윈도우 서버는 이런 멀티유저 환경을 고려하지 않고 설계된거야?
|
||||
>
|
||||
> A. 결론부터 말씀드리면, **윈도우 서버(Windows Server) 역시 완벽한 멀티유저를 지원하도록 설계된 운영체제**입니다. 하지만 일반적인 PC용 윈도우(Windows 10/11)와는 라이선스 정책과 기본 설정값이 다르기 때문에 겪으신 현상이 발생하게 됩니다.
|
||||
|
||||
왜 나는 윈도우 서버는 멀티 유저를 제대로 지원하지 않는다고 착각한걸까?
|
||||
|
||||
---
|
||||
## 📑 개념
|
||||
[[멀티유저(Multi-user)]]
|
||||
![[멀티유저(Multi-user)#📑 개념]]
|
||||
|
||||
하지만 나는 종종 mstsc로 윈도우 서버에 접속할 때 누군가의 '어?' 소리를 들은적이 있고 또 내가 작업중에 로그아웃이 되버려서 '어??' 소리를 낸 적이 있다.
|
||||
이런일이 왜 발생했던걸까?
|
||||
|
||||
|
||||
현재 겪으신 상황은 크게 두 가지 관점에서 이해할 수 있습니다.
|
||||
|
||||
## 1. 윈도우의 기본 모드: 관리용 원격 데스크톱 (Admin Mode)
|
||||
|
||||
윈도우 서버를 설치하면 기본적으로 **최대 2명**까지 동시 접속을 허용합니다.
|
||||
|
||||
- **목적:** 서버 설정 및 유지보수(관리용)입니다.
|
||||
|
||||
- **작동 방식:** 만약 2명의 관리자가 이미 접속해 있는 상태에서 3번째 사람이 접속을 시도하면, 시스템은 기존 사용자 중 한 명을 끊어버리거나(Kick), 접속을 거부합니다.
|
||||
|
||||
- **화면 공유 현상:** 만약 두 명의 사용자가 **동일한 사용자 계정(예: Administrator)** 으로 접속을 시도하면, 설정에 따라 기존 세션을 뺏어오거나(세션 리커넥트), 같은 화면을 보게 되는 경우가 생깁니다.
|
||||
|
||||
## 2. 진정한 멀티유저 환경: 원격 데스크톱 서비스 (RDS)
|
||||
|
||||
수십 명의 사용자가 각자의 독립된 바탕화면을 가지고 동시에 작업하려면, 윈도우 서버에서 **RDS(Remote Desktop Services)** 역할을 활성화해야 합니다.
|
||||
|
||||
- **독립된 세션:** RDS 환경에서는 각 사용자가 접속할 때마다 운영체제가 **개별적인 가상 데스크톱 환경(Session)** 을 생성해 줍니다. 따라서 옆 사람이 무엇을 하는지 서로 간섭할 수 없습니다.
|
||||
|
||||
|
||||
- **라이선스(CAL):** 윈도우 서버는 기본적으로 관리용 2인 외에 추가 사용자가 접속하려면 **RDS CAL**이라는 별도의 라이선스 비용을 요구합니다. MS의 비즈니스 모델상, 멀티유저 기능을 "유료 옵션"으로 분리해 둔 셈입니다.
|
||||
**관리 효율성:** 서버 점검을 위해 관리자 두 명 정도만 들어오면 충분하다는 판단입니다.
|
||||
(돈이 더 큰 이유인거같다.)
|
||||
|
||||
## 3. 요약 및 해결책
|
||||
|
||||
윈도우 서버가 [[멀티유저(Multi-user)]]를 고려하지 않은 것이 아니라, **비용과 설정의 문제**입니다.
|
||||
|
||||
- **먼저 접속한 유저가 튕기는 이유:** 허용된 동시 접속 세션 수(기본 2개)를 초과했거나, 동일한 계정으로 중복 로그인을 시도했기 때문입니다.
|
||||
|
||||
- **해결 방법:**
|
||||
|
||||
1. **서로 다른 계정 사용:** 사용자마다 개별 계정을 생성하여 접속하면 관리 모드에서도 최대 2명까지는 독립적으로 사용 가능합니다.
|
||||
|
||||
2. **RDS 역할 설치:** 3인 이상의 동시 접속이 필요하다면 서버 역할에서 `Remote Desktop Services`를 설치하고 라이선스를 등록해야 합니다.
|
||||
|
||||
3. **그룹 정책(gpedit.msc) 수정:** `컴퓨터 구성 -> 관리 템플릿 -> Windows 구성 요소 -> 터미널 서비스 -> 원격 데스크톱 세션 호스트 -> 연결` 항목에서 **원격 데스크톱 서비스 사용자를 하나의 원격 데스크톱 서비스 세션으로 제한** 옵션을 사용 안 함으로 설정하면 동일 계정으로도 여러 세션을 열 수 있습니다.
|
||||
|
||||
|
||||
> [!note] 결국.. 돈이 문제였다
|
||||
라이센스 문제였을줄이야..
|
||||
|
||||
> [!question]
|
||||
> Q. RDS 역할을 활성화하면 라이센스문제 상관없이 되는거야 아니면 RDs 역할도 설정하고 라이센스비도 내야지 3명이상 동시접속이 가능한거야?
|
||||
> A. 결론부터 말씀드리면, **RDS 역할 활성화와 라이선스 구매(비용 지불)가 모두 이루어져야** 3명 이상의 동시 접속이 가능합니다.
|
||||
|
||||
그냥.. 서버는 리눅스 쓰자. (공짜인데다가 성능도 좋고...)
|
||||
@@ -1,54 +0,0 @@
|
||||
---
|
||||
id: "유닉스(Unix) 20260407"
|
||||
created: "2026-04-07 13:13"
|
||||
tags:
|
||||
aliases:
|
||||
---
|
||||
## 💡 생각
|
||||
HP-UX도 운좋게 사용했는데 앞으로 내가 유닉스를 또 쓸 일이 있을까?
|
||||
그리고 사실.. 리눅스랑 크게 다른 것 같지도 않았다.
|
||||
|
||||
---
|
||||
## 📑 개념
|
||||
**유닉스(Unix)** 는 1960년대 후반부터 개발된 **컴퓨터 운영체제(OS)** 로, 현대 컴퓨팅 환경의 뿌리가 되는 아주 중요한 시스템입니다. 오늘날 우리가 사용하는 리눅스, macOS, 안드로이드 등이 모두 유닉스의 철학과 구조를 계승하고 있습니다.
|
||||
|
||||
## 📌 상세
|
||||
## 1. 유닉스의 핵심 특징
|
||||
|
||||
유닉스는 처음부터 **다중 사용자**와 **다중 작업**을 염두에 두고 설계되었습니다.
|
||||
|
||||
- **멀티태스킹(Multi-tasking):** 여러 개의 프로세스를 동시에 실행할 수 있습니다.
|
||||
|
||||
- [[멀티유저(Multi-user)]] 여러 사람이 동시에 시스템에 접속해서 사용할 수 있습니다.
|
||||
|
||||
- **계층적 파일 시스템:** 모든 데이터를 디렉터리(폴더) 구조로 관리하며, 심지어 하드웨어 장치까지도 파일로 취급합니다.
|
||||
[[리눅스와 유닉스의 파일 시스템]]
|
||||
|
||||
- **높은 이식성:** 대부분 C언어로 작성되어 있어, 다양한 하드웨어 환경에 맞춰 수정하고 설치하기가 매우 쉽습니다.
|
||||
|
||||
## 2. 유닉스의 시스템 구조
|
||||
|
||||
유닉스는 크게 세 가지 계층으로 나뉩니다.
|
||||
|
||||
- [[커널(Kernel)]]: 운영체제의 심장부입니다. 하드웨어를 제어하고 메모리, 프로세스, 파일 시스템 등을 관리하는 가장 핵심적인 역할을 합니다.
|
||||
|
||||
- **셸(Shell):** 사용자와 커널 사이의 다리 역할을 합니다. 사용자가 명령어를 입력하면 이를 해석해서 커널에 전달합니다. (예: bash, zsh 등)
|
||||
|
||||
- **유틸리티/애플리케이션:** 사용자가 실제로 사용하는 프로그램들입니다. 컴파일러, 편집기, 네트워크 도구 등이 여기에 해당합니다.
|
||||
|
||||
## 3. [[유닉스 철학 (The Unix Philosophy)]]
|
||||
|
||||
![[유닉스 철학 (The Unix Philosophy)#개념]]
|
||||
|
||||
---
|
||||
|
||||
## 4. 유닉스의 계보와 영향
|
||||
|
||||
유닉스는 시간이 지나면서 여러 갈래로 발전했습니다.
|
||||
|
||||
- **BSD 계열:** 캘리포니아 대학교 버클리 캠퍼스에서 발전시킨 버전으로, 현재의 **macOS**와 **iOS**의 기반이 되었습니다.
|
||||
|
||||
- **System V 계열:** 상용 유닉스의 표준이 된 버전입니다.
|
||||
|
||||
- **리눅스(Linux):** 유닉스는 아니지만 유닉스의 작동 방식을 본떠 만든 **유닉스 계열(Unix-like)** 운영체제입니다. 현재 서버와 모바일 시장의 절대 강자죠.
|
||||
|
||||
@@ -1,22 +0,0 @@
|
||||
- 작성 **날짜:** 2026-02-27
|
||||
|
||||
## 📑 개념
|
||||
> [!abstract]
|
||||
> "변화에 얼마나 쉽고 빠르게 대응할 수 있는가?"
|
||||
|
||||
## 📌 상세
|
||||
> [!check]
|
||||
> - **환경의 유연성:** 온프레미스에서 클라우드로, 또는 윈도우에서 리눅스로 실행 환경을 옮길 때의 용이성.
|
||||
>
|
||||
> - **구조의 유연성:** 마이크로서비스 아키텍처(MSA)처럼 특정 기능을 수정할 때 전체 시스템에 영향을 주지 않고 독립적으로 변경할 수 있는 능력.
|
||||
>
|
||||
> - **기술의 유연성:** 특정 벤더(Vendor Lock-in)에 종속되지 않고 필요에 따라 다양한 오픈 소스나 도구를 조합할 수 있는 상태.
|
||||
|
||||
## 📝 노트
|
||||
> [!note]
|
||||
>
|
||||
> - 어떠한 상황에 얼마나 유연하게 잘 대응할 수 있는지, 단어 뜻 그대로 이해하면 될듯
|
||||
>
|
||||
|
||||
## 🔗 지식 연결
|
||||
- **태그:** #zettelkasten #knowledge
|
||||
@@ -1,50 +0,0 @@
|
||||
---
|
||||
id: "유연한 단순함 20260318"
|
||||
created: "2026-03-18 09:22"
|
||||
tags:
|
||||
aliases:
|
||||
---
|
||||
## 💡 생각
|
||||
복잡하게 생각하지 말고 단순하게 개발하되 유연한 코드를 만들어야한다.
|
||||
|
||||
---
|
||||
|
||||
### 1. '미리 구현하는 것'과 '길을 열어두는 것'의 차이
|
||||
|
||||
업스케일링을 염두에 둔다는 것이 처음부터 복잡한 분산 처리 시스템이나 거대한 프레임워크를 도입하라는 뜻이 아닙니다.
|
||||
|
||||
- **나쁜 설계 (과잉 엔지니어링):** "나중에 사용자가 100만 명이 될지 모르니, 지금 당장 Redis 캐시를 붙이고 마이크로서비스로 쪼개자!" → **단순함 위반 (YAGNI)**
|
||||
|
||||
- **좋은 설계 (확장성 고려):** "지금은 로컬 DB를 쓰지만, 나중에 DB가 바뀌거나 서버가 늘어날 수 있으니 **로직과 데이터 접근 코드를 분리**해두자." → **유연한 단순함**
|
||||
|
||||
|
||||
즉, **나중에 고치기 힘들게 코드를 꼬아놓지 않는 것** 자체가 업스케일링을 준비하는 가장 단순한 방법입니다.
|
||||
|
||||
### 2. 파레토 법칙의 재해석
|
||||
|
||||
데이터가 늘어날 때 문제가 생기는 지점은 대개 전체 코드의 20%도 안 됩니다.
|
||||
|
||||
- **단순화:** 80%의 일반적인 로직은 최대한 읽기 쉽고 단순하게 짭니다.
|
||||
|
||||
- **업스케일링 대비:** 나머지 20%의 핵심 로직(예: 데이터 조회, 대량 처리)에서 **확장 가능한 패턴(Interface 사용, 비동기 처리 등)**을 적용하는 것입니다.
|
||||
|
||||
|
||||
이것은 모든 곳에 힘을 주는 것이 아니라, **성능의 급소가 될 만한 곳에만 최소한의 설계적 장치**를 해두는 전략입니다.
|
||||
|
||||
### 3. '버티는 코드'의 진짜 의미: 가독성
|
||||
|
||||
역설적이게도 데이터가 늘어나서 문제가 생겼을 때, 그 문제를 가장 빨리 해결할 수 있는 코드는 **단순한 코드**입니다.
|
||||
|
||||
- 코드가 단순하면 어디가 병목인지 금방 찾을 수 있습니다.
|
||||
|
||||
- 코드가 단순하면 최적화된 알고리즘으로 교체하기가 매우 쉽습니다.
|
||||
|
||||
- 반면, 미리 업스케일링을 한답시고 복잡하게 짜놓은 코드는 정작 문제가 터졌을 때 수정하기가 훨씬 어렵습니다.
|
||||
|
||||
## 📝 노트
|
||||
> [!note]
|
||||
>
|
||||
> - **"추측에 근거해서 미리 복잡한 기능을 만들지 말되(단순함), 나중에 그 기능을 개선해야 할 때 코드 전체를 갈아엎지 않아도 되게끔 '벽'을 잘 세워두라(확장성)"**
|
||||
>
|
||||
|
||||
---
|
||||
@@ -1,46 +0,0 @@
|
||||
---
|
||||
id: "최적화(Optimization) 20260317"
|
||||
created: "2026-03-17 16:59"
|
||||
tags:
|
||||
aliases:
|
||||
---
|
||||
## 💡 생각
|
||||
이곳에 하나의 생각 또는 아이디어를 작성합니다.
|
||||
|
||||
---
|
||||
## 📌 상세
|
||||
### 1. 설계의 최적화 = 구조의 단순화
|
||||
|
||||
흔히 최적화라고 하면 '기교를 부려 속도를 높이는 것'을 생각하기 쉽지만, 가장 높은 수준의 최적화는 **불필요한 단계를 제거**하는 것입니다.
|
||||
|
||||
- **복잡한 로직:** A를 거쳐 B를 확인하고 C를 실행한다.
|
||||
|
||||
- **최적화된 로직:** 바로 C를 실행해도 문제가 없음을 발견하고 중간 과정을 삭제한다.
|
||||
|
||||
- **결과:** 성능은 빨라지고(최적화), 코드는 짧아집니다(단순화).
|
||||
|
||||
|
||||
### 2. 인지적 최적화 (Cognitive Optimization)
|
||||
|
||||
코드는 컴퓨터만 읽는 게 아니라 사람도 읽습니다. 읽기 복잡한 코드는 디버깅과 유지보수 시간을 엄청나게 잡아먹죠.
|
||||
|
||||
- **단순한 코드**는 개발자가 코드를 이해하는 데 드는 **뇌의 연산 비용(Cognitive Load)**을 최소화해 줍니다.
|
||||
|
||||
- 결과적으로 전체 개발 프로세스의 성능을 높이는 '사람을 위한 최적화'가 되는 셈입니다.
|
||||
|
||||
|
||||
### 3. 알고리즘적 최적화
|
||||
|
||||
예를 들어, 데이터를 찾을 때 전체를 다 뒤지는 `O(n)` 방식보다, 정렬된 데이터에서 이진 탐색을 하는 `O(log n)` 방식이 훨씬 빠릅니다.
|
||||
|
||||
- 때로는 효율적인 알고리즘(최적화)을 선택하는 것이, 지저분한 예외 처리를 잔뜩 넣어둔 이전 코드보다 훨씬 **간결하고 명확(단순화)**할 수 있습니다.
|
||||
|
||||
## 📝 노트
|
||||
> [!note]
|
||||
>
|
||||
> - 관련 사례나 반대되는 개념이 있다면 여기에 기록하세요.
|
||||
>
|
||||
> - 본인의 언어로 풀어서 쓰는 것이 제텔카스텔의 핵심입니다.
|
||||
>
|
||||
|
||||
---
|
||||
@@ -1,40 +0,0 @@
|
||||
---
|
||||
id: 커널(Kernel) 20260407
|
||||
created: 2026-04-07 13:40
|
||||
tags:
|
||||
- operating-system
|
||||
- os
|
||||
- hardware
|
||||
- computer
|
||||
- computer-science
|
||||
aliases:
|
||||
---
|
||||
## 💡 생각
|
||||
실제 하드웨어 자원을 관리하고 사용자의 요청에 하드웨어를 조작해주는 관리자.
|
||||
사용자 <-> 하드웨어 사이의 인터페이스는 모두 커널이 해준다고 보면 됨.
|
||||
|
||||
---
|
||||
## 📑 개념
|
||||
운영체제(OS)의 **커널(Kernel)** 은 한마디로 **컴퓨터의 심장이자 모든 자원을 관리하는 관리자**라고 할 수 있습니다. 사용자가 실행하는 프로그램과 컴퓨터의 하드웨어 사이에서 다리 역할을 수행하는 아주 핵심적인 소프트웨어 계층입니다.
|
||||
|
||||
## 1. 커널의 핵심 기능
|
||||
|
||||
커널은 사용자가 직접 하드웨어를 제어하지 못하게 막으면서, 대신 안전하고 효율적으로 자원을 배분합니다.
|
||||
|
||||
- **프로세스 관리**: 여러 개의 프로그램이 동시에 실행될 수 있도록 CPU 사용 시간을 나누고 관리합니다.
|
||||
|
||||
- **메모리 관리**: 각 프로그램이 어느 정도의 메모리를 사용할지 결정하고, 서로의 영역을 침범하지 못하게 보호합니다.
|
||||
|
||||
- **파일 시스템 관리**: 하드디스크나 SSD에 데이터를 저장하고 읽어오는 방식을 제어합니다.
|
||||
|
||||
- **장치 드라이버 제어**: 모니터, 키보드, 마우스 등 각종 하드웨어와 통신하여 명령을 전달합니다.
|
||||
|
||||
- **시스템 호출(System Call) 제공**: 응용 프로그램이 하드웨어 자원을 쓰고 싶을 때 커널에 요청할 수 있는 통로를 제공합니다.
|
||||
|
||||
---
|
||||
### 우리 주변의 커널 예시
|
||||
- **Linux 커널**: 안드로이드 스마트폰, 서버용 OS, 임베디드 기기 등에서 널리 쓰이는 대표적인 **단일형 커널**입니다.
|
||||
|
||||
- **NT 커널**: 우리가 쓰는 **Windows**의 핵심입니다. **혼합형 커널** 구조를 가지고 있습니다.
|
||||
|
||||
- **XNU 커널**: macOS와 iOS의 뿌리가 되는 커널로, 마이크로 커널(Mach)과 단일형 커널(BSD)의 특징을 결합한 형태입니다.
|
||||
@@ -1,51 +0,0 @@
|
||||
- 작성 **날짜:** 2026-02-27
|
||||
|
||||
## 📑 개념
|
||||
> [!abstract]
|
||||
> 수많은 [[컨테이너(Container)]]의 배포, 관리, 확장, 네트워킹을 자동화하는 **'통합 관리 시스템'**입니다.
|
||||
> 컨테이너를 기반으로 주요 기능들을 자동화해서 실제로 구동시켜주는 시스템
|
||||
|
||||
## 📌 상세
|
||||
> [!check]
|
||||
> |**핵심 기능**|**세부 설명**|**기대 효과**|
|
||||
> |---|---|---|
|
||||
> |**자동 배치 (Scheduling)**|컨테이너를 실행하기 가장 적절한 서버를 찾아 자동으로 할당|자원 효율성 극대화|
|
||||
> |**자가 치유 (Self-healing)**|죽은 컨테이너를 감지하고 자동으로 재시작 또는 교체|**고가용성(HA) 확보**|
|
||||
> |**오토 스케일링 (Scaling)**|트래픽 부하에 따라 컨테이너 개수를 유연하게 조절|성능 유지 및 비용 최적화|
|
||||
> |**로드 밸런싱 (LB)**|여러 컨테이너에 트래픽을 고르게 분산|서비스 안정성 향상|
|
||||
> |**무중단 배포 (Rolling Update)**|서비스 중단 없이 순차적으로 새 버전 업데이트|운영 연속성 보장|
|
||||
|
||||
### 아키텍처 구조 (Conceptual View)
|
||||
|
||||
컨테이너 오케스트레이션은 크게 **지휘부(Control Plane)**와 **실행부(Data Plane)**로 나뉩니다.
|
||||
|
||||
> [!abstract] **지휘부 (Control Plane / Master)**
|
||||
>
|
||||
> - 시스템의 상태를 결정하고 명령을 내리는 두뇌 역할.
|
||||
>
|
||||
> - 어떤 컨테이너를 어디에 띄울지 결정(Scheduling)하고 상태를 감시함.
|
||||
>
|
||||
|
||||
> [!abstract] **실행부 (Data Plane / Worker Node)**
|
||||
>
|
||||
> - 실제로 컨테이너가 돌아가는 작업 공간(서버).
|
||||
>
|
||||
> - 지휘부의 명령을 받아 컨테이너를 실행하고 상태를 보고함.
|
||||
>
|
||||
|
||||
|**구분**|**서비스 명칭**|**특징**|
|
||||
|---|---|---|
|
||||
|**오케스트레이터 (지휘자)**|**Amazon ECS / EKS**|컨테이너를 관리하는 룰과 정책을 설정함.|
|
||||
|**컴퓨팅 엔진 (연주자)**|**EC2 / Fargate**|실제 컨테이너가 실행되는 물리적/가상적 인프라.|
|
||||
|
||||
## 📝 노트
|
||||
> [!note]
|
||||
>
|
||||
> - 컨테이너를 사용해서 [[가용성(Availability)]]과 [[확장성(Scalability)]]문제를 해결해주는 엔진
|
||||
> - 컨테이너를 알아서 잘 사용할 수 있도록 도와주는 엔진
|
||||
> - 학습커브는 존재함. ([[쿠버네티스(Kubernetes)]] 학습 필요)
|
||||
> (AWS의 경우 이 학습커브를 완화해주는 ECS 서비스를 제공함.)
|
||||
>
|
||||
|
||||
## 🔗 지식 연결
|
||||
- **태그:** #zettelkasten #knowledge
|
||||
@@ -1,22 +0,0 @@
|
||||
- 작성 **날짜:** 2026-02-27
|
||||
|
||||
## 📑 개념
|
||||
> [!abstract]
|
||||
> 컨테이너(Container)는 애플리케이션과 그 실행에 필요한 모든 것(코드, 런타임, 시스템 도구, 라이브러리, 설정 등)을 하나로 묶은 **표준화된 소프트웨어 패키지**입니다.
|
||||
|
||||
## 📌 상세
|
||||
> [!check]
|
||||
> ### 핵심 개념: "운송용 컨테이너와 같다"
|
||||
>
|
||||
> 항구의 컨테이너가 안에 무엇이 들었든(전자제품이든 가구든) 규격화되어 배에 쉽게 실을 수 있듯이, 소프트웨어 컨테이너도 어떤 환경(개발자 PC, 테스트 서버, 클라우드)에서든 **동일하게 작동**하도록 규격화된 것입니다.
|
||||
|
||||
## 📝 노트
|
||||
> [!note]
|
||||
>
|
||||
> - 컨테이너 기술을 사용하기 쉽게 엔진화해놓은것이 도커입니다.
|
||||
|
||||
|
||||
![[가상 머신(VM) vs 컨테이너]]
|
||||
|
||||
## 🔗 지식 연결
|
||||
- **태그:** #docker
|
||||
@@ -1,53 +0,0 @@
|
||||
---
|
||||
id: 코드의 가독성 20260317
|
||||
created: 2026-03-17 17:19
|
||||
tags:
|
||||
aliases:
|
||||
---
|
||||
## 💡 생각
|
||||
글로 읽을 땐 무슨 말인지 어렴풋이 짐작이 되지만 실제로 해보면 가독성이 좋은 코드를 만드는 건 어렵다.
|
||||
|
||||
문장처럼 읽히는 코드와 인지 부하의 최소화는 함수형 프로그래밍이 좋은 대응책인 것 같고,
|
||||
|
||||
|
||||
---
|
||||
## 📑 개념
|
||||
**가독성이 높은 코드**는 단순히 "예쁜 코드"를 넘어 **코드를 읽는 사람의 뇌가 에너지를 최소한으로 쓰게 만드는 코드**를 의미합니다.
|
||||
|
||||
## 📌 가독성이 좋은 코드의 기준
|
||||
### 1. 문장처럼 읽히는 코드 (의도 노출)
|
||||
|
||||
코드를 봤을 때 "어떻게(How)" 작동하는지 분석하기 전에, "무엇을(What)" 하려는지 바로 이해되어야 합니다.
|
||||
|
||||
- **나쁜 예:** `if (user.Status == 1 && user.Age > 19 && user.HasPaid)` (숫자 1이 무엇을 의미하는지 한참 생각해야 함)
|
||||
|
||||
- **좋은 예:** `if (user.IsActiveAdultMember())` (함수 이름만으로 의도가 명확함)
|
||||
|
||||
|
||||
### 2. 인지 부하(Cognitive Load)의 최소화
|
||||
|
||||
사람의 단기 기억력은 한계가 있습니다. 한 번에 머릿속에 담아야 할 정보가 많을수록 읽기 힘든 코드가 됩니다.
|
||||
|
||||
- **낮은 중첩도:** `if` 문 안에 `if`, 그 안에 `for` 루프가 여러 번 겹쳐 있으면 뇌는 각 단계의 조건을 기억하느라 과부하가 걸립니다. (Early Return 패턴 등으로 중첩을 제거하는 것이 좋습니다.)
|
||||
|
||||
- **작은 함수:** 하나의 함수가 100줄이라면 흐름을 놓치기 쉽습니다. 5~10줄 내외의 작은 함수로 쪼개면 각각의 책임이 명확해집니다.
|
||||
|
||||
|
||||
### 3. 일관성 (Consistency)
|
||||
|
||||
사람은 패턴을 인식하는 데 능숙합니다. 코드 전체에서 동일한 규칙이 적용되어 있다면 다음에 올 내용을 예측할 수 있게 됩니다.
|
||||
|
||||
- 변수 명명 규칙(CamelCase vs snake_case), 폴더 구조, 에러 처리 방식 등이 프로젝트 전체에서 일관되어야 합니다.
|
||||
|
||||
- **"놀람 최소화의 원칙(Principle of Least Astonishment)":** 코드를 읽었을 때 "어? 이게 왜 여기서 이렇게 동작하지?"라는 당혹감이 없어야 합니다.
|
||||
|
||||
|
||||
### 4. [[신호 대 소음비(Signal-to-Noise Ratio)]]
|
||||
|
||||
코드에서 진짜 중요한 로직(신호)은 강조하고, 형식적인 문법이나 군더더기(소음)는 줄이는 것입니다.
|
||||
|
||||
- **불필요한 주석 제거:** 코드만으로 설명이 가능하다면 주석은 소음일 뿐입니다.
|
||||
|
||||
- **단순한 추상화:** 너무 복잡한 디자인 패턴을 남용하면 실제 비즈니스 로직을 찾기 힘들어집니다.
|
||||
|
||||
---
|
||||
@@ -1,23 +0,0 @@
|
||||
- 작성 **날짜:** 2026-02-27
|
||||
K8s (K뒤에 8글자가 있다고 이렇게 표기하기도 함)
|
||||
## 📑 개념
|
||||
> [!abstract]
|
||||
"수많은 컨테이너를 지휘하여 **사용자가 원하는 상태(Desired State)**로 유지해 주는 거대한 자동화 관리 시스템"
|
||||
|
||||
컨테이너화된 애플리케이션의 배포, 확장 및 관리를 자동화해 주는 오픈 소스 [[컨테이너 오케스트레이션]] 플랫폼**입니다.
|
||||
구글이 내부에서 사용하던 시스템을 기반으로 탄생했으며, 현재 전 세계 컨테이너 관리 시스템의 표준으로 자리 잡고 있습니다.
|
||||
## 📌 핵심 기능
|
||||
> [!check]
|
||||
> **① 선언적 구성 (Declarative Configuration)** "컨테이너 3개를 띄워줘"라고 명령서(YAML 파일)를 던지면, 쿠버네티스가 현재 상태를 확인하고 명령서와 일치하도록 스스로 자원을 조정합니다.
|
||||
> **② 자가 치유 (Self-healing)** 컨테이너가 죽으면 즉시 감지하여 새로운 컨테이너를 다시 띄웁니다. 노드 자체가 죽어도 해당 노드에 있던 컨테이너들을 다른 건강한 노드로 옮겨서 실행합니다.
|
||||
> **③ 무중단 배포 및 롤백** 서비스를 중단하지 않고 애플리케이션 버전을 업데이트할 수 있으며, 문제가 생기면 즉시 이전 버전으로 되돌리는(Rollback) 기능을 제공합니다.
|
||||
|
||||
## 📝 노트
|
||||
> [!note]
|
||||
>
|
||||
> - 컨테이너 오케스트레이션을 해주는 엔진, 사용방법을 정확히 알고 쓰기가 까다로움.
|
||||
> (알아야 할 내용이 많다.)
|
||||
> - 하지만 온라인 서비스 운영에 반드시 필요한 기능들을 다 지원해준다.
|
||||
|
||||
## 🔗 지식 연결
|
||||
- **태그:** #zettelkasten #knowledge
|
||||
@@ -1,45 +0,0 @@
|
||||
- 작성 **날짜:** 2026-02-27
|
||||
|
||||
## 📑 개념
|
||||
> [!abstract]
|
||||
> **"여러 개의 독립된 자원을 하나의 거대한 단일 시스템처럼 보이게 만드는 기술"**입니다.
|
||||
> "여러 대의 컴퓨터(Node)를 네트워크로 연결하여, 외부에서는 마치 한 대의 고성능 컴퓨터처럼 작동하게 만드는 집합체"
|
||||
|
||||
## 📌 클러스터의 목적
|
||||
> [!check]
|
||||
> |**구분**|**해결하려는 문제**|**클러스터의 역할**|
|
||||
> |---|---|---|
|
||||
> |**신뢰성 (Reliability)**|한 대가 고장 나면 서비스 중단|**장애 극복(Failover):** 다른 컴퓨터가 즉시 업무를 대신함|
|
||||
> |**성능 (Performance)**|한 대의 성능으로는 처리 불가|**병렬 처리:** 작업을 쪼개어 여러 대가 동시에 수행|
|
||||
> |**확장성 (Scalability)**|성능을 더 높여야 하는 상황|**수평 확장:** 컴퓨터를 옆으로 계속 이어 붙임|
|
||||
|
||||
신뢰성과 확장성을 확보하고 고성능 처리를 하기 위함
|
||||
|
||||
### 클러스터의 핵심 구성 요소
|
||||
**① 노드 (Node)** 클러스터에 참여하는 개별 컴퓨터입니다. 물리 서버일 수도 있고 가상 머신(VM)일 수도 있습니다.
|
||||
|
||||
**② 전용 네트워크 (Cluster Interconnect)** 노드들끼리 데이터를 주고받고 서로의 생사를 확인(Heartbeat)하기 위한 초고속 통신망입니다.
|
||||
|
||||
**③ 클러스터 웨어 (Clusterware/Middleware)** 여러 대의 노드를 하나로 묶어 관리하는 소프트웨어 층입니다. 누가 대장(Master)인지, 누가 죽었는지, 작업을 어디에 보낼지 결정합니다.
|
||||
|
||||
|
||||
### 💡 한눈에 보는 비유: "오케스트라"
|
||||
|
||||
- **연주자 한 명:** 개별 컴퓨터 (Node)
|
||||
- **오케스트라 전체:** 클러스터 (Cluster)
|
||||
- **지휘자:** 클러스터 웨어 (관리 시스템)
|
||||
|
||||
- **관객(사용자):** 관객은 개별 연주자의 연습 상태가 아니라, 오케스트라가 만들어내는 **하나의 완성된 교향곡(서비스)**을 듣습니다. 연주자 한 명이 잠시 자리를 비워도(장애) 다른 연주자가 메워주어 곡은 계속 연주됩니다.
|
||||
|
||||
[[컨테이너 오케스트레이션]]
|
||||
컨테이너 오케스트레이션은 즉 하나의 완성된 서비스 형태의 컨테이너 오케스트레이션을 의미
|
||||
|
||||
## 📝 노트
|
||||
> [!note]
|
||||
>
|
||||
> - 여러개의 컴퓨터를 하나의 추상적인 단위로 묶어서 하나의 컴퓨터처럼 쓸수있게 해주는 기술
|
||||
> - 즉, 여러 노드의 합으로 하나의 슈퍼컴퓨터를 구성하는 것
|
||||
>
|
||||
|
||||
## 🔗 지식 연결
|
||||
- **태그:** #zettelkasten #knowledge
|
||||
@@ -1,22 +0,0 @@
|
||||
---
|
||||
id: "태스크 실행 역할(Task Execution Role) 20260305"
|
||||
created: "2026-03-05 09:35"
|
||||
tags:
|
||||
---
|
||||
## 💡 생각
|
||||
태스크가 동작하기 위해 필요한 권한들을 정의해놓는다고 생각하면 됨.
|
||||
|
||||
---
|
||||
## 📑 개념
|
||||
> [!abstract]
|
||||
> "태스크를 실행하기 위해 ECS 서비스가 빌려 쓰는 권한"
|
||||
태스크가 실제로 구동되기 **전**과 구동되는 **과정**에서 필요한 권한
|
||||
## 📌 주요 용도
|
||||
> [!check]
|
||||
> - **ECR 이미지 풀(Pull):** 프라이빗 저장소에서 도커 이미지를 다운로드할 권한.
|
||||
>
|
||||
> - **CloudWatch Logs:** 로그를 기록하기 위해 로그 그룹에 접근할 권한.
|
||||
>
|
||||
> - **Secrets Manager / Parameter Store:** 환경 변수에 담을 비밀번호나 설정값을 가져올 권한.
|
||||
|
||||
---
|
||||
@@ -1,32 +0,0 @@
|
||||
---
|
||||
id: "태스크 역할(Task Role) 20260305"
|
||||
created: "2026-03-05 09:38"
|
||||
tags:
|
||||
---
|
||||
## 💡 생각
|
||||
태스크의 컨테이너에서 구동되는 애플리케이션의 권한을 지정해줄 수 있음.
|
||||
애플리케이션이 AWS의 서비스에 직접 접근해서 사용하는 경우에 설정이 필요함
|
||||
|
||||
---
|
||||
## 📑 개념
|
||||
> [!abstract]
|
||||
> "내 애플리케이션(코드)이 실행 중에 직접 사용하는 권한"
|
||||
> 태스크가 **실행된 후**, 내 소스 코드(Java, Python, Node.js 등) 안에서 AWS SDK를 통해 다른 서비스를 호출할 때 필요한 권한입니다.
|
||||
|
||||
## 📌 주요 용도
|
||||
> [!check]
|
||||
> - **S3 버킷 접근:** 사용자가 업로드한 파일을 저장하거나 읽을 때.
|
||||
>
|
||||
> - **DynamoDB/RDS:** 데이터베이스에 데이터를 쓰고 읽을 때.
|
||||
>
|
||||
> - **SQS/SNS:** 메시지를 보내거나 받을 때.
|
||||
|
||||
## 📝 노트
|
||||
> [!note]
|
||||
>
|
||||
> - 관련 사례나 반대되는 개념이 있다면 여기에 기록하세요.
|
||||
>
|
||||
> - 본인의 언어로 풀어서 쓰는 것이 제텔카스텔의 핵심입니다.
|
||||
>
|
||||
|
||||
---
|
||||
@@ -1,44 +0,0 @@
|
||||
---
|
||||
id: 태스크 정의 패밀리 20260305
|
||||
created: 2026-03-05 09:04
|
||||
tags:
|
||||
---
|
||||
## 💡 생각
|
||||
태스크는 인스턴스, 태스크 정의 패밀리는 객체와 같다고 보면 된다.
|
||||
즉, 붕어빵(태스크)과 붕어빵틀(태스크 정의 패밀리)의 사이와 같다.
|
||||
|
||||
> [!question]
|
||||
> Q. 태스크 이름이라고 하면 되지 왜 태스크 정의 패밀리 이름 이라고 이상하게 이름붙여놓은거야?
|
||||
> A. 그 마음 100% 이해합니다! 처음에 AWS ECS를 접하면 **"그냥 태스크 이름(Task Name)이라고 하면 될걸, 왜 굳이 '패밀리(Family)'라는 거창한 단어를 붙여서 헷갈리게 할까?"**라는 생각이 들기 마련이죠.
|
||||
|
||||
이게 단순히 이름을 어렵게 지은 게 아니라, **'버전 관리'**라는 개념 때문에 그렇습니다.
|
||||
|
||||
## 1. 태스크 정의는 "한 번 쓰면 수정 불가능(Immutable)" 하기 때문입니다
|
||||
|
||||
AWS ECS에서 **태스크 정의(Task Definition)**는 한 번 만들면 내용을 고칠 수 없습니다. 만약 이미지 태그를 `v1`에서 `v2`로 바꾸고 싶다면, 기존 것을 수정하는 게 아니라 **새로운 버전**을 구워내야 합니다.
|
||||
|
||||
이때, **"이 설계도들은 다 같은 용도의 설계도들이야"**라고 묶어주는 그룹 이름이 바로 **패밀리(Family)**입니다.
|
||||
|
||||
- **Family Name:** `my-web-app` (성씨)
|
||||
|
||||
- **Revision 1:** `my-web-app:1` (첫째)
|
||||
|
||||
- **Revision 2:** `my-web-app:2` (둘째)
|
||||
|
||||
- **Revision 3:** `my-web-app:3` (셋째)
|
||||
|
||||
|
||||
## 2. '태스크 이름'과 구분하기 위해서입니다
|
||||
|
||||
만약 이걸 그냥 '태스크 이름'이라고 불러버리면, **실제로 돌아가고 있는 실행 객체(Running Task)**와 구분이 안 됩니다.
|
||||
|
||||
- **태스크 정의 패밀리 (Family):** "웹 서버를 띄우기 위한 **설계도 세트**" (붕어빵 틀의 종류)
|
||||
|
||||
- **태스크 (Task):** "지금 서버에서 **실제로 돌아가고 있는 프로세스**" (틀에서 찍어낸 실제 붕어빵)
|
||||
|
||||
|
||||
만약 질문자님이 `my-web-app`이라는 패밀리 이름을 정했다면, 그 설계도로 10개의 **태스크**를 띄울 수 있습니다. 이때 "태스크 이름이 뭐야?"라고 물으면 "10개 중에 어떤 거?"라고 되묻게 되죠. 그래서 **설계도의 이름**은 '패밀리'라고 불러서 확실히 구분 짓는 것입니다.
|
||||
|
||||
## 3. 서비스(Service)와의 연결 고리
|
||||
|
||||
ECS **서비스**를 만들 때 "어떤 태스크를 돌릴래?"라고 물어보는데, 이때 특정 버전(`:1`)을 지정할 수도 있지만, 보통은 **패밀리 이름**을 지정합니다. 그러면 서비스는 **"아, 이 패밀리(가족) 중에서 가장 최신 버전(Latest Revision)을 가져다가 쓰면 되겠구나!"**라고 판단합니다.
|
||||
@@ -1,29 +0,0 @@
|
||||
---
|
||||
id: 태스크(Task) 20260304
|
||||
created: 2026-03-04 17:12
|
||||
tags:
|
||||
---
|
||||
## 💡 생각
|
||||
컴퓨터가 처리하는 작업 단위에 더해 어떻게 처리를 해야 하는지 에 대한 모든 정보들을 담아 놓은 실행 단위
|
||||
태스크 단위로 프로그램을 실행한다. 이런 느낌인 듯
|
||||
|
||||
---
|
||||
## 📑 개념
|
||||
> [!abstract]
|
||||
> 컴퓨터가 처리하는 **'작업 단위'**를 말합니다.
|
||||
|
||||
|
||||
## 📝 ECS에서의 태스크
|
||||
> [!note]
|
||||
> 태스크는 단순히 컨테이너 하나만을 의미하지 않습니다. 하나의 태스크 안에는 다음과 같은 요소들이 포함됩니다.
|
||||
- **하나 이상의 컨테이너:** 보통은 하나의 메인 애플리케이션 컨테이너가 들어가지만, 로그 수집이나 프록시 역할을 하는 '사이드카(Sidecar)' 컨테이너를 함께 묶어 실행할 수도 있습니다.
|
||||
|
||||
- **공유 자원:** 태스크 내의 컨테이너들은 **동일한 네트워크 네임스페이스(IP 주소)**와 **스토리지 볼륨**을 공유합니다. 즉, 태스크 안의 컨테이너끼리는 `localhost`로 통신이 가능합니다.
|
||||
|
||||
- **실행 환경 설정:** CPU, 메모리 제한, IAM 역할(권한), 네트워크 모드 등이 태스크 단위로 설정됩니다.
|
||||
---
|
||||
|
||||
## 🔗 관련 노트
|
||||
- [[IAM(Identity and Access Management)]]
|
||||
|
||||
**Tags:** #task
|
||||
@@ -1,51 +0,0 @@
|
||||
---
|
||||
id: 터미널 에뮬레이터(Terminal Emulator) 20260407
|
||||
created: 2026-04-07 14:01
|
||||
tags:
|
||||
aliases:
|
||||
---
|
||||
## 💡 생각
|
||||
이곳에 하나의 생각 또는 아이디어를 작성합니다.
|
||||
|
||||
---
|
||||
## 📑 개념
|
||||
**터미널 에뮬레이터(Terminal Emulator)** 는 쉽게 말해 **"진짜 물리적인 터미널 기계가 없어도, 소프트웨어로 그 기계가 있는 것처럼 흉내 내어 컴퓨터와 대화하게 해주는 프로그램"** 입니다.
|
||||
|
||||
이 개념을 이해하려면 과거의 하드웨어 터미널이 무엇이었는지 먼저 아는 것이 중요합니다.
|
||||
|
||||
---
|
||||
|
||||
## 1. 과거의 "진짜" 터미널 (Hard Terminal)
|
||||
|
||||
아주 옛날에는 컴퓨터(메인프레임)가 집채만 했습니다. 그래서 사용자는 컴퓨터 본체에 직접 앉을 수 없었고, **화면과 키보드만 달린 입력 장치**를 멀리 떨어진 곳에 두고 통신선으로 연결해서 썼습니다. 이걸 **터미널(단말기)** 이라고 불렀습니다.
|
||||
|
||||
- **본체:** 계산과 처리를 담당 (거대한 서버)
|
||||
|
||||
- **터미널:** 명령어를 입력하고 결과를 화면에 뿌려주는 역할만 수행 (두뇌가 없음)
|
||||
|
||||
![[Pasted image 20260407140335.png]]
|
||||
|
||||
## 2. 터미널 "에뮬레이터"의 등장
|
||||
|
||||
세월이 흘러 개인용 PC(데스크톱)가 보급되면서, 더 이상 화면만 달린 커다란 터미널 기계가 필요 없게 되었습니다. 하지만 서버나 운영체제는 여전히 과거 터미널 방식의 **텍스트 기반 명령어**로 대화하도록 설계되어 있었죠.
|
||||
|
||||
그래서 PC 안에서 **"마치 내가 예전의 그 터미널 기계인 것처럼 속여서"** 운영체제와 대화할 수 있게 해주는 소프트웨어를 만들었는데, 이것이 바로 터미널 에뮬레이터입니다.
|
||||
|
||||
- **하는 일:** 사용자가 키보드로 친 글자를 운영체제에 전달하고, 운영체제가 보낸 텍스트 결과를 화면에 예쁘게 그려줍니다.
|
||||
|
||||
- **대표적인 예:** * **Windows:** 명령 프롬프트(CMD), PowerShell, Windows Terminal
|
||||
|
||||
- **macOS:** Terminal.app, iTerm2
|
||||
|
||||
- **Linux:** GNOME Terminal, xterm
|
||||
|
||||
|
||||
> [!warning] 셸(Shell)과의 차이점 (중요!)
|
||||
|
||||
많은 분이 헷갈려 하시는데, 둘은 역할이 다릅니다.
|
||||
|
||||
- **터미널 에뮬레이터:** 글자가 보여지는 **창(Window)** 그 자체입니다. (껍데기)
|
||||
|
||||
- **셸(Shell):** 그 창 안에서 내 명령을 해석해서 실행해주는 **프로그램(통역사)** 입니다. (예: bash, zsh)
|
||||
|
||||
즉 터미널 에뮬레이터는 putty와 매우 비슷하다고 보면 됨.
|
||||
@@ -1,40 +0,0 @@
|
||||
---
|
||||
id: "테넌시(Tenancy) 20260305"
|
||||
created: "2026-03-05 13:01"
|
||||
tags:
|
||||
---
|
||||
## 💡 생각
|
||||
테넌시가 차용, 임대차 뭐 그런 뜻이니까 결국 컴퓨팅 환경을 임대해서 쓴다 그런 느낌으로 이해하면 됨
|
||||
|
||||
---
|
||||
## 📑 개념
|
||||
사전적 의미로 '임대차' 또는 '차용'을 뜻하지만, IT와 클라우드 컴퓨팅 환경에서는 **소프트웨어 인스턴스나 컴퓨팅 자원을 공유하는 방식**을 의미합니다.
|
||||
|
||||
## 📌 상세
|
||||
1. [[멀티 테넌시(Multi-tenancy)]]
|
||||
2. [[싱글 테넌시(Single-tenancy)]]
|
||||
|
||||
### 비교 요약
|
||||
|
||||
| **구분** | **멀티 테넌시 (Multi-tenancy)** | **싱글 테넌시 (Single-tenancy)** |
|
||||
| --------- | -------------------------- | --------------------------- |
|
||||
| **비유** | 아파트, 호텔 | 단독 주택 |
|
||||
| **자원 공유** | 여러 테넌트가 공유 | 단일 테넌트 전용 |
|
||||
| **비용** | 저렴함 (SaaS 모델) | 비쌈 (전용 서버 모델) |
|
||||
| **보안** | 양호 (논리적 격리) | 최고 (물리적 격리) |
|
||||
| **적합한 곳** | 일반 사용자, 중소기업 | 대기업, 금융권, 정부 기관 |
|
||||
|
||||
## 📝 노트
|
||||
> [!note]
|
||||
>
|
||||
> - 온프레미스와 싱글 테넌시는 서로 다른 개념
|
||||
|
||||
|**구분**|**온프레미스 (On-premise)**|**싱글 테넌시 (Single-tenancy)**|
|
||||
|---|---|---|
|
||||
|**관점**|**어디에** 서버가 있는가?|**누가** 이 자원을 독점하는가?|
|
||||
|**위치**|우리 회사 내부 전산실|어디든 상관없음 (회사 내부 or 클라우드)|
|
||||
|**반대 개념**|퍼블릭 클라우드 (Public Cloud)|멀티 테넌시 (Multi-tenancy)|
|
||||
|
||||
---
|
||||
|
||||
모든 온프레미스는 대개 싱글 테넌시 구조를 가집니다 (자사 서비스만 돌리니까요). 하지만 모든 싱글 테넌시가 온프레미스인 것은 아닙니다. 요즘은 클라우드 환경에서도 보안이나 성능을 위해 싱글 테넌시 방식을 많이 사용합니다.
|
||||
@@ -1,55 +0,0 @@
|
||||
---
|
||||
id: 파게이트 스팟(Fargate Spot) 20260305
|
||||
created: 2026-03-05 10:32
|
||||
tags:
|
||||
---
|
||||
## 💡 생각
|
||||
공용 [[파게이트(Fargate)]]를 저렴하게 빌려서 쓸 수 있는데 언제 자리를 빼줘야할지 모른다.
|
||||
|
||||
|
||||
---
|
||||
## 📑 개념
|
||||
> [!abstract]
|
||||
> AWS의 남는 컴퓨팅 용량을 활용하여 훨씬 저렴한 가격에 [[파게이트(Fargate)]]서비스를 이용하는 요금 모델을 의미합니다.
|
||||
|
||||
쉽게 말해, **"쓰지 않고 노는 서버를 빌려 쓰는 대신, 아주 싼 값에 파게이트를 이용하는 방식"**이라고 이해하시면 됩니다.
|
||||
|
||||
## 📌 특징
|
||||
> [!check]
|
||||
> ### 1. 파격적인 비용 절감
|
||||
>
|
||||
> - 기존 파게이트 가격 대비 **최대 70%까지 저렴**하게 이용할 수 있습니다.
|
||||
>
|
||||
> - 예산이 한정된 프로젝트나 대규모 배치를 실행할 때 매우 경제적입니다.
|
||||
>
|
||||
>
|
||||
> ### 2. 서버리스의 편리함
|
||||
>
|
||||
> - 인프라(EC2 인스턴스)를 직접 관리할 필요가 없습니다.
|
||||
>
|
||||
> - 컨테이너 설정만 하면 AWS가 알아서 실행하고 관리해 줍니다.
|
||||
>
|
||||
>
|
||||
> ### 3. 중단 가능성 (중요!)
|
||||
>
|
||||
> - AWS에 자원이 부족해지면 **실행 중인 작업이 예고 없이 중단**될 수 있습니다.
|
||||
>
|
||||
> - 중단되기 약 2분 전에 알림을 주지만, 기본적으로 언제든 꺼질 수 있다는 점을 고려해야 합니다.
|
||||
|
||||
## 📝 노트
|
||||
> [!note] 파게이트 스팟은 **"중간에 꺼져도 다시 실행하면 그만인 작업"**에 최적화되어 있습니다.
|
||||
>
|
||||
> - **배치 작업:** 이미지 처리, 데이터 분석, 로그 수집 등.
|
||||
>
|
||||
> - **테스트 환경:** 개발 단계에서 테스트용으로 띄우는 서버.
|
||||
>
|
||||
> - **확장성 대응:** 메인 서버는 일반 파게이트로 띄우고, 갑자기 트래픽이 몰릴 때 추가되는 서버만 스팟으로 설정.
|
||||
>
|
||||
|
||||
## ⚠️ 주의사항
|
||||
> [!warning]
|
||||
> - **상태 비저장(Stateless):** 서버가 언제든 꺼질 수 있으므로, 서버 내부에 데이터를 저장하면 안 됩니다. 데이터는 외부 DB나 S3에 저장해야 합니다.
|
||||
>
|
||||
> - **가용성 전략:** 서비스가 완전히 멈추는 것을 방지하기 위해, 안정적인 **Fargate On-Demand**와 **Fargate Spot**을 적절한 비율(예: 4:6)로 섞어서 사용하는 것이 권장됩니다.
|
||||
|
||||
---
|
||||
@@ -1,14 +0,0 @@
|
||||
- 작성 **날짜:** 2026-02-27
|
||||
|
||||
## 📑 개념
|
||||
> [!abstract]
|
||||
> **AWS Fargate**는 Amazon ECS(Elastic Container Service)나 EKS(Elastic Kubernetes Service)에서 작동하는 [[서버리스(Serverless)]] 컴퓨팅 엔진입니다. 컨테이너를 실행하기 위해 가상 머신(EC2)을 직접 관리할 필요 없이, 컨테이너 단위로 배포하고 운영할 수 있게 해줍니다.
|
||||
|
||||
## 📌 주요 특징
|
||||
- **관리 부담 제로 (No Infrastructure Management):** 더 이상 "윈도우 7 지원 종료"나 "서버 라이브러리 충돌" 같은 인프라 문제로 고민할 필요가 없습니다. OS 수준의 관리는 AWS가 책임집니다.
|
||||
- **보안 및 격리 (Security by Design):** 각 컨테이너(Task)는 고유한 가상화 경계 내에서 실행되므로, 한 서비스의 장애나 보안 취약점이 다른 서비스로 전파되지 않습니다.
|
||||
- **유연한 스케일링:** 트래픽이 몰릴 때 서버(Node)를 추가로 띄우는 복잡한 과정 없이, 컨테이너 수만 늘리면 AWS가 알아서 가용자원을 할당합니다.
|
||||
|
||||
## 🔗 지식 연결
|
||||
- **태그:** #fargate
|
||||
-
|
||||
@@ -1,20 +0,0 @@
|
||||
- 작성 **날짜:** 2026-02-27
|
||||
## 📝 장점
|
||||
> [!note]
|
||||
> - **[[가용성(Availability)]]**: 하드웨어 장애 시 AWS가 즉시 컨테이너를 다른 곳에 재배치하여 **Self-healing**을 구현합니다.
|
||||
>
|
||||
> - **[[유연성(Flexibility)]] & [[확장성(Scalability)]]**: 트래픽 변화에 맞춰 컨테이너 개수만 조절하면 즉시 확장되는 **Serverless 스케일링**을 제공합니다.
|
||||
>
|
||||
> - **[[보안성(Security)]]**: 태스크 단위의 **강력한 격리**와 자동화된 호스트 OS 패치로 보안 리스크를 최소화합니다.
|
||||
>
|
||||
> - **[[생산성(Productivity)]]**: 서버 관리 업무(OS, 패치 등)가 사라져 개발자가 **비즈니스 로직에만 집중**할 수 있습니다.
|
||||
|
||||
## 📝 노트
|
||||
> [!note]
|
||||
>
|
||||
> - 결국 Aws가 안정성을 보장하는 컨테이너를 굴려주기 때문에 발생되는 장점들임
|
||||
> - 전문가가 인프라 문제를 책임져주는 컴퓨팅 환경이라고 생각하자
|
||||
>
|
||||
|
||||
## 🔗 지식 연결
|
||||
- **태그:** #zettelkasten #knowledge
|
||||
@@ -1,50 +0,0 @@
|
||||
---
|
||||
id: "파레토의 법칙 20260317"
|
||||
created: "2026-03-17 16:33"
|
||||
tags:
|
||||
aliases:
|
||||
---
|
||||
## 💡 생각
|
||||
이걸 컴퓨터 프로그램에 대입해서 전체 프로그램 사용 시간의 80%가 20%의 코드에 의해 동작한다. 라고 할 수 있겠다.
|
||||
|
||||
|
||||
---
|
||||
## 📑 개념
|
||||
전체 결과의 **80%** 가 전체 원인의 **20%** 에서 일어나는 현상을 말합니다.
|
||||
**80 대 20 법칙**이라고도 불리며, 경영, 경제, 일상생활 등 다양한 분야에서 효율성을 강조할 때 자주 인용됩니다.
|
||||
|
||||
## 📌 상세
|
||||
|
||||
### 1. 유래
|
||||
|
||||
이 법칙은 19세기 이탈리아의 경제학자 **빌프레도 파레토(Vilfredo Pareto)** 가 발견했습니다. 그는 이탈리아 인구의 20%가 전체 부의 80%를 소유하고 있다는 사실을 알아냈고, 이후 품질 관리 전문가인 조셉 주란(Joseph Juran)이 이 개념을 기업 경영과 품질 관리에 적용하면서 대중화되었습니다.
|
||||
|
||||
### 2. 주요 사례
|
||||
|
||||
우리 주변에서도 이 법칙이 적용되는 사례를 쉽게 찾아볼 수 있습니다.
|
||||
|
||||
- **기업 경영:** 전체 매출의 80%는 상위 20%의 단골 고객에게서 발생합니다.
|
||||
|
||||
- **소프트웨어 개발:** 사용자들의 불만 사항 중 80%는 전체 버그의 20%에서 기인합니다.
|
||||
|
||||
- **자기 계발:** 성과의 80%는 우리가 집중하는 시간 중 핵심적인 20%에서 나옵니다.
|
||||
|
||||
- **언어:** 일상 대화에서 사용하는 단어의 80%는 전체 어휘의 약 20%에 불과합니다.
|
||||
|
||||
### 3. 파레토 법칙의 핵심 메시지: 선택과 집중
|
||||
|
||||
이 법칙이 주는 가장 큰 교훈은 **모든 노력이 동일한 가치를 가지지 않는다**는 점입니다.
|
||||
|
||||
1. **우선순위 설정:** 10가지 일이 있다면 그중 가장 큰 성과를 낼 2가지 핵심 업무에 먼저 집중해야 합니다.
|
||||
|
||||
2. **효율성 극대화:** 적은 노력으로 최대의 효과를 내기 위해 불필요한 80%의 주변 업무를 덜어내는 과정이 필요합니다.
|
||||
|
||||
3. **자원 배분:** 한정된 시간과 비용을 가장 수익성이 높은 20%에 집중적으로 투자하는 전략이 유효합니다.
|
||||
|
||||
## 📝 노트
|
||||
> [!note]
|
||||
>
|
||||
> 파레토 법칙은 엄격한 수학적 공식이 아니라 하나의 **경향성**입니다. 실제 비율은 70:30이 될 수도 있고 90:10이 될 수도 있습니다. 중요한 것은 원인과 결과의 불균형을 이해하고 핵심에 집중하는 태도입니다.
|
||||
>
|
||||
|
||||
---
|
||||
@@ -1,36 +0,0 @@
|
||||
---
|
||||
id: "함수형 프로그래밍(Functional Programming) 20260407"
|
||||
created: "2026-04-07 15:46"
|
||||
tags:
|
||||
aliases:
|
||||
---
|
||||
## 💡 생각
|
||||
이곳에 하나의 생각 또는 아이디어를 작성합니다.
|
||||
|
||||
---
|
||||
## 📑 개념
|
||||
**함수형 프로그래밍(Functional Programming)** 은 유닉스 철학의 필터 개념을 프로그래밍 언어의 문법과 구조로 가장 완벽하게 구현해낸 방법론이라고 할 수 있습니다.
|
||||
[[유닉스 철학 (The Unix Philosophy)]]이 운영체제 수준에서 **프로그램**을 쪼개고 연결한다면, 함수형 프로그래밍은 코드 수준에서 **함수**를 쪼개고 연결합니다.
|
||||
|
||||
## 함수형 프로그래밍이 필터가 되는 방식
|
||||
함수형 프로그래밍의 핵심 개념들은 유닉스 필터의 특성과 일대일로 대응됩니다.
|
||||
|
||||
### 1. [[순수 함수(Pure Function)]] = 완벽한 필터
|
||||
|
||||
순수 함수는 외부 상태를 변경하지 않고 오직 입력값에 의해서만 결과값을 반환합니다. 이는 유닉스 필터가 입력(stdin)을 받아 출력(stdout)을 내보내는 과정에서 시스템의 다른 곳을 건드리지 않는 것과 같습니다.
|
||||
|
||||
- **입력 → [ 함수(Filter) ] → 출력**
|
||||
|
||||
|
||||
### 2. [[고차 함수(Higher-Order Function)]]와 합성 (Composition)
|
||||
|
||||
유닉스에서 파이프(`|`)를 사용해 여러 명령어를 잇는 것처럼, 함수형 프로그래밍에서는 **함수 합성**을 통해 작은 필터들을 조립합니다.
|
||||
|
||||
- 유닉스: `cat file.txt | grep "error" | wc -l`
|
||||
|
||||
- 함수형: `count(filter(read("file.txt"), "error"))` 혹은 파이프 연산자를 사용하여 더 직관적으로 표현할 수 있습니다.
|
||||
|
||||
|
||||
### 3. 불변성 (Immutability)
|
||||
|
||||
필터가 원본 데이터를 훼손하지 않고 새로운 데이터를 만들어 내보내듯, 함수형 프로그래밍에서도 기존 데이터를 수정하는 대신 항상 새로운 데이터를 반환합니다. 덕분에 데이터 흐름을 추적하기가 매우 명확해집니다.
|
||||
@@ -1,38 +0,0 @@
|
||||
- 작성 **날짜:** 2026-02-27
|
||||
|
||||
## 📑 개념
|
||||
> [!abstract]
|
||||
> 단순히 "서버를 늘린다"는 개념을 넘어, **시스템의 규모가 커짐에 따라 성능과 비용의 효율성을 유지**하는것을 의미
|
||||
|
||||
### 확장성의 두 가지 방향: Scale-up vs Scale-out
|
||||
확장성은 리소스를 추가하는 방식에 따라 크게 두 가지로 나뉩니다.
|
||||
|
||||
## 📌 상세
|
||||
> [!check]
|
||||
> #### ① 수직 확장 (Scale-up)
|
||||
>
|
||||
> 하나의 서버 자체의 사양(CPU, RAM, Disk)을 더 높은 등급으로 교체하는 방식입니다.
|
||||
>
|
||||
> - **장점:** 아키텍처 변경이 거의 필요 없고 설정이 단순함.
|
||||
>
|
||||
> - **단점:** 하드웨어 한계(Physical Limit)가 존재하며, 사양이 높아질수록 비용이 기하급수적으로 상승함. 교체 시 다운타임이 발생할 수 있음.
|
||||
>
|
||||
>
|
||||
> #### ② 수평 확장 (Scale-out)
|
||||
>
|
||||
> 비슷한 사양의 서버를 여러 대 추가하여 부하를 분산하는 방식입니다.
|
||||
>
|
||||
> - **장점:** 이론상 **무한 확장**이 가능하며, 서버 한 대가 죽어도 서비스 유지가 가능한 **고가용성**을 제공함.
|
||||
>
|
||||
> - **단점:** 트래픽을 분산해 줄 **로드 밸런서(ALB 등)**가 필수적이며, 데이터 동기화와 같은 분산 시스템 설계의 복잡도가 증가함.
|
||||
|
||||
## 📝 노트
|
||||
> [!note]
|
||||
>
|
||||
> - 관련 사례나 반대되는 개념이 있다면 여기에 기록하세요.
|
||||
>
|
||||
> - 본인의 언어로 풀어서 쓰는 것이 제텔카스텔의 핵심입니다.
|
||||
>
|
||||
|
||||
## 🔗 지식 연결
|
||||
- **태그:** #zettelkasten #knowledge
|
||||
Reference in New Issue
Block a user