변수 기록함 223

[개인프로젝트] CI/CD 연동하기 *gitHube Actions

1.도입배경 - 개인프로젝트 서버가 확장되면서, 백앤드서버, 채팅서버, 카프카 ,리액트 등 코드 수정 후 배포의 번거로움이 늘어 CI/CD 연동의 필요성을 느꼈다. GitHub Actions는 별도의 도구 없이 GitHub 플랫폼 내에서 CI/CD 환경을 구축할 수 있게 해줍니다. 소스 코드 관리와 배포 자동화를 하나의 생태계에서 처리할 수 있다는 점이 가장 큰 장점이며, 이를 통해 개발 프로세스의 효율성을 극대화하고 팀원 간의 유기적인 협업을 가능하게 합니다. 2.파이프라인 2-1. GitHub Actions: CI/CD 파이프라인 엔진. GitHub Actions를 구성하는 5가지 핵심 요소GitHub Actions는 단순히 명령어를 나열하는 것이 아니라, 체계적인 컴포넌트들로 이루어져 있습니다..

[개인 프로젝트] Kafka 적용_아키텍처 확장과 실전 구현

1. 도입 배경과 시스템 설계 (Architecture)도입 배경 : 사실 제 개인 프로젝트에 카프카가 반드시 필요한 만큼의 트래픽은 발생하지 않습니다. 하지만 실무에서 대규모 데이터 처리와 시스템 확장을 고민할 때 Kafka는 선택이 아닌 필수라는 것을 알게 되었습니다. 단순히 이론으로만 아는 것과, 실제 내 프로젝트의 아키텍처를 뜯어고치며 발생하는 네트워크 설정, 메모리 최적화, 비동기 데이터 정합성 문제를 직접 해결해 보는 것은 큰 차이가 있다고 판단했습니다.그래서 기존의 단순한 구조를 과감히 버리고, **이벤트 기반 아키텍처(Event-Driven Architecture)**로 확장하는 도전을 시작했습니다.해결책 : Kafka를 브로커로 두어 각 서비스 간의 **의존성을 제거(Decoupling)..

[Java] 제네릭 와일드카드 완벽 정리 (feat. 공변과 반공변)

