개발자 필수 지식 | CS 지식의 정석
CS 지식의 정석의 “개발자 필수 지식” 파트를 공부한 것을 기록합니다.

1. 데이터교환형식 #1. JSON과 직렬화와 역직렬화JSON정의1. Javascript 객체문법2. 데이터 + 교환형식3. 여러언어에서의 쓰임4. 단순 배열, 문자열 표현5. JSON의 타입6. JSON 직렬화, 역직렬화7. JSON의 활용2. 데이터 포맷 #2. XML정의구조활용3. API #1 개념정의장점종류4. API #2 실습 OPEN API를 이용해 온도예측하기5. API #3 실습 Node.js를 이용한 간단한 API 구축6. 클라우드 #1 가상머신전통적 배포방식가상화 배포방식동작방식장점단점7. 클라우드 #2 오프프레미스, 온프레미스오프프레미스 방식온프레미스 방식8. Iass와 PaaS와 SaaSIaaSPaaSSaaSIaaS와 PaaS 비교9. 컨테이너(container)와 도커(docker)컨테이너도커도커의 과정도커의 활용사례10. CI/CD(Continuous Integration/Delivery & Deployment)파이프라인파이프라인 장점빌드테스트머지배포툴11. 클래스와 객체와 인스턴스의 차이클래스객체인스턴스12. static 키워드는 왜 사용하며 단점은?static을 사용하는 이유static을 사용할 때 단점13. 오버로딩과 오버라이딩은 무엇인가?오버로딩(Overloading)오버라이딩(Overriding)14. 추상화란?추상화추상화 종류데이터 추상화프로세스 추상화15. IT 대기업 100% 합격하는 방법프로젝트 - 알고리즘 - CS - 오픈소스 4가지를 하자!프로젝트:알고리즘CS오픈 소스Overall
1. 데이터교환형식 #1. JSON과 직렬화와 역직렬화
JSON
정의
- “Javascript 객체 문법” 으로 구조화된 데이터교환 형식
- 파이썬, 자바스크립트, 자바 등 여러 언어에서 데이터 교환형식으로 쓰임
- 객체문법말고도 단순 배열, 문자열도 표현 가능
1. Javascript 객체문법
- 여기서 Javascript 객체문법이란 키(key)와 값(value)로 구성됨.
{key : value}
- 이미 존재하는 키를 중복선언하면 나중에 선언한 해당 키에 대응한 값이 덮어쓰이게 됨
- JSON 파일을 자바스크립트 진영에서 사용하려면 JS Object를 변환해줘야함→ JSON.parse()를 사용해야함
- 파이썬에서 JSON파일을 사용하려면 JSON.loads()를 사용해 dictionary타입으로 변환해 사용
- 언어마다 다름
- 아래 코드처럼 여러 개를 선언하고 싶을 때 배열로 감쌀 수 있음 → JSON Array라고 함
[{ "name": "kundol", "age": 30 }, { "name": "yang", "age": 30 } ]
- 첫번째 인덱스에 접근하고 싶으면: a[0]
- 첫번째 인덱스의 “name”에 접근하고 싶으면: a[0].name or a[0][”name”]
[ { "name": { "firstname": "ju", "lastname": "hongchul" }, "age": 30 }, { "name": "yang", "age": 30 } ]
- 재귀적으로도 선언 가능
- 이 때 “ju”에 접근하고 싶으면 a[0].name.firstname or a[0][”name”].firstname
2. 데이터 + 교환형식
- 데이터는 추상적인 아이디어에서부터 구체적인 측정에 이르기까지 다양한 의미로 쓰임
- 실험, 조사, 관찰 등으로부터 얻은 사실이나 자료 등을 의미
3. 여러언어에서의 쓰임
- JSON은 여러언어에서 독립적으로 쓰임
- 자바스크립트 또는 파이썬이 업그레이드 했다고 JSON을 바꿔야할 필요가 없음
4. 단순 배열, 문자열 표현
- JSON은 단순 배열, 문자열 표현 가능
- 하지만 보통 key: value 형태가 여러개인 JSON Array 형태로 쓰임
5. JSON의 타입
- Javascript Object와 유사하지만 undefined, 메서드 등을 포함하지 않는다
const a = { "a": () => { console.log(1) }, "b": undefined } console.log(a)
- JS는 위 사진과 같이 표현 가능
- JSON은 불가능
6. JSON 직렬화, 역직렬화
- 직렬화란 외부의 시스템에서도 사용할 수 있도록 바이트(byte) 형태로 데이터를 변환하는 기술 → JSON.stringify()
- 역직렬화는 반대를 의미 → JSON.parse()
7. JSON의 활용
- JSON은 프로그래밍 언어와 프레임워크 등에 독립적이므로 서로 다른 시스템간에 데이터를 교환하기에 좋다
- 주로 API의 반환형태, 시스템을 구성하는 설정파일에 활용
- ex) 업비트의 API
- ex) package.json
2. 데이터 포맷 #2. XML
정의
- JSON과 마찬가지로 데이터 교환 형식
- XML이란 Extensible Markup Language의 줄임말로 마크업 형태를 쓰는 데이터교환형식이다.
- 마크업이란?
- 태그등을 이용하여 문서나 데이터의 구조를 나타내는 방법
구조
- XML은 3가지로 형태로 구성되어 있다.
- 프롤로그: 버전, 인코딩 → <?xml version=”1.0” encoding=”UTF-8”>
- 루트요소(단 하나만) → <OSTList>
- 하위 요소 → 그 밑의 태그
<?xml version="1.0" encoding="UTF-8?> <OSTList> <OST> <name>마녀 배달부 키키</name><song>따스함에 둘러쌓인다면</song> </OST> <OST> <name>하울의 움직이는 성</name><song>세계의 약속</song> </OST> </OSTList>
여기서 면접에서 자주 나오는 질문:
- HTML과 XML의 차이는?
- HTML의 용도는 데이터를 표시하고 XML의 용도는 데이터를 저장 및 전송한다
- HTML은 미리 정의된 태그가 있지만 XML은 사용자가 고유한 태그를 만들 수 있고 정의 가능
- XML은 대/소문자를 구분하지만 HTML은 구분하지 않음
- JSON과 XML의 차이는?
- XML은 닫힌 태그가 계속 들어가기 때문에 JSON보다 무겁다.
- Javascript Object로 변환하기 위해서 JSON보다 복잡하다
- JSON은 Javascript에서 제공해주는 JSON.parse()만 쓰면 되지만 XML은 외부 라이브러리를 로드해야한다
활용
- sitemap.xml으로 쓰임
- 여러 언어에서도 독립적으로 쓰임
- 구글에 검색했을 때 상위에 노출시켜야하는데 이 기술을 SEO(search engine optimization)라 한다. 구글 데이터베이스에 페이지들이 저장되어야하는데 크롤링 봇이란 프로그램이 종속적인 페이지들은 쉽게 크롤링하지만 독립적인 페이지들은 잘 크롤링하지 못해 서비스를 만들때 sitemap.xml을 제출해줘야 쉽게 크롤링 가능하다
3. API #1 개념
정의
- API(Application Programming Interface)란 둘 이상의 컴퓨터 프로그램이 서로 통신하는 방법이자 컴퓨터 사이에 있는 중계 게층을 의미
- ex) 프로토콜, 메서드, 데이터타입 등이 정의된 중계계층
- 예를들어 HTTP냐 HTTPS이냐, GET이냐 POST이냐, JSON이냐 XML이냐…
- 참고: API는 과거부터 발전된 용어
- 라이브러리 및 프레임워크를 설명하는 명세서를 API라고 하기도하고, 웹상에서 WEB API, Web Socket API등을 API라고 하기도 하는데, 현재 기준으로 API라고 하면 보통 WEB API를 뜻한다.
장점
- 제공자는 서비스의 중요한 부분을 드러내지 않아도 된다
- 사용자는 해당 서비스가 어떻게 구현되는지 알 필요없이 필요한 정보만을 받을 수 있다
- OPEN API의 경우 앱 개발 프로세스를 단순화 시키고 시간과 비용을 절약할 수 있다
- 내부 프로세스가 수정되었을 때 API를 매번 수정하는 것이 아닌 API가 수정 안되게 만들 수 있다. → 이를 통해 내부 DB, 서버의 로직이 변경이 되어도 매번 사용자가 앱을 업데이트하는 일은 줄어들 수 있다
- 제공자는 데이터를 한곳에 모을 수 있다
종류
- private: 내부적으로 사용. 주로 해시키를 하드코딩해놓고 이를 기반으로 서버와 서버간의 통신한다.
- public: 모든 사람이 사용 가능. 많은 트래픽을 방지하기 위해 하루 요청수의 제한, 계정당 몇개 등으로 관리한다.
4. API #2 실습 OPEN API를 이용해 온도예측하기
- 수치 모델이나 인공지능 모델같이 복잡하고 비싼 장비없이 Open API 하나만으로 온도예측 차트 구현 가능!
5. API #3 실습 Node.js를 이용한 간단한 API 구축
- API 장점 4번째를 실습
- 파일이 수정되어도 API가 수정되지 않도록 하는 서버를 만듦
- 노드제이에스 기반으로 서버를 구축
- Node.js란?
- 비동기적 이벤트 주도 방식, 논블로킹 I/O 모델을 사용하는 구글의 V8 엔진을 장착한 자바스크립트 런타임
- 즉 노드제이에스는 자바스크립트를 실행할 수 있는 환경이다!
- Express 모듈이란?
- Express는 Node.js에서 동작하는 웹 프레임워크 중 많이 사용되며 라우팅 설정, 미들웨어 설정, 정적자원서버 설정 등이 쉬은 프레임워크
- 라우팅이란 URI(또는 경로) 및 특정한 HTTP 요청 메소드(GET, POST 등)인 특정 엔드포인트에 대한 클라이언트 요청에 애플리케이션이 응답하는 방법을 결정하는 것을 말함
- 루프백IP: 자신의 IP
- HTTPS의 기본포트 번호는 443, HTTP의 기본포트는 80
6. 클라우드 #1 가상머신
클라우드를 이해하기에 앞서서 근본 기술인 가상머신에 대해 배워보자
전통적 배포방식
- 물리적인 컴퓨터 한 대에 하나의 OS를 깔고 여러 가지 프로그램을 설치하는 방식
- 계정을 나눠 여러명의 사용자가 이용할 수 있도록 할 수 있지만 어떤 프로그램을 설치했을 때 다른 앱에 영향을 미침
가상화 배포방식
- 가상머신을 기반으로 배포하는 것을 말함
- 가상머신이란 컴퓨터의 하드웨어를 소프트웨어적으로 구현한 것을 말함
- 계정을 나누는 것이 아닌 한대의 컴퓨터를 가지고 여러개의 OS를 구동할 수 있게 되며 CPU, RAM을 물리적으로 갈아끼는 것이 아니라 설정만으로 이를 수행할 수 있게 됨
동작방식
- 중간에 있는 하이퍼바이저는 하나의 시스템 상에서 가상 컴퓨터를 여러개 구동할 수 있도록 해주는 중간 계층을 의미함
- 이 위에 여러개의 가상머신을 구축 가능
장점
- 한 대의 하드웨어로 여러명의 사용자들에게 독립적으로 클라우드 서비스를 할 수 있다
단점
- 가상머신 위에 OS를 일일이 설치해야 함
7. 클라우드 #2 오프프레미스, 온프레미스
오프프레미스 방식
- 클라우드 서비스는 내가 아닌 다른 회사의 공급자가 호스팅하고 인터넷을 통해 사용자에게 제공되는 인프라, 플랫폼 또는 소프트웨어를 말함
- 이를 이용해 자체 인프라나 하드웨어 설치 없이 애플리케이션과 리소스에 쉽고 싸게 이용 가능
온프레미스 방식
- 네트워크 선까는 것부터 시작해 서버, 데이터베이스 설치 등을 하는 것
- ex) 네이버의 프라이빗 IDC, 각
8. Iass와 PaaS와 SaaS
IaaS
- Infrastructure-as-a-Service
- 인프라형 클라우드 서비스
- 클라우드가 단지 “인프라”만 제공해서 특정 서비스에 종속되지 않음
- 단순히 빈방을 준다고 생각하면 됨
- node.js, MongoDB등을 개발자가 일일이 직접 설치해야함
- ex) AWS의 EC2, NCP등
PaaS
- Platform-as-a-Service
- 플랫폼형 클라우드 서비스
- 클라우드가 플랫폼을 제공
- node.js, MongoDB등이 설치되어있으며 그저 클릭을 통해 해당 서비스를 이용 가능
- 빌트인 방을 준다고 생각하면 됨
- 모니터링, CI/CD가 제공
- ex) heroku
SaaS
- Software-as-a-Service
- 서비스형 클라우드 서비스
- 완전한 서비스를 클라우드 서비스로부터 제공받아 사용
- ex) 구글docs
IaaS와 PaaS 비교
ㅤ | IaaS | PaaS |
유연성 | 높음 | 낮음 |
이식성 | 높음 | 낮음 |
운영비효율 | 낮음 | 높음 |
- IaaS는 다른 서버로 옮길 때(빈방이라) 쉬워서 유연성과 이식성이 높지만 , PaaS는 (빌트인 방이라) 플랫폼 종속적이라 옮기기 어려움
- 운영비 효율은 IaaS는 명령어로 일일이 설치해야해서 낮지만, PaaS는 클릭만으로 쉽게할수 있어 높다. 또한 PaaS 는 CI/CD 무료로 가능, 모니터링 가능, 로깅도 가능, 그래서 비용이 잘 안듬
9. 컨테이너(container)와 도커(docker)
컨테이너

