날짜와 시간 조작하기
Java 8에서 도입된 java.time 패키지는 기존 Date와 Calendar의 문제점들을 해결한 현대적인 날짜/시간 API이다. 이번 포스트에는 ChronoUnit와 ChronoField에 대해 알아본다 날짜와 시간의 핵심 개념 날짜와 시간을 다룰 때 가장 먼저 이해해야 할 개념은 특정 시점의 시간과 시간의 간격을 명확히 구분하는 것이다.…
Java 8에서 도입된 java.time 패키지는 기존 Date와 Calendar의 문제점들을 해결한 현대적인 날짜/시간 API이다. 이번 포스트에는 ChronoUnit와 ChronoField에 대해 알아본다 날짜와 시간의 핵심 개념 날짜와 시간을 다룰 때 가장 먼저 이해해야 할 개념은 특정 시점의 시간과 시간의 간격을 명확히 구분하는 것이다.…
Java 8부터는 java.time 패키지(=JSR-310)가 기본 표준이 되었다. 이 API는 다음과 같은 특징을 갖는다. LocalDate / LocalTime / LocalDateTime 가장 기본이 되는 날짜/시간 클래스는 아래 3개이다 LocalDate LocalTime LocalDateTime 이름에 Local이 붙는 이유는 타임존(ZoneId)이 없기 때문이다. 즉, “서울 시간”, “런던 시간”같은…
비즈니스 요구사항 이커머스 시스템에서 주문(Order)은 다양한 결제 수단을 지원해야 한다 각 결제 수단마다 필요한 데이터가 다르고, 별도의 테이블로 관리된다 설계 목표 조회를 하나의 API로, 저장/수정도 하나의 API로 통합하되, 내부 구현은 결제 타입별로 분리 Domain Model & Enum JPA가 아닌 jOOQ를…
Java의 열거형(Enum Type)을 제대로 이해하려면 열거형이 생겨난 배경을 알아야 한다. 실무 예제를 통해 문제 상황부터 살펴보자 비즈니스 요구사항 다음과 같은 회원 등급 시스템을 구현한다고 가정해보자 예를 들어, GOLD 등급 회원이 10,000원을 구매하면 2,000원 할인 받는다 문자열 사용의 문제점 첫 번째…
자바 개발을 하다 보면 날짜와 시간을 다루는 일이 빈번하다. 과거의 Date나 Calendar 클래스는 설계 결함이 많아 사용하기 매우 까다로웠으나, 자바 8에서 도입된 java.time 라이브러리는 이를 완벽하게 해결했다. 한눈에 보는 날짜와 시간 클래스 체계 자바가 제공하는 클래스들은 ‘무엇을 관리하느냐’에 따라 명확하게…
Java 동시성 컬렉션에서 Collections.synchronizedXxx()를 살펴보았다. 이번에는 그 한계를 극복한 java.util.concurrent 패키지와 고성능 동시성 컬렉션들을 알아보자 왜 별도의 동시성 컬렉션이 필요할까? Collections.synchronized의 문제 Concurrent 컬렉션의 해결책 동시성 컬렉션 개요 java.util.concurrent 패키지 핵심 특징 제공되는 컬렉션 종류 타입 일반 컬렉션 Concurrent 컬렉션…
Java 컬렉션의 근본적인 특징 java.util 패키지의 컬렉션 프레임워크는 기본적으로 Thread-safe하지 않다. 그렇다면 왜 처음부터 모든 컬렉션에 synchronized를 걸어두지 않았을까? 그 이유는 동기화는 성능 비용을 수반하기 때문이다 Vector의 교훈 Java는 과거 이런 실수를 했다 결과 교훈: 동기화의 필요성을 정확히 판단하고 필요한…
사소해 보이는 필드명 하나가 어떻게 수 십분의 디버깅을 요구했는지, 그리고 그 과정에서 배운 것들 문제 상황 프로젝트에서 데이터 매핑 오류를 경험했다. 분명 JSON으로 값을 보냈는데, Controller에서 @Valid 검증에 걸려 400 에러가 발생했다 증상: studentName은 정상 매핑되는데, sId만 계속 null이었다 삽질…
java.util 패키지의 컬렉션 프레임워크(ArrayList, HashMap, LinkedList 등)는 멀티스레드 환경에서 안전할까? 결론부터 말하자면, 대부분의 컬렉션은 Thread-Safe하지 않는다 Java 컬렉션 프레임워크는 Thread-Safe한가? Thread-Safe의 정의 thread-safe란 여러 스레드가 동시에 접근해도 문제없이 동작하는 것을 의미한다 위 코드를 보면 add() 메서드가 단순히 컬렉션에 데이터 하나를…
문제 정의 생산자 – 소비자 문제는 한정된 크기의 버퍼를 통해 데이터를 주고 받는 멀티스레드 환경에서 발생하는 동시성 문제이다 핵심 문제 해결 방안의 진화 단순 synchronized (문제 발생) sleep()으로 대기 (더 심각한 문제) wait/nofity 사용 (비효율 존재) Lock + Condition으로 개선…