Back-End/JAVA 11

Java 스레드에서 InterruptedException을 어떻게 처리해야 할까?

멀티스레드 환경에서 InterruptedException은 다른 예외들과는 성격이 완전히 다르다.단순히 “오류가 발생했다”라는 의미가 아니라, 스레드를 종료하라는 의도적인 신호다.이 신호를 어떻게 다루느냐에 따라 시스템이 정상적으로 종료될 수도 있고,반대로 종료되지 않는 스레드가 남아 장애로 이어질 수도 있다.아래는 InterruptedException을 올바르게 처리하는 방법과잘못 처리했을 때 생기는 문제들을 정리한 내용이다.InterruptedException은 “스레드를 멈춰라”라는 신호다다른 일반적인 예외(IOException, RuntimeException, etc.)는오류 상황을 나타낼 뿐이다.하지만 InterruptedException은 외부에서 스레드에 보낸 종료 요청이다.이 신호가 발생하..

Back-End/JAVA 2025.12.09

volatile vs atomic — 헷갈리는 두 개념 완벽 정리

멀티스레드 프로그래밍을 하다 보면 volatile과 atomic의 차이에서 한 번쯤 혼란을 겪게 된다.둘 다 동시성과 관련된 키워드지만, 그 역할은 분명히 다르다.이 글에서는 두 개념을 CPU 동작부터 코드 레벨까지 명확하게 정리해본다. 1. volatile — “항상 최신 값을 보게 하라” volatile은 가시성(visibility) 을 보장하기 위한 키워드다.일반 변수는 CPU 캐시에 저장되어, 다른 스레드가 변경한 값을 즉시 반영하지 못할 수 있다.하지만 volatile을 붙이면 해당 변수를 항상 메인 메모리에서 직접 읽고 쓰도록 강제한다.어떤 블로그를 보니 [그 변수를 휘발성 메모리에 만들어라] 라고도 표현해두었네. volatile int count;이렇게 선언하면 모든 스레드가 항상 count..

Back-End/JAVA 2025.10.09

AtomicBoolean

AtomicBoolean 이란?AtomicBoolean은 Java에서 제공하는 원자적(atomic) 인 불리언(Boolean) 변수예요.AtomicBoolean isRunning = new AtomicBoolean(false); 이 한 줄로 만든 변수는true / false 값을 저장한다는 점에서는 일반 boolean과 같지만,멀티스레드 환경에서도 동기화 문제 없이 안전하게 읽기/쓰기가 가능합니다.즉, 여러 스레드가 동시에 isRunning을 읽고/바꾸더라도 race condition이 발생하지 않음. compareAndSet() 메서드란?compareAndSet(expectedValue, newValue)는 “현재 값이 expectedValue면, 그때만 newValue로 바꿔라” 라는 의미입니다.이게..

Back-End/JAVA 2025.10.09

좋은 메서드명에 대한 고민

코드를 작성하다 보면 좋은 메서드명에 대해 고민을 정말 많이하게된다.물론 정답은 없는 거 겠지만, 좋은 습관이 일관성 있는 코드를 만들어 준다고 생각하기 때문에 여러 글을 참고해서 한번 정리를 해본다.1. Boolean 값을 반환하는 메서드Prefix의미예시is상태 확인 (boolean)isActive, isEnabledcan어떤 동작을 수행할 수 있는지 여부canExecute, canDeleteshould호출자가 이 동작을 실행해야 하는지 여부shouldReloadhas해당 속성이나 객체를 보유하고 있는지 여부hasChildren, hasErrorneeds어떤 처리가 필요한지 여부needsRefreshwas과거 상태를 표현할 때wasSuccessful 2. 조건부로 동작하는 메서드Prefix / Suf..

Back-End/JAVA 2025.05.15

Java record 간결하고 안전한 데이터 구조

Java를 사용하다 보면 단순히 데이터를 담는 용도의 클래스를 자주 작성하게 된다.이럴 때마다 우리는 반복적으로 생성자, getter, equals, hashCode, toString을 작성하곤 했다.그런 반복을 줄이기 위해 Lombok을 사용하는 개발자들도 많다.그런데 Java 14 이후부터 등장한 record 키워드는 이런 데이터 클래스를 보다 명확하고 간결하게 정의할 수 있도록 도와준다.이번 글에서는 record가 무엇인지, 기존의 Lombok과 어떤 차이가 있는지, 그리고 실무에서는 어떤 기준으로 선택하면 좋을지 정리해본다.1. record란?Java 14(프리뷰), Java 16(정식)부터 도입된 record는 불변 데이터 구조(immutable data carrier) 를 표현하기 위한 문법이..

