Enterprise 중급

Singleton EJB 대 CDI @ApplicationScoped

더 간단한 공유 상태 관리를 위해 Singleton EJB를 CDI @ApplicationScoped 빈으로 대체합니다.

✕ Java EE
@Singleton
@Startup
@ConcurrencyManagement(
    ConcurrencyManagementType.CONTAINER)
public class ConfigCache {
    private Map<String, String> cache;

    @PostConstruct
    public void load() {
        cache = loadFromDatabase();
    }

    @Lock(LockType.READ)
    public String get(String key) {
        return cache.get(key);
    }

    @Lock(LockType.WRITE)
    public void refresh() {
        cache = loadFromDatabase();
    }
}
✓ Jakarta EE 8+
@ApplicationScoped
public class ConfigCache {
    private volatile Map<String, String> cache;

    @PostConstruct
    public void load() {
        cache = loadFromDatabase();
    }

    public String get(String key) {
        return cache.get(key);
    }

    public void refresh() {
        cache = loadFromDatabase();
    }
}
이 코드에 문제가 있나요? 알려주세요.
🪶

적은 어노테이션 노이즈

@ConcurrencyManagement, @Lock, @Startup이 없습니다 — 단일 @ApplicationScoped 어노테이션만.

🔧

유연한 동시성

정확히 필요한 스레드 안전성을 위해 java.util.concurrent 잠금이나 volatile을 사용합니다.

🧪

쉬운 테스트

일반 CDI 빈은 EJB 컨테이너 없이 테스트에서 직접 인스턴스화할 수 있습니다.

이전 방식
@Singleton EJB
모던 방식
@ApplicationScoped CDI
JDK 버전
11
난이도
중급
Singleton EJB 대 CDI @ApplicationScoped
사용 가능

Jakarta EE 8 / Java 11 이후 널리 사용 가능

Singleton EJB는 동시성 관리(@Lock, @ConcurrencyManagement)를 번들로 제공합니다. CDI @ApplicationScoped는 선택한 동시성 메커니즘과 결합된 간단한 대안입니다.

공유 𝕏 🦋 in