프로그래밍 기본지식 격파하기

- 보통 응용 프로그램을 개발하게 됨.
- 쉘이라는 소프트웨어로 운영체제와 통신을 하며 cd, ls를 사용하는 것임.
- 현재는 고급 언어(영어로 코딩)를 컴파일러를 거쳐 프로그램을 만듦.
- 컴파일러와 인터프리터가 있지만 요새는 경계가 흐려지고 있음.
- 빌드 = 컴파일 + 프로그램 실행 준비를 위한 모든 과정.
- 프로세스 = 실행되고 있는 프로그램, 메모리에 올라간다는 것을 의미.


- 실제로 관리자도구에서 확인하면 컴퓨터에는 수많은 프로세스가 실행되고 있음.
- 운영체제가 전체 프로세스의 자원을 관리함.
- (면접 단골 질문) 스레드 vs 프로세스 vs 멀티 프로세스 멀티프로세스는 공장을 여러개 세우는 것, 멀티스레드는 공장안의일꾼을 많이 생성시키는 것.
깃과 깃허브
- commit : git에서 코드 변화를 기록하는 최소 단위.
- branch : 독립적으로 작업을 진행할 수 있는 객체.
- github : 대표적인 원격 저장소.
- git 기본 동작 흐름 : add → commit → push 과 fetch, merge
- pull request, code review.
- gitflow : 대표적인 깃 브랜치 전략.

네트워크
- 컴퓨터들끼리 서로 연결되어 통신을 하는 것.
- 클라이언트 : 정보를 요구하는 주체, 서버 : 정보를 제공하는 주체. 다만 이는 상대적인 개념임.
- IP : 네트워크 통신을 위한 주소. 모든 것은 IP 주소로 접근함.
- 포트 : 컴퓨터 내 프로세스로 도달하기 위한 주소. 리액트는 3000임.
- HTTP 프로토콜 : 브라우저와 서버의 통신할 때, 어플리케이션 통신할 때 사용.
- 결과적으로 브라우저는 IP 주소와 포트를 통해 네트워크 통신함.
- domain Name system : DNS를 거쳐 도메인을 IP 주소로 변환하여 서버로 IP주소 전송.
- 방화벽 : 보안을 위해 네트워크 통신을 제한하는 행위. IP, port, 통신 정보 등 다양한 값을 통해 통신을 제한함.
- OSI 7계층. 물데네전세표응 (ㅋㅋ)
- 라이브러리 vs 프레임워크. 굳이 나누진 않지만.. 라이브러리는 보통 특정 기능을 수행하는 코드 묶음이라하고, 프레임워크는 실제로 코드를 짜는 흐름을 결정함. 리액트는 라이브러리.

- API : 프로그램과 프로그램을 연결시켜주는 매개체. 하나의 서버, 인터페이스, 소프트웨어가 될 수 있음.
- OPEN API : 특정집다에서 관리하는 데이터를 제 3자가 서버 요청을 통해 접근하도록 한 것.

- 로그 : 프로그램을 실행하면서 남기는 기록. ex) 유저가 웹, 앱을 사용하는 기록, 서버에서 로그인 요청이 온 기록.
- 유저 로그로는 google analytics, amplitude, hotjar 로그 데이터 베이스 등으로 유저 로그 파악. 서버로그로는 요청시간, 요청 IP 등이 있음. 하나의 프로덕트를 운영하는 데 로그 관리가 중요함.
웹, 모바일 개발의 큰 맥락 이해하기
백엔드와 협업하면서 협업에 필요한 게 무엇인지 파악하자!
웹
- HTML, CSS, JS 사용함.
- 웹이 보여지는 과정 : 클라이언트와 웹 서버 컴퓨터가 도메인 요청, 서버의 응답을 하며 이루어짐.
- CSR과 SSR

- 반응형 웹, 크로스 브라우징,
모바일
- 플랫폼 OS : android, ios, 개발언어 : kotlin, JAVA, swift, objective-c.
- 앱이니까 바로 메인 페이지의 정보를 요청하면 서버가 응답하는 구조.
- 앱 스토어 런칭, 심사 : 내부 직원이 직접 앱의 적합도를 판단함.

