전체 글 248

Java Spring 프로젝트에서 시간(Timezone)을 UTC로 통일

백엔드 시스템에서 시간(Time)은 생각보다 훨씬 까다로운 주제이다.특히 다음과 같은 상황에서는 문제가 자주 발생한다.서버는 한국(KST)인데, 사용자는 해외에 있음DB에 저장된 시간이 환경마다 다르게 보임로컬에서는 정상인데, 운영 서버에서 시간이 9시간 어긋남로그, 배치, 만료 시간 계산이 뒤틀림“모든 내부 시간은 UTC로 저장하고, 보여줄 때만 변환한다.” 1. 왜 UTC로 통일해야 하는가?로컬 타임존(KST 등)으로 저장할 때 문제점서버 위치가 바뀌면 시간 기준이 달라진다컨테이너(Docker), 클라우드 환경에서 TZ 설정 누락 시 오동작여러 국가 사용자 서비스 시 시간 계산이 복잡해진다서머타임(DST) 문제 발생 가능UTC로 저장하면 얻는 장점서버 위치와 무관한 일관성DB, 로그, 배치, 캐시 ..

카테고리 없음 2026.01.02

CompletableFuture + Spring @Async

Spring에서 비동기 처리를 가장 실무적으로 사용하는 방법Spring에서 비동기 처리를 가장 간단하게 도입하는 방법은@Async + CompletableFuture 조합이다. 1. @Async란 무엇인가@Async는 Spring이 제공하는 비동기 실행 애너테이션이다.메서드를 별도 스레드에서 실행하도록 만들어준다.@Asyncpublic CompletableFuture asyncMethod() { return CompletableFuture.completedFuture("result");} 2. 기본 동작 구조@Async가 붙은 메서드는Spring이 내부적으로 TaskExecutor(ThreadPool) 에 작업을 위임호출자는 즉시 반환결과는 CompletableFuture로 받는다Spring이 스..

IT/Spring 2026.01.02

CompletableFuture vs WebFlux

Java 비동기 처리, 무엇을 선택해야 하지?Java에서 비동기 처리를 고민하다 보면 마주치는 두 가지 선택지가 있다.바로 CompletableFuture와 Spring WebFlux이다.두 기술 모두 “비동기 처리”를 지원하지만, 문제 해결 방식과 철학은 다르다. 1. CompletableFuture란 무엇인가CompletableFuture는 미래에 완료될 결과를 표현하는 비동기 추상화이다.기존의 동기 코드 스타일을 최대한 유지하면서, 비동기 처리를 “추가”하는 방식이다.기존 Servlet / MVC 구조 그대로 사용 가능Thread 기반 비동기 처리명시적인 스레드 풀(ExecutorService) 사용imperative(명령형) 코드 스타일 유지현재 구조를 유지하면서 비동기를 도입하고 싶을 때 적합하..

IT/JAVA 2026.01.02

CompletableFuture 비동기 처리

Java에서 비동기 처리를 구현하는 방식은 여러 가지가 있지만,Java 8 이후 가장 널리 사용되는 방식은 CompletableFuture이다. 과거에는 Future + ExecutorService 조합으로 비동기 처리를 구현했지만,이 방식은 결과 조합, 예외 처리, 체이닝이 불편했다.CompletableFuture는 이러한 한계를 해결하기 위해 등장했다. 1. 비동기 처리?비동기 처리는 작업을 요청한 후, 결과를 기다리지 않고 다음 코드를 실행하는 방식이다.즉, 흐름을 멈추지 않는다.동기 처리: 작업 요청 → 결과 대기 → 다음 코드 실행비동기 처리: 작업 요청 → 다음 코드 실행 → 결과는 나중에 처리네트워크 호출, DB 조회, 파일 I/O 같은 작업은 대기 시간이 길기 때문에비동기로 처리하지 않으..

IT/JAVA 2026.01.02

CORS 브라우저 보안

CORS란 무엇인가?프론트엔드·백엔드 개발자가 반드시 이해해야 하는 보안 정책웹 개발을 하다 보면 가장 자주 마주치는 에러 메시지가 있다.Access to fetch at 'https://api.example.com' from origin 'http://localhost:3000' has been blocked by CORS policy.이 메시지는 브라우저가 CORS 정책(Cross-Origin Resource Sharing)을 위반했다고 판단했기 때문이다.CORS는 웹 보안을 위해 반드시 필요한 정책이지만, 처음 접하면 매우 복잡하게 느껴진다. 1. CORS가 왜 필요한가?브라우저는 보안을 위해 같은 출처(Same-Origin)에서 제공되는 리소스만 기본적으로 허용한다.출처는 아래 3개 요소가 모두..

IT/IT 2025.12.10

