배운 것
Boolean.TRUE.equals(result) 형태로 쓰는 이유는 result가 null일 수 있기 때문이다.
상황
Redis에서 Set 멤버 여부를 확인하는 코드에서 발견했다.
public boolean isAlreadyIssued(String couponId, String userId) {
Boolean result = redisTemplate.opsForSet().isMember(ISSUED_KEY_PREFIX + couponId, userId);
return Boolean.TRUE.equals(result);
}
redisTemplate.opsForSet().isMember()의 반환 타입은 Boolean (래퍼 타입)이다.
Java의 래퍼 타입 Boolean은 true, false, null 세 가지 값이 가능하다.
왜 null이 반환될 수 있나
Redis 연결 장애나 타임아웃 발생 시 null을 반환할 수 있다.
비교
// result가 null일 때
result == true // NullPointerException 💥
result.equals(true) // NullPointerException 💥
Boolean.TRUE.equals(result) // false 반환, 안전 ✅
Boolean.TRUE.equals()는 내부적으로 null 체크를 해주기 때문에 NPE 없이 안전하게 처리된다.
null이 들어오면 그냥 false로 처리되므로 "발급 안 됨"으로 안전하게 폴백된다.
핵심 정리
래퍼 타입(Boolean, Integer 등)을 비교할 때는 == 대신 equals()를 쓰되,
NPE를 피하려면 알고 있는 값.equals(모르는 값) 형태로 써야 한다.
// 안전한 패턴
Boolean.TRUE.equals(someBoolean) // null-safe ✅
"expected".equals(someString) // null-safe ✅
// 위험한 패턴
someBoolean.equals(true) // someBoolean이 null이면 NPE 💥
Redis 연결이 어디서 이루어지는가
궁금했던 것
CouponRedisRepository 코드를 보면 Redis 연결 정보가 전혀 없는데, 어떻게 Redis와 통신하는지 궁금했다.
@Repository
@RequiredArgsConstructor
public class CouponRedisRepository {
private final RedisTemplate<String, String> redisTemplate;
// 연결 정보가 없는데 어떻게 Redis랑 통신하지?
}
실제 연결 흐름
1. application.yml
spring.data.redis.host / port 설정
↓
2. Spring Boot Auto-config
RedisConnectionFactory Bean 자동 생성 (실제 TCP 연결)
↓
3. RedisConfig.java
RedisConnectionFactory를 주입받아 RedisTemplate Bean 등록
(연결이 아니라 key/value 직렬화 방식만 설정)
↓
4. CouponRedisRepository
@RequiredArgsConstructor로 RedisTemplate 주입받아 사용
각 레이어 역할 정리
레이어 파일 역할
| 설정값 | application.yml | host, port 제공 |
| 연결 생성 | Spring Boot Auto-config | RedisConnectionFactory 자동 생성 (코드 없음) |
| Bean 설정 | RedisConfig.java | String 직렬화 설정 추가 |
| 실제 사용 | CouponRedisRepository | 명령어 실행 |
핵심 정리
CouponRedisRepository는 Redis 연결을 직접 하지 않는다.
Spring이 application.yml을 읽고 자동으로 만들어준 RedisConnectionFactory가
RedisTemplate에 이미 연결된 상태로 주입되기 때문에,
Repository는 그냥 가져다 쓰기만 하면 된다.
이것이 Spring의 의존성 주입(DI) + Auto-configuration 패턴이다.
'Study' 카테고리의 다른 글
| TIL - MSA에서 HTTP vs Kafka, Spring Cloud Gateway (0) | 2026.07.23 |
|---|---|
| TIL - Docker restart 정책 비교 (no / on-failure / always / unless-stopped) (0) | 2026.07.22 |
| TIL - G1GC vs ZGC : GC 방식 차이와 선택 기준 (0) | 2026.07.18 |
| [내일배움캠프 TIL] - Lettuce Redis 명령이 Zipkin에 안 나타나는 이유 & 해결 (0) | 2026.07.06 |
| [내일배움캠프 TIL] - 부하 테스트 지표와 p95가 국룰인 이유 (0) | 2026.07.03 |