- 앱 버전이 다양함. 웹처럼 업데이트가 쉽지 않기 때문.
- 웹뷰 : 앱 내에서 웹을 보여주는 브라우저 역할을 함. 앱 내에 브라우저가 있다고 생각하면 됨.
- 웹, 앱 공통점 : 동일한 API 서버를 이용함.
- 차이점 : 웹은 페이지마다 계속해서 URL 요청 후 다운을 받기 때문에 속도가 느림. 앱은 스토어에서 한 번 다운받으면 사용할 때는 속도가 빠름. 다만 SPA 방식, 쿠키 등으로 개발하면 속도를 향상시킬 수 있음. 웹은 코드를 바꾼 후 서버에 업로드하면 바로 반영이되지만 앱은 코드를 바꾸려면 심사를 통과해야 하기 때문에 대응이 느림. 웹은 컴퓨터 장치를 자유자재로 이용할 수 없음. ex) 푸시 설정, 카메라, 센서 등. 앱은 장치 설정에 자유로움.
백엔드 개발의 큰 맥락 이해하기
- 크게 서버 + 클라우드로 나눌 수 있음.
- 서비스에 쓰이는 대표적인 서버로
데이터베이스 서버
,API서버(WAS)
,스토리지(파일) 서버
가 있음.
- 데이터 베이스는 하나의 프로그램. 테이블로 이루어짐. 서버는 데이터베이스 프로그램을 실행하고 있는 컴퓨터임.
- 역할 별로 데이터 베이스가 나뉨. 유저 데이터 베이스, 상품 데이터베이스.
- 보통 SQL로 데이터와의 통신을 함.
- 데이터 베이스를 클라 또는 유저에게 바로 전달하면 안되기 때문에 API 서버를 만들어 중계함.

- 스토리지 : 이미지, 비디오, 음악, 문서를 가져옴. 스토리지 서버의 주소를 바탕으로 가져오는 것임,

- 클라우드가 부상하며 AWS를 주로 사용함. +) azure, naver cloud platform, cafe24
- 가상화 기술(도커) : 일반적으로 운영체제 위에 프로그램이 도는데 도커를 사용하면 virtual machine과 container를 이용해 무언가(?)를 할 수 있음. 궁금하면 더 찾아보기.
- 클라우는 컴퓨팅 자원을 제공하고 손쉽게 네트워크 관리를 할 수 있음.
- 클라이언트 요청을 처리하기 위해 CPU, 메모리를 사용함. 요청이 많아지면 응답 속도가 드려지기 때문에 여러 대를 사용하여 로드 밸런싱을 함. 트래픽을 분산시켜주는 역할.
- 서버 스케일링

- 서버 모니터링 : 서버 컴퓨터 혹은 프로그램의 상태를 확인하는 작업.
회사에서 개발자들이 하는 일 정리
어떻게 협업을 하는지, 소프트웨어가 어떻게 실제 서비스로 이루어지는지 알아보자.
대략적인 흐름일 뿐 완벽히 일치하지 않을 수 있음.
- 목표 설정 → 기획 회의 → 개발 → QA → 배포 → 출시
- 순차적으로 일하는 워터폴 방식과, 같이 일을 진행하는 애자일 방식으로 일할 수 있음.
- FE는 디자이너의 와이어프레임을 보면서 화면을 제작함 → 디자인 결과 적용 및 API 문서를 보면서 API 이용 → 테스트 코드 작성
- 백엔드는 API 개발 및 데이터베이스 모델링을 함 → API 테스트 및 예외사항 확인 및 수정.

- 소스코드 빌드(CI) : 개발자가 작성한 코드가 잘 합쳐지기 전에 빌드, 테스트를 자동화한 것.
- 배포 : 실제 개발한 것을 실제 사용되는 컴퓨터(서버)에 올리는 행위.
- CD(continuous Deployment) : 코드들이 운영환경에서 실행되기까지 자동화하는 것.
- 배포 후 문제가 발생하면 문제가 생긴 프로젝트들을 롤백함.

더 나은 개발자로 성장하기
- 현재 프로그래밍 메타는 객체 지향.
- 협업을 위해 꼭 알아야 하는 개념 숙지하기.
- 견고하고 재사용 가능한 코드 작성.
- 개념 이해뿐만 아니라 직접 작성해보기.
- 추천 도서 : 오브젝트 (조영호 저)
- 테스트 코드 작성하기. 실패할 수 있는 코드를 테스트로 작성할 수 있어야 함.
- 아키텍처에 대한 기본 이해하기. directory 위치에 대한 이해. 건강한 의존성을 가지게 하고, 프로젝트 구조를 쉽게 파악할 수 있게 해줌.