전체 글
-
[Java] 문자열 결합과 컴파일러 최적화Java 2025. 5. 7. 22:37
자바를 사용하다보면 문자열을 정말 많이 다루는데 이때 결합 연산자 '+'도 자주 다루게 된다. 처음 자바를 배웠을 때는 결합 연산자로 문자열을 다루면 성능이 안 좋을 수 있다고 들었다. 그런데 조금 더 공부해보니 결합 연산자를 사용해도 컴파일러가 컴파일 시점에 최적화를 해준다고 알게 되었다. 딱 여기까지만 알고 있었는데, 오늘은 어떻게 최적화가 이루어지는지 궁금해서 직접 알아보기로 했다. javap -c 명령어이 명령어는 Java 클래스 파일(.class)의 바이트코드를 디컴파일해서 보여주는 명령어이다. 즉, java 파일이 class 파일로 컴파일된 이후 실제 JVM이 실행하는 저수준 명령어(바이트코드)를 확인할 수 있는 도구이다. 예제 코드를 만들어 컴파일하고 이 명령어를 통해 코드가 어떻게 동작하는..
-
[Java] 생산자-소비자 문제Java 2025. 4. 8. 22:48
1️⃣ 생산자-소비자 문제란?생산자-소비자 문제는 멀티스레드 환경에서 공유 자원을 두고 여러 작업이 협업할 때 발생하는 대표적인 동시성 문제이다.생산자는 데이터를 만들어 큐(버퍼)에 넣고, 소비자는 그 데이터를 꺼내어 처리한다.이 과정에서 발생하는 동시성 문제를 살펴보고, 그것을 해결하는 과정을 알아보자.2️⃣ 동기화 적용 ❌@Slf4jpublic class SharedBuffer { private final int capacity; // 생산자와 소비자가 공유하는 버퍼 private final Queue table = new ArrayDeque(); public SharedBuffer(int capacity) { this.capacity = capacity; } ..
-
[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 클래스를 상속하여 특정 기능을..
-
[디자인 패턴] 프록시 패턴 (Proxy Pattern)Design Patterns 2025. 1. 30. 23:34
✅ 프록시 패턴이란?어떤 객체에 대한 접근을 제어하기 위해 대리자 객체를 사용하는 디자인 패턴이다.원본 객체에 직접 접근하는 것이 아니라, 중간에 프록시 객체를 두어 요청을 처리하거나, 변경하는 방식으로 동작한다.대표적인 활용 사례접근 제어성능 향상: 지연 로딩, 캐싱Spring Framework의 AOP(Aspect-Oriented Programming)도 내부적으로 프록시 패턴을 사용하고 있다.✅ 핵심 개념Subject: 클라이언트가 사용하는 인터페이스 또는 추상 클래스RealSubject: 실제 동작을 수행하는 원본 객체Proxy: 원본 객체에 대한 접근을 제어하는 대리 객체. 클라이언트는 이 프록시 객체를 통해 RealSubject에 접근한다.의존 관계: Client → Proxy → RealSu..
-
[디자인 패턴] 템플릿 콜백 패턴 (Template Callback Pattern)Design Patterns 2025. 1. 30. 19:48
✅ 템플릿 콜백 패턴이란?반복적으로 사용되는 로직을 템플릿 메서드로 정의하고, 변경이 필요한 부분을 콜백 함수(람다, 익명 클래스, 인터페이스 구현 등)로 전달하는 패턴이다.즉, 고정된 템플릿(공통 로직)과 유연한 콜백(변경될 로직)을 분리하여 재사용성을 높이는 패턴이다.전략 패턴과 유사하지만, 전략을 메서드 파라미터(콜백)로 받는다는 점에서 차이가 있다.Spring Framework에서 JdbcTemplate, TransactionTemplate 등이 대표적인 예시이다.✅ 핵심 개념템플릿 메서드공통적인 흐름을 담당하는 메서드변동되는 특정 부분을 콜백으로 위임콜백변경이 필요한 부분을 담당익명 클래스, 람다식, 인터페이스 구현체 등 다양한 방식으로 제공 가능✅ 장단점장점코드 재사용성 증가: 반복되는 코드를..
-
[디자인 패턴] 전략 패턴 (Strategy Pattern)Design Patterns 2025. 1. 28. 22:49
✅ 전략 패턴이란?기능을 캡슐화하여 동적으로 기능을 선택할 수 있게 해주는 디자인 패턴이다.비슷한 작업을 수행하는 여러 기능이 있을 때, 이 기능들을 개별 클래스로 캡슐화하고, 실행 시점에 필요한 기능을 선택할 수 있도록 한다.✅ 핵심 개념캡슐화: 각 기능을 별도의 클래스로 분리유연성: 실행 시점에 행위를 선택, 변경 가능구성(Composition): 실행 클래스가 특정 기능을 직접 구현하지 않고, 해당 기능을 다른 클래스에서 위임 받아 실행✅ 구조Context: 클라이언트가 사용하는 객체로 전략(기능)을 실행한다.Strategy: 기능을 정의하는 인터페이스ConcreteStrategy: Strategy를 구현하는 구체적인 기능 클래스✅ 장단점장점개방-폐쇄 원칙(OCP) 준수: 기능을 추가하거나 변경해도..
-
[디자인 패턴] 템플릿 메서드 패턴 (Template Method Pattern)Design Patterns 2025. 1. 27. 20:48
✅ 템플릿 메서드 패턴이란?공통 기능을 상위 클래스에 정의하고 각자 상이한 기능은 하위 클래스가 결정하도록 하는 디자인 패턴템플릿이라는 뼈대를 상위 클래스에서 만들고, 세부적인 구현은 하위 클래스에서 하도록 강제하는 방식 ✅ 핵심 개념템플릿 메서드: 알고리즘의 큰 흐름(프로세스)을 정의하는 메서드이다. 상위 클래스에서 구현되며, 전체 구조를 고정한다.후크 메서드: 상위 클래스에서 구현된 메서드 중, 하위 클래스에서 세부 내용을 변경하거나 확장할 수 있도록 설계된 메서드이다. (기본 구현을 제공함)추상 메서드: 하위 클래스에서 반드시 구현해야 하는, 템플릿 메서드의 핵심 단계를 정의 ✅ 장단점장점코드 재사용성 증가: 알고리즘의 공통 부분(뼈대)을 상위 클래스에 정의하므로 코드의 중복이 줄어듦확장성: 새로운..
-
[Docker] 나만의 Docker Compose 파일 만들기Docker 2025. 1. 27. 00:08
https://jngsngjn.tistory.com/62 macOS에서 도커로 오라클 DB 구축하기 (Docker, Oracle DB, macOS)회사 데이터베이스 서버가 잠시 중단되었다.내가 만들고 있는 스프링부트 모듈을 테스트할 수가 없어서, 직접 오라클 DB를 사용해보기로 했다.맥북 정보: M3 Pro (macOS Sequoia 15.2)도커 정보: Docker 27.jngsngjn.tistory.com지난번에 만들었던 오라클 DB 도커 이미지를 다른 곳에서도 편하게 사용하기 위해 compose 파일을 만들어 보기로 했다. 0. Docker Compose 파일이란?docker compose 파일이란 여러 개의 컨테이너를 쉽게 정의하고 관리하기 위한 설정 파일이다. 보통 yml 파일로 작성된다. 이 ..
-
[Docker] macOS에서 도커로 오라클 DB 구축하기Docker 2025. 1. 25. 15:28
회사 데이터베이스 서버가 잠시 중단되었다.내가 만들고 있는 스프링부트 모듈을 테스트할 수가 없어서, 직접 오라클 DB를 사용해보기로 했다.맥북 정보: M3 Pro (macOS Sequoia 15.2)도커 정보: Docker 27.4.01. Oracle Docker 이미지 저장소 클론git clone https://github.com/oracle/docker-images.gitclone이 완료되면 홈 디렉터리에서 확인할 수 있다. 2. Oracle Database 설치 파일 다운로드https://www.oracle.com/database/technologies/oracle19c-linux-arm64-downloads.html위 사이트에 접속하여 LINUX.ARM64_1919000_db_home.zip 파일..
-
[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..
-
[Spring Cloud] Netflix Eureka 찍어먹기Spring Framework 2025. 1. 3. 23:36
1. Eureka 소개Netflix Eureka는 Netflix OSS(Open Source Software)에서 제공하는 서비스 디스커버리 기술이다. 서비스 디스커버리란 마이크로서비스 아키텍처에서 각 서비스가 동적으로 서로를 찾고 통신할 수 있도록 돕는 메커니즘이다. 마이크로서비스에서는 서비스가 독립적으로 분리되기 때문에 서비스 간의 위치를 동적으로 파악하는 것이 필요하다. Eureka를 사용하여 마이크로서비스를 편리하게 관리할 수 있으며 Eureka 서버를 클러스터로 구성하여 장애에 대비할 수도 있다. 하지만 Eureka는 HTTP 기반 통신을 사용하기 때문에 대규모 시스템에서 네트워크 부하가 발생할 수 있다.2. 주요 기능서비스 동적 등록: 각 마이크로서비스가 IP 주소나 포트를 미리 알 필요 없이..
-
[Linux] 리눅스의 etc 디렉터리Computer Science 2024. 12. 13. 17:24
1️⃣ etc 디렉터리란?(1) 의미/etc 디렉터리는 리눅스 및 유닉스 시스템에서 시스템 설정과 구성 파일을 저장하는 디렉터리이다.운영체제의 핵심 동작을 제어하거나 사용자와 관련된 다양한 설정 파일이 이곳에 저장된다.초기 유닉스 시스템에서는 “기타 설정 파일”을 모아두는 디렉터리였으나, 현재는 시스템 설정 파일을 저장하는 주요 디렉터리로 발전했다.(2) 특징시스템 전역 설정 저장소시스템 운영, 네트워크 설정, 사용자 계정 관리 등 운영체제의 동작을 제어하는 파일들이 저장됨모든 사용자에게 적용되는 설정 포함개별 사용자 설정(~/.bashrc, ~/.profile)과 달리 시스템 전체 설정 파일이 저장됨변경 시 모든 사용자와 시스템에 영향을 미침대부분의 파일은 텍스트 형식으로 작성되어 사람이 읽고 수정하기..
-
[Linux] 시그널의 종류와 의미Computer Science 2024. 12. 13. 16:54
1️⃣ 시그널이란?(1) 의미시그널(Signal)이란 리눅스/유닉스 시스템에서 프로세스 간에 비동기적으로 이벤트를 전달하기 위한 메커니즘이다. OS가 프로세스에 특정 이벤트가 발생했음을 알리거나, 프로세스를 종료하거나 특정 동작을 수행하도록 강제할 때 사용된다.(2) 특징비동기적: 이벤트가 발생하면 즉시 프로세스에 전달프로세스 간 통신(IPC): 프로세스가 서로 신호를 보내 특정 동작을 유발할 수 있음핸들링 가능: 특정 시그널에 대한 프로세스 동작 커스텀 가능. 일부 시그널은 무시하거나 차단 가능2️⃣ 주요 시그널 종류와 의미3️⃣ kill 명령어(1) 의미리눅스/유닉스 시스템에서 프로세스에 신호(Signal)를 보내 특정 작업을 수행하도록 하는 명령어kill이라는 이름과 달리 프로세스를 종료하는 것뿐 ..
-
IP와 서브넷 마스크Computer Science 2024. 12. 11. 15:05
1️⃣ 기본 개념(1) IP 주소IP 주소는 네트워크 상에서 장치를 식별하기 위한 32비트 주소4개의 8비트(옥텟)로 구성되며, 점으로 구분됨예시: 192.168.5.189(2) 서브넷 마스크서브넷 마스크는 네트워크 부분과 호스트 부분을 구분하는 데 사용하는 값네트워크 주소: 네트워크를 식별하는 주소 (공통 영역)호스트 주소: 네트워크 내에서 각 장치를 구분하는 주소서브넷 마스크는 32비트 2진수로 표현되며, 1과 0으로 구성됨1은 네트워크 부분, 0은 호스트 부분을 나타냄예시: /26 서브넷 마스크이진수: 11111111.11111111.11111111.11000000십진수: 255.255.255.192CIDR(Classless Inter-Domain Routing) 표기법: 서브넷 마스크를 간결하게 ..