2024-03-12-TIL
2024-03-12-TIL
Today I Learned
Repository Pattern
Repository 패턴은 도메인 객체를 마치 메모리 안의 컬렉션처럼 다루게 해 주는 추상화다. 서비스 계층은 save, findById 같은 인터페이스만 알고, SQL이나 ORM 같은 영속성 기술의 세부는 Repository 구현 뒤로 숨는다. 덕분에 도메인 로직이 저장 방식에 덜 묶이고, 테스트에서 Repository를 가짜 구현으로 바꾸기 쉬워진다.
Spring Data JPA는 인터페이스만 선언하면 구현을 런타임에 만들어 주지만, 쿼리 메서드 이름이나 @Query로 표현하기 어려운 로직은 직접 구현해야 한다. 공식 문서가 안내하는 방법은 fragment 인터페이스를 쓰는 것이다.
1
2
3
4
5
6
7
8
9
10
11
12
13
interface CustomizedUserRepository {
void someCustomMethod(User user);
}
class CustomizedUserRepositoryImpl implements CustomizedUserRepository {
@Override
public void someCustomMethod(User user) {
// EntityManager, QueryDSL 등으로 직접 구현
}
}
interface UserRepository extends CrudRepository<User, Long>, CustomizedUserRepository {
}
- 구현 클래스 이름은 기본적으로 fragment 인터페이스 이름에
Impl을 붙인다. 접미사는@EnableJpaRepositories(repositoryImplementationPostfix = ...)로 바꿀 수 있다. - 여러 fragment를 함께 상속할 수 있고, 선언 순서대로 처리된다.
- 커스텀 구현은 기본 Repository 구현보다 우선하므로,
save같은 기본 메서드도 같은 시그니처로 재정의할 수 있다.
Vlad Mihalcea의 글은 이 구조로 Hibernate 고유 기능이나 복잡한 쿼리를 Repository 안에 넣는 예를 보여 준다.
Advanced Java Books for Experienced Developers
경력 개발자를 위한 Java 도서 목록들을 모았다. 목록마다 구성은 다르지만, 문법 입문을 넘어서 API 설계 관용구, 최신 언어 기능, JVM 내부와 성능, 동시성을 다루는 책을 고른다는 방향은 같다. 예를 들어 java67의 목록은 Joshua Bloch의 Effective Java와 Java 8 이후 람다, 스트림, 새 날짜 API를 다루는 Modern Java in Action을 포함한다. Manning의 The Well-Grounded Java Developer 2판은 모듈 시스템, 바이트코드와 클래스 로딩, 성능 튜닝, 동시성, Kotlin과 Clojure 같은 JVM 언어, 빌드 도구와 컨테이너까지 다룬다.
마지막 Hussein Nasser의 글은 Java에 한정하지 않고, 백엔드 엔지니어에게 필요한 기본기를 다룬다.
Arbitrary
테스트에 임의의 객체를 입력으로 넣는 방법에 관한 링크다.
JUnit 5의 @ValueSource는 문자열, 정수 같은 리터럴 타입만 받을 수 있다. 어노테이션 속성에는 컴파일 타임 상수만 올 수 있기 때문이다. JUnit 이슈 1140은 LocalDate 같은 임의의 객체를 @ValueSource로 넘기고 싶다는 요청이다. 이런 경우에는 객체를 만들어 반환하는 팩토리 메서드를 @MethodSource로 연결하는 것이 일반적인 해법이다.
1
2
3
4
5
6
7
static Stream<LocalDate> dates() {
return Stream.of(LocalDate.of(2017, 1, 1), LocalDate.of(2017, 12, 31));
}
@ParameterizedTest
@MethodSource("dates")
void testWithDates(LocalDate date) { ... }
한 걸음 더 나가면 입력값을 직접 고르지 않고 생성기에 맡기는 property-based testing이 있다. 특정 예시 몇 개 대신 “모든 입력에 대해 성립해야 하는 성질”을 적고, 프레임워크가 무작위 입력을 대량으로 만들어 검증한다. Java의 jqwik에서는 이 생성기를 Arbitrary라고 부른다. Maurício Aniche의 Effective Software Testing은 명세 기반 테스트, 구조적 테스트, 커버리지와 함께 property-based testing을 한 장으로 다룬다.
Async
동시성(concurrency), 병렬성(parallelism), 비동기(asynchronous), 논블로킹(non-blocking)은 자주 섞여 쓰이지만 서로 다른 축의 개념이다. 동시성은 여러 작업이 진행 중인 상태를 다루는 구조이고, 병렬성은 실제로 같은 순간에 여러 작업이 실행되는 것이다. 동기와 비동기는 작업 완료를 호출자가 기다려 결과를 받는지, 나중에 콜백이나 이벤트로 받는지의 문제이고, 블로킹과 논블로킹은 호출한 스레드가 제어권을 돌려받는지의 문제다.
첫 번째 GeekNews 글은 이 용어들을 정리한 긴 글을 소개하며 OS와 프로세서, 코루틴과 제너레이터, I/O 멀티플렉싱, 그린 스레드와 고루틴, CSP와 액터 모델까지 다룬다. 댓글에서는 동기와 비동기, 블로킹과 논블로킹을 2x2로 나누는 구분이 분야마다 다르게 쓰인다는 토론이 이어진다. select 같은 I/O 멀티플렉싱은 블로킹이면서 비동기적이고, 폴링은 논블로킹이면서 동기적인 예로 언급된다.
두 번째 글은 Ben Hoyt의 The One Billion Row Challenge in Go를 소개한다. 10억 행의 관측소별 기온 데이터에서 최솟값, 평균, 최댓값을 구하는 과제를 Go로 아홉 단계에 걸쳐 최적화한 기록이다. 맵 조회 횟수 줄이기, 기온 파싱 직접 구현, FNV-1a 해시와 선형 탐사를 쓴 전용 해시 테이블, 그리고 파일을 청크로 나눠 고루틴마다 처리한 뒤 결과를 합치는 병렬화 순서로 진행한다. 글 제목 기준으로 1분 45초에서 3.4초까지 줄였다. 작성자는 평소에는 단순하고 관용적인 코드에서 시작하는 것이 맞다고 하면서도, 데이터 처리처럼 비용에 직결되는 곳에서는 이런 최적화가 의미가 있다고 정리한다.
AI 키워드
2024년 3월 4일 Anthropic이 Claude 3 모델 계열(Haiku, Sonnet, Opus)을 발표했다. 텍스트와 이미지를 함께 입력받는 멀티모달 모델로, 크기와 성능에 따라 세 단계로 나눈 구성이다. 출처는 Anthropic의 발표 글 Introducing the next generation of Claude와 Wikipedia의 2024 in artificial intelligence 항목이다.
참고한 자료외부 출처 23
외부 출처
- jcchu.medium.com/repository-pattern에-대해-알아보기-c86407d487cf
- Custom Repository Implementations
- vladmihalcea.com/custom-spring-data-repository
- 10 Advanced Java Books and Courses for Experienced Developers
- 5 Top Java books for experienced developers
- medium.com/javarevisited/10-books-every-experienced-java-developer-should-read-51eb033e863f
- 12 Advanced Java programming Books for Experienced Programmers - Part 2
- javatpoint.com/advanced-java-books-in-2021
- Top 10 Java Books for 2026
- Must-Read Java Books for Every Developer
- 11 Best Java Books You can Read to become Expert Java developer
- The Well-Grounded Java Developer, Second Edition
- thepencentre.com/shop/product/100-interview-questions-by-x-y-wang-paperback-indigo-chapters-coles-9e7102
- amazon.com/100-Interview-Questions-Collections-Programming/dp/B0C5GX59KZ
- medium.com/@hnasr/how-to-become-a-good-backend-engineer-fundamentals-4dcc4a16ce55
- Make it possible to return arbitrary Objects from @ValueSource
- d2.naver.com/news/2459981
- Effective Software Testing
- 동시성, 병렬, 비동기, 논블럭킹과 컨셉들
- Go로 10억 행 처리하기 도전: 9개의 방법으로 1분45초에서 4초로 단축
- The One Billion Row Challenge in Go: from 1m45s to 3.4s in nine solutions
댓글
아직 댓글이 없습니다