Java 24

Java > 패키지 구조

Layer-based 구조 (계층별 구조)com.example.app ├─ controller │ ├─ UserController.java │ └─ ProductController.java ├─ service │ ├─ UserService.java │ └─ ProductService.java └─ dao ├─ UserDao.java └─ ProductDao.java 장점계층 책임이 명확함MVC 패턴과 직관적으로 매칭단점도메인 단위로 변경/확장하기 어렵고, 특정 기능 수정 시 여러 패키지를 오가야 할 수 있음규모가 커지면 패키지 간 의존성 관리가 어려움 Feature/Domain-based 구조 (도메인별 구조)com.example.app ├─ user │ ├─ UserCo..

Java/Java > Basics 2025.11.17

Bean Validation > 컬렉션에 애너테이션 설정 시 미동작

문제 1. 컬렉션에 @Size(min = 1)을 설정했는데 값을 전달하지 않았는데(null인데도) 유효성 검증이 되지 않음이유는 @Size는 not null 확인을 하지 않기 때문 @NotNull@Size(min = 1)위와 같이 설정하거나 @NotEmpty만 사용해야 함 문제 2. 클래스 내에 컬렉션 필드가 있을 때 해당 필드에 애너테이션을 설정해도 유효성 검증되지 않음이유는 Generics를 사용하면 Runtime에는 타입 정보가 없어지기 때문 private List users;위와 같이 설정해야 함

Java > Local 개발 환경을 위한 애플리케이션에 TLS 설정 (keytool)

keytoolJava에서 Key 및 Certificate(인증서)를 생성하고 관리하는 명령줄 도구 Key와 KeyStore 생성keytool -genkeypair -alias my-tls-key -keyalg RSA -validity 3650 -keystore my-tls-key.p12 -storetype PKCS12RSA 2048비트 개인 키 생성Self-Signed(자체 서명된) 인증서 포함유효기간 3650일 (10년) 이후에 입력한 Keystore password를 잘 기억해두자 KeyStore 목록 확인keytool -list -keystore my-tls-key.jks Spring Boot에 KeyStore 설정server: ssl: key-store: file:api/cert/my-tl..

Java 2025.03.19

Logging > Logback > MyBatis

MyBatis를 사용할 때 기본적으로 SQL 쿼리 로그에 출력되는 클래스명은 어떻게 될까? DAO나 Mapper의 클래스명이 출력될까? 아니다. Mapper XML로 쿼리를 설정한 경우 XML에 설정한 Namespace의 값으로 출력된다 따라서 해당 Namespace의 값이 폴더 구조를 따르는 규칙적인 경우라면 Logger 설정이 쉬우나, 만약 규칙적이지 않다면 쉽지 않을 것이다. 예를 들어 아래와 같이 설정되어 있다면.. 이와 같이 mapper라는 이름으로 시작하는 Logger 설정이 가능할 것이다.. 하지만 아래와 같이 설정되어 있다면 Logger 설정이 거의 불가능할 것이다.... 이런 경우에는 log4jdbc-remix 같은 라이브러리를 사용하면 아래와 같은 Logger를 사용하여 설정 가능하다..

Java/Logging 2025.02.11

Logging > Logback > additivity

Logback은 계층적 로깅을 따름 Logger의 로깅은 상위 Logger에게 전파됨. 이는 중복 로깅이 될 수 있다는 말이다 예를 들어 아래와 같이 Root logger의 레벨은 INFO로 설정하고, MyBatis 관련 로깅은 DEBUG로 설정한다고 해보자  org.mybatis 패키지 하위에서 DEBUG 로그를 출력한 뒤 Root logger에도 전파되지만, INFO 레벨에 막혀 출력이 되지 않는다additivity의 기본값은 true이다 additivity의 값을 false로 설정하면 어떻게 될까?  false로 설정하면 org.mybatis의 로그는 더이상 출력되지 않는다이를 출력하기 위해서는 별도의 Appender를 설정해야 한다

Java/Logging 2025.02.11

Java > Docker 컨테이너로 실행 시 bash: warning: setlocale: LC_ALL: cannot change locale (ko_KR.UTF-8)

문제compose.yml 설정에 LC_ALL: ko_KR.UTF-8 설정을 하였는데, 컨테이너 진입 시 아래 경고 발생bash: warning: setlocale: LC_ALL: cannot change locale (ko_KR.UTF-8)  원인컨테이너 내 ko_KR.UTF-8 로우캘 미설치  해결방법 1Dockerfile 생성하여 ko_KR.UTF-8 로우캘 설치방법 2compose.yml에 ko_KR.UTF-8 설정 environment: LANG: ko_KR.UTF-8방법 3compose.yml에 en_US.UTF-8 설정 environment: LANG: en_US.UTF-8 TZ: Asia/Seoul en_US.UTF-8 로캘은 기본적으로 UTF-8 인코딩..

