| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |
- 스프링핵심원리
- 스프링 핵심원리
- 엘라스틱서치
- ElasticSearch
- 클린아키텍처
- 카카오 면접
- 티스토리챌린지
- kubernetes
- effectivejava
- Effective Java
- 알고리즘정렬
- Effective Java 3
- 자바스크립트
- 카카오
- 이펙티브 자바
- Spring
- 스프링
- k8s
- 예제로 배우는 스프링 입문
- 이차전지관련주
- Kotlin
- 스프링부트
- 자바
- 알고리즘
- 이펙티브자바
- java
- 김영한
- 오블완
- Sort
- JavaScript
- Today
- Total
목록개발 (134)
Kim-Baek 개발자 이야기
Kotlin의 함수형 스타일 예외 처리로 더 안전하고 우아한 코드 작성하기목차Java vs Kotlin 예외 처리 비교기본 try-catch-finallytry를 Expression으로 사용하기runCatching - 함수형 예외 처리Result 타입 활용Spring Boot에서의 예외 처리Custom Exception 설계실전 패턴과 Best Practices들어가며프로젝트에서 외부 API를 호출하는 코드를 작성하다가 예외 처리 때문에 고민이 많았습니다. Java 스타일로 작성하면 try-catch 블록이 중첩되어 코드가 지저분해지고, 예외가 발생했을 때 기본값을 반환하거나 로깅 후 재시도하는 로직을 깔끔하게 처리하기 어려웠습니다.그러다 Kotlin의 runCatching과 Result 타입을 알게 되..
Java 대신 Kotlin으로 Spring Boot 개발하기 - 더 간결하고 안전한 백엔드 개발목차왜 Kotlin + Spring Boot인가?프로젝트 설정과 의존성Spring Annotations와 KotlinDependency Injection의 Kotlin 방식Controller 계층 구현Service 계층과 트랜잭션Entity와 RepositoryConfiguration과 Bean 정의실전 예제: RESTful API 구축들어가며Spring Boot 프로젝트를 Java에서 Kotlin으로 마이그레이션하면서 가장 놀라웠던 점은 코드량이 30% 이상 줄어들었다는 것입니다. Boilerplate 코드가 사라지고, Null Safety로 NPE가 거의 발생하지 않았으며, Data Class 덕분에 DTO..
Kotlin의 강력한 제어 구조와 타입 시스템을 마스터하여 더 안전하고 간결한 코드를 작성하는 방법목차제어 구조의 진화: Expression vs Statementwhen - 강력한 패턴 매칭if expression - 더 이상 Statement가 아닙니다Enum Class - 타입 안전한 상수Sealed Class - 제한된 클래스 계층Companion Object - 정적 멤버의 Kotlin 방식실전 예제: 네트워크 응답 처리들어가며Java에서 Kotlin으로 넘어오면서 가장 놀라웠던 것은 제어 구조가 Expression이라는 점이었습니다. if문에서 값을 반환받고, when문으로 복잡한 분기를 우아하게 처리하는 것을 보고 "이게 가능하다고?"라는 생각이 들었습니다.특히 프로젝트에서 네트워크 응답이나..
이 글을 읽으면: Kotlin의 강력한 Extension Functions로 기존 클래스에 새로운 기능을 추가하는 방법과, String Templates, Multi-line String, 정규식 등 실무에서 바로 쓸 수 있는 문자열 처리 기법을 완벽하게 배울 수 있습니다.📌 목차Extension Functions란? - 마법의 확장 기능Custom Extension Functions 만들기String Templates - 변수 삽입의 정석Multi-line String - 복잡한 텍스트 다루기실전 String 처리 기법Extension Functions 고급 활용1. Extension Functions란? - 마법의 확장 기능😫 Java의 불편함 - 유틸리티 클래스 지옥// Java - 유틸리티 클..
이 글을 읽으면: Kotlin의 핵심인 함수형 프로그래밍을 마스터할 수 있습니다. Lambda, Higher-order Functions, map/filter/groupBy 등의 Collection 연산, 그리고 let/apply/run 같은 Scope Functions를 실전 예제로 배워보세요. Java의 Stream API보다 훨씬 강력합니다!📌 목차함수형 프로그래밍이란? - 왜 배워야 할까Lambda & Higher-order FunctionsCollection Operations 완전 정복Scope Functions (let, apply, run, with, also)실전 패턴 모음성능 최적화 팁1. 함수형 프로그래밍이란? - 왜 배워야 할까😫 명령형 프로그래밍의 불편함 (Java 스타일)//..
이 글을 읽으면: Java 개발자의 악몽인 NullPointerException(NPE)를 컴파일 타임에 방지하는 Kotlin의 Null Safety 시스템을 완벽하게 이해할 수 있습니다. 실무에서 바로 적용 가능한 4가지 연산자를 실전 예제와 함께 배워보세요.📌 목차NPE의 악몽 - 왜 Null Safety가 필요한가Nullable Types (?) - Null 가능 타입Safe Call Operator (?.) - 안전한 호출Elvis Operator (?:) - 기본값 제공Not-null Assertion (!!) - 개발자의 보증실전 활용 패턴성능 최적화 팁1. NPE의 악몽 - 왜 Null Safety가 필요한가😱 Java 개발자의 일상// Java - 언제 터질지 모르는 시한폭탄public..
이 글을 읽으면: Kotlin의 기본 문법인 Data Class, Named Parameters, Primary Constructor를 실전 예제와 함께 배울 수 있습니다. Java 개발자라면 특히 주목! 코드량을 50% 줄이는 마법을 경험하세요.📌 목차Data Class란? - 10줄 코드를 1줄로Named Parameters로 가독성 높이기Primary Constructor 완벽 이해실전 예제로 배우기Java vs Kotlin 비교1. Data Class란? - 10줄 코드를 1줄로😫 Java에서 DTO 만들 때 이런 경험 있으신가요?// Java - 끔찍한 보일러플레이트 코드public class User { private String name; private int age; p..
✅ 함수형 인터페이스란?함수형 인터페이스(Functional Interface)란 "단 하나의 추상 메서드만 가지는 인터페이스" 를 의미합니다.✔ 자바에서 람다 표현식(->)과 함께 사용하기 위해 만들어진 인터페이스✔ 메서드가 1개만 있으므로, 람다식으로 쉽게 구현 가능✔ @FunctionalInterface 어노테이션을 사용하면 컴파일러가 함수형 인터페이스인지 확인해줌📌 대표적인 함수형 인터페이스 8가지🚀 1️⃣ Function (입력값을 변환하여 반환)✔ 입력값 T를 받아서 R로 변환하는 함수✔ 어떤 값을 입력받아서 변환하는 기능이 필요할 때 사용✔ 예제: Integer → String 변환Function intToString = num -> "숫자: " + num;System.out.printl..
Cursor AI?최근에 업무를 하면서도 gpt와 같은 AI 서비스를 사용하는 일은 정말 많아진 것 같다. AI 서비스가 없을 때는 내가 코딩을 어떻게 하고 있었지?라는 생각이 들 정도인데, 그 와중에 Cursor AI라는 AI IDE가 나와서 한번 써보게 되었다.사실 copilot 을 ide에 연동해서 사용을 하고 있긴 했는데, 아직 잘 쓰지는 못하고 있는 거 같아서 궁금해서 써봤는데 너무 신기하다는 생각이 든다.gpt는 내가 물어본 것에 대해서 대답을 해준다면, Cursor AI 는 그걸 바로 내 프로젝트에 반영시켜 주는 차이가 있다.이게 하나의 예시인데, 만약 "gpt에서 IOS에서 알람을 보내는 방법을 알려줘"라는 질문을 했다고 생각해 보자. 일반적으로 알람을 보내기 위한 과정을 상세하게 설명해 ..
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. 클래스 정보 얻기 • 클래스 이름, 패키지, 부모 클래스, 구현한 인터페이스 등을 조..
프로듀서(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를 클러스터링하여 고가용성을 구현할 수 있습니다.잡 리스너 및 트리거 리스너: 작업 실행 전후에 특정 로직을 실행할 수 있..