- 애플리케이션이 한 컴퓨팅 환경에서 다른 컴퓨팅 환경으로 빠르고 안정적으로 실행되도록 코드와 모든 종속성을 패키징하는 소프트웨어의 표준 단위이다
- 컨테이너는 OS를 공유하기 때문에 빠르고, 경량화되어 있으며 격리성도 훌륭
- 가상머신 배포 방식은 OS를 공유안하고 일일이 하나씩 설치해줘야했지만, 컨테이너 배포방식은 OS를 공유하고 컨네이너가 격리돼 OS를 일일이 설치 안해도 됌 → 조금더 빠르고 경량화 됌
- 단점: 컨테이너 배포방식에서 OS에 문제가 생기면 다른 앱들에 영향을 미침
도커
- IaaS 의 이식성과 유연성, PaaS 운영비효율의 장점을 모두 가진게 “도커”
- 애플리케이션 구동에 필요한 환경설정관련 절차를 작성 → 빌드 → 도커 이미지 생성 → 도커 이미지 실행 → 도커 컨테이너 생성
도커의 과정

- 도커 파일: 패키지, 환경변수설정 등을 기록한 파일. 이를 빌드해 도커이미지로 변환
- 도커 이미지: 컨테이너 실행에 필요한 파일과 설정값, 데이터 등을 포함된 “상태값”이며 “불변”하다. 하나의 이미지에서 여러개의 컨테이너를 생성할 수 있으며 컨테이너의 상태와는 무관하게 이미지는 그대로 존재한다.
- ex) 1대의 서버에 환경설정해야 한다면 미리 만들어 놓은 이미지를 다운받아서 이를 통해 컨테이너만 만들면 끝
- 도커 컨테이너: 컨테이너가 실행시키면 도커이미지에 설정된 프로그램, 데이터 등이 실제 컴퓨팅자원과 연결된다.
도커의 활용사례
- 도커컨테이너를 기반으로 클라우드에 컨테이너배포방식으로 서비스가 많이 운영되고 있다
- 예를들어 2014년에 구글에서 발표한 자료에 따르면 구글에서 만드는 서비스들 대부분이 도커컨테이너에 기반하여 쓰이고 있으며, 매주 약 20억개의 서비스가 운영된다 함
10. CI/CD(Continuous Integration/Delivery & Deployment)
- 개발자가 코드를 짠 뒤에는 지속적으로 코드를 합치고 코드를 배포해야함
- 이를 CI/CD(Continuous Integration/Delivery & Deployment)라고 함
파이프라인
- 코드구축부터 시작해서 배포까지의 일련의 과정들을 CI/CD 파이프라인이라고 함
- 총 3단계 (Continuous Integration - Continuous Delivery - Continuous Deployment)

