- 책 제목
- 비전공자를 위한 이해할 수 있는 IT 지식
- 출판연월
- 20년 7월
- 지은이
- 최원영
- URL
- http://www.kyobobook.co.kr/product/detailViewKor.laf?ejkGb=KOR&mallGb=KOR&barcode=9791196918033&orderClick=LEa&Kc=
컴파일러는 인간과 컴퓨터 간 통역사
- 컴퓨터는 0과 1의 언어를 사용함
- 인간의 요구를 개발자가 프로그래밍 언어로 문서화함. 이 문서에는 각종 명령이 담겨 있음. 컴파일러가 이 명령을 기계어인 0과 1로 변환해 컴퓨터에 전달함
- 프로그래밍 언어: 컴퓨터에 명령할 문서를 작성하기 위한 언어
- 컴파일러: 프로그래밍 언어로 작성된 문서를 기계어로 번역해서 컴퓨터에 전달
- 개발자는 컴퓨터가 해야 하는 일을 문서로 작성하는 역할
- Integrated Development Environment(IDE)는 이런 문서 작성을 도와주는 프로그램
- Android Studio, Xcode(애플 OS 기반 application 개발), Eclipse(C,C++, JAVA, 웹 개발 용도), Pycharm
프로그래밍 언어가 다양한 이유?
- 사람들마다 표현 방식이 다르니 프로그래밍 언어도 다양해질 수 밖에 없음. 그 중 많이 쓰이는 것들만 선택받아 살아남는 구조
- C 언어 이전에 선택받지 못한 A, B 언어가 그 예시
- 저수준 언어는 컴퓨터 친화적인 언어, 고수준 언어는 인간 친화적인 언어
- 컴퓨터 친화적인 언어는 낮은 사양의 컴퓨터에서도 잘 돌아가고, 고수준 언어는 그 반대
- 컴퓨터 기능이 메인이 아닌 장치(프린터, 라디오 등)에선 저수준 언어를 사용해서 가격을 낮춤
- 가장 낮은 저수준 언어는 기계어 그 자체(01001~~)
- 유명한 언어 중 C언어가 가장 저수준이고, JAVA, PHP, Python, Ruby 등은 상대적으로 고수준 언어에 속함
컴퓨터 구성요소
- CPU: 두뇌 개념, 연산 담당
- HDD, SDD: 창고 개념, 데이터 저장
- RAM: CPU의 개인 작업 공간. 데이터 임시 저장
- 어떤 프로그램 아이콘을 더블 클릭해 실행하는 과정은 결국 저장 장치에 있는 데이터를 메모리로 올려놓고 CPU가 작업한다는 것
- ‘하드디스크 3번 플래터에 접근ㄴ해서 포토샵 데이터를 2번 메모리의 3번 구역에 올린 뒤 CPU에게 일을 시켜라’
- 위 과정을 대신해주는 것이 Operating System(OS, 운영체제)
- 윈도우(MS), Mac OS(Apple), iOS(Apple), Android(Google) 등
- 각 OS 위에 돌아가는 프로그램을 만들려면 각 OS에 특화된 프로그래밍 언어를 사용해야함
- 애플: Objective-C, Swift
- 구글: Java, Kotlin
- MS: C#, Visual Basic, C++, JavaScript
특화된 언어 말고 모든 OS에서 다 쓰이는 언어는 없을까?
- Java: 각 운영체제 위에 Java Virtual Machine(JVM)이라는 소프트웨어를 설치한다면, 이 위에서 Java로 만든 프로그램이 동작할 수 있음
- Python: 이 언어로 프로그램을 만들면 여러 OS에서 프로그램을 설치, 실행할 수 있음
- 이러한 방식은 OS 위에 프로그램을 올리고, 그 위에 (Java, Python 등으로 만든) 프로그램을 중첩시켜 돌리는 것이기 때문에 속도가 느림
- 모바일의 경우, iOS, Android 두 OS만 알면 되기 때문에 JVM과 같은 방식에 대한 수요가 적음 (용량 문제도 있고)
네트워크, 컴퓨터 간 연결
- 선으로 직접 연결된 컴퓨터들은 서로 파일을 주고받거나 게임을 같이 할 수 있다.
- 컴퓨터가 연결된 작은 지역(커피숍, 아파트 등)을 Local Area Network(LAN)이라 하고, 여러 LAN을 연결해 Metropolitan Area Network(MAN)을 만들고, 여러 MAN을 연결해 Wide Area Network(WAN)을 만듦
- 이런 과정이 10~20년 안에 일어났고, 초고속 인터넷망 등 전송 속도를 홍보하려는 회사 간 경쟁도 치열했다. 연결 공사 때 마다 정전도 몇 번 있었고..
- 물리적인 선이 아닌 무선으로도 신호를 주고 받을 수 있게됨 (3G, 4G, 5G 등)
- 전송하려는 파일을 정확한 컴퓨터에 보내기 위해 관련된 정보를 IP 주소로 통일시킴
- 위치와 컴퓨터에 따라 IP 주소는 고유함
- 늘어난 컴퓨터 숫자에 대응하기 위해 숫자 구분을 4개에서 6개로 늘린 IPv6를 같이 사용 중
이 모든 개념은 모두 이걸 위해: 서버와 클라이언트
- 파일을 요청하는 컴퓨터를 클라이언트(프론트엔드), 파일을 제공하는 컴퓨터를 서버(백엔드)라고 함
- 파일을 제공하기 위해선 프로그램이 필요함
- 이 서버 프로그램은 주로 리눅스라는 운영체제 위에서 돌림
- 리눅스가 기본적으로 무료
- 리눅스의 유명한 버전 중 Ubuntu, Red hat(유료), Android(모바일 운영체제 형태) 등이 있음
- 윈도우나 Mac OS가 비싼 이유는 바탕화면, 폴더, 파일, 마우스 등의 훌륭한 접근성을 가진 개념을 그래픅 UI로 구현했기 때문.
- 서버 프로그램은 단지 24시간 안정적으로 돌아가는 것이 가장 중요하기 때문에 이런 그래픽 UI는 불필요함. 따라서 리눅스를 많이 사용하게 되는 것
- 안정성이라는 측면에서 개인이 서버를 운영하는 것은 여러 리스크가 발생함. 자연스럽게 서버를 제공하는 서비스가 대두되었고 이를 제공하는 업체는 호스팅 업체라고 함 (국내에는 Cafe 24, 가비아 등)
- 해외에서는 Amazon Web Services(AWS)가 대표적인 호스팅 업체. 여긴 서버 컴퓨터 대여 뿐만 아니라 다양한 솔루션도 제공
서버와 클라이언트 간 정보는 어떻게 주고 받는건지? API와 JSON
- 클라이언트가 서버에 ‘이미지 파일 줘’라는 요청을 보낸다고 했을 때, 그 과정을 정확히 상상해보면 저 요청을 도대체 어떤 언어, 방식으로 전달할지 언급하지 않았다는 것을 알 수 있다. 이러한 요청와 정보 전달 자체는 지금까지 배운 프로그래밍 언어(인간과 컴퓨터 간 언어지 컴퓨터 간 언어가 아님), 컴파일러(프로그래밍 언어와 기계어 간 번역기이지 컴퓨터 간 번역기가 아님) 등의 개념으로 설명할 수 없다. 이런 전달 과정을 어떻게 하면 구축할 수 있을지 논리적으로 고민해보면 쉽게 답이 나온다.
- 클라이언트에서 요청하는 것을 인풋으로, 서버에서 제공하는 값을 아웃풋으로 하는 함수를 고안해내는 것이다. 이 함수가 곧 Application Programming Interface(API)라고 할 수 있다.
- 예를 들어 ‘서버주소/A’라는 요청(인풋)을 보내면, 해당 서버주소가 로그인 기능을 수행하고 응답하거나, ‘서버주소/B’라는 요청을 보내면 해당 서버가 회원 가입 기능을 수행하고 응답하는 방식이다.
- API는 소프트웨어가 다른 소프트웨어의 기능을 쓰기 위해 중간에 필요한 체계
- API는 서버 개발자가 만들고, 클라이언트는 그 API를 사용한다.
- API를 만들 때 데이터 주고 받는 기능도 같이 넣어야함 (뒤에서 따로 다룸)
- 클라에서 로그인 요청을 할 때 아이디와 비밀번호 데이터를 제공해야 하는 것이 그 예시
- 대부분의 요청은 CRUD에 속함 (예시: 타임라인에 사진을 올리는 등의 요청)
- Create: 사진 업로드
- Read: 사진 불러오기
- Update: 사진 바꾸기
- Delete: 사진 지우기
- 데이터를 다루는 어떤 기획에 위 네가지 요청이 하나라도 없다면, 추후 큰 실수로 이어지기 때문에 그 이유를 명확히 하고 진행해야함
- 위 예시 요청을 다시 보면, 여러 CRUD가 하나의 요청(작업)에 포함되어 있지만 CRUD 하나하나 ‘서버주소/A’ 이런 방식으로 요청을 보내게 되면 혼란이 가중됨
- 이런 상황을 타개하고자 나온 운동이 Representational State Transfer API(RESTful API) 이다.
- CRUD를 하나의 주소로 관리하고, 요청을 보낼 때 어떤 요청인지 파악할 수 있는 method를 붙여서 같이 전송함 (Method는 개발자 세계에선 수학의 함수와 같은 의미다.)
- Create: POST(생성)
- Read: GET(로드)
- Update: PUT(전체 바꿈), PATCH(일부 바꿈)
- Delete: DELETE(지움)
- 서버 관점에서 CRDU 요청이 오면, 어떻게든 응답을 보내야함. 통일성 있는 체계의 응답을 고안해낸 것이 HTTP 상태 코드
- 200번대 코드: 수행 결과 잘됐고, 요청한 데이터 같이 전송할게~
- 400번대 코드: 클라이언트 쪽에 문제 있어서 수행하지 못했어~
- 500번대 코드: 서버 쪽에 문제가 있어서 수행하지 못했어~
- API 개념을 서버 & 클라이언트에서 확장시켜 한 컴퓨터 내 여러 소프트웨어 간 요청, 응답의 경우도 API가 필요함
- 기능을 제공하는 소프트웨어에서 관련 API를 미리 만들어놓지 않았다면 다른 소프트웨어는 그 기능을 (당연히) 쓸 수 없음
- API를 그냥 제공, 열람하게 해주는게 아니라 프로그램 형태로 제공할 수도 있음. 이를 Software Development Kit(SDK)라고 함
- 요청과 응답을 주고받을 때 데이터도 같이 담길 수 있는데, 어떤 형식으로 데이터를 담아야 할지? 유명한 형식을 쓰자!
- 과거에는 XML이라는 형식이 널리 쓰였으나, 현재 가장 유명한 형식은 JSON
- JSON은 중괄호로 시작, key와 value의 쌍으로 이루어져 있음
- 하나의 key에 여러 데이터가 담겨야 할 땐 array 형식으로 나타냄 (ex. [‘상품1’, ‘상품2’])
- 도메인 네임은 IP 주소와 같다. 숫자는 의미를 파악하기 힘드니 문자로 대신 나타낸 것
또 다른 큰 줄기: Application
- 응용 프로그램(Application Software), 애플리케이션, OS 위에 올라가는 모든 프로그램, 어플 모두 같은 의미
- 스마트폰이 등장하면서 데스크톱에 설치하는 프로그램은 응용 프로그램, 모바일은 앱, 어플로 부르게 된 것
- 모바일에는 앱 마켓이라 불리는 앱을 업로드해놓고 판매할 수 있는 시장이 있음
- iOS에선 앱스토어, 안드로이드에선 구글 플레이 스토어라고 부름
- 각 스토어마다 심사 과정, 기간, 지침이 다름
또 다른 큰 줄기: Web
- 다른 OS 사용자들이 각 OS에서만 호환되는 파일을 주고받는다면 서로 파일을 열 수 없는 문제가 발생함. 이를 해결하기 위해선 OS나 프로그램에 상관없이 일정한 형식이 언제나 동일하게 보이는 새로운 개념이 필요했음. 그 일정한 형식이 Hyper Text Markup Language(HTML)이다.
- HTML로 작성한 문서는 OS에 상관없이 브라우저만 있으면 동일한 정보를 볼 수 있게 고안되었다. 모든 정보가 자유롭게 공유되는 환경을 목표로 창안된 것이고, 그에 맞춰 정보를 체계화하는 코드들이 HTML 코드에 내재해있다. HTML은 태그라는 코드로 구성되어 있으면 아래 예시 있음.
: header : paragraph
- : ordered list
- : unordered list
- : 링크 개념, 한 HTML 문서에서 다른 HTML 문서로 이동할 수 있게 해줌
- HTML은 프로그래밍 언어가 아닌 브라우저가 볼 수 있는 문서를 적는 언어 (이걸로 뭘 작성해봤자 컴파일러가 인식을 못함)
- HTML은 정보 전달에만 초점을 맞추다보니 디자인 기능이 부족해서 HTML에 디자인을 입힐 수 있는 코드인 Cascading Style Sheets(CSS)를 붙임
- HTML과 CSS를 합쳐 퍼블리싱 작업이라 하며, 이 작업하는 사람들을 퍼블리셔라고 부름
- HTML 작업을 주로 하는 사람은 마크업 개발자라고 함
- 정보 전달, 디자인 외 웹에서 API 요청, 로그인 등의 기능을 구현하기 위해선 프로그래밍 언어가 필요함. 그래서 웹에선 JavaScript이라는 언어가 프로그래밍 언어의 역할을 함.
- HTML, CSS, JavaScript의 완성본은 모두 서버에 있어 프론트에서 GET 요청으로 html 문서를 받아와 웹에 띄운다.
- 이 부분이 웹와 어플의 가장 큰 차이인데, 어플은 업데이트할 경우 스토어에 업로드하고, 유저가 다운로드해야 하지만 웹은 그냥 서버의 원본을 바꾸면 된다.
- 웹은 네트워크의 영향을 많이 받지만, 어플은 상대적으로 영향을 덜 받는다.
- 브라우저는 HTML, CSS, JavaScript를 받아서 읽는 프로그램이다. Chrome, Explorer, Firefox, Opera, Safari 등이 있다.
- 각 브라우저는 서로 다른 응용프로그램이기 때문에 브라우저마다 HTML, CSS, JavaScript를 읽고 구현하는 방식이 다름. 여기에 브라우저의 버전도 고려한다면 웹 프론트 개발자는 브라우저 종류 * 버전에 맞춰 추가로 코드를 작성해야함. 이 문제를 브라우저 버전의 파편화라고 부름.
또 다른 줄기: Database
- 관계형 데이터베이스와 RDBMS는 익히 들어서 알테고, 이걸 클라와 백에서 어떻게 다루고 있는지?
- 데이터는 보조기억장치에 저장되고, DBMS는 소프트웨어다. 일반적인 컴퓨터라면 DBMS를 실행시킬 수 있고, 클라이언트와 서버는 일반적인 컴퓨터를 가정한다. 즉, 클라와 서버에는 모두 DBMS를 실행시킬 수 있고, 데이터를 저장할 수 있다.
- 알람 애플리케이션의 경우, 인터넷에 연결이 되어 있지 않아도 동작하기 때문에 데이터가 클라에 쌓인다는 것을 알 수 있다.
- 데이터의 출처가 클라인지 백인지 명확하게 알려면? API 문서를 봐야함. 데이터가 어디에 있는지 명확하게 알아야 누구한테 요청을 할지 알 수 있음
- 클라이언트 = 로컬, 내부DB, 네이티브, 프론트
- 서버 = API 요청, (그냥)DB, 백
또 다른 줄기: 프레임워크, 라이브러리
- 빅테크 기업에선 개발자들이 자사의 애플리케이션을 쉽고 빠르게 개발할 수 있도록 공간과 도구를 제공하고 있음. 각각을 프레임워크, 라이브러리라고 하며 좀 더 사전적 정의로 프레임워크는 소프트웨어의 특정 문제를 해결하기 위해 상호 협력하는 클래스와 인터페이스의 집합이고, 라이브러리는 단순 활용 가능한 클래스의 집합이라고 설명 가능하다.
- 각 회사, 웹, 서버, 언어 별 유명한 프레임워크가 있다.
- 프레임워크가 라이브러리보다 상위 개념이며, 한 프로젝트에서 프레임워크는 하나만 쓸 수 있는 반면, 라이브러리는 한 프로젝트에서 여러개가 함께 사용이 가능하다.
- 더 자세한 설명은 https://webclub.tistory.com/458를 참고하면 좋다.
또 다른 줄기: 개발자와 디자이너
- 디자이너는 주로 포토샵과 일러스트를 사용해 작업함. 이 프로그램을 사용해 뽑아낸 결과물을 개발자가 구현하려면 세세한 부분의 수치까지 알아야 하는데, 이런걸 기록한 가이드를 작성해야함. 디자이너가..!
- 수고스러움을 줄이고자 스케치, 재플린, XD 등의 프로그램이 등장했는데, 가이드를 적지 않아도 디자이너 작업 결과물의 수치를 보여준다.
- 디자인 구현은 개발자의 몫이지만, 프레임워크와 라이브러리에서 제공하는 수준을 벗어난 디자인 디테일을 구현하고자 한다면 디자이너, 개발자 서로 힘듦
- 프론트 개발자는 UI를 보는 감각이 있어야 하고, 디자이너는 프레임워크, 라이브러리 가이드를 어느 정도 숙지하고 있어야 함