비동기 처리, 병렬 처리, BFS/DFS 탐색

웹 서비스, 분산 시스템, 대규모 데이터 처리 등 대부분의 애플리케이션은 동시에 여러 작업을 처리해야 한다.이때 사용되는 개념이 비동기 처리(Asynchronous), 병렬 처리(Parallel)이다. 1. 비동기 처리 (Asynchronous Processing)비동기 처리는 작업을 요청한 후 그 결과를 기다리지 않고 다음 작업을 실행하는 방식이다.예시웹 서버에서 이메일 전송 요청 → 메인 요청 응답과 분리하여 비동기로 처리이미지/영상 파일 업로드 후 변환 작업을 백그라운드에서 실행프론트엔드에서 fetch 요청 후 UI는 계속 작동비동기 처리는 주로 I/O 작업 처리에 최적화되어 있다.네트워크 호출, DB 응답, 파일 읽기/쓰기 등은 CPU보다 속도가 느리므로메인 스레드가 기다리지 않고 다른 일을 처리..

카테고리 없음 2025.12.07

Java 멀티스레드와 병렬 실행

Java에서 고성능 애플리케이션을 개발하려면 멀티스레드(Multi-thread) 개념을 이해해야 한다.스레드를 직접 생성하고 관리하는 일은 복잡하고 비용이 크기 때문에,ExecutorService, ThreadPool, CountDownLatch 등 다양한 API를 함께 사용한다. 1. 멀티스레드스레드(Thread)는 프로그램의 실행 흐름 단위이다.멀티스레드란 이 실행 흐름을 여러 개 만들어 여러 작업을 동시에 실행하는 구조를 의미한다.예:웹 서버: 사용자 요청마다 새로운 스레드 처리게임 서버: 몬스터 AI 스레드 + 네트워크 IO 스레드병렬 계산: 여러 CPU 코어에서 계산 작업을 나눠 처리단순 Thread 생성 방식Thread thread = new Thread(() -> { System.out..

IT/JAVA 2025.12.07

Java 함수형 인터페이스 Supplier, Runnable

Java 8 이후 큰 변화 중 하나가 함수형 인터페이스(Functional Interface) 기반의 람다 표현식 도입이다.그중에서도 실무에서 자주 등장하는 인터페이스가 Supplier 와 Runnable이다. 1. 함수형 인터페이스함수형 인터페이스는 추상 메서드를 단 하나만 갖는 인터페이스이다.예:RunnableSupplierConsumerFunctionPredicate모두 람다식으로 표현할 수 있다. 2. Supplier — “값을 만들어서 공급하는 인터페이스”@FunctionalInterfacepublic interface Supplier { T get();}✔ 주요 특징입력 인자가 없다.무언가를 생성하거나 반환하는 역할을 한다.표현식 형태: () -> T“값을 필요할 때 지연 생성(lazy..

IT/JAVA 2025.12.07

getOrDefault() vs computeIfAbsent()

Java 컬렉션을 사용하다 보면 한 번쯤 마주치는 두 메서드가 있다.getOrDefault(key, defaultValue)computeIfAbsent(key, mappingFunction)둘 다 “key가 없을 때 기본 값을 어떻게 처리할 것인가”라는 공통 목적을 가진 것처럼 보이지만,작동 방식도 완전히 다르고, 쓰이는 상황도 전혀 다르다. 1. getOrDefault() — “단순 조회 + 기본 반환” 역할V value = map.getOrDefault(key, defaultValue);✔ 동작 방식key가 존재하면 해당 value를 그대로 반환한다.key가 존재하지 않으면 defaultValue를 반환만 한다.Map 자체에는 아무 것도 추가되지 않는다.✔ 특징Map 수정 없음읽기(Read) 연산d..

IT/JAVA 2025.12.06

ReentrantLock 락 제어

Java에서 멀티스레드 환경을 다루다 보면, 가장 먼저 떠올리는 동기화 방식은 synchronized이다.하지만 실무에서는 synchronized만으로 해결할 수 없는 더 세밀한 락 제어가 필요한 경우가 많고,이때 선택하게 되는 도구가 바로 ReentrantLock이다. 단순한 전역 락이 아니라 자원별 락이 필요하다.이때 사용할 수 있는 패턴 중 하나가 ConcurrentMap + ReentrantLock 기반의 동적 락 관리 기법이다. 1. ReentrantLock이란ReentrantLock은 Java의 java.util.concurrent.locks 패키지에서 제공하는 명시적 락(Explicit Lock)이다.synchronized가 자동으로 락을 걸고 해제하는 구조라면, ReentrantLock은 ..

IT/JAVA 2025.12.06

Java 예외: RuntimeException

RuntimeExceptionJava에서는 프로그램 실행 중 나타나는 오류(exception or error)를 처리하기 위해 예외(Exception) 클래스를 제공한다.그중 RuntimeException은 “런타임 예외(Runtime Exception)”로 불리며,보통 예측 불가능한 프로그래밍 오류를 나타낼 때 사용된다. RuntimeException을 직접 사용하거나, 그 하위 클래스를 사용하는 것 => 이게 바로 흔히 말하는 “Unchecked Exception”이다. 반대로 RuntimeException을 상속하지 않는 예외들은 Checked Exception으로 분류된다. Checked Exception vs Unchecked Exception 차이 검사 시점컴파일 시점 — 예외 처리를 강제..

IT/JAVA 2025.12.06

main에 쌓인 커밋 구조조정하기

main에서 전부 작업 → 백업 브랜치 만들기 → main 초기화 → 새 브랜치로 cherry-pick → 백업 브랜치 삭제이런 상황을 만날 수 있다. “원래는 feature/... 브랜치에서 작업했어야 하는데,귀찮아서 그냥 main에서 다 해버렸다…” 이미 커밋도 여러 개 쌓였고, 리모트에도 푸시까지 해버렸다.이 상태에서 히스토리를 말끔하게 정리하고 싶다면, 다음과 같은 전략을 사용할 수 있다.현재 main 상태를 통째로 백업 브랜치로 복사main을 초기 커밋 시점으로 되돌리기새 기능 브랜치를 하나 만들고,백업 브랜치에 있는 필요한 커밋들만 cherry-pick작업이 끝나면 백업 브랜치를 삭제 1. main 브랜치로 이동git checkout main현재 작업 중인 브랜치와 상관없이, 기준이 될 mai..

IT/Git & GitHub 2025.11.30

JUnit의 테스트 생명주기 어노테이션

JUnit은 Java 에서 가장 널리 사용되는 테스트 프레임워크이다.개발자가 작성하는 테스트 코드가 일정한 규칙과 흐름에 맞게 실행될 수 있도록 도와주는 도구이며,Spring Boot를 포함한 대부분의 Java 기반 애플리케이션에서 표준처럼 사용된다.JUnit이 제공하는 핵심 기능테스트 자동 실행 (@Test)테스트 라이프사이클 관리 (@BeforeEach, @AfterAll 등)Assertion(검증) 지원 (assertThat, assertEquals)테스트 클래스/메서드 분리 및 관리반복 테스트, 예외 테스트 등 다양한 확장 기능 제공테스트 코드에서의 “생명주기” 테스트 코드를 작성하다 보면 매번 같은 초기화 로직을 반복해야 하는 경우가 많다. 예를 들어,테스트 전에 더미 데이터 세팅서비스/리포지토..

IT/Spring 2025.11.30

@Transactional(readOnly = true)

1) 한 줄 정의@Transactional(readOnly = true)는 해당 트랜잭션이 읽기 전용임을 트랜잭션 관리자에게 힌트로 제공해,런타임에 알맞은 최적화를 가능하게 하는 설정이다.이 값은 기본값이 아니며, 명시하지 않으면 읽기/쓰기 트랜잭션으로 동작한다.이 설정은 어디까지나 힌트이므로, 구현체가 이를 해석하지 못하면 무시될 수 있다. 2) 무엇이 최적화되는가(1) JPA/Hibernate 관점Spring + Hibernate 조합에서 읽기 전용 트랜잭션을 사용하면 일반적으로 세션 Flush 모드가 MANUAL로 바뀌고,기본 읽기 전용 플래그를 활용하여 Dirty Checking(변경 감지)을 최소화한다.그 결과 스냅샷 보관이 줄거나 생략되어 메모리/CPU 사용량이 감소한다.Flush가 자동으로..

IT/Spring 2025.11.11

Git 핵심 개념

1) Mac에서 Git 설치하기Mac에서는 Git 설치가 매우 간단하다.기본적으로 터미널에서 git --version을 입력하면macOS가 필요한 구성요소(Xcode Command Line Tools)를 자동으로 설치하도록 안내한다.cmd + space로 Spotlight를 열고 터미널을 실행아래 명령을 입력git --version설치 안내 창이 나타나면 설치 진행을 선택설치가 완료되면 다시 git --version으로 버전을 확인Homebrew를 사용 중이라면 brew install git로도 설치가 가능하다. 2) Git을 이해하는 기본 구조Git을 제대로 쓰려면 내부 흐름 이해하기2-1) Working Tree사용자가 실제로 파일을 편집하는 공간이다.Git이 추적하는 파일과 추적하지 않는 파일이 섞..