Java 2024.10.29

Java > Concurrency > 10. Thread pool, Executor framework

스레드 직접 사용할 때의 문제점1. 스레드 생성 비용으로 인한 성능 문제메모리 할당각 스레드는 자신만의 호출 스택을 가진다보통 1MB 이상의 메모리를 사용한다OS 자원 사용스레드 생성은 OS 커널 수준에서 이루어지며, 시스템 호출을 통해 처리된다OS 스케줄러 설정OS 스케줄러가 스레드를 관리하고 실행 순서를 조정한다 스레드를 생성하는 작업은 상대적으로 무겁다. 아주 가벼운 작업이라면 작업의 실행 시간보다 생성 시간이 더 오래 걸릴 수도 있다 이러한 문제는 스레드 재사용을 통해 해결할 수 있다2. 스레드 관리 문제서버의 CPU, 메모리 자원은 한정되어 있기에 스레드는 무한히 만들 수 없다 사용자의 요청을 처리하는 스레드가 평소에는 100개면 충분했는데, 10,000명의 사용자가 몰려 10,000개의 스레드..

Java/Concurrency 2024.10.14

Java > Concurrency > 9. Concurrent Collections

java.util 패키지의 컬렉션 프레임워크대부분 Thread safe하지 않음 단일 스레드가 컬렉션 사용 시 성능이 좋다  Collections.synchronized~ 동기화 메서드스레드 안전하지 않은 많은 컬렉션들을 편리하게 스레드 안전한 컬렉션으로 변경해준다 단점동기화 오버헤드잠금 범위가 넓어져 잠금 경합(Lock contention) 증가, 병렬 처리 효율 저하모든 메서드에 동기화 적용정교한 동기화 불가과도한 동기화  java.util.concurrent 패키지의 컬렉션 프레임워크위 방식의 단점 보완자바 1.5부터 제공 스레드 안전하며 고성능 멀티 스레드 환경을 지원하는 다양한 동시성 컬렉션 클래스 제공 다양한 성능 최적화 기법이 적용되어 있다synchronizedLock (ReentrantLo..

Java/Concurrency 2024.10.14

Java > Concurrency > Atomic operation, CAS

원자적 연산해당 연산이 더 이상 나눌 수 없는 단위로 수행된다는 것 원자적 연산은 중단되지 않고, 실행되거나 실행되지 않는 성질을 가진다 멀티 쓰레드 환경에서는 다른 쓰레드의 간섭 없이 안전하게 처리됨을 의미한다 원자적 연산int i = 0;원자적 연산 Xi += 1;i++; 원자적 연산이 아니라면 synchronized나 Lock 등을 이용해 안전한 임계 영역을 만들어야 한다AtomicInteger 등 Atomic~멀티 쓰레드 환경에서 안전하게 증감 연산을 수행할 수 있게 해주는 객체 snychronized, ReentrantLock 보다 빠르다 그 이유는 incrementAndGet() 메서드는 락을 사용하지 않고 원자적 연산을 수행하기 때문  https://github.com/venzersiz/le..

Java/Concurrency 2024.10.04

Java > Concurrency > 7. Synchronization

동시성 문제같은 자원에 여러 쓰레드가 동시에 접근할 때 발생하는 문제 여러 쓰레드가 접근하는 자원을 공유(Shared) 자원이라고 한다. 대표적 공유 자원은 인스턴스 필드이다 쓰레드의 공유 자원에 대한 접근을 동기화하여 동시성 문제를 해결할 수 있다  Critical section임계 영역 여러 쓰레드가 동시에 접근하면 데이터 불일치나 예상치 못한 동작이 발생할 수 있는 위험하고 중요한 코드 부분여러 쓰레드가 공유 자원을 접근하거나 수정하는 부분  동기화(Syncrhonization)여러 쓰레드가 공유 자원에 대해 일관성 있고 안전한 접근을 보장하기 위한 메커니즘 아래 문제를 해결할 수 있다경합 조건(Race condition)여러 쓰레드가 동시에 읽고 쓰는 데이터의 일관성 멀티 쓰레드 환경에서 필수적이..

Java/Concurrency 2024.09.23