Java 동시성 컬렉션 (1) – Collections.synchronized와 한계
Java 컬렉션의 근본적인 특징 java.util 패키지의 컬렉션 프레임워크는 기본적으로 Thread-safe하지 않다. 그렇다면 왜 처음부터 모든 컬렉션에 synchronized를 걸어두지 않았을까? 그 이유는 동기화는 성능 비용을 수반하기 때문이다 Vector의 교훈 Java는 과거 이런 실수를 했다 결과 교훈: 동기화의 필요성을 정확히 판단하고 필요한…
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() 메서드가 단순히 컬렉션에 데이터 하나를…
jOOQ를 사용하다 보면 매번 JOIN할 때마다 ON 절을 명시해야 하는 번거로움이 있다. JPA – QueryDSL에서는 Entity의 연관관계 덕분에 ON 절 없이도 간단하게 JOIN을 작성할 수 있는데, jOOQ에서도 외래키(Foreign Key) 정보를 기반으로 테이블 간 연관관계 Path를 자동 생성해서 활용하면 ON 절…
jOOQ의 ExecuteListener를 활용하면 애플리케이션 레벨에서 슬로우 쿼리를 실시간 슬로우 쿼리 감지할 수 있다 ExecuteListener ExecuteListener는 jOOQ가 제공하는 라이프사이클 훅으로, SQL 실행의 각 단계에서 커스텀 로직을 실행할 수 있게 해준다 PerformanceListener 구현 jOOQ Configuration 등록 Spring Boot 3.x에서는 DefaultConfigurationCustomizer를 통해 jOOQ…
JPA Entity 기반 DSL 생성 방식은 좋지만 멀티모듈 강제, 일부 DB 객체 지원 불가 등의 제약이 있었다. 이번에는 Testcontainers와 Flyway를 결합하여 DDL 파일로 jOOQ DSL을 생성하는 방식을 살펴보자 DDL Database 방식의 한계 순수 DSL 파일만으로 DSL을 생성하는 방식(DDL Database)를 살펴보자…
코드만 봐도 어떤 쿼리가 실행될지 예측하기 쉽다는 것이 jOOQ의 큰 장점이다. 여기서는 jOOQ의 핵심이라 할 수 있는 코드 제너레이션(Code Generation)방식과 무엇을 기준으로 DSL을 만들어야 하는지 알아본다 Code Generation jOOQ의 코드 제너레이션은 다양한 데이터 소스 중 하나를 참고하여 jOOQ DSL을 생성하는…
ActiveRecord 패턴은 Java 개발자에게 생소할 수 있다. jOOQ는 이 패턴을 지원하여 객체가 직접 데이터베이스 작업을 수행할 수 있게 한다. ActiveRecord 패턴 핵심 개념: 데이터베이스 테이블의 행(Row)를 감싼 객체가 데이터와 함께 CRUD 작업을 직접 수행하는 메서드를 포함 UML 다이어그램 비교 일반적인…
데이터 수정과 삭제는 신중해야 하는 작업이다. jOOQ는 동적 필드 업데이트부터 WHERE 절 없는 위험한 쿼리를 방지하는 안전장치까지 제공해준다 UPDATE 3가지 방식 DAO를 통한 전체 필드 업데이트 JPA의 save()처럼 POJO 전체를 업데이트 – 변경 여부와 관계없이 모든 컬럼이 SET 절에 포함된다…
데이터 삽입은 모든 애플리케이션의 기본이다. jOOQ는 JPA처럼 편리한 DAO 방식부터 벌크 INSERT까지 다양한 INSERT 패턴을 제공한다 jOOQ INSERT의 5가지 방식 자동 생성 DAO를 통한 INSERT JPA의 save() 메서드처럼 사용할 수 있는 가장 간편한 방식 Repository 구현 핵심 특징 생성된 SQL…