Java
-
[Java] 커스텀 어노테이션으로 컴파일 시점에 검증하기 (Annotation Processor)Java 2025. 6. 20. 23:43
개발자에게 컴파일 에러는 정말 고마운 에러이다. 컴파일 에러가 있다면 빌드 자체가 되지 않기 때문에 실행할 수도, jar 파일을 만들 수도 없기 때문이다. 자바의 어노테이션 기능을 잘 사용하면 컴파일 시점에 코드를 검증할 수 있다. 대표적으로 자바에서 기본으로 제공하는 @Override 어노테이션이 있다. 추상 메서드를 구현할 때 @Override 어노테이션을 사용하면 이 메서드가 상위 타입의 메서드를 재정의한 것임을 명시적으로 나타낼 수 있을 뿐만 아니라 오버라이딩을 잘못했을 경우 컴파일 시점에 오류를 발생시켜 실수를 사전에 방지할 수 있는 효과가 있다. 나는 '@Override와 같은 어노테이션처럼 컴파일 시점에 코드를 검증해주는 어노테이션을 개발자가 직접 만들어서 사용할 수는 없을까?'라는 생각이 ..
-
[Java] 문자열 결합과 컴파일러 최적화Java 2025. 5. 7. 22:37
자바를 사용하다보면 문자열을 정말 많이 다루는데 이때 결합 연산자 '+'도 자주 다루게 된다. 처음 자바를 배웠을 때는 결합 연산자로 문자열을 다루면 성능이 안 좋을 수 있다고 들었다. 그런데 조금 더 공부해보니 결합 연산자를 사용해도 컴파일러가 컴파일 시점에 최적화를 해준다고 알게 되었다. 딱 여기까지만 알고 있었는데, 오늘은 어떻게 최적화가 이루어지는지 궁금해서 직접 알아보기로 했다. javap -c 명령어이 명령어는 Java 클래스 파일(.class)의 바이트코드를 디컴파일해서 보여주는 명령어이다. 즉, java 파일이 class 파일로 컴파일된 이후 실제 JVM이 실행하는 저수준 명령어(바이트코드)를 확인할 수 있는 도구이다. 예제 코드를 만들어 컴파일하고 이 명령어를 통해 코드가 어떻게 동작하는..
-
[Java] volatile 예약어Java 2025. 2. 18. 22:31
volatile이란?volatile 예약어는 자바의 동시성 환경에서 변수의 가시성 문제를 해결하기 위해 사용되는 예약어이다. volatile의 특징1. 가시성 보장한 스레드가 volatile 변수를 변경하면, 다른 스레드가 즉시 변경된 값을 읽을 수 있다.CPU 캐시를 사용하지 않고, 메인 메모리(RAM)에서 직접 읽고 쓰기 때문이다.2. 원자성 미보장volatile은 읽기/쓰기는 안전하지만, 연산 등과 같은 복합 연산은 원자적으로 동작하지 않는다.예제 코드1. 가시성 문제volatile 없이 실행했을 때 가시성 문제 발생 가능!public class NoVolatileMain { private static boolean flag = false; public static void main(St..
-
[Java] record 예약어Java 2025. 2. 13. 21:51
record 예약어자바 14에서 처음 도입되고, 자바 16에서 정식 기능으로 추가된 예약어로, 불변 데이터 객체(immutable data objects)를 간편하게 선언할 수 있도록 지원하는 기능이다. record의 특징1. 자동으로 필드, 생성자(모든 필드 포함), Getter, equals(), hashCode(), toString() 제공2. record의 필드는 상수 (final)3. 일반적인 POJO 클래스와 비교했을 때 코드가 훨씬 간결함4. Serializable을 구현하여 직렬화 가능5. 상속 불가능 record 사용 예제public record User(String name, int age) {}public class RecordExample { public static void ..
-
[디자인 패턴] 데코레이터 패턴 (Decorator Pattern)Design Patterns 2025. 1. 31. 16:37
✅ 데코레이터 패턴이란?객체의 기능을 동적으로 확장할 수 있는 구조적 디자인 패턴이다.기존 코드 수정 없이 객체의 행동을 변경하거나 새로운 기능을 추가할 때 유용하다.상속 대신 구성(Composition)과 위임(Delegation)을 활용하여 기능을 확장하는 것이 핵심이다.✅ 핵심 개념1️⃣ ComponentComponent: 핵심 인터페이스로서, 기능의 기본 구조를 정의한다.Concrete Component: Component 인터페이스를 구현하는 구체 클래스이다.2️⃣ DecoratorDecorator: Compoent 인터페이스를 구현하는 추상 클래스이다. 실제 기능을 수행하지 않고 기존 Component를 감싼다.Concrete Decorator: Decorator 클래스를 상속하여 특정 기능을..
-
[디자인 패턴] 전략 패턴 (Strategy Pattern)Design Patterns 2025. 1. 28. 22:49
✅ 전략 패턴이란?기능을 캡슐화하여 동적으로 기능을 선택할 수 있게 해주는 디자인 패턴이다.비슷한 작업을 수행하는 여러 기능이 있을 때, 이 기능들을 개별 클래스로 캡슐화하고, 실행 시점에 필요한 기능을 선택할 수 있도록 한다.✅ 핵심 개념캡슐화: 각 기능을 별도의 클래스로 분리유연성: 실행 시점에 행위를 선택, 변경 가능구성(Composition): 실행 클래스가 특정 기능을 직접 구현하지 않고, 해당 기능을 다른 클래스에서 위임 받아 실행✅ 구조Context: 클라이언트가 사용하는 객체로 전략(기능)을 실행한다.Strategy: 기능을 정의하는 인터페이스ConcreteStrategy: Strategy를 구현하는 구체적인 기능 클래스✅ 장단점장점개방-폐쇄 원칙(OCP) 준수: 기능을 추가하거나 변경해도..
-
[Java] 리플렉션(Reflection)에 대해서Java 2025. 1. 17. 23:04
자바의 리플렉션이란 런타임에 클래스, 생성자, 필드, 메서드 등에 동적으로 접근하여 조작할 수 있게 해주는 기능이다. 긴말 필요 없이 예제 코드로 알아보자. 간단한 계산기 클래스를 만들었다.public class Calculator { private int add(int a, int b) { return a + b; } public static int max(int a, int b) { return Math.max(a, b); }} 이제 JUnit5와 AssertJ를 사용하여 테스트해보자.class ReflectionTest { @Test void testCalculator_1() throws Exception { Class calc..
-
[Apache Kafka] 카프카의 데이터 복제 방식Apache Kafka 2024. 11. 21. 22:26
카프카의 데이터 복제 방식에 대해 알아보자. 카프카는 장애 허용 시스템이다. 클러스터 안의 여러 개의 브로커들이 서로 데이터를 복제한다. 그래서 브로커들 중 하나에 장애가 발생하더라도 데이터가 유실될 위험이 적다. 다음과 같은 카프카 클러스터 환경이 있다고 해보자.브로커 3개 사용 중A 토픽이 있으며, 토픽당 파티션 개수는 3개복제 개수는 3개다른 기타 설정이 모두 기본값이라면 일반적으로 데이터 복제는 그림과 같이 이루어진다.A 토픽의 파티션 3개는 각 브로커에 하나씩 배치리더 파티션 : 노란색팔로워 파티션 : 연보라색