[개발 일기] 2025.05.15 - 클래스마다 무조건 인터페이스를 생성??
·
개발 일기
💡 개요 클래스마다 무조건 인터페이스를 생성하라고 요구하는 구현 표준은 좋은 예다. 이 문장은 클린코드(12장-창발성 P.222)에서 발췌해온 문장이다. 왜 클래스마다 무조건 인터페이스를 생성하는 게 좋은 예시일까? 인터페이스를 만든다는 것은 공통된 기능이 있다는 의미일 것이고, 인터페이스를 사용한다면 해당 기능을 자연스럽게 강제화하는 것인데… 🛠️ 인터페이스를 생성하는 게 좋은 이유 인터페이스를 만들면 얻을 수 있는 장점이 뭐가 있을까? ✅ DIP(의존 역전 원칙) 적용 가능 상위 모듈(사용자)은 하위 모듈(구현체)에 의존하지 않고, 인터페이스(추상화)에 의존하게 됨으로써 결합도가 낮아진다. 이는 유연한 구조를 가능하게 만든다. ✅ 테스트 용이성 향상 인터페이스가 있으면 테스트 시 실제..
[개발 일기] 2025.05.14 - ConfigurationProperties와 Setter
·
개발 일기
💡 개요 @Setter @ConfigurationProperties(prefix = "naver") 확실한 이유는 모르겠지만, @Setter가 없다면 @ConfigurationProperties를 사용하더라도 application.yml에 정의된 값을 객체에 바인딩할 수 없다. 오늘은 그 이유에 대해 정리해 보자. 🛠️ ConfigurationProperties 일단 ConfigurationProperties가 뭔지부터 정리 해보자. @ConfigurationProperties는 *.properties 또는 *.yml 파일에 정의된 설정 값을 자바 클래스의 필드에 바인딩해 주는 애노테이션이다. 위 코드를 보면 prefix가 naver로 설정되어 있는데, 이것은 설정 파일에 있는 naver ..
[개발 일기] 2025.05.13 - 자바 Optional 정리
·
개발 일기
💡 개요 오늘은 자바에서 사용되는 Optional에 대해 정리해 보자. 🛠️ Optional Optional이란 자바에서 NullPointException을 방지하기 위해 사용되는 타입이다. 보통 JPA을 사용해 엔티티를 조회할 때 Optional로 엔티티를 한번 감싸고 사용하면, 더 안전하게 객체를 다룰 수 있다. Optional findMember = memberRepository.findByEmail(email); ⚙️ Optional 제공 메서드 Optional에는 다양한 메서드가 제공된다. 📌 생성 관련 메서드설명Optional.of(value)절대 null이 아닌 값을 포함한 Optional 생성 (null이면 NullPointerException)Optional.ofNullab..
[개발 일기] 2025.05.12 - 분산 저장 (파티셔닝, 샤딩)
·
개발 일기
💡 개요 오늘은 DB의 안정성과 성능을 향상하는 방법인 분산 저장 기법(파티셔닝과 샤딩)에 대해 정리 해보자. 🛠️ 파티셔닝 파티셔닝이란 데이터베이스를 특정 조건을 적용해 여러 부분으로 분할하는 것이다. 하나의 DBMS에 너무 큰(많은 컬럼을 관리) 테이블이 들어가면 성능 측면에서 문제가 발생할 수 있다. 이를 방지하기 위해 테이블이나 인덱스를 작은 파티션 단위로 나누어 사용하는 방법을 의미한다. 파티셔닝을 통해 얻을 수 있는 장점은 다음과 같다. ✅ 성능 향상쿼리를 수행하는 테이블의 데이터 수가 감소하기 때문에 검색 속도가 향상된다. ✅ 관리 용이전체 테이블을 대상으로 백업이나 복원을 진행하는 것이 아니라 파티션 단위로 관리를 하기 때문에 데이터 관리가 더 편해진다. 🛠️ 샤딩 샤..
[개발 일기] 2025.05.11 - Redis 만료 원리
·
개발 일기
💡 개요 오늘은 Redis에서 키가 삭제되는 원리에 대해 정리해 보자. 🛠️ Redis 키 삭제 원리 Redis의 키 삭제 방법은 크게 Lazy Expiration (지연 만료)와 Active Expiration (적극 만료)가 있다. ⚙️ Lazy Expiration (지연 만료) 지연 만료란, 클라이언트가 키에 접근할 때, 해당 키가 만료되었으면 그때 삭제하는 것이다. 그렇기 때문에 따로 삭제하는 작업을 수행할 필요가 없다. ⚙️ Active Expiration (즉시 만료) Redis 서버는 초당 10번(기본 값) expire cycle을 실행한다. 각 사이클 과정은 다음과 같다. TTL이 설정된 키 공간에서 임의의 키 20개를 조사한다.만료된 키들을 삭제한다.만약 삭제된 키가 25..
[개발 일기] 2025.05.10 - Bulk을 사용한 저장이 하나씩 저장하는 것 보다 빠른 이유
·
개발 일기
💡 개요 Bulk을 사용한 저장이 하나씩 저장하는 것보다 빠른 이유에 대해 정리해 보자. 🛠️ Bulk Bulk을 사용한 저장이란, 여러 데이터를 한번에 모아 저장하는 것을 말한다. 일반적으로 Batch Insert나 Bulk Insert 등으로 표현된다. 하나씩 저장for (User user : userList) { userRepository.save(user);} 한번에 모아 저장userRepository.saveAll(userList); 한 번에 저장하는 방식이 성능 면에서 유리한 이유는 무엇일까? 가장 큰 이유는 지연 시간 감소에 있다. 일반적으로 데이터베이스는 데이터를 저장할 때 트랜잭션을 사용한다. 데이터를 하나씩 저장하면 그에 따라 커밋도 여러 번 발생하게 되고, 이..