[필D상] Chapter 1. 실제 DBMS 사례를 통해 기본 개념 익히기 - MySQL 아키텍처
2023. 9. 8. 06:15
Database/필수 DBMS 상식
Chapter 1에서는 MySQL의 아키텍처에 대해 살펴보겠습니다. MySQL의 기본 아키텍처는 다음과 같습니다. MySQL Connectors & Shell MySQL connector는 애플리케이션이 MySQL과 연결되어 작동할 수 있도록 도와주는 소프트웨어입니다. API를 통해 MySQL의 기능(쿼리 실행, 데이터 조회, 데이터 수정 등)을 활용할 수 있습니다. MySQL connector는 프로그래밍 언어에 따라 구현이 다르며, 대표적인 예시로 Java의 경우 JDBC(Java Database Connectivity)를 사용합니다. MySQL shell은 CLI(Command Line Interface) 또는 스크립트를 사용하여 MySQL을 다룰 수 있는 또 다른 방법입니다. MySQL Engin..
[필D상] 소개 및 목차
2023. 9. 6. 17:05
Database/필수 DBMS 상식
"필수 DBMS 상식(필D상)" 포스트 시리즈는 DBMS를 사용하는 개발자라면 반드시 알아야 하는 DBMS 상식에 대해 다룹니다. 이 시리즈는 단순한 정보 전달을 넘어, DBMS가 내부적으로 어떻게 동작하는지와 개발자의 시각에서 DBMS의 동작 방식을 바라보는 방법 등을 다룹니다. DBMS는 Database Management System의 약자로, 일반적으로 데이터베이스라고 불리지만 사실상 데이터베이스와는 엄연히 다른 개념입니다. 데이터베이스는 구조화된 정보 또는 데이터의 조직화된 모음으로서 디스크에 저장되는 반면, DBMS는 이러한 데이터베이스의 데이터를 효율적으로 관리하기 위해 사용되는 소프트웨어입니다. 시리즈 목차는 다음과 같습니다. Part 1. 단일 프로세스 DBMS Part 1에서는 단일 프..
[Java] LocalDate.now()를 사용하면 안되는 이유
2023. 9. 1. 09:29
Java/Deep Java
최근에 개발한 배치 프로그램이 로컬에서 실행했을 때와 배포 환경에서 실행했을 때 조회하고 생성하는 데이터 간에 차이가 발생하는걸 확인했습니다. 동일한 설정으로 배포했는데 대체 어떻게 문제가 발생하는 건지... 원인을 찾아내기까지 오랜 시간이 걸렸습니다. 문제는 배치 프로그램에서 사용하는 LocalDate.now()였습니다. 이번 포스팅에서는 LocalDate.now()가 어떻게 문제를 유발했는지, 그리고 어떻게 해결했는지에 대해 공유하고자 합니다. 원인 분석 배치 프로그램은 05:30, 07:30, 09:30에 실행하도록 스케줄링 돼있습니다. 배치 프로그램에 date와 관련된 일자를 인자로 넘기지 않으면 해당 배치 프로그램은 LocalDate.now()를 기준으로 배치 실행 일자를 결정하게됩니다. 그런데..
[Rust] Rust Ownership이란
2023. 8. 31. 19:03
Rust/Basic Rust
Rust는 다른 언어에서 찾아보기 힘든 ownership이란 개념이 존재합니다. Java의 경우 garbage collector가 메모리를 관리하고 C/C++의 경우 프로그래머가 메모리를 직접 관리합니다. Rust는 ownership을 활용해 garbage collector와 프로그래머의 개입 없이도 메모리를 효과적으로 관리할 수 있습니다(여기서 말하는 메모리의 관리는 사용하지 않는 객체 등에 할당된 메모리를 해제하는 것을 의미합니다). 이번 포스팅에서는 Rust가 제공하는 ownership의 4가지 유형에 대해 살펴보겠습니다. Move Move는 ownership을 한쪽 위치에서 다른 쪽 위치로 옮기는 것을 의미합니다. fn main() { let string = String::new(); use_st..
[OS] sendfile 시스템 콜과 kafka zero-copy
2023. 8. 24. 17:37
Operating System
File.read(fileDesc, buf, len); Socket.send(socket, buf, len); 위 코드는 디스크의 데이터를 네트워크를 통해 전달하는 코드입니다. 구체적인 내부 동작원리는 다음과 같습니다. 운영체제가 디스크상의 파일을 읽어 데이터를 커널 공간(kernel space)의 읽기 버퍼(read buffer)에 저장합니다. 애플리케이션은 읽기 버퍼에 저장된 데이터를 사용자 공간(use space) 버퍼(application buffer)로 읽어 들입니다. 애플리케이션은 사용자 공간 버퍼로 읽어 들인 데이터를 소켓 버퍼에 씁니다. 운영체제는 소켓 버퍼의 데이터를 NIC(Network Interface Card) 버퍼에 복사합니다. 해당 데이터는 네트워크를 통해 전송됩니다. 디스크상의..
[Java] Java 네트워크 Deep Dive
2023. 7. 30. 12:37
Java/Deep Java
백엔드 개발자의 중요한 소양 중 하나는 네트워크에 대한 이해입니다. 분산환경에 대한 경험을 요구하는 회사가 많아지면서 그에 따른 네트워크에 대한 이해도 그 어느 때보다 중요하게 됐습니다. 이번 포스팅에서는 Java NIO는 TCP를 어떻게 처리하는지 살펴보겠습니다. 포스팅에 첨부된 소스코드는 아래 github 링크에서 확인할 수 있습니다. GitHub - seonwoo960000/java-nio-practice Contribute to seonwoo960000/java-nio-practice development by creating an account on GitHub. github.com Java NIO(New I/O) Java NIO는 확장성 있는 Java 입출력(I/O) 기능을 구현할 수 있는 A..
[AWS] 사이드 프로젝트용 AWS IaaC - Cloudformation
2023. 7. 24. 08:11
Infrastructure/AWS
새로운 사이드 프로젝트를 시작할 때마다 AWS의 환경을 구축하는 작업은 저에게 있어 매우 귀찮은 일 중 하나였습니다. AWS는 cloudformation를 통해 infrastructutre as a code 기능을 제공하는데, 이 기능을 활용해 제 번거로움을 덜 수 있었습니다. cloudformation는 AWS에 구축하고자 하는 환경을 코드로 정의할 수 있도록 합니다. 따라서 동일한 환경을 재구축하는 게 매우 쉽고 인프라를 구축하는 데 있어 실수할 여지를 감소시킬 수 있습니다. 이번 포스팅을 통해 사이드 프로젝트를 위한 미니멀한 AWS 환경을 cloudformation를 통해 구축해 보겠습니다. 포스팅과 관련된 코드는 아래 github에서 확인할 수 있습니다. GitHub - seonwoo960000/..
[Spring Boot] Spring Batch Partitioning을 통해 Step을 분리해보자
2023. 7. 8. 14:21
Java/Spring Boot
Spring Batch 애플리케이션을 작업하다보면 이 애플리케이션이 처리해야하는 데이터가 많아졌을 때 다음과 같은 고민을 어떻게 해결할 수 있을지 궁금했습니다. 기존 코드 변경을 최소화하며 단일 서버의 처리량을 최대한 높이는 방법이 없을까? 동시성을 최소한으로 신경쓰고 처리량을 높일수는 없을까? 위 궁금증을 해소할 수 있는 방법을 찾던 중 spring batch의 partitioning 기능이 있다는 것을 알게됐습니다. 이번 포스팅에서는 위 궁금증을 spring batch에서 어떻게 해소해주는지 살펴보겠습니다. 코드는 아래 링크에서 확인해주세요. Main 브랜치에 partitioning을 적용하고 no-partitioning 브랜치는 일반적인 batch를 구현하였습니다. GitHub - seonwoo96..