[Spring] Spring에서의 객체 관리: XML 설정 파일 vs 어노테이션 기반 DI

2024. 10. 4. 11:58·Spring

컨테이너란?

컨테이너는 개발자를 대신해서 객체를 생성하고 관리하는 역할을 한다.

서블릿 컨테이너인 톰캣이 new를 호출하여 서블릿 객체를 만들어주는 것처럼, Spring 컨테이너도 개발자 대신 객체를 생성한다.

아래 코드는 Spring 컨테이너를 구동하는 방식이다.

AbstractApplicationContext factory = new GenericXmlApplicationContext("applicationContext.xml");

 

이 코드에서 컨테이너는 applicationContext.xml 파일을 읽고, 그 안에 정의된 객체(bean)를 생성한다.

다음과 같은 방식으로 객체를 정의할 수 있다. 아래는 applicationContext.xml의 일부 코드이다.

<bean class="test.IPhone" id="apple">
   <property name="watch" ref="aw" />
   <property name="num" value="1234" />
</bean>

 

하지만 XML 설정 방식은 점점 복잡해지고 관리가 어려워지기 때문에, Spring에서는 어노테이션 기반 DI 방식을 지원하게 되었다.


의존성 주입(DI)

DI는 한 객체가 다른 객체의 기능을 필요로 할 때 이를 주입해주는 방식이다.

예를 들어, Controller가 DAO 객체를 필요로 하거나 DAO가 데이터베이스 연결을 필요로 할 때 의존성을 주입받는다.

XML 기반 DI는 applicationContext.xml 파일에서 모든 의존성을 설정하는 방식이다.

<bean class="test.IPhone" id="apple">
   <property name="watch" ref="aw" />
</bean>

 

@ 어노테이션 기반 DI는 코드에서 직접 어노테이션을 사용하여 의존성을 주입한다.

@Autowired 어노테이션을 사용하면 Spring이 자동으로 적절한 객체를 주입해준다.

다음은 @Autowired의 사용 예시이다.

@Component("apple")
public class IPhone implements Phone {
    @Autowired
    private Watch watch;
    
    public void powerOn() {
        watch.powerOn();
    }
}

 

여기서 @Autowired는 타입을 기준으로 자동으로 객체를 주입한다.

 


XML 설정 파일과 어노테이션의 차이

 

  • 객체 생성 방식:
    • XML: <bean> 태그를 사용해 객체를 생성하고 의존성을 설정한다.
    • 어노테이션: @Component와 @Autowired를 사용해 객체와 의존성을 주입한다.
  • 의존성 주입 방법:
    • Setter 주입: Setter 메서드를 통해 의존성을 주입한다. 이는 new 호출 시 에러를 방지하고 유연성을 높인다.
    • 생성자 주입: 객체 생성 시점에 필요한 의존성을 주입한다.
  • 어노테이션 사용의 장점:
    • XML 설정 방식은 설정 파일이 길어지고 복잡해질 수 있지만, 어노테이션은 코드와 설정을 통합하여 관리가 용이하다.
    • @Component는 객체 생성, @Autowired는 의존성 주입을 담당하여 더 간단한 코드를 작성할 수 있게 한다.

@Autowired와 @Qualifier

 

@Autowired는 타입을 기준으로 의존성을 주입하는데, 만약 여러 개의 동일한 타입이 존재하면 모호성 에러가 발생할 수 있다.

위의 에러는 애플워치와 갤럭시워치의 타입이 동일한데, 컴퓨터는 내가 코드에 어노테이션을 정확하게 기입하지 않으면 둘이 정확하게 뭐가 다른지 모른다.

이를 방지하기 위해 @Qualifier를 사용하여 특정 객체를 지정할 수 있다.

@Autowired
@Qualifier("appleWatch")
private Watch watch;

 

 

이처럼 @Qualifier를 사용하면 특정 객체명을 지정해 의존성을 주입할 수 있지만, 실무에서는 자주 사용되지 않는다.

@Qualifier는 성능이 향상되는 것은 아니기 때문이다.

성능에 민감한 프로젝트에서는 다른 방식의 의존성 관리가 더 선호되기도 한다.


요약

Spring에서는 XML 설정 파일과 어노테이션 두 가지 방법으로 객체 관리와 의존성 주입을 할 수 있다.

XML 설정 파일은 구체적인 설정을 제공하지만, 설정이 복잡해질 수 있고, 어노테이션은 간결한 코드를 작성하는 데 도움을 준다.

각 방식의 장단점을 이해하고, 상황에 맞게 활용하는 것이 중요하다.

 

 

'Spring' 카테고리의 다른 글

[Spring] DispatcherServlet, ViewResolver , DI 방식 정리  (0) 2024.10.07
[Spring] Spring DI와 비즈니스 로직  (2) 2024.10.06
[Spring] 의존성 주입  (0) 2024.10.02
[Spring] 스프링 프레임워크  (1) 2024.10.01
스프링 프레임워크  (0) 2024.08.19
'Spring' 카테고리의 다른 글
  • [Spring] DispatcherServlet, ViewResolver , DI 방식 정리
  • [Spring] Spring DI와 비즈니스 로직
  • [Spring] 의존성 주입
  • [Spring] 스프링 프레임워크
yn98
yn98
좌우명 : 여전할 것 인가, 역전할 것 인가? 백엔드 개발자가 되고싶은 역전하고 있는 개발자 꿈나무의 블로그입니다. 개발을 하면서 공부한 것들을 기록합니다. 24.06 ~
  • yn98
    개발 꿈나무
    yn98
  • 전체
    오늘
    어제
    • 분류 전체보기 (131)
      • Python (3)
      • 공부 (7)
      • DB (7)
      • JAVA (24)
      • JSP (9)
      • jQuery (2)
      • HTML (3)
      • Spring (20)
      • 웹 (4)
      • C (1)
      • Git (2)
      • 에러일기 (19)
      • 프로젝트 (6)
      • 책 (21)
        • 멘토씨리즈 자바 (14)
        • 2024 수제비 정보처리기사 (7)
      • 기타 (2)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • GitHub
    • Notion
  • 공지사항

  • 인기 글

  • 태그

    Di
    이벤트 스케줄러
    2-layered 아키텍처
    jsp
    Spring
    스프링 프레임워크
    ViewResolver
    html
    어노테이션
    java
    aop
    멘토씨리즈 자바
    MVC
    @repository
    객체지향
    @service
    정보처리기사 실기
    수제비
    정처기
    오블완
    recoverabledataaccessexception
    정보처리기사
    @Component
    생성자
    DispatcherServlet
    티스토리챌린지
    상속
    정처기 실기
    오버로딩
    codeup 4891 : 행복
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
yn98
[Spring] Spring에서의 객체 관리: XML 설정 파일 vs 어노테이션 기반 DI
상단으로

티스토리툴바