웹 개발

Map 등을 DI 할 수는 없을까?

_KH_ 2025. 4. 25. 17:15

Spring Boot에서 Map 등을 private 멤버변수를 통해 “DI”해서 사용할 수는 없는가?

 

 

 

⇒ 불가능하다. 일반 자바 컬렉션(List, Map) 등은 DI 대상이 아니다.

Spring에서 @Autowired를 사용해서 의존성을 주입하려면 주입받을 객체는 Spring Bean으로 등록되어 있어야 하는데, Map/ List / Set / String / Integer 등은 단순한 자바 객체(POJO)이고, 직접적으로 스프링 컨테이너에 Bean으로 등록되어 있지 않기 때문에 @Autowired를 붙여 사용할 수 없다.

Map을 꼭 DI해야할 일이 있다면 @Bean을 붙여 직접 등록하는 것이 낫다.

하지만 보통 필요한 곳에서 직접 new HashMap<>()해서 사용하는 경우가 대부분이다. 특히 컨트롤러 내 결과값 리턴용 Map은 메서드 내 지역변수로 선언해서 쓰는게 보편적이다. 왜냐면 비효율적이기 때문에.


DI는 서비스 객체나 DAO처럼 재사용이 필요한 객체를 미리 만들어두고 필요한 곳에 주입하여 관리 효율성을 높이는 것이 목표이다. 반면, Map 같은 경우 주로 메서드 내부에서만 쓰이며, 데이터를 일시적으로 담아서 사용 후 버리는 일회성 객체이기 때문에 DI해서 사용할 시 오히려 관리해야 할 Bean만 늘어나기 때문에 비효율적이다.


+) Map을 DI하면 싱글톤 SCOPE로 관리된다!! 스프링 컨테이너는 싱글톤 패턴을 유지하는 방식으로 관리하기 때문에 멤버변수로 Map을 달면 하나의 자료형을 하나로만 일치시키는 스프링 컨테이너의 방식 때문에 여러 요청들이 하나의 Map 인스턴스를 공유하게 된다. 이러면 값 덮어쓰기나 동기화 문제가 발생한다.


정말 의도적으로 애플리케이션 전역에서 공유해야 하는 상태가 있는 경우에만 Map을 DI로 써도 된다.

'웹 개발' 카테고리의 다른 글

Repository와 Impl  (0) 2025.04.27
Eclipse와 VSCode  (0) 2025.04.26
XML 파일로 AOP 적용하기  (0) 2025.04.24
AOP  (0) 2025.04.23
이메일 API 코드를 Spring Boot로 변환할 때 경고 처리  (0) 2025.04.22