전체 글

CS

[Network] TCP Socket Programming - 데이터 전송하기

목표 이번 글에서는 TCP Socket을 직접 만들어보면서 TCP에 대한 이해를 높임과 동시에 TCP 서버도 만들어보겠습니다. 이 글에서는 데이터 전송하기까지만 다뤄보겠습니다. TCP Socket TCP Client의 흐름도 TCP에서는 누구와 통신하고 있는지 먼저 정하고 통신이 진행됩니다. 그리고 누구와 통신한다고 정해져 있기 때문에 상대와 어떤 통신을 했는지 기록을 하게 됩니다. 이 기록을 State라고 합니다. Client의 connect()는 통신할 상대와 가상의 연결을 맺습니다. UDP 하고 가장 큰 다른 점은 클라이언트 측에서 socket을 만들고 connect를 한다는 점입니다. 가상의 연결이 맺어지면 UDP의 sendto(), recvfrom() 같은 데이터를 보낼 때마다 명시해야 했던 내..

CS

[Network] Protobuf, JSON

목표 이번 글에서는 최근 많은 개발자들 사이에서 화두가 되고 있는 Protobuf에 대해 알아보려고 합니다. Protobuf는 어떤 것이며 기존의 데이터 포맷(예: JSON, XML)과 어떤 차이점이 있는지에 대해 알아보겠습니다. Protobuf란 무엇인가? Protobuf, 또는 '프로토콜 버퍼'는 Google에서 개발한 이진 데이터 포맷입니다. 구조화된 데이터를 직렬화하고 역직렬화하는 데 사용되며, 효율적이고 빠르게 데이터를 전송하고 저장할 수 있습니다. Protobuf의 특징 이진 포맷: Protobuf는 이진 데이터 포맷을 사용하여, 사람이 읽을 수 있는 포맷보다 훨씬 더 작고 빠르게 데이터를 전송합니다. 언어 중립: 여러 프로그래밍 언어에 대한 지원이 포함되어 있어 다양한 언어로 개발된 시스템 ..

CS

[Network] Socket Programming 메모리 관리

목표 메모리를 다루지 않는 프로그래밍 언어는 없습니다. 단지 C/C++처럼 그걸 명시적인 포인터로 노출하지 않을 뿐입니다. 그리고 그 언어들이 제공하는 것은 단지 "메모리 할당/해제" 일 뿐 메모리 복사에 대한 의사 결정은 해주지 않습니다. 즉, 불필요한 메모리 복사인지 아닌지. 복사를 감수할 정도인지 아닌지는 여전히 프로그래머가 결정해야 되고, 이때 메모리 구조에 대한 이해 없이는 불가능합니다. 이 글에서는 Socket Programming 에서 메모리 관리에 대해 알아보겠습니다. sendto() 함수의 동작 Q) 지금까지 문자열 전송에 대해서만 다뤘는데 정수는 어떻게 보내야 하나요? sendto 함수의 인자는 다음과 같습니다. int numBytes = sendto(s, buf.c_str(), buf..

CS

[Network] UDP Socket 만들어보기 - 데이터 받기

목표 전 글에서는 C++로 UDP Socket 만들어 데이터를 보내보았습니다. 이번 글에서는 UDP Socket으로 데이터를 받는 코드를 작성해 보겠습니다. UDP로 데이터 받기 #include #include #include #include #include #include #include using namespace std; int main(){ int s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); // Socket 열기 if (s < 0) return 1; // 오류가 있으면 s는 음수 string buf = "Hello World"; struct sockaddr_in sin; memset(&sin, 0, sizeof(sin)); sin.sin_family = AF..

CS

[Network] UDP Socket 만들어보기 - 데이터 보내기

목표 이번 글에서는 c++로 UDP 소켓 생성과 이를 이용해 데이터를 보내는 코드를 작성해 보면서 UDP 통신 방법을 알아보도록 하겠습니다. Opaque Hadle로서의 Socket Descriptor socket() 함수로 UDP 소켓을 만들어보겠습니다. #include // the Internet 관련 함수들 #include // socket 관련 기본 함수들 #include // Unix 계열에서 표준 기능 함수들 #include using namespace std; int main(){ int s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); cout

CS

[Network] Socket Programming (TCP, UDP)

들어가기 전에 백엔드 소프트웨어 개발이라는 강좌를 학교에서 듣고 있는데 너무 유익해서 꼼꼼히 정리해보려고 합니다. 이번 포스트에서는 Socket Programming에 대해서 써보겠습니다. Socket이란? 뭔가를 집어넣기 위해서 자연적 혹은 인위적으로 만든 구멍 어떤 기능을 추가하기 위해서 혹은 제공되는 기능을 쓰기 위해서 만든 구멍 예를 들어서 TCP 혹은 UDP를 쓰고 싶다면 Transport에 있는 socket을 만들면 됩니다. 소켓은 어떤 계층이 되었든 간에 자기가 그 서비스를 쓰고 싶으면 만들 수 있습니다. Network Socket Library network layer를 손쉽게 접근할 수 있게 도와주는 library (ex: 프로토콜 옵션 조정, 헤더 자동 채우기 등) 1980년대 Berk..

SpringBoot

[SpringBoot] JPA N+1 문제를 @EntityGraph로 해결하기

들어가기 전에 JPA N+1 문제를 해결하기 위해 고민하던 도중 @EntityGraph로 해결하니 너무 편해서 글을 쓰게 되었습니다. 물론 query가 복잡해지는 경우 이 어노테이션으로도 해결할 수 없는 부분이 있겠지만 간단한 query일 경우 이 @EntityGraph로 한번 해결 해 봤으면 하는 마음에 공유합니다. @EntityGraph란? @EntityGraph 어노테이션은 JPA에서 제공하는 기능을 활용하여 엔티티 그래프를 정의하는 데 사용됩니다. JPA는 연관된 엔티티를 로드할 때 Lazy Loading으로 설정해 놓았으면 연관된 엔티티가 실제로 필요한 시점에만 데이터베이스에서 가져옵니다. 이는 N+1 query 문제와 같은 성능 문제를 야기합니다. @EntityGraph 어노테이션을 사용하면 ..

Tech

[Tech] Kafka? RabbitMQ?

들어가기 전에 실시간 채팅 구현을 고려하는 도중 Message Queue에 대해 알게 되었다. Message Queue중 대표적인 것으로는 Kafka와 RabbitMQ가 있다는 것도 알게 되었다. 이번 포스팅에서는 이 둘 각각의 장점과 차이점을 알아보고 어떤 상황에서 어떤 것을 사용하는 것이 좋은지 알아보려고 한다. Message Queue? 메시지 큐는 애플리케이션 간에 데이터를 전송하는 데 사용되는 중간자나 중개자이다. 사용하는 주요 이유는 아래와 같다. 비동기 처리: 메시지 큐는 시스템 간의 통신을 비동기식으로 만들어, 한 서비스가 다른 서비스로부터 독립적으로 동작할 수 있게 해준다. 이를 통해 애플리케이션의 처리 과정을 비동기적으로 만들어 애플리케이션의 응답성을 향상시키고, 병목 현상을 줄일 수 ..

진세박
sejineer