본문 바로가기

Study

TIL - Boolean.TRUE.equals()를 쓰는 이유

728x90
반응형

배운 것

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 패턴이다.

반응형