From 04780acc73893f9980a37b05cd9a1c820d9719c1 Mon Sep 17 00:00:00 2001 From: mooncw <97713997+mooncw@users.noreply.github.com> Date: Tue, 30 Jan 2024 23:54:44 +0900 Subject: [PATCH 01/14] Create 2024-01-26-stomp-websocket-programing --- _posts/2024-01-26-stomp-websocket-programing | 148 +++++++++++++++++++ 1 file changed, 148 insertions(+) create mode 100644 _posts/2024-01-26-stomp-websocket-programing diff --git a/_posts/2024-01-26-stomp-websocket-programing b/_posts/2024-01-26-stomp-websocket-programing new file mode 100644 index 0000000..cd9b2d0 --- /dev/null +++ b/_posts/2024-01-26-stomp-websocket-programing @@ -0,0 +1,148 @@ +--- +layout: post +title: STOMP 웹소켓 프로그래밍 +author: 문찬욱 +categories: 기술세미나 +banner: + image: https://raw.githubusercontent.com/Kernel360/blog-image/main/2024/0126/thumb.jpg + background: "#000" + height: "100vh" + min_height: "38vh" + heading_style: "font-size: 4.25em; font-weight: bold; text-decoration: underline" + tags: [웹소켓, STOMP] +--- + +안녕하세요. 저는 STOMP 웹소켓 프로그래밍이라는 주제로 발표한 문찬욱입니다. + +저는 이번 프로젝트에서 채팅 기능을 구현하고 있는데요, 그 과정에서 사용한 기술에 대해 공유드리고자 이 주제를 선정했습니다. + +이 글에서 웹소켓이 무엇인지, http와 웹소켓의 차이점이 무엇인지, 웹소켓 동작 방식은 어떤지, STOMP이 무엇인지 알려드리고자 합니다. + +
+ +## 1. 웹소켓 +웹소켓은 http 환경에서 클라이언트와 서버 사이에 하나의 TCP 커넥션을 통해 실시간으로 전이중 통신을 가능하게 하는 프로토콜입니다. + +여기서 전이중 통신은 전화기처럼 양방향으로 송신과 수신이 가능한 통신을 뜻합니다. + +
+ +## 2. HTTP vs 웹소켓 +그럼 이러한 웹소켓과 HTTP와의 차이점은 무엇일까요? + +Http는 클라이언트가 요청을 보낼 때마다 연결을 맺고 응답을 받은 후 연결을 끊어버리기 때문에 비 연결성 프로토콜입니다. + +그리고 클라이언트가 요청하고 서버가 응답하는 단방향 통신입니다. + +반면에 웹소켓은 한번 연결을 맺으면 어느 한쪽에서 연결을 끊으라는 요청을 보내기 전까진 연결을 유지하기 때문에 연결 지향 프로토콜입니다. + +그리고 양 쪽에서 데이터를 주고 받을 수 있는 양방향 통신입니다. + + +이미지1 + +### 실시간 측면에서는...? +http는 비 연결성이기 때문에 데이터를 주기 위해선 매번 연결해야 하고 그만큼 연결 비용이 발생하게 됩니다. + +즉, 오버헤드가 커집니다. + +이미지2 + +위 이미지에서 왼쪽은 일반적인 http로 주고받는 데이터양이고, 오른쪽 위는 웹소켓 연결요청할 때의 데이터양이고, 그 아래는 연결 이후의 데이터양입니다. + +웹소켓은 처음 연결할 때 http로 하기 때문에 처음 데이터 양은 유사하지만, 이후 데이터 양이 매우 줄어든 것을 확인할 수 있습니다. + +이러한 점들에서 웹소켓이 http 보다 실시간성에 더 유리합니다. + +## 3. 웹소켓 동작 방식 +이미지3 + +웹소켓의 동작 방식은 크게 3가지로 나눌 수 있는데요, + +빨간 박스는 Opening Handshake, + +노란 박스는 Data transfer, + +보라 박스는 Closing Handshake에 해당됩니다. + +### Opening Handshake +이미지4 + +빨간 박스 부분인 Opening Handshake는 먼저 웹소켓 클라이언트에서 http 프로토콜을 통해 웹소켓으로 Upgrade 해달라는 요청을 보냅니다. + +이 요청의 의미는 웹소켓 프로토콜로 전환해달라는 것입니다. + +그 다음 웹소켓 서버는 101 응답과 함께 웹소켓 프로토콜로의 전환을 승인했음을 알립니다. + +### Data Transfer +이미지5 + +노란 박스 부분인 Data Transfer는 Opening Handshake가 끝나서 전환된 웹소켓 프로토콜을 통해 클라이언트와 서버 간 실시간 전이중 통신을 하는 부분입니다. + +### Closing Handshake +이미지6 + +보라 박스 부분인 Closing Handshake는 서로 간의 커넥션을 종료하는 부분입니다. + +## 4. STOMP +STOMP는 streaming text oriented messaging protocol의 줄임말이며, + +메세지 브로커를 활용하여 쉽게 메시지를 주고 받을 수 있는 프로토콜입니다. + +이 프로토콜은 웹소켓 위에 얹어 하위 프로토콜로 함께 사용할 수 있습니다. + +### 웹소켓만 사용하는 것 비해 어떤 이점이...? +웹소켓 프로토콜은 메시지 데이터 타입이 Text인지 Binary인지는 정의하지만, 메시지 내용에 대해서는 정의하지 않습니다. + +이는 복잡한 메시지를 주고 받으려면 어떤 메시지인지 알기 위한 로직이 필요하다는 것입니다. + +STOMP 프로토콜은 메시지 내용을 구조화 할 수 있어서 효과적인 메시징을 도와줍니다. + +예를 들어, A라는 사람이 B라는 사람에게 “안녕”이라는 내용으로 보내는 메시지가 있다고 해보겠습니다. + +웹소켓로 보낼 때는 “안녕”이라는 메시지만 보내면 됩니다. + +클라이언트가 1명이라면 문제가 없지만, 클라이언트가 여러명이라면, 이 메시지를 누가 보냈는지, 누구한테 가야하는지, 어떤 용도로 보내는 것인지 서버가 알 수가 없습니다. + +물론, 단순히 안녕이 아닌 모든 정보가 담긴 한줄의 긴 텍스트 문자열로 보낼 수 있습니다. + +하지만 이러면, 서버가 이 메시지를 이해하고 처리하기 쉽지 않을 수 있습니다. + +또한 연결된 클라이언트 주소마다 메시지 핸들러를 구현해야 합니다. + +이미지7 + +STOMP는 이미지처럼 + +destination /app/chat/message로 보내는, +sender A가, + +content “안녕”의 내용의 메시지를, + +send 전송했음을 + +구조화 된 형태로 보낼 수 있기 때문에 서버는 이 메시지가 어떤 메시지인지 이해하고 처리하기 쉽습니다. + +또 다른 이점은 STOMP는 pub/sub 구조로 되어있다는 것입니다. + +이미지8 + +pub/sub 구조란 이 이미지처럼 publisher에서 메시지 브로커의 Topic1이라는 특정 토픽에 메시지를 보내면, Topic1을 구독하고 있는 subscribe들에게 메세지를 전달하는 구조를 말합니다. + +이 구조로 인해 최대 토픽별로만 메시지 핸들러를 구현해주면 되기 때문에 웹소켓로만 구성된 것에 비해 메시지 핸들러 구현 양이 줄어든다는 이점이 있습니다. + +### pub/sub 구조의 특징 +저는 pub/sub 구조의 특징을 크게 3가지로 나눠볼 수 있었습니다. + +첫째, pub과 sub을 쉽게 추가할 수 있어서 확장성이 좋습니다. + +둘째, pub과 sub 간에 강한 의존성이 없어서 비동기적으로 처리할 수 있습니다. + +셋째, sub은 관심 토픽에 대한 메시지만 받을 수 있어서 선택적 수신이 가능합니다. + +
+ +## 5. 마무리 +채팅, 실시간 업데이트, 알림 같은 실시간성 기능을 구현하고자 하면, + +STOMP도 선택지 중 하나라고 생각합니다. From 9527940e0bcd793cfb069b796e055d29f233dd57 Mon Sep 17 00:00:00 2001 From: mooncw <97713997+mooncw@users.noreply.github.com> Date: Mon, 5 Feb 2024 23:24:51 +0900 Subject: [PATCH 02/14] Update 2024-01-26-stomp-websocket-programing --- _posts/2024-01-26-stomp-websocket-programing | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/_posts/2024-01-26-stomp-websocket-programing b/_posts/2024-01-26-stomp-websocket-programing index cd9b2d0..16505bf 100644 --- a/_posts/2024-01-26-stomp-websocket-programing +++ b/_posts/2024-01-26-stomp-websocket-programing @@ -38,15 +38,14 @@ Http는 클라이언트가 요청을 보낼 때마다 연결을 맺고 응답을 그리고 양 쪽에서 데이터를 주고 받을 수 있는 양방향 통신입니다. - -이미지1 +![1](https://github.com/Kernel360/blog/assets/97713997/2d25b3e0-d31f-426b-b69d-001cbcf00d3a) ### 실시간 측면에서는...? http는 비 연결성이기 때문에 데이터를 주기 위해선 매번 연결해야 하고 그만큼 연결 비용이 발생하게 됩니다. 즉, 오버헤드가 커집니다. -이미지2 +![2](https://github.com/Kernel360/blog/assets/97713997/580a3e5c-29bc-429e-85c5-8e248e4db002) 위 이미지에서 왼쪽은 일반적인 http로 주고받는 데이터양이고, 오른쪽 위는 웹소켓 연결요청할 때의 데이터양이고, 그 아래는 연결 이후의 데이터양입니다. @@ -55,7 +54,7 @@ http는 비 연결성이기 때문에 데이터를 주기 위해선 매번 연 이러한 점들에서 웹소켓이 http 보다 실시간성에 더 유리합니다. ## 3. 웹소켓 동작 방식 -이미지3 +![3](https://github.com/Kernel360/blog/assets/97713997/344e5c48-0ead-40f7-bc5c-bc3a9b3f4c4b) 웹소켓의 동작 방식은 크게 3가지로 나눌 수 있는데요, @@ -66,7 +65,7 @@ http는 비 연결성이기 때문에 데이터를 주기 위해선 매번 연 보라 박스는 Closing Handshake에 해당됩니다. ### Opening Handshake -이미지4 +![4](https://github.com/Kernel360/blog/assets/97713997/5995bac3-ca2c-4ad7-83d0-ad1d5cce8ad8) 빨간 박스 부분인 Opening Handshake는 먼저 웹소켓 클라이언트에서 http 프로토콜을 통해 웹소켓으로 Upgrade 해달라는 요청을 보냅니다. @@ -75,12 +74,12 @@ http는 비 연결성이기 때문에 데이터를 주기 위해선 매번 연 그 다음 웹소켓 서버는 101 응답과 함께 웹소켓 프로토콜로의 전환을 승인했음을 알립니다. ### Data Transfer -이미지5 +![5](https://github.com/Kernel360/blog/assets/97713997/61f2f6b2-c9e7-4436-ba0c-34a75d78e5bb) 노란 박스 부분인 Data Transfer는 Opening Handshake가 끝나서 전환된 웹소켓 프로토콜을 통해 클라이언트와 서버 간 실시간 전이중 통신을 하는 부분입니다. ### Closing Handshake -이미지6 +![6](https://github.com/Kernel360/blog/assets/97713997/50c700a8-ff7f-4b4a-a5a3-635d0d016a11) 보라 박스 부분인 Closing Handshake는 서로 간의 커넥션을 종료하는 부분입니다. @@ -110,7 +109,7 @@ STOMP 프로토콜은 메시지 내용을 구조화 할 수 있어서 효과적 또한 연결된 클라이언트 주소마다 메시지 핸들러를 구현해야 합니다. -이미지7 +![7](https://github.com/Kernel360/blog/assets/97713997/527a4717-9c58-4402-8441-9c4ae7455555) STOMP는 이미지처럼 @@ -125,7 +124,7 @@ send 전송했음을 또 다른 이점은 STOMP는 pub/sub 구조로 되어있다는 것입니다. -이미지8 +![8](https://github.com/Kernel360/blog/assets/97713997/23a3e3f0-b8f9-4156-a15a-76bf8cef85bf) pub/sub 구조란 이 이미지처럼 publisher에서 메시지 브로커의 Topic1이라는 특정 토픽에 메시지를 보내면, Topic1을 구독하고 있는 subscribe들에게 메세지를 전달하는 구조를 말합니다. From 10a3799276dbfb31fc416674a9053b11339ea844 Mon Sep 17 00:00:00 2001 From: mooncw <97713997+mooncw@users.noreply.github.com> Date: Mon, 5 Feb 2024 23:29:17 +0900 Subject: [PATCH 03/14] =?UTF-8?q?feat:=2020240126=5Fstomp=20=EC=9B=B9?= =?UTF-8?q?=EC=86=8C=EC=BC=93=20=ED=94=84=EB=A1=9C=EA=B7=B8=EB=9E=98?= =?UTF-8?q?=EB=B0=8D=5F=EB=AC=B8=EC=B0=AC=EC=9A=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...socket-programing => 2024-01-26-stomp-websocket-programing.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename _posts/{2024-01-26-stomp-websocket-programing => 2024-01-26-stomp-websocket-programing.md} (100%) diff --git a/_posts/2024-01-26-stomp-websocket-programing b/_posts/2024-01-26-stomp-websocket-programing.md similarity index 100% rename from _posts/2024-01-26-stomp-websocket-programing rename to _posts/2024-01-26-stomp-websocket-programing.md From 691c22c0820af3d20c3a7f8458e7ec299a2d0ae6 Mon Sep 17 00:00:00 2001 From: isevou__ Date: Tue, 13 Feb 2024 00:46:45 +0900 Subject: [PATCH 04/14] =?UTF-8?q?feat=20:=2020240125=5F=EC=BD=94=EB=94=A9?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=5F=EA=B3=A0=EB=B3=91=EB=A3=A1.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- _posts/2023-01-25-coding-test.md | 94 ++++++++++++++++++++++++++++++++ 1 file changed, 94 insertions(+) create mode 100644 _posts/2023-01-25-coding-test.md diff --git a/_posts/2023-01-25-coding-test.md b/_posts/2023-01-25-coding-test.md new file mode 100644 index 0000000..7420b66 --- /dev/null +++ b/_posts/2023-01-25-coding-test.md @@ -0,0 +1,94 @@ +--- +layout: post +title: 주저하는 개발자들을 위해 - 코딩 테스트 +author: 고병룡 +categories: 기술세미나 +banner: + image: https://docs.oracle.com/cd/E19340-01/820-6424/images/to_MOM.gif + background: "#000" + height: "100vh" + min_height: "38vh" + heading_style: "font-size: 4.25em; font-weight: bold; text-decoration: underline" + tags: [코딩테스트, 기술세미나] +--- + +## 코딩 테스트? +코딩 테스트란 개발자의 기술적인 역량을 시험하기 위해 실시하는 알고리즘이나 구현을 요구하는 테스트입니다. + +회사 입장에서는 지원자를 평가하는 최소한의 기준이고 지원자에게는 ~~통곡의 벽~~ 처럼 느껴지는 코딩 테스트 대체 왜 해야할까? + +그리고 또 어떻게 준비해야만 할까..? + +## 코딩 테스트 그래서 왜 해야하나? +무엇보다도, 많은 회사들이 코딩테스트를 1차적인 관문으로 두고 지원자를 거르고 있기 때문에 그런 회사들에 지원할 생각이 있다면 꾸준히 준비하는 게 좋다. + +> 아래 4가지 이유를 통해서 조금 더 자세히 알아보자면.. + +* 여러분들이 가고 싶어하는 많은 회사에는 정말 많은 지원자가 몰린다. 이들 개개인의 모든 역량을 테스트하기에는 현실적으로 무리가 있고, 이 과정에서 코딩 테스트는 효율적으로 이들을 가려내는데 도움이 되기 때문에 많은 기업들이 도입한다. +* 여러분들이 어떤 식으로 코드를 작성하는지 미리 확인하고 어떤 사고 방식과 결론, 평소 개발을 어떻게 하는지 엿볼 수 있는 창구와 비슷하다. 자신이 어떤 개발자인지 비교적 손 쉽게 다른 개발자들에게 보여줄 수 있다. +* 개발에 필요한 지식들을 보여주고 나의 컴퓨터 과학 지식을 기반으로 한 나의 문제 해결력을 보여주기 쉽다. 결국 알고리즘 문제를 구현한다는 건 그 문제를 이해해야만 할 수 있는 거고, 그에 맞는 알고리즘을 찾고 시간 내에 테스트 케이스들을 통과시켜야 하기 때문에, 비교적 쉽게 내 문제 해결 능력을 보여줄 수 있다. +* 개발자는 자주,, 생각보다 자주 이직이라는 카드를 꺼내든다.. 이직할 때 코테 준비를 하지말고,, 항상 이직이라는 카드를 꺼낼 수 있도록 언제든 코테를 준비를 할 필요가 있다. + +## [당신이 코딩테스트를 포기하는 7가지 이유](https://www.inflearn.com/course/%EA%B0%9C%EB%B0%9C%EC%9E%90-%EC%B7%A8%EC%97%85-%ED%86%B5%ED%95%A9%ED%8E%B8) +아래의 7가지 이유는 [한정수님](https://github.com/Integerous)의 [비전공자를 위한 개발자 취업 가이드](https://www.inflearn.com/course/%EA%B0%9C%EB%B0%9C%EC%9E%90-%EC%B7%A8%EC%97%85-%ED%86%B5%ED%95%A9%ED%8E%B8)의 내용에서 가져온 개발자들이 코테를 포기하는 7가지 이유이다. + +가져온 이유들에는 각각 논리적인 허점이 존재하고 우리는 같이 그것을 깨부수고 코딩테스트를 준비하기 위한 마음가짐을 잡아 보도록 하자. + +>1. 코딩 테스트를 보는 회사에는 어차피 서류 합격도 못할 것이다. + +아니다. 서류만 내도 코테를 보게 해주는 회사가 많고 “서류”도 영향이 있지만 “테스트 결과” 도 영향이 있다. +> 2. 코딩 테스트를 준비할 시간이 없다. + +분명히 당신의 하루에는 낭비되는 시간이 있다. 그 시간을 찾아서 하자. 코딩 테스트 준비 뿐만아니라 다른 공부도 마찬가지다.. +> 3. 지금부터 준비하더라도, 더 오래 준비한 전공자들에게 밀릴 것이다. + +체육 전공한 사람이 마라톤을 더 잘 뛸까? 아니면 일반인이 더 잘 뛸까? 확률은 전자가 높겠지만 거의 비슷하게 힘들다. 전공자들이라고 해서 코테가 쉽고 뚝딱 풀리는 일은 아니다. +> 4. Java(언어), Spring(프레임워크)도 제대로 못하는데 무슨 코딩 테스트? + +코딩 테스트라도 제대로 해야지 면접은 볼 수 있지 않을까? 물론 둘 다 잘하면 정말 좋고 그것도 아니라면 면접에 들어갈 수 있는 실력이 된다는 것 자체로도 의미가 있다고 생각한다. 코테를 볼 기회는 항상 찾아오는게 아니니... +> 5. 코딩 테스트 안봐도 개발로 취업은 하더라. + +당연히 할 수 있다. 하지 않는 기업을 찾아서 지원하면 된다. 하지만 차라리 코테를 준비하고 더 많은 기회를 얻는게 맞지 않나 라는 생각이 든다. +>6. 조금 해봤는데, 너무 어렵다. + +착각하는 분들이 있는데 우리는 대회를 나가자고 하는 게 아니다. 코테를 쳐보는 것만으로도 소중한 자산이다. 이걸로 상을 타는 게 아니라 우리는 취업이 목적이기에.... +>7. 어떻게 준비해야 될지 모르겠다. + +그러면 이제부터 알아보자! 만약 필자가 뭐하는 사람인지 의심이 간다면.. 그래도 나름 [열심히(?)](https://solved.ac/profile/hodako97) 준비해오고 [알고리즘을 좋아하고](https://github.com/fingersdanny/PS_note), [알고리즘 스터디](https://github.com/Kernel360-cell1/algorithm-study)를 운영 중인 사람 중 하나로써 여러분들이 코테에서 더 행복해지길 바라는 마음에서 준비했다. + +## 코딩테스트 어떻게 준비해야 할까? + +### 1. 알고리즘 / 자료구조를 배우자 + +코딩 테스트에 나오는 문제는 다양한 배경 지식을 요구하고 그 중 만나게 되는 대부분은 자료 구조와 다양한 알고리즘이다. + +따라서, 무턱대고 문제를 풀기위해 접근 하는 것보다는 미리 아래의 자료구조와 알고리즘과 친숙해진 이후로 풀어보길 시작하는 것을 권장한다.. + +그 중에 보편적으로 활용되는 자료 구조와 알고리즘은 다음과 같다. + +#### 자료구조 +* 배열 (Array) +* 리스트 (List) +* 연결 리스트 (LinkedList) +* 스택 (Stack) +* 큐 (Queue) +* 덱 (Deque) +* 우선순위 큐 (Priority Queue), 힙 (Heap) +* 트리 (Tree), 이진 트리(Binary Tree) +* 그래프 (Graph) +* 세트 (Set) +* 맵 (Map) + + + + +## 참고 자료 +[Kafka와 RabbitMQ의 차이점은 무엇인가요?](https://aws.amazon.com/ko/compare/the-difference-between-rabbitmq-and-kafka/) + +[Apache Kafka란 무엇입니까?](https://aws.amazon.com/ko/what-is/apache-kafka/) + +[Apache ActiveMQ](https://activemq.apache.org/) + +[메시지 큐란?](https://www.ibm.com/kr-ko/topics/message-queues) + +[Pub/Sub이란 무엇인가요?](https://cloud.google.com/pubsub/docs/overview?hl=ko) From e0ca87f47d026a898adaabdb842d413179425492 Mon Sep 17 00:00:00 2001 From: Byungryong Ko Date: Wed, 14 Feb 2024 13:12:07 +0900 Subject: [PATCH 05/14] =?UTF-8?q?chore=20:=20=EA=B8=80=20=EB=82=B4?= =?UTF-8?q?=EC=9A=A9=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- _posts/2023-01-25-coding-test.md | 67 +++++++++++++++++++++++++++++--- 1 file changed, 61 insertions(+), 6 deletions(-) diff --git a/_posts/2023-01-25-coding-test.md b/_posts/2023-01-25-coding-test.md index 7420b66..dc5b74c 100644 --- a/_posts/2023-01-25-coding-test.md +++ b/_posts/2023-01-25-coding-test.md @@ -13,7 +13,7 @@ banner: --- ## 코딩 테스트? -코딩 테스트란 개발자의 기술적인 역량을 시험하기 위해 실시하는 알고리즘이나 구현을 요구하는 테스트입니다. +코딩 테스트란 개발자의 기술적인 역량을 시험하기 위해 실시하는 알고리즘이나 구현을 요구하는 테스트다. 회사 입장에서는 지원자를 평가하는 최소한의 기준이고 지원자에게는 ~~통곡의 벽~~ 처럼 느껴지는 코딩 테스트 대체 왜 해야할까? @@ -78,17 +78,72 @@ banner: * 그래프 (Graph) * 세트 (Set) * 맵 (Map) +* 서로소 집합 (Disjoint Set / Union Find) +> 위에 있는 자료 구조들을 모두 아는 편이 좋은가요? +위 자료 구조들은 기술 면접 때도 자주 만날 수 있으니 말로 설명할 수 있을 만큼 알아 두는 편이 좋다. 당연히 문제를 만났을 때 위의 자료구조를 각 프로그래밍 언어별로 어떤 식으로 사용할 수 있는지도 알아두어야 문제에 적용할 수 있다. + +#### 알고리즘 +* 그리디 (Greedy) +* 동적 계획법 (Dynamic Programming) : 메모이제이션... +* 다양한 정렬 알고리즘 : 버블, 선택, 삽입, 병합, 힙, 퀵 +* 탐색 알고리즘 + * 깊이 우선 탐색 (DFS) + * 너비 우선 탐색 (BFS) + * 이진 탐색 + * 매개 변수 탐색 + * 트리에서의 탐색 : 힙 트리, 트라이(Trie) +* 크루스칼 알고리즘 (최소 신장 트리) +* 백트래킹 +* 최단 경로 : 다익스트라, 벨만-포드, 플로이드-워셜 +* 완전 탐색 (Bruteforcing) + +> 알고리즘과 마찬가지로 위에 있는 내용들도 전부는 아니지만 말로 설명할 수 있어야 한다. + +> 알고리즘 공부를 시작하고 싶은데 어디서부터 보는게 좋을까요? + +개인적으로 방법은 중요하다고 생각하지 않고 꾸준히 보는게 더 낫다고 생각하지만 그래도 몇 가지 강의 및 책을 추천해보자면, + +[이것이 코딩 테스트다](https://product.kyobobook.co.kr/detail/S000001810273?utm_source=google&utm_medium=cpc&utm_campaign=googleSearch&gad_source=1&gclid=EAIaIQobChMIutbEu_OphAMVE1cPAh1V2A1hEAAYASAAEgLDevD_BwE) + +[BaaaaaaaarkingDog님의 실전 알고리즘 강좌](https://blog.encrypted.gg/919) + + +### 2. 꾸준히 풀자 + +너무나도 당연한 말이지만 생각보다 코딩 테스트는 언제든 볼 수 있게끔 준비를 해놓는 상태가 훨씬 좋다고 생각한다. 꾸준히 준비하지 않으면 실력이 떨어지는 속도는 가파르지만 실력을 올리는 속도는 생각보다 더 걸릴 수 있다. + +따라서 사람들이 자주 사용하고, 실제 코딩 테스트 환경에 가까운 곳에서 자주 문제를 풀어보기를 권장한다. + +* [프로그래머스](https://school.programmers.co.kr/learn/challenges?order=recent) : 많은 기업들의 코딩 테스트를 진행해주고 있고 문제도 꾸준히 올라온다. 카카오 등의 기업 공채에서의 기출 문제 또한 제공하고 있다. +* [SW Expert Academy](https://swexpertacademy.com/main/main.do) : 삼성에서 운영하는 코딩테스트 및 알고리즘 학습 사이트이다. 삼성 관련 (반기 마다 열리는 알고리즘 특강, 입사 시 코딩 테스트)가 모두 여기에서 요구하는 문제 입출력 방식이나 라이브러리를 어떤 것을 사용할 수 있는지 까지 미리 알고 준비할 수 있다. +* [Baekjoon Online Judge](https://www.acmicpc.net/) : 다양한 문제를 제공하고 삼성 SW 역랑 기출 문제를 제공하고 있다. 압도적인 문제 수와 유저 수로 인해 문제를 풀지 못했을 때 물어볼 곳이 더 많다는 이점이 있다. + +개인적으로는 백준을 제일 좋아하고 애용한다. 꾸준히 풀기를 지키기 위해서는 나름의 보상이 필요하다고 생각하는데.. 필자는 꾸준히 풀기 위해 코딩 테스트를 나름의 게임이라고 생각하여 위 백준 사이트와 연동되는 [solved.ac](https://solved.ac/)를 활용하여 꾸준히 잔디 심기(?) 및 랭크를 통해서 코딩 테스트를 준비중이다. + +### 3. 실제로 구현하기 전에 어떻게 구현할 지 손으로 적어보자 + +아는 문제가 나와서 구현부터 할 생각할지 말고 무엇부터 어떻게 구현할지 생각해보고 문제 풀이를 작성해보자. + + 1. 요즘 코딩 테스트에 나오는 문제들은 설명이 길다. 미리 순서를 정해두지 않고 구현만 하다가 보면 중간에 갈 길을 잃기 쉽고 문제 설명 중 어디까지 구현했는지 추적할 수가 없다. 결국 다시 되돌아가서 문제를 읽어야 할 수 도 있다. 처음부터 모든 상황을 본인의 언어로 정리해둔다면, 헷갈릴 이유도 없고 본인이 어디까지 구현했는 지 추적이 가능하다. + 2. 대부분의 코딩 테스트는 펜과 종이를 허용한다. 이걸 준비하라고 하는 이유는 써서 고민해봐도 좋다는 얘기고 이것을 활용하지 않을 이유가 없다! + 3. 많은 수의 기업이 코딩 테스트에 대한 기출문제를 제공하지 않는다. 따라서 직접 적어 놓은 문제 구현 계획을 보고 나서 나중에 복기할 수 있도록 한다. + +### 4. 시간 분배를 잘하자. + +1. 문제를 풀기 전에 시간 복잡도 계산을 해보고 올바른 알고리즘을 골랐는지 생각해보자. 보수적으로 생각했을 때 연산이 1억번을 1초라 가정하면 대부분의 문제에서 시간 초과를 받지 않을 수 있다. 어떤 알고리즘을 사용할지 입력의 최대 범위는 어디까지인지 시간은 얼마나 주어졌는지를 복합적으로 고려해보고 문제를 풀어야 한다. +2. 실제 시험도 마찬가지지만 문제 당 시간 분배가 중요하다. 최악의 경우 2시간 내에 4문제를 풀어야할 수도 있고 그거 보다 길거나 짧을 수 있다. 평균적으로 실전에서는 40분 ~ 1시간이 주어진다고 생각하고 문제를 접근해야 테스트 중 시간이 모잘라서 문제를 포기하는 불상사를 겪지 않을 수 있다. +3. 여느 시험을 볼 때와 마찬가지로 너무 오래 걸리는 문제만 붙잡고 있지 말아야 한다. 모든 답안을 다 들고 시험장에 갈 수 없듯이 코딩테스트도 못 푸는 문제가 있을 수 있다. 그럴 땐 넘기고 시간이 남을 때 돌아보는게 정신건강에 훨씬 더 좋다. +4. 앞의 내용의 연장선에서 대부분의 코딩테스트는 순서대로 풀지 않아도 된다. 처음에 문제를 받는다면 쭉 훑어보고 해당 문제의 알고리즘이 바로 보이거나 구현이 오래 걸리지 않을 것 같은 문제들을 빨리 풀고 시간을 아끼는 게 좋다! ## 참고 자료 -[Kafka와 RabbitMQ의 차이점은 무엇인가요?](https://aws.amazon.com/ko/compare/the-difference-between-rabbitmq-and-kafka/) +이것이 코딩 테스트다 -[Apache Kafka란 무엇입니까?](https://aws.amazon.com/ko/what-is/apache-kafka/) +[개발자 취업을 위한 코딩 테스트 준비 방법](https://katfun.tistory.com/192) -[Apache ActiveMQ](https://activemq.apache.org/) +[알고리즘 분류 참고 - 백준 온라인 저지 알고리즘 별 문제 분류](https://www.acmicpc.net/problem/tags) -[메시지 큐란?](https://www.ibm.com/kr-ko/topics/message-queues) -[Pub/Sub이란 무엇인가요?](https://cloud.google.com/pubsub/docs/overview?hl=ko) +헤더 이미지 붙이고 글 내용 읽고 수정해서 오늘 업로드 할 것 \ No newline at end of file From 2bd1aaa41098e5b0feb25ffc39193c2ff678efb0 Mon Sep 17 00:00:00 2001 From: gunsight <103917282+gunsight1@users.noreply.github.com> Date: Wed, 14 Feb 2024 14:21:26 +0900 Subject: [PATCH 06/14] Create 2023-12-01-RDBMS.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit RDBMS의 조회과정, 쿼리실행계획 중요성 --- _posts/2023-12-01-RDBMS.md | 192 +++++++++++++++++++++++++++++++++++++ 1 file changed, 192 insertions(+) create mode 100644 _posts/2023-12-01-RDBMS.md diff --git a/_posts/2023-12-01-RDBMS.md b/_posts/2023-12-01-RDBMS.md new file mode 100644 index 0000000..d2ab64d --- /dev/null +++ b/_posts/2023-12-01-RDBMS.md @@ -0,0 +1,192 @@ +# RDBMS의 조회과정, 쿼리실행계획 중요성 + +반갑습니다. +RDBMS와 쿼리실행계획의 중요성을 주제로 기술세미나 발표를 한 정지용 입니다. + +## [1. 개요] + +요즘 자바와 ORM을 기반으로 개발을 하게되어 직접적으로 쿼리를 보는 일이 예전보다 현저히 줄어들었다고는 하나 아직도 데이터가 저장되는 저장소는 대부분 데이터베이스입니다. + +결국 그 말은 즉슨 아무리 데이터베이스에 의존을 최소화 하더라도 어쩔 수 없이 데이터베이스에 대해 잘 알아야 한다는 이야기이기도 합니다. + +이번 시간에는 RDBMS에서 다양한 기능을 많이 지원하지만 가장 많이 쓰이는 조회과정과 이와 연관되어있는 쿼리실행계획의 중요성을 알아보는 시간을 가져보고자 합니다. + +
+ +## [2. RDBMS란?] + +진행하기 앞서, 데이터베이스(Database, 이하 DB)란 무엇일까요? + +짧고 명료하게 이야기 하자면 집합과 명제를 근간으로 하는 체계적인 데이터 모음입니다. + +RDBMS (관계형 데이터베이스 관리 시스템 :: Relational Database Management System)는 이름에서도 유추가 되듯 데이터베이스의 관리 시스템입니다. + +이 RDBMS에선 보통 일반적으로 4가지의 명령어를 지원합니다. + +![스크린샷 2024-02-14 134256](https://github.com/gunsight1/blog/assets/103917282/11ceddc9-60fb-4723-a7ca-551c4b1b8916) + +DDL(Data Definition Language)은 데이터 정의어로 DB 구조를 정의하거나 변경하는데 쓰입니다. + +DML(Data Manipolation Language)은 데이터 조작어로 등록(insert) 조회(select) 수정(update) 삭제(delete)를 수행합니다. + +DCL(Data Control Language)은 데이터 제어어로 DB에 접근하는 사용자의 권한관리를 담당합니다. + +TCL(Trangection Control Language)은 트랜잭션 제어어로 작업수행의 대한 승인(commit), 철회(rollback)을 담당합니다. + +이 중 우리가 알아볼 명령어는 DML에 속하는 SELECT이며 DBA가 아닌 이상 우리같은 개발자는 보통 DML과 TCL을 세트로 많이 사용합니다. + +DML의 가장 큰 특징은 DDL과 다르게 수행을 한 뒤 데이터가 즉시 DB에 반영되지 않으므로 TCL을 통해 최종 수행여부를 결정 해야합니다. + +
+ +## [3. SELECT의 조회 과정] + +DBMS의 명령어는 직관적인 편이며 SELECT의 문법도 이와 마찬가지입니다. + +SELECT, 선택한다. 무엇을? 컬럼을. + +FROM, 어디로부터? TABLE에서 + +WHERE, 어떤 기준으로? 조건에 따라 + +GROUP BY 어떻게 묶어? 컬럼에 맞춰서 + +HAVING 어떤 기준으로? 조건에 따라 + +ORDER BY 정렬은? 오름차순 / 내림차순 + +![스크린샷 2024-02-14 140524](https://github.com/gunsight1/blog/assets/103917282/0f5afa37-bd98-4b8a-82be-bc114ded1634) + +위의 이미지에서 노란 박스안의 문법들은 옵션을 의미합니다. + +옆의 예제 SQL문법이 한눈에 읽히신다면 여러분들은 SELECT 쿼리를 쓸 줄 아시게 된겁니다. + +문법을 알아보았으니 이제 실행 과정을 살펴볼건데 이해하기 쉽게 뷔페에서 요리 담는 것으로 비유를 해봤습니다. + + +![스크린샷 2024-02-14 135018](https://github.com/gunsight1/blog/assets/103917282/e1886f5e-e50f-40d4-bb41-ac05ec3092bd) + +FROM → 뷔페에 모든 요리들이 잔뜩 있는 상태입니다. + +WHERE → 내가 먹고 싶은 음식을 생각해봅시다. + +GROUP BY → 에피타이저, 메인, 디저트처럼 종류에 따라 나눠봅니다. + +HAVING → 나눈 음식중에 생각해보니 국수랑 튀김은 아니다 싶어 빼기로 했어요. + +SELECT → 이제 먹을 음식을 다 골랐고, 접시에 담았습니다. + +ORDER BY → 이 음식을 순서대로 먹습니다. + +결과로 보면 아래와 같은 이미지처럼 흐르게됩니다. + + +![스크린샷 2024-02-14 135025](https://github.com/gunsight1/blog/assets/103917282/6c386616-902b-4bc5-98b6-f6b26c15b2e8) + +
+ +## [4. SELECT의 활용] + +SELECT는 활용도가 아주 높은 DML이고, 서브쿼리(sub-query)라는 특별한 기능을 제공합니다. + +서브쿼리란 쿼리 안에 또 쓰이는 다른 쿼리를 뜻합니다. + +DML에선 포괄적으로 쓰일 수 있고, DDL과의 혼용도 일부 지원을 합니다. + +대표적으로 자주 쓰이는 응용 3가지를 예시로 설명드리겠습니다. + +![스크린샷 2024-02-14 135158](https://github.com/gunsight1/blog/assets/103917282/b4ccc05d-aa38-43ce-8b59-ffce7fab0183) + +첫째로 백업, CREATE 명령어와 조합하면 테이블 백업으로도 쓸 수 있습니다. + +노란박스의 조건을 보면 1은1로 할 경우 데이터까지 복사 + +1은0으로 하면 테이블 스키마만 복사합니다. + +![스크린샷 2024-02-14 140720](https://github.com/gunsight1/blog/assets/103917282/5f6c0366-7693-4b6c-945d-8207d31af973) + +둘째로 필터링입니다. 예를 들어 INSERT명령어와 조합하면 조건에 맞는 데이터만 뽑아 넣을 수 있습니다. + +![스크린샷 2024-02-14 140725](https://github.com/gunsight1/blog/assets/103917282/47927533-50e8-4a53-95c3-0aec17287883) + +셋째로 SELECT안에 SELECT를 써서 임시 테이블, 즉 버추얼 뷰처럼 쓸 수 있는데 이것을 인라인 뷰라고 합니다. + +![스크린샷 2024-02-14 135310](https://github.com/gunsight1/blog/assets/103917282/f69c7a35-432f-4940-87ca-9f0bc0ccddf1) + +위 이미지에 보이는 쿼리에서 첫번째는 조인을 이용한 쿼리 실행이고, 두번째는 인라인 뷰를 이용한 쿼리 실행 입니다. + +둘이 같은 결과를 보여주는 쿼리인데 어느 쪽이 더 빠르게 될까요? 쿼리를 다루게 된다면 항상 고민하게되는 포인트입니다. + +지금껏 이야기 한 SELECT 과정을 실제 RDBMS에서 수행되는 과정을 풀어보면 아래와 같은 이미지처럼 나오게 됩니다. + +DBMS에 관심이 있어 자세히 알아가고자 한다면 아래의 내용에 대해서도 공부해봄직합니다. 🫡 + +![스크린샷 2024-02-14 135358](https://github.com/gunsight1/blog/assets/103917282/7fe177f8-3bdd-478f-a397-ec8437884cb3) + +
+ +## [5. 쿼리실행계획] + +우리의 입장에서 이것보다 더 먼저 알아야 할 것은 SELECT 쿼리가 실행 될 때 발생하는 실행계획(query-plan) 이란 것이 있습니다. + +이 실행계획은 말 그대로 쿼리가 실행 할 때 어떠한 계획을 가지고 수행하는가를 나타내는 계획서입니다. 이 실행계획의 각 단계를 COST, 즉 비용이라고 부르는데 말그대로 수행에 필요한 비용을 뜻합니다. + +우리같은 서민은 가성비를 좋아하듯, 쿼리의 성능도 가성비가 중요합니다. 🙃 보통 다른 환경이 동일하다는 가정하에 코스트가 낮을수록 결과를 빠르게 가져옵니다. + +같은 결과를 뽑더라도 이 실행 계획에 따라 성능이 좌지우지되므로 얼마나 중요한지 알려드리고자 아주 극단적이지만 심플한 예시를 통해 말씀드리겠습니다. + +## [6. 실행계획을 직접 확인해보자] + +![스크린샷 2024-02-14 135852](https://github.com/gunsight1/blog/assets/103917282/694cdd8e-cefc-42d7-956c-e53a1c8ec749) + +자 우리가 취업을 하게되서 회사에서 '통계 쿼리를 만들어라' 업무 지시를 받았다고 시나리오를 두고 위와 같은 구조를 가진 회원 정보 테이블이 있다 가정합시다. + +이 데이터를 토대로 전체 회원 수, 월 가입자 수, 6개월 이상 미접속자 수 3개를 가져오고자 합니다. + +![스크린샷 2024-02-14 135903](https://github.com/gunsight1/blog/assets/103917282/dcafd47d-9987-45cc-8719-cfe9f3828dd5) + +쿼리를 써본지 얼마 안된 초보자의 입장에선 방금전 문법을 알아가는 과정을 통해 SELECT를 가지고 세가지의 값을 가져와야 한다는 것은 인지 할 것입니다. + +그런데 각각 성격이 다른 값을 어떻게 하나로 묶어야할지 고민이 될겁니다. + +일단 각각의 결과를 뽑는 쿼리를 써보자면 보시는 그림과 같이 나올 것입니다. + +![스크린샷 2024-02-14 135935](https://github.com/gunsight1/blog/assets/103917282/21cb7b2d-1213-4b85-a59b-4d4725b67399) + +이제 이것을 하나의 결과로 보여주기위해 FROM절엔 테이블이 들어가야 한다는 문법을 생각해서 다음과 같이 작성했다고 가정해봅시다. + +FROM절에 아까 작성한 각각의 결과를 가져오는 쿼리를 넣어주고, SELECT절에서 값을 가져오게 했습니다. 문법상 아주 정확하고, 올바른 결과를 나타냅니다. + +앞으로 이와 같은 두번의 과정이 더 있는데 결과는 모두 동일함을 미리 말씀드립니다. + +![스크린샷 2024-02-14 140005](https://github.com/gunsight1/blog/assets/103917282/28dd9112-c97c-4b46-9c1d-0d4a8642fc64) + +작성한 쿼리 앞에 실행 계획을 확인하는 EXPLAIN을 넣고 다시 쿼리를 실행해보면 다음과 같이 실행 계획이 6개나 잡혀있는 것을 확인 할 수 있습니다. + +FROM절에 나온 서브쿼리 SELECT가 3번 사용되어 같은 테이블에 3번 요청을 하고, SELECT절에서도 3번의 결과를 가져온 꼴이 되어 결과적으로 3 더하기 3 = 6이 나왔습니다. + +회사에서 쿼리를 이렇게 짜고 보고를 하면 어떻게 될까요? 아이고 고생많았으니 얼른 퇴근하세요 ~ 라고 할까요? 안타깝게도 칼퇴는 커녕 야근으로 직행입니다.🫠 + +![스크린샷 2024-02-14 140044](https://github.com/gunsight1/blog/assets/103917282/fbd9ccfd-bf1e-4add-af54-ae805f5dbfe6) + +자, 야근을 피하기 위해 이번엔 SELECT절 처음부터 각각의 값을 가져오도록 바꿔보았습니다. + +위의 코드에서 MYSQL은 문법상 보이진 않지만 FROM절이 있다고 가정을 해서 보는 것이 맞습니다. + +참고로 오라클에선 문법 가독성을 위해 FROM DUAL이라는 것을 지원합니다. + +FROM절을 가상의 테이블로 취급하여 1개, 서브쿼리로 뽑아오는 부분 3개로 아까보다 무려 2개나 줄었으니 이번엔 칼퇴각일 것 같죠?? + +여러분들께서 이 쿼리를 보고 만족한다면 안타깝게도 또 하루 야근의 길로 당첨입니다. + +그럼 여기서 또 어떻게 줄여야할까요? + +![스크린샷 2024-02-14 140119](https://github.com/gunsight1/blog/assets/103917282/1fb16e96-fd5e-4b30-8501-40671fd75f4d) + +DBMS에서 지원하는 SUM 함수와 자바의 IF와 비슷한 CASE, WHEN, THEN 문법을 이용해서 단 한번으로 데이터를 가져오도록 바꿔보았습니다. + +와우, 코스트가 단 하나로 바뀌었네요. 이정도면 고생했단 칭찬과 함께 칼퇴 할 만 합니다. + +이렇게해서 같은 결과를 보여도 쿼리를 어떻게 짜느냐에 따라 효율이 올라가는지, + +그 효율을 보는 실행계획은 어떻게 보는지 아주 기초적인 내용으로 알려드렸습니다. From a5876163e0f273cc71455ada5b8c810c6ac1eb73 Mon Sep 17 00:00:00 2001 From: gunsight <103917282+gunsight1@users.noreply.github.com> Date: Wed, 14 Feb 2024 14:29:34 +0900 Subject: [PATCH 07/14] =?UTF-8?q?=ED=8F=AC=EC=8A=A4=ED=8C=85=20=EB=A0=88?= =?UTF-8?q?=EC=9D=B4=EC=96=B4=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 코드 내 최상단 레이어 정보 추가하였음. --- _posts/2023-12-01-RDBMS.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/_posts/2023-12-01-RDBMS.md b/_posts/2023-12-01-RDBMS.md index d2ab64d..03ab6ad 100644 --- a/_posts/2023-12-01-RDBMS.md +++ b/_posts/2023-12-01-RDBMS.md @@ -1,3 +1,18 @@ +--- +layout: post +title: RDBMS의 조회과정, 쿼리실행계획 중요성 +author: 정지용 +categories: 기술세미나 +banner: + image: https://github.com/gunsight1/blog/assets/103917282/6c386616-902b-4bc5-98b6-f6b26c15b2e8 + background: "#000" + height: "100vh" + min_height: "38vh" + heading_style: "font-size: 4.25em; font-weight: bold; text-decoration: underline" + tags: [RDBMS, 오라클, MYSQL, DML, QUERYPLAN, 기술세미나] +--- + + # RDBMS의 조회과정, 쿼리실행계획 중요성 반갑습니다. From 5e42f9c076a579722903722541e0d9a6e906c670 Mon Sep 17 00:00:00 2001 From: gunsight <103917282+gunsight1@users.noreply.github.com> Date: Wed, 14 Feb 2024 14:36:44 +0900 Subject: [PATCH 08/14] =?UTF-8?q?=EC=98=A4=ED=83=80=20=EC=88=98=EC=A0=95?= =?UTF-8?q?=202023-12-01-RDBMS.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 오타 수정 --- _posts/2023-12-01-RDBMS.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/_posts/2023-12-01-RDBMS.md b/_posts/2023-12-01-RDBMS.md index 03ab6ad..7e1376c 100644 --- a/_posts/2023-12-01-RDBMS.md +++ b/_posts/2023-12-01-RDBMS.md @@ -42,11 +42,11 @@ RDBMS (관계형 데이터베이스 관리 시스템 :: Relational Database Mana DDL(Data Definition Language)은 데이터 정의어로 DB 구조를 정의하거나 변경하는데 쓰입니다. -DML(Data Manipolation Language)은 데이터 조작어로 등록(insert) 조회(select) 수정(update) 삭제(delete)를 수행합니다. +DML(Data Manipulation Language)은 데이터 조작어로 등록(insert) 조회(select) 수정(update) 삭제(delete)를 수행합니다. DCL(Data Control Language)은 데이터 제어어로 DB에 접근하는 사용자의 권한관리를 담당합니다. -TCL(Trangection Control Language)은 트랜잭션 제어어로 작업수행의 대한 승인(commit), 철회(rollback)을 담당합니다. +TCL(Transaction Control Language)은 트랜잭션 제어어로 작업수행의 대한 승인(commit), 철회(rollback)을 담당합니다. 이 중 우리가 알아볼 명령어는 DML에 속하는 SELECT이며 DBA가 아닌 이상 우리같은 개발자는 보통 DML과 TCL을 세트로 많이 사용합니다. @@ -200,8 +200,8 @@ FROM절을 가상의 테이블로 취급하여 1개, 서브쿼리로 뽑아오 DBMS에서 지원하는 SUM 함수와 자바의 IF와 비슷한 CASE, WHEN, THEN 문법을 이용해서 단 한번으로 데이터를 가져오도록 바꿔보았습니다. -와우, 코스트가 단 하나로 바뀌었네요. 이정도면 고생했단 칭찬과 함께 칼퇴 할 만 합니다. +와우 코스트가 단 하나로 바뀌었네요. 이정도면 고생했단 칭찬과 함께 칼퇴 할 만 합니다. + +이렇게해서 같은 결과를 보여도 쿼리를 어떻게 짜느냐에 따라 효율이 올라가는지, 그 효율을 보는 실행계획은 어떻게 보는지 아주 기초적인 내용으로 알려드렸습니다. -이렇게해서 같은 결과를 보여도 쿼리를 어떻게 짜느냐에 따라 효율이 올라가는지, -그 효율을 보는 실행계획은 어떻게 보는지 아주 기초적인 내용으로 알려드렸습니다. From 0c00786c43be990b9c502a82814ba33d4bf3486d Mon Sep 17 00:00:00 2001 From: isevou__ Date: Wed, 14 Feb 2024 17:31:37 +0900 Subject: [PATCH 09/14] =?UTF-8?q?feat=20:=2020240125=5F=EC=BD=94=EB=94=A9?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=5F=EA=B3=A0=EB=B3=91=EB=A3=A1.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- _posts/2023-01-25-coding-test.md | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/_posts/2023-01-25-coding-test.md b/_posts/2023-01-25-coding-test.md index dc5b74c..fb9eab9 100644 --- a/_posts/2023-01-25-coding-test.md +++ b/_posts/2023-01-25-coding-test.md @@ -4,7 +4,7 @@ title: 주저하는 개발자들을 위해 - 코딩 테스트 author: 고병룡 categories: 기술세미나 banner: - image: https://docs.oracle.com/cd/E19340-01/820-6424/images/to_MOM.gif + image: https://www.hanbit.co.kr/data/editor/20200918163925_xyypndmo.png background: "#000" height: "100vh" min_height: "38vh" @@ -139,11 +139,9 @@ banner: ## 참고 자료 -이것이 코딩 테스트다 +이것이 코딩 테스트다, 나동빈 저, pg 46 - 50 [개발자 취업을 위한 코딩 테스트 준비 방법](https://katfun.tistory.com/192) [알고리즘 분류 참고 - 백준 온라인 저지 알고리즘 별 문제 분류](https://www.acmicpc.net/problem/tags) - -헤더 이미지 붙이고 글 내용 읽고 수정해서 오늘 업로드 할 것 \ No newline at end of file From f0dd89d6af77191cc89673b08e0309dbc3ec0bfa Mon Sep 17 00:00:00 2001 From: mooncw <97713997+mooncw@users.noreply.github.com> Date: Wed, 14 Feb 2024 20:20:41 +0900 Subject: [PATCH 10/14] =?UTF-8?q?fix=20:=2020240126=5Fstomp=20=EC=9B=B9?= =?UTF-8?q?=EC=86=8C=EC=BC=93=20=ED=94=84=EB=A1=9C=EA=B7=B8=EB=9E=98?= =?UTF-8?q?=EB=B0=8D=5F=EB=AC=B8=EC=B0=AC=EC=9A=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 썸네일 주소 오타 수정 --- _posts/2024-01-26-stomp-websocket-programing.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_posts/2024-01-26-stomp-websocket-programing.md b/_posts/2024-01-26-stomp-websocket-programing.md index 16505bf..177798b 100644 --- a/_posts/2024-01-26-stomp-websocket-programing.md +++ b/_posts/2024-01-26-stomp-websocket-programing.md @@ -4,7 +4,7 @@ title: STOMP 웹소켓 프로그래밍 author: 문찬욱 categories: 기술세미나 banner: - image: https://raw.githubusercontent.com/Kernel360/blog-image/main/2024/0126/thumb.jpg + image: https://raw.githubusercontent.com/Kernel360/blog-image/main/2024/0126/thumb.png background: "#000" height: "100vh" min_height: "38vh" From 5d342bc982ebaf307ebcb13a0bb9b27115e5dbee Mon Sep 17 00:00:00 2001 From: Wonsang Kim Date: Thu, 15 Feb 2024 20:08:51 +0900 Subject: [PATCH 11/14] [docs] dynamic programming post --- _posts/2024-02-08-dynamicprogramming.md | 42 +++++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 _posts/2024-02-08-dynamicprogramming.md diff --git a/_posts/2024-02-08-dynamicprogramming.md b/_posts/2024-02-08-dynamicprogramming.md new file mode 100644 index 0000000..86bde1c --- /dev/null +++ b/_posts/2024-02-08-dynamicprogramming.md @@ -0,0 +1,42 @@ +--- +layout: post +title: 다이나믹 프로그래밍 +author: 김원상 +categories: 기술세미나 +banner: + image: https://github.com/Kernel360/blog-image/blob/main/2024/0208/1.png?raw=true + background: "#000" + height: "100vh" + min_height: "38vh" + heading_style: "font-size: 4.25em; font-weight: bold; text-decoration: underline" + tags: [알고리즘, 다이나믹프로그래밍] +--- + + + +안녕하세요. 이번에 다이나믹프로그래밍에 관하여 기술세미나를 드릴 김원상입니다. + +
+ +## 1. 웹소켓 + + +
+ +## 2. HTTP vs 웹소켓 + + +![1](https://github.com/Kernel360/blog-image/blob/main/2024/0208/3.png?raw=true) +![2](https://github.com/Kernel360/blog-image/blob/main/2024/0208/4.png?raw=true) +![3](https://github.com/Kernel360/blog-image/blob/main/2024/0208/5.png?raw=true) +![4](https://github.com/Kernel360/blog-image/blob/main/2024/0208/7.png?raw=true) +![5](https://github.com/Kernel360/blog-image/blob/main/2024/0208/8.png?raw=true) +![6](https://github.com/Kernel360/blog-image/blob/main/2024/0208/9.png?raw=true) + + + +## 4. STOMP + + +## 5. 마무리 + From 90959a2a88bf1290e88e9a7ee2c1b937d7d66e2e Mon Sep 17 00:00:00 2001 From: Wonsang Kim Date: Thu, 15 Feb 2024 20:13:26 +0900 Subject: [PATCH 12/14] [docs] dynamic programming post --- _posts/2024-02-08-dynamicprogramming.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/_posts/2024-02-08-dynamicprogramming.md b/_posts/2024-02-08-dynamicprogramming.md index 86bde1c..b50b3f7 100644 --- a/_posts/2024-02-08-dynamicprogramming.md +++ b/_posts/2024-02-08-dynamicprogramming.md @@ -12,9 +12,11 @@ banner: tags: [알고리즘, 다이나믹프로그래밍] --- +안녕하세요. 이번에 다이나믹 프로그래밍에 관하여 기술세미나를 드릴 김원상입니다. - -안녕하세요. 이번에 다이나믹프로그래밍에 관하여 기술세미나를 드릴 김원상입니다. +$$ +\int_{a}^{b} f(x) \, dx +$$
From d0a55c4b8705be5ed23d5b90fb4aedc73dd44d34 Mon Sep 17 00:00:00 2001 From: Wonsang Kim Date: Thu, 15 Feb 2024 20:41:56 +0900 Subject: [PATCH 13/14] [docs] dynamic programming post --- _posts/2024-02-08-dynamicprogramming.md | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/_posts/2024-02-08-dynamicprogramming.md b/_posts/2024-02-08-dynamicprogramming.md index b50b3f7..b33bf76 100644 --- a/_posts/2024-02-08-dynamicprogramming.md +++ b/_posts/2024-02-08-dynamicprogramming.md @@ -14,18 +14,17 @@ banner: 안녕하세요. 이번에 다이나믹 프로그래밍에 관하여 기술세미나를 드릴 김원상입니다. -$$ -\int_{a}^{b} f(x) \, dx -$$ +다이나믹 프로그래밍은 코딩테스트를 처음 접하시는 분들에게는 진입장벽, 조금 익숙하신 분들에게는 알다가도 모를것 같은 알고리즙인데요. 제 나름대로 다이나믹 프로그래밍 문제를 접근하는 방법과 어떤 식으로 공부하면 좋을지에 대한 생각을 나눌 수 있을 것 같아 선택한 주제입니다. 커널360 코딩테스트에도 나왔고, 다른 기업 코딩테스트 후기를 봐도 조금씩 나오기 때문에 연습을 많이 해두시면 분명 원하는 회사를 가시는데 도움이 될 거라 생각합니다. -
+### 1. 리처드 E. 벨만 -## 1. 웹소켓 +다이나믹 프로그래밍은 리처드 E. 벨만이라는 수학자가 처음 고안한 알고리즘입니다. 어떤 과목이든지 +$$ +\int_{a}^{b} f(x) \, dx +$$ -
-## 2. HTTP vs 웹소켓 ![1](https://github.com/Kernel360/blog-image/blob/main/2024/0208/3.png?raw=true) @@ -37,8 +36,3 @@ $$ -## 4. STOMP - - -## 5. 마무리 - From 170ae2e622d5bedeb54fb6e0081f612974bd4463 Mon Sep 17 00:00:00 2001 From: Byungryong Ko Date: Thu, 15 Feb 2024 21:40:18 +0900 Subject: [PATCH 14/14] Update 2023-01-25-coding-test.md --- _posts/2023-01-25-coding-test.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_posts/2023-01-25-coding-test.md b/_posts/2023-01-25-coding-test.md index fb9eab9..41c7c80 100644 --- a/_posts/2023-01-25-coding-test.md +++ b/_posts/2023-01-25-coding-test.md @@ -54,7 +54,7 @@ banner: 착각하는 분들이 있는데 우리는 대회를 나가자고 하는 게 아니다. 코테를 쳐보는 것만으로도 소중한 자산이다. 이걸로 상을 타는 게 아니라 우리는 취업이 목적이기에.... >7. 어떻게 준비해야 될지 모르겠다. -그러면 이제부터 알아보자! 만약 필자가 뭐하는 사람인지 의심이 간다면.. 그래도 나름 [열심히(?)](https://solved.ac/profile/hodako97) 준비해오고 [알고리즘을 좋아하고](https://github.com/fingersdanny/PS_note), [알고리즘 스터디](https://github.com/Kernel360-cell1/algorithm-study)를 운영 중인 사람 중 하나로써 여러분들이 코테에서 더 행복해지길 바라는 마음에서 준비했다. +그러면 이제부터 알아보자! 만약 필자가 뭐하는 사람인지 의심이 간다면.. 그래도 나름 [열심히(?)](https://solved.ac/profile/hodako97) 준비해오고 [알고리즘을 좋아하고](https://github.com/fingersdanny/PS_note), [알고리즘 스터디](https://github.com/Kernel360-cell1/algorithm-study)를 운영 중인 사람 중 하나로서 여러분들이 코테에서 더 행복해지길 바라는 마음에서 준비했다. ## 코딩테스트 어떻게 준비해야 할까?