IT/Git & GitHub 2025.10.12

Git과 Github - 개발자가 알아야 할 버전 관리의 시작점

1. Git이란 무엇인가?Git은 파일과 코드의 변경 기록을 저장하고 관리하는 도구이다.쉽게 말해, “코드의 타임머신”이라 할 수 있다.개발 과정에서 코드는 계속 바뀐다. 새로운 기능이 추가되고, 버그가 수정되며, 때로는 실수로 문제가 생기기도 한다.Git은 이러한 모든 변경 사항을 기록하여, 언제든지 과거 상태로 되돌아갈 수 있게 해주는 버전 관리 시스템(VCS, Version Control System)이다.Git은 혼자 쓸 수도 있지만, 여러 명이 동시에 협업할 때 진가를 발휘한다. 누가 언제 어떤 코드를 수정했는지 추적할 수 있고, 충돌(conflict)이 생기면 서로의 변경 사항을 비교하면서 합칠 수 있다. 2. Github란 무엇인가? Git이 코드의 변경 이력을 관리하는 도구라면,Github..

IT/Git & GitHub 2025.10.12

Studying English (4)

2019년부터 사용해온 영어쉐도잉 어플, 꾸매영.미디어로 공부할 수 있어 재미없지 않고 좋았다.영어 공부 어플 추천해요!https://play.google.com/store/apps/details?id=com.doctor9.evdtenmineng 🎬 Nocturnal Animals Talking About Their Marriages ● Are things are a little better?상황은 조금 나아졌어? ● He's just having a hard time with his business right now.그는 사업이 조금 힘들어 ● Thought we were hiding it pretty well.우리는 잘 숨기고 있다고 생각했어. ● He would be very upset to fi..