Back-End/JAVA 2025.05.02

@RequiredArgsConstructor와 @Builder와의 차이

@RequiredArgsConstructor와 자주 비교되는 롬복 어노테이션 중 하나가 바로 @Builder다.두 어노테이션 모두 객체 생성을 도와주지만, 쓰임새와 철학이 조금 다르다.1. @Builder: 복잡한 객체 생성을 유연하게@Builderpublic class ArticleResponse { private Long articleId; private String title; private String content; private LocalDateTime createdAt;}이렇게 선언하면 다음과 같이 객체를 만들 수 있다.ArticleResponse res = ArticleResponse.builder() .articleId(1L) .title("제목") ..

Back-End/JAVA 2025.04.22

final 필드와 @RequiredArgsConstructor는 왜 같이 쓰는가?

Java로 코드를 작성하다 보면 종종 이런 선언을 보게 된다.@RequiredArgsConstructorpublic class Worker { private final String id; private final List paths; private final LogicService logicService;} 처음 보면 궁금해진다.왜 final을 붙이고, @RequiredArgsConstructor를 쓰는 걸까?이번 글에서는 이 조합이 가지는 의미와 철학을 정리해보려 한다. final 필드란?자바에서 final은 딱 한 번만 값을 할당할 수 있다는 의미를 가진다.즉, 아래 코드는 컴파일되지 않는다.public class Example { private final String name;..

Back-End/JAVA 2025.04.22

자바 enum, 상수가 전부가 아니었다

자바에서 enum은 흔히 "고정된 상수 집합"을 만들 때 사용한다.예를 들어 사용자 역할을 나타내기 위해 이렇게 쓴다:public enum Role { ADMIN, USER, GUEST} 이렇게 사용하면 Role.ADMIN, Role.USER처럼 코드가 명확해지고, 값도 제한할 수 있다.그래서 enum은 값이 고정된 목록을 안전하게 관리하는 수단으로 많이 쓰인다.그런데 여기서 한 발 더 나아가면, enum은 단순한 상수를 넘어서객체이자 싱글톤으로도 활용할 수 있는 구조라는 걸 알게 된다. enum은 객체다예를 들어, 아래처럼 enum에 생성자와 필드를 추가할 수 있다.public enum LogLevel { DEBUG("디버그"), INFO("정보"), ERROR("에러"..

Back-End/JAVA 2025.04.17

Runnable이란? 비동기 워커 설계에서 마주친 첫 스레드 인터페이스

업무 중 스케줄 기반으로 콜을 발신해야 하는 시스템을 설계하게 됐다.단일 스케줄을 처리하는 로직이 꽤 간단해서 한 개의 쓰레드로만 처리할 수도 있었지만,여러 건을 동시에 병렬로 처리하고 싶어서 멀티스레드 구조를 도입하기로 했다. 그 과정에서 처음 접하게 된 것이 바로 Runnable 이라는 인터페이스였다.오늘은 그걸 처음 만났던 경험과, 어떻게 적용했는지를 남겨본다. Runnable이란?Java에서 멀티스레드를 사용할 때 “이 스레드가 어떤 작업을 할 건지”를 정의할 수 있어야 한다.그걸 정의해주는 게 바로 Runnable 인터페이스다.public interface Runnable { void run();} 딱 하나의 메서드 run()만 가지고 있고,이 안에 “스레드가 해야 할 작업”을 작성하면 된..

Back-End/JAVA 2025.03.23

메서드 참조 ::

Java에서 ::는 메서드 참조(Method Reference)를 나타내는 연산자입니다. 이 연산자는 람다 표현식을 더 간결하고 읽기 쉽게 표현하기 위해 사용됩니다. 1. 메서드 참조의 기본 개념:: 연산자는 이미 정의된 메서드를 참조하여, 람다 표현식을 간결하게 나타냅니다.예: String::toUpperCase원래는 다음과 같은 람다 표현식으로 문자열을 대문자로 변환합니다: list.stream() .map(s -> s.toUpperCase()) .forEach(System.out::println);이를 메서드 참조를 사용하면 더 간결하게 작성할 수 있습니다:list.stream() .map(String::toUpperCase) .forEach(System.out::println..

Back-End/JAVA 2024.11.22