- Continuous Integration: 코드를 빌드하고 테스트하고 합침
- Continuous Delivery: 해당 레퍼지토리에 릴리스
- Continuous Deployment: 이를 프로덕션, 즉 실제 서비스에 배포
파이프라인 장점
- 코드 배포까지 좀 더 체계적으로 만듦
- 테스트가 강제됨
- 파이프라인 자체내에 테스트가 있기 때문에 테스트 없으면 코드 머지 자체가 안되게 만들 수 있음
빌드
- 대표적인 예로 webpack이 있음

테스트
- 테스트는 단위테스트, 통합테스트, 엔드투엔드테스트가 있다
- 대표적인 프레임워크로는 mocha가 있다
- 단위테스트: 함수 등 작은 단위를 테스팅
- 통합테스트: 모듈을 통합할 때 테스트
- 엔드투엔드테스트: 사용자가 서비스를 사용하는 상황을 가정해서 테스트
머지
- git이나 svn을 이용해 머지한다
- 요새는 그냥 git을 씀
배포
- 사용자를 위한 서비스 배포
- 내부적으로 QA엔지니어나 관리자페이지를 위한 배포, 데이터웨어하우스로부터 데이터를 가공해서 백엔드 개발자를 위한 배포등을 포함
툴
- github action, genkins, circle ci가 유명하며 heroku를 통해 CI, CD 설정 없이 자동 가능
- 참고) heroku + github action으로 설정도 가능
11. 클래스와 객체와 인스턴스의 차이
클래스
- 클래스란 객체를 만들어 내기 위한 틀
- 객체의 속성과 메서드의 집합을 담아놓은 것
객체
- 클래스로부터 만들어지는 실체
- 클래스로 선언된 변수를 객체라 함
- Person a; // 객체
인스턴스
- 객체가 메모리에 할당이 된 상태이며 런타임에 구동되는 객체를 말함
- a = new Person(); // 인스턴스 → 메모리에 할당되면 인스턴스
- 참고: 인스턴스는 AWS의 클라우드의 가상서버를 의미하기도 함
12. static 키워드는 왜 사용하며 단점은?
static을 사용하는 이유
- 클래스의 인스턴스가 아닌 클래스에 속하기 때문에 클래스의 변수, 메소드 등을 공유하는데 사용
- 위와 같은 사용으로 해당 클래스로 만들어지는 객체사이에서 중복되는 메소드, 속성을 효율적으로 정의할 때 쓰임
- ex) talk()와 같이 중복되는 속성(메소드)은 static으로 하는게 좋음 → 효율적으로 메모리를 쓸 수 있음
static을 사용할 때 단점
- 단점: static이 붙은건 선언을 하자마자 메모리에 올라감 → 코드상에 안써도 메모리에 올라가서 메모리 낭비
- 자바에서 static으로 선언하지 않은 변수는 힙(heap)에 할당됌. 가비지 컬렉터(GC)가 메모리 관리를해 메모리 회수를 하지만, static으로 선언한 변수는 method area에 할당돼 GC가 메모리 회수를 하지 않음. 프로그램이 종료되어야 메모리가 회수됨
13. 오버로딩과 오버라이딩은 무엇인가?
오버로딩(Overloading)
- 이름이 같아도(메소드명이 같아도) 매개변수 개수, 타입, 순서를 다르게 해서 같은 이름의 함수를 여러개 정의할 수 있는 것을 말함
- 같은 클래스 내에서 사용
- 장점: 프로그램의 유연성을 높이고 코드를 깔끔하게 함
- ex) 매개변수가 다르다해서 multiply1, multiply2, multiply3… 이렇게 만들면 코드가 복잡해짐
- 몰랐던 사실: 매개변수의 타입, 개수 말고도 “순서”를 다르게 해도 오버로딩
오버라이딩(Overriding)
- 상위 클래스가 가지고 있는 메소드를 하위 클래스가 재정의 하는 것
- 상속 관계 클래스에서 사용되며 static, final로 선언한 메소드는 오버라이딩 불가능
- 자바에서는 @Override 어노테이션으로 오버라이딩 판별 → 굳이 안써도 되지만 IDE가 오류를 검증해 주는 걸로 알고 있음
- 오버라이딩 나의 질문: 왜 static, final은 오버라이딩 불가능일까?
14. 추상화란?
추상화
- 복잡한 데이터, 구조, 시스템등으로부터 핵심만을 가려내 덜 자세하게 만드는 것
- 세부사항, 절차 등을 감추고 인터페이스 등을 만드는 것으로 복잡도를 낮추는 방법
추상화 종류
데이터 추상화
- 어떠한 데이터들의 공통점을 모으고 차이점은 버림
- ex) 고양이, 강아지, 원숭이 등의 객체들의 공통적인 특징을 묶어 동물이라는 카테고리로 카테고리화 시킴
프로세스 추상화
- 어떠한 내부 프로세스를 숨기는 것을 말함
- ex) 데이터베이스가 어떻게 데이터를 저장하는지는 모르지만, 단순하게 insert, upsert 등의 쿼리로 데이터를 저장
15. IT 대기업 100% 합격하는 방법
프로젝트 - 알고리즘 - CS - 오픈소스 4가지를 하자!
프로젝트:

