일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 알고리즘정렬
- 예제로 배우는 스프링 입문
- 이펙티브 자바
- 자바스크립트
- 카카오 면접
- k8s
- Sort
- 이차전지관련주
- effectivejava
- 알고리즘
- 엘라스틱서치
- 이펙티브자바
- 김영한
- JavaScript
- 스프링 핵심원리
- 코딩테스트
- 카카오
- 오블완
- kubernetes
- 스프링
- java
- Effective Java 3
- 스프링부트
- 티스토리챌린지
- 클린아키텍처
- Effective Java
- Spring
- ElasticSearch
- 스프링핵심원리
- 자바
- Today
- Total
목록분류 전체보기 (153)
Kim-Baek 개발자 이야기
Spring Data MongoDB: @EnableMongoAuditing@EnableMongoAuditing는 Spring Data MongoDB에서 도큐먼트의 생성 및 수정과 관련된 정보를 자동으로 기록할 수 있게 해주는 어노테이션입니다. 이 기능을 통해 데이터가 생성되거나 변경될 때 자동으로 타임스탬프와 사용자 정보를 관리할 수 있습니다.주요 기능생성일 및 수정일 자동 기록@CreatedDate: 도큐먼트가 처음 생성될 때, 현재 날짜와 시간을 기록합니다.@LastModifiedDate: 도큐먼트가 수정될 때마다 현재 날짜와 시간을 기록합니다.생성자 및 수정자 정보 기록@CreatedBy: 도큐먼트를 생성한 사용자의 정보를 기록합니다.@LastModifiedBy: 도큐먼트를 수정한 사용자의 정보를 ..
OpenAPI는 **RESTful API(애플리케이션 프로그래밍 인터페이스)**를 설계, 생성, 문서화, 유지 관리하는 데 사용되는 표준 명세(specification)입니다. 간단히 말해, API를 사람들이 이해하고 시스템이 실행할 수 있도록 체계적으로 문서화하는 방법이라고 볼 수 있습니다.OpenAPI의 핵심 개념API의 설계와 문서화를 표준화: OpenAPI 명세는 API의 구조, 동작, 데이터 형식을 자세히 정의합니다. 이를 통해 개발자나 사용자가 API를 쉽게 이해하고 사용할 수 있습니다.JSON 또는 YAML 형식으로 작성: OpenAPI는 사람이 읽기 쉬운 형식인 JSON 또는 YAML 파일로 API의 동작을 명확히 기술합니다.도구와의 호환성: OpenAPI는 Swagger와 같은 도구와 연..
CompletableFuture는 Java에서 비동기 프로그래밍을 지원하기 위해 제공되는 클래스로, 주로 멀티스레드 환경에서 비동기 작업을 더 쉽게 관리하고 체이닝(연쇄 호출)과 조합을 가능하게 합니다. 이는 Future 인터페이스의 한계를 극복하기 위해 Java 8에서 도입되었습니다. 1. CompletableFuture란 무엇인가요?CompletableFuture는 비동기적으로 작업을 수행하고, 결과가 준비되면 콜백을 호출하거나 다른 작업을 이어서 처리할 수 있도록 설계된 클래스입니다.비동기: 작업이 완료될 때까지 기다릴 필요 없이 바로 다음 코드를 실행할 수 있음.완료 가능: 개발자가 작업 결과를 직접 설정하거나, 실패를 명시적으로 알릴 수 있음.체이닝 가능: 여러 작업을 순차적으로 연결해서 처리 ..
Spring WebClient는 Spring WebFlux에서 제공하는 비동기 및 논블로킹 HTTP 클라이언트로, 다른 서비스나 API와 통신할 때 사용됩니다. 이전에 사용되던 RestTemplate의 대안이며, 리액티브 프로그래밍을 지원하여 더 나은 성능과 유연성을 제공합니다.---1. WebClient 특징비동기/논블로킹: 요청과 응답이 블로킹 없이 처리됩니다.리액티브 스트림 지원: Mono와 Flux를 반환하여 리액티브 방식으로 데이터를 처리합니다.RestTemplate의 대안: Spring 5 이상에서는 WebClient를 추천합니다.동기식 호출 가능: 원한다면 동기식으로도 호출할 수 있습니다.---2. WebClient 생성WebClient는 크게 두 가지 방식으로 생성할 수 있습니다:1. 빌더..
**자바 리플렉션(Java Reflection)**은 프로그램이 **런타임(runtime)**에 클래스, 메소드, 필드 등의 구조를 분석하고 제어할 수 있는 기능입니다. 즉, 컴파일 시점이 아니라 실행 중에 객체의 정보를 조회하거나 동적으로 조작할 수 있는 기술입니다.리플렉션이란? • 정적(Static) 방식: 일반적으로 자바 프로그램은 코드를 작성할 때 사용할 클래스, 메소드, 필드 등을 명확히 알고 있어야 합니다. 예: String str = new String(); • 리플렉션: 프로그램 실행 중에 동적으로 클래스 이름, 메소드 이름 등을 기반으로 객체를 생성하거나 메소드를 호출합니다.리플렉션으로 가능한 작업 1. 클래스 정보 얻기 • 클래스 이름, 패키지, 부모 클래스, 구현한 인터페이스 등을 조..
Spring의 @Async: 쉽게 이해하기@Async는 비동기 작업을 간단히 처리하도록 도와주는 Spring의 애노테이션입니다.비동기란, 어떤 작업을 요청하고 그 작업이 끝날 때까지 기다리지 않고 바로 다음 작업을 진행하는 것을 말합니다.예를 들어:동기 작업: 요리를 하면서 밥솥이 밥을 다 지을 때까지 기다리는 것비동기 작업: 밥솥에 밥을 맡기고, 기다리지 않고 동시에 반찬을 준비하는 것Spring의 @Async를 사용하면 "밥솥에 밥을 맡기고 바로 반찬 준비" 같은 비동기 작업을 쉽게 구현할 수 있습니다.@Async를 사용하는 방법1. 준비 작업: 설정 파일에서 활성화Spring에서 비동기 기능을 사용하려면 먼저 설정에서 이를 활성화해야 합니다.설정 클래스에 @EnableAsync를 추가하면 됩니다.i..
프로듀서(Producer) 모듈과 컨슈머(Consumer) 모듈을 분리하고, 이들 간의 통신을 RabbitMQ와 같은 메시지 브로커를 통해 처리하는 아키텍처는 마이크로서비스 아키텍처나 이벤트 기반 아키텍처에서 자주 채택되는 패턴입니다. 이러한 구조는 시스템의 유연성, 확장성, 신뢰성을 높이기 위해 다양한 상황에서 유용하게 사용될 수 있습니다. 아래에서는 이 구조가 언제, 왜 유용한지에 대해 자세히 설명하겠습니다.1. 프로듀서-컨슈머 아키텍처란?프로듀서-컨슈머 아키텍처는 비동기 메시징을 기반으로 하는 아키텍처 패턴으로, 한쪽(프로듀서)이 메시지를 생성하여 메시지 큐(예: RabbitMQ)에 발행하고, 다른 쪽(컨슈머)이 이를 구독하여 처리합니다. 이때 프로듀서와 컨슈머는 직접적으로 연결되지 않고, 메시지 ..
Write-Behind Caching(쓰기 후방 캐싱)은 **캐시(Cache)**와 영속 저장소(Persistent Storage) 간의 데이터 동기화 방식을 나타내는 개념 중 하나입니다. 이 방식은 데이터가 먼저 캐시에 기록되고, 나중에 비동기적으로 영속 저장소에 반영되는 방식을 의미합니다. 반대로, Write-Through Caching(쓰기 직전 캐싱)은 데이터가 캐시와 영속 저장소에 동시에 동기적으로 기록되는 방식을 말합니다.아래에서 Write-Behind Caching의 개념, 작동 방식, 장단점, 그리고 사용 사례에 대해 자세히 설명드리겠습니다.1. Write-Behind Caching의 개념Write-Behind Caching은 애플리케이션이 데이터를 캐시에 쓰면, 이 데이터 변경 사항을 즉..
1. SLF4J와 Logback의 개요a. SLF4J (Simple Logging Facade for Java)정의: SLF4J는 다양한 로깅 프레임워크에 대한 추상화 계층을 제공하는 로깅 파사드(Facade)입니다.역할: 애플리케이션 코드에서 직접 특정 로깅 프레임워크에 의존하지 않고, SLF4J API를 통해 로깅을 수행하도록 합니다. 이를 통해 로깅 구현체를 쉽게 교체하거나 변경할 수 있습니다.장점:유연성: 여러 로깅 프레임워크(Log4j, Logback, java.util.logging 등)와 독립적으로 사용할 수 있습니다.일관된 API: 다양한 로깅 프레임워크에 대해 일관된 로깅 API를 제공합니다.성능 최적화: 메시지 포맷 시점에서 실제 로깅 여부를 검사하여 불필요한 문자열 연산을 방지합니다...
1. Kubernetes의 내부 도메인 개요Kubernetes 클러스터 내에서는 다양한 리소스(서비스, 파드 등)들이 서로 통신할 수 있도록 내부 DNS 네임을 제공합니다. 이 내부 도메인 네임은 외부에서 접근할 수 없으며, 클러스터 내부에서만 해석되고 사용됩니다.1.1. 클러스터 내부 도메인의 필요성서비스 디스커버리(Service Discovery): 마이크로서비스 아키텍처에서 각 서비스가 서로를 쉽게 찾고 통신할 수 있도록 합니다.유연한 네트워킹: 다양한 네임스페이스(namespace)와 서비스를 효율적으로 관리할 수 있습니다.보안: 내부 통신만을 허용하여 외부 접근을 제한함으로써 보안을 강화합니다.2. Kubernetes 내부 DNS 아키텍처Kubernetes는 클러스터 내 DNS 서비스를 제공하기..
1. Spring WebFlux란?Spring WebFlux는 Spring Framework 5에서 도입된 논블로킹(Non-blocking) 및 리액티브(Reactive) 프로그래밍을 지원하는 웹 프레임워크입니다. 기존의 Spring MVC가 서블릿 기반의 동기(Blocking) 모델을 사용한다면, WebFlux는 논블로킹 처리를 통해 더 높은 확장성과 성능을 제공합니다.주요 특징:논블로킹 I/O: 요청 처리 동안 스레드가 블로킹되지 않습니다.리액티브 스트림: 데이터 스트림을 비동기적으로 처리합니다.함수형 라우팅: 함수형 프로그래밍 방식을 사용한 라우팅 지원.다양한 런타임 지원: Netty, Undertow 등 서블릿 컨테이너가 아닌 서버에서도 실행 가능.2. Spring MVC와의 차이점Spring M..
리액티브 프로그래밍은 비동기 데이터 흐름 및 이벤트 기반 프로그래밍을 구현하는 패러다임입니다. 데이터를 스트림 형태로 다루며, 시간이 지남에 따라 발생하는 이벤트를 처리합니다. 자바에서는 Reactor와 RxJava 같은 라이브러리를 통해 리액티브 프로그래밍을 구현할 수 있습니다. --- 자바에서 리액티브 프로그래밍의 핵심 개념 1. Publisher와 Subscriber Publisher: 데이터를 발행하는 역할. (e.g., Flux, Mono) Subscriber: 데이터를 구독하여 처리하는 역할. 이 둘은 Reactive Streams 표준 인터페이스를 따릅니다. 2. Mono와 Flux (Project Reactor 기준) Mono: 최대 하나의 데이터를 처리하는 Publisher. Mono m..
Box stringBox = new Box();stringBox.setValue("Hello");// stringBox.setValue(10); // 컴파일 오류: 타입 불일치1. 제네릭 타입 소거 (Generic Type Erasure)자바에서 제네릭(Generic)은 코드의 재사용성과 타입 안전성을 증가시키는 중요한 기능이지만, 자바 컴파일러는 **타입 소거(Erasure)**를 사용하여 제네릭을 처리합니다. 타입 소거란 컴파일 시점에서 제네릭 타입 정보를 제거하는 과정을 말합니다. 이 때문에 자바의 제네릭은 런타임에 타입 정보를 알 수 없으며, 컴파일 타임에만 제네릭이 유효하게 됩니다.제네릭 타입 소거의 동작 원리자바 컴파일러는 제네릭을 처리할 때, 제네릭 타입의 인스턴스를 실제 클래스 타입으로 변..
1. Quartz란?1.1. Quartz 소개Quartz는 오픈 소스 스케줄링 라이브러리로, 복잡한 스케줄링 작업을 간편하게 구현할 수 있도록 도와줍니다. 주기적인 작업 실행, 일정한 간격으로 작업 실행, 특정 시간에 작업 실행 등 다양한 방식으로 작업을 스케줄링할 수 있습니다.1.2. 주요 기능다양한 트리거 지원: Cron 트리거, Simple 트리거 등 다양한 트리거 유형을 지원하여 유연한 스케줄링이 가능합니다.작업 지속성: 작업(Job)과 트리거(Trigger)를 데이터베이스에 저장하여 애플리케이션 재시작 후에도 스케줄이 유지됩니다.클러스터링 지원: 여러 인스턴스에서 Quartz를 클러스터링하여 고가용성을 구현할 수 있습니다.잡 리스너 및 트리거 리스너: 작업 실행 전후에 특정 로직을 실행할 수 있..
JPA(Java Persistence API)를 사용하면서 종종 마주하게 되는 N+1 문제에 대해 친절하고 상세하게 설명드리겠습니다. 이 문제는 특히 성능 최적화가 중요한 애플리케이션에서 자주 언급되며, 이해하고 해결하는 것이 중요한 부분입니다.📌 N+1 문제란?N+1 문제는 데이터베이스에 접근할 때 발생하는 성능 이슈 가운데 하나로, 주로 ORM(Object-Relational Mapping) 프레임워크를 사용할 때 나타납니다. 이 문제는 다음과 같은 형태로 발생합니다:N개의 쿼리 + 1개의 메인 쿼리가 실행됩니다.즉, 첫 번째 메인 쿼리가 실행된 후, 각 결과에 대해 추가적인 N개의 쿼리가 발생하게 됩니다.이로 인해 데이터베이스에 불필요하게 많은 요청이 발생하고, 애플리케이션의 성능이 저하될 수 있..
일급 컬렉션(First-Class Collection)은 소프트웨어 설계에서 컬렉션을 별도의 클래스로 감싸서 관리하는 패턴을 말합니다. 이 개념은 컬렉션(List, Set, 등)을 단순히 도메인 객체의 속성으로 사용하는 대신, 컬렉션 자체를 하나의 일급 객체로 취급하여 도메인 로직을 캡슐화하고 책임을 분리하는 데 목적이 있습니다.일급 컬렉션의 정의일급 컬렉션은 다음과 같은 특징을 가집니다:1. 단일 컬렉션 포장: 하나의 도메인 컬렉션만을 포함합니다.2. 불변성 유지: 컬렉션의 불변성을 보장하여 외부에서 직접 수정할 수 없게 합니다.3. 비즈니스 로직 포함 가능: 컬렉션 자체에 관련된 도메인 로직을 포함할 수 있습니다.4. 도메인 용어 사용: 컬렉션을 도메인 용어에 맞춰 네이밍하여 코드의 가독성을 높입니다..
제네릭(Generics)은 자바에서 컴파일 타임에 타입(type)을 검증하고, **코드의 재사용성과 타입 안전성(type safety)**을 높이기 위해 도입된 기능입니다. 제네릭을 사용하면 클래스나 메서드를 여러 타입에 대해 일반화(generalize)하여 작성할 수 있어, 다양한 데이터 타입을 처리하는 코드를 보다 효율적이고 안전하게 작성할 수 있습니다. 이번에는 자바 제네릭에 대해 상세히 설명하겠습니다.제네릭의 필요성자바는 **타입 안전성(type safety)**을 보장하기 위해 컴파일 시점에 타입을 확인합니다. 제네릭을 도입하기 이전에는 다양한 타입의 객체를 처리할 때 Object 타입을 사용하거나, 특정 타입으로 캐스팅(casting)하는 방식이 일반적이었습니다. 하지만 이러한 방식은 다음과 ..
Elastic Search(엘라스틱서치) 개요엘라스틱서치(Elastic Search)는 오픈 소스 분산 검색 및 분석 엔진으로, Apache Lucene 기반으로 개발되었습니다. 실시간으로 대용량 데이터를 검색하고 분석할 수 있으며, 주로 로그 분석, 실시간 애널리틱스, 텍스트 검색, 보안 모니터링 등 다양한 분야에서 활용됩니다. 엘라스틱서치는 **Elastic Stack(옛칭 ELK Stack)**의 핵심 컴포넌트로, Logstash와 Kibana와 함께 사용되어 데이터 수집, 변환, 시각화를 효과적으로 처리할 수 있습니다.주요 특징:분산 구조:데이터를 여러 노드에 분산 저장하여 확장성과 고가용성을 보장합니다.실시간 검색 및 분석:실시간으로 데이터를 인덱싱하고 검색할 수 있어, 빠른 데이터 처리와 분석..
Apache Kafka는 고성능, 분산형 이벤트 스트리밍 플랫폼으로, 대규모 데이터 스트림을 실시간으로 처리하고 관리할 수 있게 해줍니다. Kafka는 원래 LinkedIn에서 내부 메시징 시스템으로 개발되었으며, 현재는 오픈 소스로 제공되어 다양한 애플리케이션에서 널리 사용되고 있습니다.주요 특징높은 처리량: 수백 메가바이트에서 기가바이트 단위의 데이터를 초당 처리할 수 있습니다.확장성: 클러스터 규모를 손쉽게 확장할 수 있어 대규모 데이터 스트림을 처리할 수 있습니다.내결함성: 데이터 복제와 분산 저장을 통해 장애 발생 시에도 데이터 손실 없이 안정적으로 운영됩니다.실시간 처리: 실시간으로 데이터를 생산하고 소비할 수 있어, 실시간 분석 및 모니터링에 적합합니다.다양한 사용 사례: 로그 수집, 실시간..
레빗엠큐란? **레빗엠큐(RabbitMQ)**는 메시지 브로커의 한 종류로, 애플리케이션 간의 비동기 통신을 가능하게 하는 오픈 소스 소프트웨어입니다. 다양한 프로그래밍 언어를 지원하며, 분산 시스템에서 데이터를 안정적으로 전달하는 데 사용됩니다. 왜 레빗엠큐를 사용할까요? * 비동기 처리: 작업 처리 시간이 오래 걸리는 경우, 메시지를 큐에 넣고 다른 작업을 수행할 수 있습니다. * 시스템 분리: 애플리케이션 간의 의존성을 줄이고, 각 애플리케이션이 독립적으로 작동할 수 있도록 합니다. * 확장성: 시스템 부하가 증가하더라도 메시지 큐를 추가하여 시스템 성능을 향상시킬 수 있습니다. * 데이터 전달 보장: 메시지가 손실되지 않도록 다양한 메커니즘을 제공합니다. 레빗엠큐의 주요 개념 * Producer:..