꾸준히

[TIL-180] 연속 수열, 재귀, 애플리케이션 계층

무자비한 낭만주먹 2024. 1. 7. 23:22

[그림1]. 오늘도 감사한 공부 시작 ~

 

목차
0. 오늘의 학습 시간
1. 오늘 배운 것
2. 오늘의 알고리즘
3. 오늘의 CS
4. 영어 받아쓰기
5. 내일 할 일 (청사진)
6. 감사한 일

 

0. 오늘의 학습 시간
11:30 ~ 13:00 (1시간 30분): 점심시간 풀 공부
22:00 ~ 24:00 (2시간): 주짓수 갔다와서 너무 힘들어서 삼십분 누워있다 바로 공부

 

1. 오늘 배운 것
- 사실 HTTP에 대해서 명확한 정의를 안하고 "메시지를 주고 받기 위해 정의한 규칙 중 하나"로 뭉뚱그려 이해했는데 결국 HTTP 는 서버와 클라이언트 간에 "응용 계층 끼리의 통신"을 위한 것임을 이해했다.
- 회사 코드에 자꾸 prototype라는게 들어가서 대충 넘겼었는데 ES6 이전에 자바 스크립트에서 객체지향의 "상속"을 구현하기 위해 필요했던 요소라는 걸 이해했다.
- DOM에 대해서 복습했다.

 

2. 오늘의 알고리즘
연속 수열 문제랑 간단한 재귀 문제를 풀었다.

https://github.com/choichanhyeok/codetree-TILs/tree/main/231213/T%EB%A5%BC%20%EC%B4%88%EA%B3%BC%ED%95%98%EB%8A%94%20%EC%97%B0%EC%86%8D%20%EB%B6%80%EB%B6%84%20%EC%88%98%EC%97%B4

 

https://leetcode.com/problems/binary-tree-inorder-traversal/solutions/4396163/recursive/

 

recursive, - undefined - LeetCode

View choichanhyeok's solution of undefined on LeetCode, the world's largest programming community.

leetcode.com

 

3. 이주의 CS
(2023-12-10)
[이제는 눈감고도 말할 수 있는 또 자바의 역사]
- 오픈 소스 공부했을 때 배웠듯이 70~80년대 개인용 컴퓨터(PC)가 보급되면서 Oracle 같은 소프트웨어 기업들이 등장했다.
- 그런 기반 위에 1991년, 내가 태어나기 5년전 즈음 Green이라는 프로젝트가 생기면서 자바의 탄생이 시작됐다.
- 이 프로젝트의 목적은 제임슨 고슬링 형 포함 3명으 ㅣ친구들이 TV와 시청자가 서로 상호 작용 할 수 있는 무언가를 만들기 위해 시작했었다. 지금의 IPTV 같은 느낌이다.
- 그 때 지은 자바의 모태였던 언어의 이름은 Oak였다 (참나무: 고슬링 형 사무실 앞에 있는 나무).
- 나 태어나기 1년 전에 Oak라는 이름의 언어는 커피의 종류였던 Java라는 이름으로 드디어 세상에 등장했다.
- 당시 자바의 모토는 WORK (WorkOnceRunAnywhere): 한 번 개발하면 어디서든 동작하는 것이었다.
- 내가 태어난 해인 96년에 JDK 1.0이 등장했고 그 다음해인 JDK1.1 은 1년만에에 22만 다운로드를 기록하면서 엄청난 성장을 보이게된다.
- 중간에 J2SE(Java 2 Standard Edtion)으로 변경됐는데 이유는 그 당시에 J2EE, J2ME와 같은 기업용, 모바일(블랙베리) 같은 Edition들과 혼동을 막기 위해서였다. (같은 시리즈로 분류하고 싶어서인가? 어쨌든 ..)
- 그렇게 J2SE는 1.4 버전까지 출시되다가 1.5버전 부터는 앞에 1.을 뺀 J2SE 5라는 형식으로 불리게 됐다.
- J2SE 1.5 까지는 그대로 J2SE라는 prefix를 사용했지만 1.6 버전부터는 Java SE 1.6 같은 형식으로 불리기 시작했다.
- Java SE 1.6 까지는 기존에 고슬링 형이 있었던 Sun MicroSystem이 주요 스펙을 만들고 java를 만들어 왔지만 SE 7 부터는 Oracle이 선 마이크로 시스템즈를 인수해 지금에 이르렀다.
- 사실 자바 표준의 이름이 JDK, J2SE, Java SE로 변경됐지만 이 책에서는 자바 표준 버전을 일반적으로 불리는 JDK라고 사용한다고 한다.
-  사실 Java 버전에서 제공되어야 하는 표준 문서가 만들어지면 그 기준에 해당하는 각 벤더에 맞는 JDK가 별도로 만들어진다. 예컨대 IBM과 HP 서버는 별도의 OS를 가지고 있는데, 여기에 최적화되어 있는 JDK를 개발해서 사용하고 있다.
- 단, JDK 버전만 맞으면 어떤 OS에서 개발하든지 적용한 OS에서 컴파일만 하면 애플리케이션 실행에 문제가 없다.
- 그리고 맨날 보는 "OpenJDK"라는 건 "소스에 라이선스 문제가 되는 부분을 제거한 완전 오픈소스 버전의 JDK"를 말한다.
- 알고 있겠지만 JRE는 실행만을 위한 환경이다. JDK에서 개발에 필요한 컴파일 등의 각종 프로그램이 제외된 상태로 설치된다.