- 원하는 기업의 모집공고를 확인해 사용하는 기술을 공부하자
- 프로젝트에 사용하는 기술들을 어느정도는 깊게 공부
- 모든 기술들을 다 깊게 배울수는 없지만, 자신이 강점으로 내새울만한 기술들은 깊게
- ex) 스프링을 강점으로 내새울거면, 스프링에 대해 깊게 공부하자
- Docs + 강의 + 책
- 결론: 지원자격은 무조건 충족 + 우대사항 기술 base + 깊게
알고리즘
순서대로
- 누적합, 구현, 그래프이론, DFS, BFS, 트리순회, 완탐, 백트래킹, 비트마스킹, 그리디, 라인스위핑, 투포인터, LIS, 이분탐색, DP, 최단거리, 펜윅트리
- 플래티넘 or 프로그래머스 레벨 5 수준까지 → 최소 다 합쳐서 160문제는 풀어야함
CS
- 디자인패턴 - 네트워크 - 운영체제 - 자료구조 - 데이터베이스
오픈 소스
- 6개월동안 하루 2시간씩
- 이슈분석, 코어분석, 댓글, 지속된 pr
- Github Star 1만 이상의 오픈소스를 목표로
- 목표 오픈소스 주변의 오픈소스부터
Overall
순서대로
- 알고리즘: 필요개념 & 플레티넘 이상
- 프로젝트: 지원자격, 우대사항, 깊게
- CS: 중요한 것 이상 모두 외우자 - 하루 30분씩만
- 오픈소스: star 1만 이상의 기여자


댓글