일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 예제로 배우는 스프링 입문
- 김영한
- 자바
- 알고리즘
- 스프링부트
- 티스토리챌린지
- k8s
- effectivejava
- java
- Spring
- 스프링핵심원리
- Effective Java
- 카카오
- kubernetes
- 카카오 면접
- Effective Java 3
- 자바스크립트
- 스프링 핵심원리
- 클린아키텍처
- 알고리즘정렬
- 오블완
- ElasticSearch
- 코딩테스트
- 스프링
- 이차전지관련주
- JavaScript
- 이펙티브 자바
- Sort
- 이펙티브자바
- 엘라스틱서치
- Today
- Total
목록전체 글 (145)
Kim-Baek 개발자 이야기
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:..
Spring Cloud Config란?Spring Cloud Config는 마이크로서비스 아키텍처에서 애플리케이션의 설정을 외부에서 관리할 수 있도록 도와주는 구성 관리 솔루션입니다. 이를 통해 다양한 환경(개발, 테스트, 운영 등)에서 애플리케이션 설정을 중앙에서 관리하고 배포할 수 있습니다.주요 특징외부 구성 관리: 애플리케이션의 설정 파일(application.properties, application.yml 등)을 Git, SVN, 파일 시스템 등 외부 저장소에 저장하여 중앙에서 관리할 수 있습니다.환경별 설정: 각 서비스와 환경에 맞는 별도의 설정을 쉽게 관리할 수 있습니다. 예를 들어, 개발 환경과 운영 환경에서 다른 데이터베이스 설정을 적용할 수 있습니다.버전 관리: Git과 같은 버전 관리..
Quartz는 자바 기반의 오픈 소스 스케줄링 라이브러리로, 복잡한 작업 스케줄링을 손쉽게 구현할 수 있도록 도와줍니다. Spring Quartz는 Quartz Scheduler를 Spring 프레임워크와 통합하여 보다 간편하게 사용할 수 있게 한 모듈입니다. 이를 통해 애플리케이션 내에서 정기적이거나 특정 조건에 따른 작업 실행을 효율적으로 관리할 수 있습니다.주요기능잡(Job) 정의 및 실행:Job 인터페이스를 구현하여 실행할 작업을 정의.특정 시간 또는 간격에 따라 잡을 실행할 수 있음.트리거(Trigger) 설정:작업의 실행 시점을 제어하는 트리거를 설정.간단한 간격 기반 트리거(SimpleTrigger)와 복잡한 크론 표현식을 사용하는 크론 트리거(CronTrigger) 지원.스케줄링 관리:잡의..
디자인 패턴 중, 비지터 패턴에 대해서 강의를 듣고 정리해보았다. 위의 다이어그램이 비지터 패턴의 다이어그램이다. 중요한 것은 Element( 자료구조 ) 는 변화하지 않는다는 것과 vistor ( 서비스 로직 ) 가 추가되는 기능을 가진다는 것이다. 비지터 패턴은 일반적으로 프로그래밍을 하는 과정에서 생각하는 것과는 약간 다른데, 아래와 같다고 보면 된다. 일반적 : 방문자는 “구매” 라는 기능을 가지고 가게에 간다. 버거킹에 가면 “햄버거”를 사고, 피자헛에 가면 “피자"를 산다. 비지터패턴 : 가게에 방문자가 들어간다. 가게가 방문자에게 자신의 정보를 주고, 방문자는 정보에 따라 “버거킹의 햄버거 구매”, “피자헛의 피자 구매” 라는 기능을 호출한다. 코드 예시를 통해서 살펴보도록 하자. 비지터 패..
자바의 컬렉션은 가변이다. 이 때문에 발생하는 문제를 먼저 살펴본다 6.1 package travelator; public class Suffering { public static int sufferScoreFor(List route) { Location start = getDepartsFrom(route); List longestJourneys = longestJourneysIn(route, 3); return sufferScore(longestJourneys, start); } } start 가 별게 없어서 인라인 한다. (6.2) 6.2 public static int sufferScoreFor(List route) { List longestJourneys = longestJourneysIn(rou..
POJO? Plain Old Java Object public class CoffeePOJO { public String name; private List ingredients; public CoffeePOJO(String name, List ingredients) { this.name = name; this.ingredients = ingredients; } void addIngredient(String ingredient) { ingredients.add(ingredient); } } 자바 빈(Java Bean) 공식 자바 빈 문서에 따르면 자바 빈은 아래의 조건을 모두 충족하는 POJO이다. (DTO라고도 한다함) 모든 객체 변수는 Private 제한자를 가지며 getter 와 setter 함수를 ..
함수형 프로그래밍의 핵심은 바로 람다 계산법이다. 람다 계산법은 프로그래밍보다 먼저 등장한 개념인데, 어떤 것인지 사례를 보면서 살펴보도록 하자. 정수를 제곱하기 public class Squint { public static void main(String args[]){ for(int i = 0; i { int i = 0; while (!stopRequested) i++; }); backgroundThread.start(); TimeUnit.SECONDS.sleep(1); stopRequested = true; } } 이 코드는 backgrounThread 가 실행된 후, 1초뒤에 정지될 것으로 보이는 코드이다. 하지만 실제 동작은 그렇게 되지 않을 수 있다. CPU1 이 backgroundThread..
객체지향이란 무엇일까? 면접에서 자주 물어보는 질문이기도 하다. "데이터와 함수의 조합" 이라고 말하는 사람도 있고, "실제 세계를 모델링하는 새로운 방법"이라고 대답하는 사람도 있다고 한다. 하지만 두 개 모두 만족스러운 답변이라고는 하지 않는다. 캡슐화, 상속, 다형성을 통해서 설명하는 사람들도 있는데 그렇다면 이 세 가지 개념이 어떤 것인지 한번 살펴보도록 하자. 캡슐화 데이터를 응집력 있게 구성하고, 구분선 바깥에 데이터는 숨겨지고, 일부함수만 외부에 노출되는 것을 말한다. 객체 지향 언어에서는 private, public 등을 통해서 이를 표현한다. 하지만 객체 지향에서만 해당 개념이 있는 것이 아니다. c언어에서의 사용하는 방법인데, point.c로 구현을 하고, point.h 파일로 해당 기..
구조적 프로그래밍의 발견 구조적 프로그래밍은 1960년대 네덜란드의 데이크스트라라른 프로그래머에 의해서 발견되었다. 이 때 프로그래밍은 진공관으로 이루어진 컴퓨터로 하던 시기였는데, 컴퓨터가 거대하고, 쉽게 손상되고 느리고 결과까지 믿을 수 없는 상태였다. 데이크스트라는 프로그래밍이 어렵고, 프로그래머가 프로그래밍을 잘하지 못한다는 문제를 인식했다. 그래서 조그만 세부사항이라도 간과하면 프로그램이 정상동작하지 않는 것을 볼 수 있었다. 데이크스트라는 프로그래머가 작성한 코드가 올바르게 동작하기를 원했고, 코드가 올바르게 동작한다는 사실을 수학적인 원리를 적용해서 풀려고했다. 수학적 증명 자세한 수학적인 기법은 설명하지 않지만, 예전에 배웠던 수학적 귀납법이 기억나는가? p(1)이 참이고, P(n)이 참이..