Programming/STUDY

[인강/CS 지식의 정석] 1. 개발자 필수 지식

지고르 2024. 11. 30. 14:47
데이터 교환 방식

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)의 실행 속도가 크게 향상됨

컴파일된 코드를 메모리에 저장, 캐싱하므로 인터프리터보다 더 많은 메모리 소비함