(2023-12-11)
[전송계층의 역할: 신뢰할 수 있는 데이터 전송하기]
- 다른 네트워크로 데이터를 전송하려면 네트워크 계층에 있는 라우터의 라우팅 기능을 이용해야한다.
- 근데 데이터 전송을 하더라도 목적지에 도착을 못하는 경우는 어떻게 할까? 더 이상 내 데이터는 신뢰할 수 없는 데이터가 된다.
- 이런 상황에 대비해 "목적지에 신뢰할 수 있는 데이터를 전달"하기 위해 전송 계층이 필요하다.
- 전송계층은 어떻게 전달하는 데이터를 "신뢰할 수 있는 상태"로 만들까?
- 먼저 '오류를 점검"한다. 오류가 발생하면 데이터 재전송을 요구하는데 그 때 하헌우 코치님이 말씀해주셨던 TCP의 재전송이 여기에서 일어나는 거 같다.
- 아하! 그럼 전송 계층은 '오류를 점검하고 대응하는 계층이구나!' 라고 정리가 가능한 거 같다. 근데 사실 역할이 하나 더 있다. 바로 '전송된 데이터의 목적지가 어떤 어플리케이션인지 식별하는 역할'이다.
- 어떤 어플리케이션인지 어떻게 식별하냐고? 바로 'port'를 이용해 식별한다. 예컨대 ssh에 요청을 보낼거면 22번 포트를 써야하는 맥락과 같은 것이다.
- 전송 계층은 2가지로 구분할 수 있다, "신뢰성을 중요하게 생각하냐", 아니면 "효율성을 중요하게 생각하냐"
- 각 관점에 따라 '연결형 통신', '비연결형 통신'으로 구분할 수 있다. 
- 연결형 통신은 상대편과 유기적으로 협력해가면서 통싱하는 방식이고 비연결형 통신은 '닥치고 내 편지 받아라' 전략이다.
- 이쯤 되면 느낌이 오는게 당연하지만 정리하면, 연결형은 TCP이고 비연결형은 UDP이다.

[TCP의 구조]
- TCP로 메시지를 전송할 때 우리는 TCP 헤더라는 걸 붙이는데, 이렇게 TCP 헤더가 붙은 메시지를 우리는 "세그먼트"라는 PDU로 표현한다. (UDP 헤더가 붙으면 데이터그램~)
- IP 헤더와 마찬가지로 일일이 다 외울 필요 없고 중요한 것만 기억하면 된다.
- TCP는 데이터 전송을 위해 먼저 "가상의 동점 통신로"를 확보해야 한다.
- 3 웨이 핸드셰이크는 텍스트로 표현하기 어려워 필요시 164p  직접 확인하기

(2023-12-12)
[응용 계층의 역할]
- 웹 페이지를 볼 때는 인터넷 익스플로러 같은 웹 브라우저를 사용하는 거 기억 나는가? 이렇게 애플리케이션은 사용자가 하고 싶은 일들을 할 수 있도록 돕는 역할을 한다. 
- 이런 애플리케이션은 "서비스를 요청하는 측"에서 사용하는 애플리케이션으로 분류할 수 있는데 이는 서비스를 제공하는 측도 있다는 의미이다. 그냥 어렵게 설명했지만 간단히 얘기하면 서버-클라이언트 모델에서의 애플리케이션을 얘기했다.
- 여태껏 설명한 애플리케이션은 응용 계층에서 동작한다. 
- 이 애플리케이션 계층은 "세션 계층과 표현 계층을 포함"한다.
- ** 사실 우리가 HTTP 같은 프로토콜 얘기를 자주 하는데, 이 프로토콜은 결국 클라이언트 측 애플리케이션과 서버 측 애플리케이션이 통신하는데 필요한 운용계층의 프로토콜을 의미한다 ** -> 아~~~~~주 중요한 논점
- 우리가 흔히 알고 있는 DNS, FTP, SMTP, POP3, HTTP등의 프로토콜들이 여기 속한다.

** [웹 서버의 구조란?] **
- 인터넷에서 핵심적인 역할을 하고 있는 WWW에 대해서 잘 알고 있는가? W3나 웹 이라고 불리는게 이거다.
- ** WWW는 HTML, URL, HTTP라는 세 가지 기술로 이루어져있다. **
- http 1.1부터 keepalive라는 기능이 생겼는데, 데이터 교환이 모두 끝날 때 까지 연결을 끊지 않는 구조다. 근데 이러면 무상태가 아니지 않나?, 연결을 유지하는거랑 상태를 가지는거랑은 전혀 다른 개념인가?
- HTTP/1.1 에 비해 HTTP2 에서 개선된 점은 "요청을 보낸 순서대로 응답을 반환하지 않ㅇ도 된다."는 것이다. 그래서 콘텐츠를 빠르게 표시할 수 있다.

 

4. 오늘의 무자막 시청
오늘의 영상: -

 

5. 내일 할 일 (청사진)
1. 네트워크 기초
2. 알고리즘
3. 자바의 신

 

6. 감사한 일
오늘 주짓수 재밌었다. 하루하루 하고싶은 운동도 하고 공부도 할 수 있어서 새삼 감사했다.

 

 

오늘 하루도 공부할 수 있어 크게 감사합니다

2023-12-12 개발자 최찬혁