[인강/CS 지식의 정석] 1. 개발자 필수 지식
데이터 교환 방식
JSON (JavaScript Object Notation)
: 자바스크립트 객체 문법으로 구조화된 데이터 교환 형식
- 특징
1. 객체 문법 외에도 단순 배열, 문자열도 표현 가능
2. 프로그래밍언어, 프레임워크에 독립적임
=> 여러 언어에서 각 라이브러리에 의해 사용됨
ex) Java - JSONObject, Python - dict
3. API 반환 형태, 시스템 설정파일에 활용됨
- 문법
1. key : value 형식
{
"name" : "Harry",
"age" : 17
}
중괄호 내부 key 값 중복 시 마지막 key:value 만 남음
2. 배열
a =
[
{
"name" : "Harry",
"age" : 17
},
{
"name" : "Ron",
"age" : 18
}
]
//
a[0]["name"] => Harry
a[1].name => Ron
3. 타입
Javascript 객체와 유사하지만 undefined, 메서드 포함하지 않음
Number, String, Bolean, Array, Object, null
- 직렬화(=serialize)
외부 시스템에서 사용할 수 있도록 데이터를 byte 형태로 변환
ex) JSON.stringify ( 자바 객체 → JSON 문자열 )
- 역직렬화 (=deserialize, parse)
시스템 내부에서 가공하기 위해 문자열 데이터를 객체로 변환
ex) JSON.parse( JSON 문자열 → 자바 객체 )
XML (Extensible Markup Language)
: 마크업(태그 이용해 문서/데이터 구조 나타냄) 형태 데이터 교환 형식
- 구성
프롤로그 : 버전, 인코딩
루트 요소(1개만)
하위 요소들
- HTML과의 차이
HTML | XML | |
용도 | 데이터 표시 | 데이터 저장, 전송 |
태그 형식 | 미리 정의된 태그 사용 | 커스텀 태그 생성, 정의 |
대소문자 구분 | 대소문자 구분 X | 대소문자 구분 O |
- JSON과의 차이
.JSON | XML | |
용량 | 용량 가벼움 | 닫힌 태그가 계속 들어가 비교적 큰 용량 차지 |
자바스크립트 객체 변환 | 쉬움 (자바스크립트 내장 라이브러리 사용) | 어려움 (외부 라이브러리 사용 또는 직접 구현 필요) |
활용 | API 데이터 전송 | sitemap.xml (사이트가 제공하는 url 정보 설명 => 검색엔진이 이해할 수 있도록 함) |
API (Application Programming Interface)
: 2개 이상의 컴퓨터 프로그램이 서로 통신하는 방법 & 컴퓨터 사이에 있는 중계 계층
ex) 프로토콜, 메서드, 데이터 타입 등이 정의된 중계 계층
※ Interface : 서로 다른 2개의 시스템/장치 사이에서 정보, 신호를 주고받는 경우의 접점 또는 경계면
=> 일반 사용자는 컴퓨터 내부 서버를 알 필요 없이 인터페이스를 통해 기능을 실행할 수 있음
- 장점
1. 제공자 => 서비스의 중요한 부분을 드러내지 않아도 됨
2. 사용자 => 서비스가 어떻게 구현됐는지 알 필요 없음
3. Open API는 앱 개발 프로세스를 단순화시킴 (시간, 비용 절약) ex. 네이버 로그인 API 활용
4. 내부 프로세스 수정 시 API는 수정되지 않도록 할 수 잇음 => 매번 사용자가 앱 업데이트하지 안아도 됨 ex. DB 튜닝
5. 제공자 => 데이터를 한 곳에 모을 수 있음
- 종류
1. private : 내부적으로 사용함 (주로 Hash 키를 하드코딩해 서버-서버 간 통신함)
2. public : 모든 사람이 사용할 수 있음 (트래픽 관리 위해 하루 요청 수 제한, 계정당 개수 제한 있을 수 있음)
클라우드
가상 머신 (Virtual Machine)
: 컴퓨터의 하드웨어를 소프트웨어적으로 구현한 것
가상화 배포 방식 : 가상머신 기반 배포
=> 1대의 컴퓨터를 가지고 여러 OS를 구동하며 CPU, RAM 설정을 소프트웨어적으로 변경
=> 각 사용자는 독립된 OS 환경에서 컴퓨팅 가능
※ Hypervisor : 하나의 시스템에서 가상 컴퓨터를 여러 대 구동할수 있도록 해주는 중간 계층 (이 위에 여러 가상머신 구축 가능)
cf) 전통적 배포 방식 : 물리 컴퓨터 1대에 OS 1개 깔고 여러 프로그램 설치
=> 계정을 나눠 여러 사용자가 이용 가능하지만 한 사용자가 특정 프로그램을 설치했을 때 타 사용자들도 영향 받을 수 있음
=> 클라우드는 가상화 기술을 통해 1대의 하드웨어로 여러 사용자들에게 독립적으로 클라우드를 서비스함
(단점 : VM 위에 OS 일일이 설치해야 함)
오프 프레미스(Off-premise) & 온 프레미스 (On-premise)
1. 클라우드 (=오프 프레미스)
: 다른 회사의 공급자가 호스팅하고, 인터넷을 통해 사용자에게 제공되는 인프라/플랫폼/소프트웨어
=> 자체 인프라/하드웨어 설치 없이 애플리케이션, 리소스를 편리하고 저렴하게 이용
2. 온프레미스
: 네트워크 선 설치, 서버, DB 설치 등 모든 물리 작업을 수행하며 서버를 운영하는 방식
ex) 네이버의 프라이빗 IDC
IaaS & PaaS & SaaS
1. IaaS (Infrastructure As A Service)
클라우드가 인프라를 제공함 (≒ 빈 방)
=> node.js, MongoDB 등을 개발자가 직접 설치함
=> 특정 서비스에 종속되지 않음
ex) AWS의 EC2, 네이버클라우드플랫폼
2. PaaS (Platform As A Service)
클라우드가 플랫폼을 제공함 (≒ 빌트인 방)
=> node.js, MongoDB 등이 설치돼있음 & CI/CD, 모니터링 등이 제공됨
ex) heroku
3. SaaS (Software As A Service)
클라우드가 완전한 서비스를 제공함
=> 개발자 개입 없이 사용자가 바로 이용 가능한 서비스
ex) 구글 docs
- IaaS - PaaS 비교
IaaS | PaaS | |
유연성 | 높음 | 낮음 |
이식성 | 높음 | 낮음 |
운영 효율성 | 낮음 | 높음 |
Paas => 플랫폼에 종속된 컴포넌트들로 인해 마이그레이션이 비교적 어려움
IaaS => 모든 프로그램, CI/CD, 모니터링 기능을 직접 설치/구현해야 해 운영 면에서 비교적 비효율적임
Container & Docker
1. 컨테이너
: 애플리케이션이 한 컴퓨팅 환경에서 다른 컴퓨팅 환경으로 빠르고 안정적으로 실행되도록 코드와 모든 종속성을 패키징하는 소프트웨어의 표준 단위
장점 : OS를 공유하므로 빠르고, 경량화돼있고, 격리성이 높음
단점 : OS에 문제 발생 시 다른 앱에도 영향 끼칠 수 있음
2. 도커
: 컨테이너 배포에 필요한 거의 모든 기능을 제공하는 플랫폼
=> IaaS와 PaaS의 장점이 모두 극대화됨 (컨테이너 기반의 높은 이식성, 명령어 기반의 높은 운영 효율성)
- 도커의 컨테이너 실행 과정
도커 파일을 빌드해 도커 이미지로 변환
→ 도커 이미지를 통해 컨테이너 생성 (여러 컨테이너 생성 가능)
→ 컨테이너 실행 명령 시 도커 이미지에 설정된 프로그램, 데이터 등이 실제 컴퓨팅 자원과 연결되어 실행됨
※ 도커 파일 : 패키지, 환경변수 등이 기록된 설정 파일
※ 도커 이미지 : 컨테이너 실행에 필요한 파일, 설정값, 데이터 등을 포함하는 불변의 파일
※ 컨테이너 - 이미지는 독립적임 => 컨테이너 상태와 무관하게 이미지는 그대로 존재함
CI/CD (Continuous Integration / Delivery & Deployment)
: 코드 구축 ~ 배포까지 일련의 과정
Continuous Integration : 코드 빌드, 테스트 후 통합함
Continuous Delivery : 해당 레포지토리에 release함 (스테이징 환경)
Continuous Deployment : 운영 서버, 즉 실제 서비스에 배포함 (운영 환경)
CI/CD 파이프라인의 장점 => 코드 배포까지의 체계성 + 테스트의 강제성
- 빌드
vue 프로젝트 => vue 확장자는 웹브라우저에서 구동 안 됨
=> html, javascript, css로 변환(=빌드) 후 구동됨
빌드 도구 : webpack
- 테스트
단위 테스트 : 함수 등 작은 단위 테스트
통합 테스트 : 모듈 통합 시 실행하는 테스트
end-to-end 테스트 : 사용자가 서비스를 사용하는 상황을 가정하는 테스트
테스트 프레임워크 : mocha
- 머지 (merge)
여러 사용자들이 머지하면서 코드 충돌 발생함
=> 작은 이슈 단위로 나눠서 머지하고, 충돌 시 서로 화면 공유해가며 합의해야 함
머지 도구 : svn, git
- 배포
사용자를 위한 서비스 배포 외에도 QA 엔지니어/어드민을 위한 배포, 데이터웨어하우스로부터 데이터를 가공한 백엔드 개발자를 위한 배포 등도 있음
배포 도구 : github action, jenkins, circle (+ heroku 플랫폼에서는 CI/CD 설정 없이 자동 배포 가능)
기타 기초 지식
클래스, 객체, 인스턴스의 차이
- 클래스 : 객체를 만들기 위한 틀, 객체의 속성과 메서드의 집합을 담아놓은 것
ex) 붕어빵 틀 밀가루와 팥이라는 재료 속성을 가짐
- 객체 (Object) : 클래스로부터 만들어지는 실체, 클래스로 선언된 변수
ex) 붕어빵 틀 안에 밀가루 100g, 팥 20g이 들어간 객체A, 붕어빵 틀 안에 밀가루 90g, 팥 10g이 들어간 객체B 등 붕어빵 틀의 속성에 다양한 값이 담김
ex) Person a;
- 인스턴스 : 객체가 메모리에 할당된 상태, 런타임에 구동되는 객체 (객체와 같은 의미로도 쓰임)
ex) a = new Person("이름", 20);
static
: 클래스 단위에서 클래스의 변수, 메서드 등을 공유하는 데 사용됨
- 장점
특정 객체 구현하지 않고도 클래스 단위에서 메소드, 필드 동작 가능
중복되는 메소드, 변수 사용 감소하여 메모리 효율성 증가
- 단점
실제로 사용하지 않더라도 객체 선언하는 시점에 메모리에 바로 올라감 => 메모리 낭비
자바 => static이면 프로그램 종료될 때까지 가비지 콜렉터가 회수 안함 => 메모리 낭비
오버로딩, 오버라이딩
- 오버로딩
: 매개변수(파라미터)의 개수/타입/순서를 다르게 하여 같은 메소드명으로도 여러 함수를 정의하는 것
=> 프로그램 유연성 증가, 코드 가독성 증가
- 오버라이딩
: 상위 클래스가 가지고 있는 메소드를 하위 클래스가 재정의하는 것
=> 상속 관계 클래스에서 사용됨 (static, final 선언된 메소드는 오버라이딩 불가)
추상화
: 복잡한 시스템의 핵심만 가려내 보여주는 것 or 코드 세부사항/절차를 감춰 복잡도를 감소시키는 것
- 데이터 추상화
: 데이터들의 공통점만 모으는 것
ex) 고양이, 강아지 등 객체들을 공통점인 동물로 카테고리화해 추상화시킴
- 프로세스 추상화
: 내부 프로세스를 숨기는 것
ex) MySQL 등 특정 DB 내부의 추상화로 인해 아키텍처를 알지 못해도 쿼리 전송하기만 하면 데이터 이용 가능
컴파일 언어, 인터프리터 언어
cf) 기계어 : 컴퓨터 프로세서가 직접 이해하고 실행하는 명령어 (0,1로 표현됨)
cf) 컴파일 : 고수준의 소스 코드를 전처리-컴파일러-어셈블러-링커 과정을 거쳐 저수준 언어로 만듦
- 컴파일러
: 소스 코드 전체를 읽어 한번에 기계어로 변환하고, 생성된 기계어 코드를 실행하는 프로그램
컴파일 과정은 시간이 걸리나, 실행시간은 빠름
코드 수정 시 컴파일 과정이 필요함
ex) C, C++, Go, Rust 등의 언어가 컴파일러 사용함
- 인터프리터
: 소스코드를 한 줄씩 읽어가며 바로 기계어로 변환, 실행하는 프로그램
컴파일 단계가 없어 초기 시작은 빠르지만, 코드 실행시마다 변환 과정을 거쳐 전체 코드 실행시간은 느려질 수 있음
코드 수정 시 컴파일 과정이 필요하지 않음
ex) Python
- JIT 컴파일러
: 인터프리터 - 컴파일러의 중간 형태
1. 코드 분석 : 실행 시점에 코드 분석해 어떤 부분이 가장 자주 실행되는 지 판단함 (실행 전에 코드 분석하지 않음)
2. 동적 컴파일 : 자주 실행되는 코드(hot spot)를 선별적으로 기계어로 변환함 (프로그램 실행 중, 실시간으로)
3. 최적화 : 컴파일 과정에서 다양한 최적화 기법 적용함 (ex. 메모리 접근 패턴 분석, 가비지 컬렉션 오버헤드 최소화)
4. 실행 : 컴파일된 기계 코드 실행 (프로그램 실행 중 새로운 hot spot 발견 시 해당 코드도 JIT 컴파일로 최적화됨)
ex) JVM, .NET, V8(Node.js 엔진)
자주 사용되는 코드(hot code)의 실행 속도가 크게 향상됨
컴파일된 코드를 메모리에 저장, 캐싱하므로 인터프리터보다 더 많은 메모리 소비함