(Node.js · Spring Boot · Docker · CI/CD · Kubernetes까지)dotenv는 .env 파일을 읽어 환경 변수로 주입해 주는 작은 라이브러리지만,“환경 변수 관리”는 보안·배포·운영 전반을 좌우하는 핵심 주제예요. 이 글은 기초부터 실무 베스트 프랙티스까지 한 번에 정리합니다.1) dotenv란? .env 파일에 적은 키=값 쌍을 애플리케이션 시작 시 환경 변수로 로드해 줍니다.Node.js에서 가장 흔히 씁니다.# .envDB_HOST=localhostDB_USER=rootDB_PASS=secret// index.jsrequire('dotenv').config(); // 가장 첫 줄에서!const { DB_HOST, DB_USER, DB_PASS } = process...
전체 글
항상 정리하며 기록하고 있습니다.들어가며소프트웨어 아키텍처는 프로젝트의 장기적인 유지보수성, 확장성, 테스트 용이성에 직접적인 영향을 줍니다.특히 Hexagonal(헥사고날) 아키텍처, Layered(레이어드) 아키텍처, Clean Architecture, 그리고 Modular Monolith는 백엔드 개발자라면 꼭 이해해야 할 대표적인 패턴입니다. 이 글에서는 각 아키텍처의 개념과 차이점을 정리하고, 언제 어떤 패턴을 선택하면 좋은지 설명해보려 합니다:) Layered Architecture(계층형 아키텍처)📖 개념전통적인 아키텍처 스타일로, 보통 Presentation -> Service -> Repository -> Database 순으로 흐릅니다.계층 간 의존성 방향이 단방향이며, 하위 계층이 변경되면 상위 계층도 영향을 받..
멀티스레드 환경에서는 여러 요청이 동시에 처리되기 때문에, 공유 자원 관리가 중요한 과제입니다.공유 객체를 잘못 관리하면 데이터 꼬임, 동기화 비용 증가, 심지어 보안 이슈까지 발생합니다. 이 문제를 해결하기 위해 자바는 ThreadLocal이라는 도구를 제공합니다.ThreadLocal은 이름 그대로 스레드마다 독립적인 저장 공간을 만들어주어,동기화 비용 없이 안전하게 데이터를 보관할 수 있습니다.1. ThreadLocal이란?ThreadLocal은 스레드 단위로 값을 보관할 수 있는 저장소즉, 같은 변수를 여러 스레드가 접근해도 서로 영향을 주지 않는다.set(value): 현재 스레드의 저장소에 값 저장get(): 현재 스레드의 저장소에서 값 조회remove(): 현재 스레드의 저장소에서 값 삭제(메..
1. RabbitMQ란?RabbitMQ는 메세지 브로커(Message Broker)입니다. 프로그램끼리 직접 통신하지 않고, 중간에 RabbitMQ가 우체국 역할을 하면서 메세지를 안전하게 전달해줍니다.Producer(발행자) -> 메세지를 보냄Exchange(교환소) -> 메세지 목적지 결정Queue(큐) -> 메세지가 실제로 저장되는 공간Consumer(소비자) -> 큐에서 메세지를 꺼내 처리 👉 비유“편지를 보내면, 교환소(우체국 창구)가 주소를 보고 적절한 우체통(큐)에 넣고, 편지함을 열어보는 사람이 소비자(Consumer)다.”2. 메세지 흐름 구조Producer → Exchange → Queue → ConsumerProducer: 메시지를 발행Exchange: 메시지를 어떤 큐로 보낼지 결..
프로그래밍에서 함수(메서드)에 인자를 넘길 때 어떻게 전달되는지에 따라Call by Value와 Call by Reference로 나뉜다. 이 차이는 언어마다 다르게 적용돼서 헷갈리기 쉽다.1. Call by Value (값에 의한 호출)값을 복사해서 전달함수 내부에서 매개변수를 변경해도 원본은 변하지 않는다.예시 (C, Java 기본형)#include void change(int x) { x = 20;}int main() { int a = 10; change(a); printf("%d", a); // 10} 👉 값만 복사됐으니 a는 그대로 10이다.2. Call by Reference (참조에 의한 호출)주소(참조)를 그대로 전달함수 내부에서 변경하면 원본도 함께 바뀐다.예시 ..
TL;DRRabbitMQ전통적 메시지 브로커(AMQP). 큐 기반, 라우팅 유연, 낮은 지연, 업무 트랜잭션/요청-응답/작업 분배에 강함.Kafka분산 커밋 로그. 토픽-파티션(로그) 기반, 아주 높은 처리량, 리텐션과 재처리, 이벤트 스트리밍/분석/CDC에 강함.요청-응답, 작업 큐, 라우팅 규칙이 복잡, 빠른 처리 후 메시지 소모 -> RabbitMQ데이터 파이프라인, 이벤트 스트리밍, 재처리/리플레이, 초고처리량 -> Kafka핵심 개념 요약항목 RabbitMQ Kafka항목 RabbitMQ Kafka 데이터 모델큐(Queue) + 익스체인지(Exchange) 라우팅로그(append-only), 토픽/파티션소비 모델브로커가 푸시(push)컨슈머가 풀(pull)순서 보장단일 큐·단일 컨슈머에서 사..
함수형 프로그래밍이란?함수형 프로그래밍(Function Programming, FP)은 상태 변경과 부수 효과(side-effect)를 최소화하는 방식의 프로그래밍 패러다임입니다.이 방식은 순수 함수를 중심으로, 데이터를 불변으로 다루며, 함수를 1급 객체로 취급합니다.Java 8부터 함수형 프로그래밍을 지원하는 람다 표현식, 스트림 API 등이 도입되면서, 코드가 더욱 간결하고 직관적으로 변했습니다.1. 람다 함수(Lambda Function)람다 함수는 익명 함수(anonymous function)로, 함수형 프로그래밍의 핵심 개념 중 하나입니다.간결한 함수 표현을 가능하게 해주며, 매개변수와 반환값을 명시적으로 정의할 수 있습니다.// 람다 함수 예시Runnable runnable = () -> S..
1. Factory Pattern (Simple Factory)Factory pattern은 객체를 생성하는 기능을 하나의 클래스나 메소드로 캡슐화하여클라이언트 코드에서 객체를 직접 생성하는 대신, 객체 생성을 간접적으로 할 수 있게 해주는 디자인 패턴입니다.주로 객체 생성 로직이 간단하고, 여러 객체를 생성하는 방식이 고정적일 때 유용합니다.특징하나의 팩토리 클래스에서 객체를 생성한다.객체 생성 방식이 변경될 때, 클라이언트 코드에 영향이 없다.객체를 생성하는 과정이 단순하고, 고정적일 때 주로 사용된다.예시public class Car { private String model; public Car(String model) { this.model = model; } p..