지난 포스팅에서 제네릭의 불공변성(Invariance) 때문에 발생하는 불편함에 대해 다뤘습니다.List는 List의 부모가 아니기 때문에 유연하게 사용할 수 없었죠.이를 해결하기 위해 등장한 것이 바로 **와일드카드(?)**입니다. 이번 글에서는 와일드카드의 핵심 개념과 3가지 종류, 그리고 이를 뒷받침하는 공변과 반공변의 원리까지 정리합니다.1. 와일드카드란? (Unknown Type Argument)와일드카드(?)는 말 그대로 **"알 수 없는 타입(Unknown Type)"**을 의미합니다. 정해지지 않은 타입을 나타내기 때문에 제네릭을 더 유연하게 사용할 수 있게 해줍니다.핵심 제약 사항Type Argument 위치에서만 사용 가능클래스나 메서드를 정의할 때(Box)는 쓸 수 없습니다. (T를 ..

자바/자바 2026.01.22

[Java] 제네릭은 왜 불변(Invariant)일까? (feat. 공변과 서브타입)

더보기 자바 개발자라면 List에 List을 대입할 수 없다는 사실을 한 번쯤 마주하게 됩니다. "String은 Object의 자식이니까 당연히 되어야 하는 거 아니야?"라는 의문이 들 수 있죠. 오늘은 배열과 제네릭의 차이, 그리고 제네릭의 서브타입 관계에 대해 정리해 봅니다.1. 기본 개념: Java의 타입 계층 구조우선 자바의 기본적인 상속 관계를 짚고 넘어가겠습니다.Integer는 Number의 서브타입입니다 (Integer Number는 Object의 서브타입입니다 (Number 따라서 Integer는 Object의 서브타입이기도 합니다.이 관계는 **Liskov Substitution Principle (리스코프 치환 원칙)**에 의해 자식 객체를 부모 타입 변수에 대입할 수 있게 해줍니다.2..

자바/자바 2026.01.21

(java) 패턴 매칭 instanceof 캐스팅 제거 (Flow Scoping 완벽 이해)

자바 개발을 하다 보면 특정 타입을 확인하고 그 타입의 메서드를 쓰기 위해 지겹게 반복하는 코드가 있습니다. 바로 instanceof로 확인하고 다시 (Casting)을 하는 과정이죠.오늘은 JDK 16부터 정식 도입되어 우리 코드를 훨씬 깔끔하게 만들어준 패턴 매칭(Pattern Matching) 기능과, 은근히 헷갈리는 스코프(Scope) 규칙을 정리해 보겠습니다.1. 우리가 그동안 작성하던 방식 (AS-IS)기존에는 객체의 타입을 확인한 뒤, 다시 명시적으로 캐스팅을 해줘야 했습니다.if (obj instanceof String) { String str = (String) obj; // 아... 이 코드를 또 써야 하나요? System.out.println(str.toUpperCase()..

자바/자바 2026.01.20

(자바) Apache Kafka 핵심 개념 (RabbitMQ <->Redis (Pub/Sub) <->Apache Kafka 차이 )

1. Apache Kafka란 무엇인가?Apache Kafka는 LinkedIn에서 개발하여 오픈소스로 공개한 **분산 이벤트 스트리밍 플랫폼(Distributed Event Streaming Platform)**입니다.기존의 메시징 시스템이 "메시지를 주고받는 것"에 집중했다면, Kafka는 **"데이터(이벤트)를 지속적으로 생성하고, 저장하고, 처리하는 것"**에 초점을 맞춥니다.핵심 특징높은 처리량(High Throughput): 초당 수백만 건의 이벤트를 처리할 수 있습니다.영속성(Persistence): 메시지를 메모리가 아닌 **디스크(Disk)**에 저장하여, 장애가 발생해도 데이터가 유실되지 않습니다.확장성(Scalability): 서버(Broker)를 수평적으로 늘려 성능을 확장하기 쉽습..

자바/자바 2025.12.15

[Java] I/O 스트림과 안전한 자원 관리: Try-with-Resources 완벽 분석 (Try-Catch-Finally 비교)

백엔드 개발 환경에서 외부 리소스(파일, 네트워크, DB)와의 입출력(I/O)은 빈번하게 발생합니다. 이때 자원을 획득하는 것만큼 중요한 것이 **자원의 해제(Release)**입니다.본 포스팅에서는 Java I/O 스트림의 기본 개념부터, 왜 반드시 close()를 해야 하는지, 그리고 Java 7부터 도입된 Try-with-Resources(TWR) 패턴이 기존의 try-catch-finally 방식에 비해 어떤 기술적 이점을 갖는지 심층적으로 정리합니다.1. Java I/O Stream의 정의자바에서 스트림(Stream)은 데이터가 흐르는 단방향 통로를 의미합니다. 출발지(Source)에서 도착지(Destination)로 데이터를 운반하며, 다음과 같은 특징을 가집니다.단방향성 (Unidirecti..

자바/자바 2025.12.04

(JAVA) 함수형 인터페이스 완벽 정리: 람다부터 스트림까지의 연결고리

1. 왜 함수형 인터페이스가 등장했는가?1.1 배경 및 목적배경: Java 8 이전에는 메서드(동작) 하나를 파라미터로 넘기려면 거추장스러운 **익명 내부 클래스(Anonymous Inner Class)**를 써야 했다. (보일러플레이트 코드 발생)목적: "함수를 변수처럼 다루자(동작 파라미터화)"는 함수형 프로그래밍의 니즈를 충족하고, 코드를 간결하게 만들기 위해 **람다(Lambda)**가 도입되었다.정의: 람다식을 담을 수 있는 그릇, 그것이 바로 **함수형 인터페이스(Functional Interface)**다. Code: Before & After // [Before: Java 8 이전] 익명 내부 클래스 사용// 코드가 뚱뚱하다. (핵심 로직보다 껍데기가 더 큼)Collections.sor..

자바/자바 2025.12.03

데이터베이스 인덱스 최적화 전략 및 핵심 개념 정리

데이터베이스 인덱스 최적화 전략 및 핵심 개념 정리데이터베이스 **옵티마이저(Optimizer)**가 효율적인 쿼리 실행 계획을 수립하는 데 필수적인 인덱스(Index)의 작동 원리, 선택 기준, 그리고 올바른 사용법을 정리합니다.1. 인덱스 미사용 조건 (Index Skip)옵티마이저가 인덱스를 생성했음에도 불구하고 사용하지 않고 **풀 테이블 스캔(Full Table Scan)**을 선택하는 주요 경우입니다.조건설명높은 데이터 조회율조회하려는 데이터가 원본 데이터의 20~25% 이상일 경우 (정확한 수치는 DBMS나 설정에 따라 다름).이유 (I/O 비용)인덱스를 통해 원본 데이터에 접근하는 과정에서 발생하는 랜덤 I/O의 비용이, 테이블 전체를 순차적으로 읽는 순차 I/O 비용보다 크다고 판단하기 ..