| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | ||||
| 4 | 5 | 6 | 7 | 8 | 9 | 10 |
| 11 | 12 | 13 | 14 | 15 | 16 | 17 |
| 18 | 19 | 20 | 21 | 22 | 23 | 24 |
| 25 | 26 | 27 | 28 | 29 | 30 | 31 |
- UNIDEV
- 캡스톤디자인프로젝트
- 인프라
- 체크인미팅
- 게임개발동아리
- 도커
- EC2
- 생활코딩
- 백엔드개발자
- 개발공부
- Spring boot
- Route53
- CICD
- 프리티어
- bastion host
- NAT gateway
- 42서울
- UNICON2023
- openAI API
- 프롬프트엔지니어링
- UNICON
- 오블완
- 프로그래밍
- spring ai
- 티스토리챌린지
- 스프링부트
- AWS
- 전국대학생게임개발동아리연합회
- 라피신
- Redis
- Today
- Total
Hyun's Wonderwall
[CS 지식의 정석] 1. 개발자 필수 지식 본문
[데이터교환형식 #1. JSON과 직렬화와 역직렬화]
JSON(JavaScript Object Notation): Javascript 객체 문법으로 구조화된 데이터 교환형식.
- 프로그래밍 언어와 플랫폼에 독립적 -> 서로 다른 시스템간에 데이터를 교환하기 좋음.
- 여러 언어에서 객체, 해시테이블, 딕셔너리 등으로 변환되어 쓰임. (ex. javascript에서는 javascript object, python에서는 dict)
- 주로 API 반환 형태, 시스템 구성 설정 파일에 활용
Javascript 객체 문법: 키(key)와 값(value)으로 구성.
- 이미 존재하는 키 중복 선언 시 나중에 선언한 해당 키에 대응한 값이 덮어씌워짐.
- 객체 문법 뿐 아니라 단순 배열, 문자열도 표현 가능 (ex. [1, 2, 3, 4] / "문자열")
- 배열은 대괄호 []를 기반으로 표현. 배열의 원소는 [0], [1] 와 같이 접근, 해당 key에 대한 value는 .key 또는 ["key"] 방식으로 접근
- JSON의 타입: 수(Number), 문자열(String), 참/거짓(Boolean), 배열(Array), 객체(Object), null
- javascript object와 유사. undefined, 메서드 등은 포함 불가.
JSON 직렬화, 역직렬화
- 직렬화 Serialization: 외부 시스템에서도 사용할 수 있도록 바이트(byte) 형태로 데이터를 변환하는 기술.
- JSON.stringify()로 JS Object에서 JSON 구조 문자열로 바꾸는 것이 직렬화.
- 역직렬화 Deserialization: 바이트->JSON.
- JSON.parse()로 JSON 에서 객체로 바꾸기 위해서 파싱하는 것이 역직렬화.
[데이터 포맷 #2. XML]
XML(Extensible Markup Language): 마크업 형태를 쓰는 데이터 교환형식.
- 마크업(markup): 태그 등을 이용하여 문서나 데이터의 구조를 나타냄. (속성 부여도 가능)
구성
1. 프롤로그 : 버전, 인코딩
2. 루트요소(단 1개)
3. 하위 요소들
<?xml version="1.0" encoding="UTF-8"?>
<OSTList>
<OST like="1">
<name>마녀 배달부 키키</name> <song>따스함에 둘러쌓인다면</song>
</OST>
<OST like="2">
<name>하울의 움직이는 성</name> <song>세계의 약속</song>
</OST>
</OSTList>
HTML과 XML 비교
1. [용도] HTML 용도: 데이터를 표시 / XML 용도: 데이터 저장 및 전송
2. [태그] HTML은 태그가 미리 정해져 있음*. / XML은 태그가 정해져 있지 않음.
3. [대소문자] HTML은 대소문자 구분 X / XML은 대소문자 구분 O
*보충: html 자체적으로는 고유한 태그를 만들 수 없음. JS의 웹 컴포넌트(Web Components) API를 사용하면 커스텀 태그 작성 가능.
JSON과 XML 비교
- [용량] XML은 닫는 태그가 계속 들어가므로 JSON과 비교하면 무거움.
- [Javascript Object 변환 용이성] JSON은 JSON.parse()면 되어서 간단하지만, XML은 JSON보다는 많은 노력이 필요.
xml의 대표 용례는 sitemap.xml
sitemap.xml: 서비스 내 모든 페이지들을 리스트업한 데이터.
- 크롤러가 사이트 데이터 수집 시 일부 페이지를 누락할 수 있는 문제를 방지. (원인: 사이트가 매우 큼, 서로 링크가 종속적으로 연결되지 않음)
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url>
<loc>http://www.example.com/foo.html</loc>
<lastmod>2018-06-04</lastmod>
</url>
<url>
<loc>http://www.example.com/abc.html</loc>
<lastmod>2018-06-04</lastmod>
</url>
</urlset>
API (Application Programming Interface): 두 시스템 간 통신 규약을 정의한 중계 계층.
- 서로 다른 소프트웨어 컴포넌트나 시스템 간에 데이터나 기능을 교환하기 위한 명세이자 인터페이스로, 한 프로그램이 다른 프로그램의 기능을 표준화된 방식으로 호출·이용할 수 있도록 정의한 중간 계층을 의미.
- 요청자(A 컴퓨터)와 응답자(B 컴퓨터) 간 데이터 교환 방식(HTTP, HTTPS, GET, POST 등)을 정의함.
- 과거에는 라이브러리·프레임워크 명세서를 포함했으나, 현재는 WEB API(REST API, WebSocket API 등)를 중심으로 사용됨.
인터페이스 (Interface): 서로 다른 두 개의 시스템, 장치 사이에서 정보나 신호를 주고받는 경우의 접점이나 경계면
- 특징: 내부 서버 구현과 무관하게 통신 가능, 직접 DB 접근 방지(보안·추상화 역할)
[API의 장점]
- 보안성 강화
- DB 구조, 테이블 정보, 상수값 등 내부 로직을 노출하지 않아도 됨.
- 필요한 데이터만 선택적으로 공개 가능. - 유연한 서비스 구조
- 내부 DB나 서버 로직 변경 시에도 API 규격만 유지되면 클라이언트 업데이트 불필요.
- 예: DB 튜닝 시 앱 업데이트 불필요. - 개발 효율성
- OPEN API를 통해 외부 서비스와 손쉽게 연동 가능. (ex. 네이버 로그인, 카카오 지도 API) - 데이터 통합 관리
- 이벤트 발생 시 API 호출로 데이터를 중앙화 가능. (ex. yes24 베스트셀러 API → 사용자 클릭 이벤트 집계)
[API의 종류]
구분 접근 범위 특징 활용 예
| 구분 | 접근 범위 | 특징 | 활용 예 |
| Private API | 내부 전용 | 하드코딩된 해시 키 기반 통신, 서버 간 비공개 통신 | 파트너 간 전용 API(헤더 키 전달) |
| Public API | 외부 공개 | 사용자 제한 설정(일일 호출 수 등) | 네이버, 카카오 OPEN API |
[API 실습 예시 – Open API 기반 온도 예측]
- Open-Meteo API를 통해 인공지능 모델 없이 실시간 날씨 예측 데이터 요청. 특징: API 버전 명시 (예: v1), 좌표 기반 데이터 요청
const OPEN_API = "https://api.open-meteo.com/v1/forecast?latitude=37.57&longitude=126.98&hourly=temperature_2m¤t_weather=true&timezone=Asia%2FTokyo";
[API 구축]
- 목표: 내부 로직이 변경되어도 API 명세를 변경하지 않고 호환성 유지
- Node.js: Google V8 엔진 기반 JavaScript 런타임 환경. 비동기 이벤트 주도형 구조. 자바스크립트로 서버·알고리즘·게임 등 실행 가능
- Express.js: Node.js 기반 웹 프레임워크. 라우팅, 미들웨어, 정적 자원 제공 기능 간결화
[라우팅 (Routing)]
URI(경로)와 HTTP 메서드(GET, POST 등)에 따라 클라이언트 요청에 응답하는 규약
예: /api/users → GET(조회), POST(등록), PUT(수정), DELETE(삭제)
[URI 분석 예시]
http://127.0.0.1:3000
프로토콜 : HTTP
IP : 127.0.0.1 (루프백IP)
port : 3000
app.listen(port, () => {
console.log(`http://127.0.0.1:${port}`)
port는 사실 숨겨져 있음
https port : 443이 기본포트
http port : 80이 기본포트
[예시 – 실제 사이트 URI]
http://www.naver.com → HTTP 기본 포트 80
브라우저 접근 시 프로토콜, IP, 포트는 자동 추상화됨
[클라우드 컴퓨팅 개요]
[클라우드의 기반 기술 – 가상머신(Virtual Machine)]
전통적 배포방식: 물리 컴퓨터 1대에 OS 1개 설치 → 여러 프로그램이 같은 자원을 공유
→ 한 앱의 변경이 다른 앱에 영향 가능
가상화 배포방식: 하드웨어 위에 하이퍼바이저(Hypervisor)를 두고 여러 OS를 독립적으로 실행
→ 한 컴퓨터에서 여러 VM 동시 구동 가능
특징: 하드웨어를 소프트웨어적으로 구현. 설정만으로 CPU·RAM 할당 변경 가능. 서로 완전히 격리된 환경 제공(샌드박스 구조)
단점: 각 VM에 OS를 별도 설치해야 함
[하이퍼바이저(Hypervisor)]
의의: 단일 시스템에서 여러 VM을 구동할 수 있게 하는 중간 계층
역할: 하드웨어 자원 분리·할당 및 VM 관리
예시: VMware, KVM, Hyper-V
[클라우드 배포 방식]
| 구분 | 정의 | 특징 | 예시 |
| 오프프레미스 (Off-Premise) | 외부 클라우드 서비스 제공업체가 인프라 호스팅 | 인프라 설치 없이 저비용 운영, 확장 용이 | AWS, Azure, NCP |
| 온프레미스 (On-Premise) | 기업이 자체 데이터센터(IDC) 직접 구축·운영 | 보안·통제력 우수, 초기비용 높음 | 네이버 춘천 데이터센터 (프리쿨링 방식 냉각) |
[클라우드 서비스 모델]
- IaaS (Infrastructure as a Service)
의의: 인프라(서버·스토리지·네트워크)만 제공
특징: OS·Runtime·DB를 사용자가 직접 설치, 특정 플랫폼에 종속되지 않음, 유연성 높음, 운영비 효율 낮음
예시: AWS EC2, Naver Cloud Platform(NCP)
- PaaS (Platform as a Service)
의의: 개발 플랫폼 및 런타임 환경 제공
특징: Node.js, MongoDB 등 미리 설치, CI/CD 및 모니터링 제공, 운영 효율 높으나 플랫폼 종속성 존재
예시: Heroku, Google App Engine
- SaaS (Software as a Service)
의의: 완성된 소프트웨어를 서비스 형태로 제공
특징: 별도 설치 없이 즉시 사용, 실시간 협업, 버전 관리 용이
예시: Google Docs, Notion, Slack
[IaaS vs PaaS 비교]
| 항목 | IaaS | PaaS |
| 유연성 | 높음 | 낮음 |
| 종속성 | 낮음 | 높음 |
| 이식성 | 높음 | 낮음 |
| 운영비 | 비효율적 | 효율적 |
[컨테이너(Container)와 도커(Docker)]
컨테이너: 애플리케이션 실행 환경을 OS 레벨에서 격리해 빠르고 안정적으로 배포하는 단위
특징: OS를 공유 → VM보다 경량·고속, 모든 의존성(라이브러리, 설정 등)을 함께 패키징, 완전한 격리성 제공, OS 문제 발생 시 다른 컨테이너 영향 가능
도커(Docker): 컨테이너 생성·관리·배포를 위한 플랫폼
특징: 동일 이미지에서 다수의 컨테이너 생성 가능, 이미지 불변성으로 재현성 확보
핵심 구성:
- Dockerfile: 패키지·환경 변수 설정 기록 파일
- Docker Image: 컨테이너 실행을 위한 불변 상태 스냅샷
- Docker Container: 실행 중인 이미지 인스턴스
작동 과정: Dockerfile → Build → Image 생성 → Run → Container 실행
도커 활용 예시: 클라우드 컨테이너 배포(AWS ECS, Kubernetes 등) (구글 서비스 대부분이 도커 기반)
[CI/CD (지속적 통합·배포)]: 코드 작성 → 테스트 → 빌드 → 배포까지 자동화하는 파이프라인 구조 규약
(Continuous Integration / Continuous Delivery / Continuous Deployment)
필요성: 다수 개발자 협업 시 배포 충돌, 버전 불일치 방지, 테스트 자동화로 품질 유지
단계별 구성:
| 단계 | 설명 |
| Continuous Integration (CI) | 코드 빌드·테스트·병합 자동화 |
| Continuous Delivery (CD) | 릴리스 버전 자동 생성 |
| Continuous Deployment | 실제 서비스 환경(프로덕션) 자동 배포 |
장점: 코드 품질 유지, 테스트 자동화 강제, 배포 주기 단축, 장애 발생 시 롤백 용이
대표 툴:
- CI/CD 플랫폼: GitHub Actions, Jenkins, CircleCI
- 통합형 플랫폼: Heroku(Git 연동 자동 배포 지원)
파이프라인 구성 요소:
- Build (빌드)
- 코드 번들링 및 자원 패키징
- 예: webpack (모듈 번들러)
- Test (테스트)
- 단위 테스트(Unit), 통합 테스트(Integration), 엔드투엔드(E2E) 테스트
- 대표 도구: Mocha, Jest
- Merge (머지)
- Git 기반 코드 병합, 충돌 해결
- 작은 단위(issue 단위) 병합 권장
- Deploy (배포)
- 서비스, 관리자페이지, 데이터 파이프라인 등 환경별 배포 포함
- GitHub Actions + Heroku 조합으로 자동화 가능
[요약]
클라우드: 가상화 기반의 분산 컴퓨팅 인프라. 도커: 컨테이너 단위 애플리케이션 배포 기술. CI/CD: 지속적 통합·자동 배포 파이프라인 규약.
[클래스, 객체, 인스턴스]
클래스(Class): 객체를 생성하기 위한 청사진 또는 설계 규약. 속성(필드)과 동작(메서드)의 집합 정의.
객체(Object): 클래스에서 생성된 실체. 클래스의 구조를 실제 메모리에 할당한 형태.
인스턴스(Instance): 객체가 메모리에 로드되어 실행 중인 상태. 런타임 시점에 존재하는 실체. ※ AWS 등에서는 ‘가상 서버 단위’를 의미하기도 함.
[static 키워드]
- 의의: 클래스의 인스턴스가 아닌 클래스 자체에 속하는 멤버를 정의하는 규약. 모든 객체가 공유하는 변수·메서드로 사용.
- 특징: 인스턴스화 없이 클래스명.메서드() 형태로 접근 가능, 클래스 내부에서 공통 기능·전역 자원 관리 시 유용, 명시적이며 가시성 높은 공유 자원 관리 가능.
- 단점: Heap이 아닌 Method Area에 미리 할당되어 GC(가비지 컬렉션) 미적용, 프로그램 종료 전까지 메모리 점유로 불필요한 낭비 위험, 객체지향 원칙(캡슐화·다형성) 약화.
[오버로딩(Overloading) vs 오버라이딩(Overriding)]
| 구분 | 오버로딩 | 오버라이딩 |
| 정의 | 동일한 메서드명으로 매개변수 타입·개수·순서를 다르게 정의 | 상위 클래스 메서드를 하위 클래스가 재정의 |
| 사용 위치 | 동일 클래스 내 | 상속 관계 클래스 간 |
| 목적 | 코드 유연성·가독성 향상 | 다형성 실현 및 행위 재정의 |
| 제약 | 없음 | static, final 메서드는 불가 |
| 실행 시점 | 컴파일 시 결정 | 런타임 시 결정 |
[추상화(Abstraction)]
- 의의: 복잡한 구조나 데이터를 단순화하여 핵심만 표현하는 설계 원칙. 불필요한 세부 구현을 감추고 인터페이스로 표현.
- 유형: (1) 데이터 추상화 - 공통 속성을 묶고 세부 차이는 제거 (예: 고양이·강아지 → “동물”) (2) 프로세스 추상화 - 내부 절차를 감추고 인터페이스로 제공 (예: DB 내부 저장 과정은 숨기고 INSERT, UPDATE만 노출).
시스템 내 예시: MySQL 아키텍처는 내부 I/O 구조를 감춘 채 쿼리 단위 접근 제공. API, 모듈화 구조도 추상화의 구현 사례.
[컴파일러(Compiler)와 인터프리터(Interpreter)]
공통점: 고수준 언어를 기계어(Machine Code, 0·1)로 변환하는 변환기 규약.
컴파일러 방식: 전체 코드를 한 번에 기계어로 변환, 실행 전 변환으로 속도 빠름, 수정 시 재컴파일 필요. 사용 언어: C, C++, Go, Rust. 과정: 전처리 → 컴파일러 → 어셈블러 → 링커 → 실행파일 생성.
인터프리터 방식: 코드를 한 줄씩 읽고 즉시 실행, 시작은 빠르나 전체 속도는 느림, 실행 중 변환으로 수정 후 즉시 실행 가능. 사용 언어: Python, JavaScript. 장점: 실시간 실행 및 디버깅 용이. 단점: 반복 변환으로 인한 성능 저하.
[JIT 컴파일러 (Just-In-Time Compiler)]
의의: 컴파일러와 인터프리터의 장점을 결합한 동적(실시간) 컴파일 방식으로, 실행 중 자주 호출되는 코드를 선택적으로 기계어로 변환.
작동 원리: (1) 코드 분석 - 실행 중 “핫스팟(hot spot)” 탐지 (2) 동적 컴파일 - 자주 실행되는 코드만 변환 (3) 최적화 - 메모리 접근·GC 오버헤드 최소화 (4) 캐싱 - 변환된 코드 메모리 저장 및 재사용.
대표 구현: JVM, .NET CLR, V8 Engine(Node.js, Chrome).
장점: 반복 실행 코드의 성능 극대화, 인터프리터 대비 빠른 실행 속도. 단점: 캐시 저장으로 메모리 사용량 증가, 초기 실행 시 분석 오버헤드 발생.
[요약]
클래스는 객체의 설계도, static은 공용 자원 선언 규약, 오버로딩·오버라이딩은 다형성 구현 수단, 추상화는 복잡성 완화의 핵심 개념, 컴파일러·인터프리터·JIT은 언어 실행의 세 가지 접근 구조임.
'Study > CS' 카테고리의 다른 글
| [CS 지식의 정석] 2. 디자인패턴 (0) | 2025.10.24 |
|---|