전체 글
-
리눅스 서버에 Gemini CLI 설치하기카테고리 없음 2026. 1. 10. 18:16
작년에 등장한 Gemini CLI를 리눅스 서버에 설치해보고 싶어서 설치해봤다.오라클 클라우드 Free Tier로 제공받은 Rocky 리눅스 서버에 설치했다.1. 시스템 업데이트sudo dnf update -y 2. Node.js 설치curl -fsSL https://rpm.nodesource.com/setup_22.x | sudo bash -sudo dnf install -y nodejs gcc-c++ make *설치 확인node -vnpm -v 3. Gemini CLI 설치sudo npm install -g @google/gemini-cli *설치 확인gemini --version 4. 서버에 API Key 등록우선 아래 사이트에서 API Key를 발급받고 복사하여 사용한다.https://aistud..
-
엔화 알림 프로그램 만들기 💴Project 2025. 8. 17. 01:41
https://github.com/jngsngjn/saporo GitHub - jngsngjn/saporo: 엔화 알림 서비스엔화 알림 서비스. Contribute to jngsngjn/saporo development by creating an account on GitHub.github.com0️⃣ 개요올 겨울에 일본 삿포로 여행을 간다. 그런데 엔화를 매번 확인하는 게 귀찮고, 까먹을 때도 있어서 매일 정해진 시각에 내 이메일로 엔화 정보를 알려주는 프로그램을 만들어 보았다.1️⃣ 환경 및 개발/서버 정보 ⚙️Java 21, Spring Boot, Maven, Thymeleaf 기반 개발Oracle Cloud Free Tier (Rocky Linux 8) 서버에 배포GitHub Actions 사용하..
-
[Kubernetes] 쿠버네티스 기본 실습 🐥Cloud/Kubernetes 2025. 7. 12. 15:18
쿠버네티스 왕초보가 실습 예제를 직접 만들어 공부한 내용을 담았습니다.0️⃣ 실습 목표이미지 생성 → Docker Hub push → k8s Deployment에서 Docker Hub에 push한 이미지 사용하기실습용 Minikub k8s 클러스터 사용하기k8s Service의 로드밸런싱 기능 사용하기실행 시점에 Pod에서 사용할 환경변수 조작하기1️⃣ 실습 모식도두 로컬 머신은 같은 네트워크 사용 📶192.168.35.86 (window 노트북 💻)인텔리제이에서 Netty TCP 서버 기동 중데이터 받으면 클라이언트 정보를 로깅하는 역할만 수행192.168.35.78 (macbook 💻)Minikube를 설치하고 k8s 클러스터를 기동할 머신동시에 Postman 클라이언트 역할도 수행HTTP 요청..
-
[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] 생산자-소비자 문제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 파일 만들기Cloud/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 구축하기Cloud/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..