ENGLISH 2025.09.28

Git Merge 옵션 : --ff, --no-ff, --squash

Git에서 브랜치를 병합할 때 merge나 pull 명령어와 함께 자주 등장하는 옵션이 있다.--ff, --no-ff, --squash이다.모두 병합의 히스토리 관리 방식과 관련이 있으며, 어떤 옵션을 쓰느냐에 따라 프로젝트 히스토리가 크게 달라진다. 1. --ff (fast-forward merge)fast-forward merge는 Git의 기본 동작대상 브랜치가 단순히 뒤쪽에만 커밋이 이어져 있는 경우,새로운 병합 커밋을 만들지 않고 브랜치 포인터만 앞으로 이동시킨다. 장점히스토리가 직선으로 이어져 깔끔하다불필요한 merge commit이 생기지 않는다단점브랜치가 존재했다는 흔적이 남지 않는다협업 시 어떤 기능이 어느 브랜치에서 개발되었는지 추적하기 어렵다사용 시점기능 브랜치를 짧게 만들어 금방..

IT/Git & GitHub 2025.08.29

Polling: 전통적인 실시간 데이터 통신 방식

Polling이란?웹 애플리케이션에서 클라이언트가 서버의 변경된 데이터를 얻기 위해 가장 먼저 사용된 방식이 Polling이다.Polling은 클라이언트가 일정한 주기를 두고 서버에 요청을 보내고, 서버는 그 시점의 데이터를 응답하는 구조이다.즉, 서버에서 이벤트가 발생했는지 여부를 알기 위해 클라이언트가 계속해서 물어보는 방식이라고 할 수 있다. Polling의 특징Polling 방식의 장점은 단순성이다.특별한 설정이나 프로토콜 없이 기존의 HTTP 요청/응답 모델 위에서 동작하기 때문에 구현이 쉽다.하지만 단순성 뒤에는 명확한 단점이 존재한다.서버에 변경 사항이 없어도 요청/응답이 발생하여 리소스가 낭비된다요청 주기를 짧게 잡으면 빠르게 변경 사항을 알 수 있지만, 서버에 과부하가 걸린다요청 주기를..

IT/IT 2025.08.27

Spring Cloud Gateway에서 Java DSL로 라우팅 설정

Spring Cloud Gateway는 Spring 생태계에서 널리 쓰이는 API Gateway 솔루션이다.간단한 설정으로 라우팅, 필터링, 보안, 모니터링 기능을 제공하며, Spring WebFlux 기반으로 비동기/논블로킹 처리를 지원한다.application.yml이 아닌 Java DSL 방식으로 라우트를 등록하는 방법과 이를 담는 GatewayConfig 클래스를 예시로 살펴본다. 1. GatewayConfig 클래스Spring Cloud Gateway에서 라우팅 정보를 등록하는 방법은 크게 두 가지이다.application.yml 설정 기반Java DSL 기반 (RouteLocator Bean 등록)여기서 Java DSL 기반의 라우팅 설정은 @Configuration 클래스 안에서 Route..

카테고리 없음 2025.08.18
반응형