JNDI 조회 대 CDI 주입
취약한 JNDI 문자열 조회를 타입 안전 CDI 주입으로 대체합니다.
코드 비교
✕ Java EE
public class OrderService {
private DataSource ds;
public void init() throws NamingException {
InitialContext ctx = new InitialContext();
ds = (DataSource) ctx.lookup(
"java:comp/env/jdbc/OrderDB");
}
public List<Order> findAll()
throws SQLException {
try (Connection con = ds.getConnection()) {
// query orders
}
}
}
✓ Jakarta EE 8+
@ApplicationScoped
public class OrderService {
@Inject
@Resource(name = "jdbc/OrderDB")
DataSource ds;
public List<Order> findAll()
throws SQLException {
try (Connection con = ds.getConnection()) {
// query orders
}
}
}
이 코드에 문제가 있나요? 알려주세요.
모던 방식이 더 나은 이유
타입 안전 연결
주입 오류는 런타임 문자열 조회가 아닌 배포 시점에 잡힙니다.
보일러플레이트 없음
InitialContext 생성, JNDI 이름 문자열, NamingException 처리를 제거합니다.
테스트 가능
의존성은 주입된 필드로, 단위 테스트에서 목으로 쉽게 대체할 수 있습니다.
이전 방식
JNDI 조회
모던 방식
CDI @Inject
JDK 버전
11
난이도
중급
JDK 지원
JNDI 조회 대 CDI 주입
사용 가능
Jakarta EE 8 / Java 11 이후 널리 사용 가능
동작 원리
전통적인 JNDI 패턴은 문자열 기반 리소스 조회를 강제하여 타입 불일치가 런타임까지 잡히지 않습니다. CDI @Inject는 컨테이너가 의존성을 해석하도록 하여 타입 불일치를 배포 시점에 잡습니다.
관련 문서