[Spring] 스프링 프레임워크 의존관계

2022. 2. 5. 12:40·Spring

1. 의존 관계에 대한 용어 정리


  • 빈

   IoC 컨테이너가 관리하는 자바 객체

 

 

  • 와이어링 

   애플리케이션 객체 간의 연관관계를 형성해주는 것을 의미

 

 

  • 의존 관계 주입

   빈 식별, 생성 및 와이어링 의존 관계 프로세스를 의존 관계 주입이라고 한다.

 

 

  • IoC(Inversion of Control)

   의존 관계를 만드는 책임을 사용자 본인이 가지는 것이 아니라 프레임워크로 옮기는 것을 뜻한다.

 

 

 

 

 

2. 스프링 IoC 컨테이너가 빈을 식별하는 방법


스프링 IoC 컨테이너는 클래스에서 어노테이션을 보고 클래스의 인스턴스를 생성한다.

어노테이션의 종류는 아래와 같다.

@Component와 그것을 상속한 어노테이션들

 

어노테이션 설명
@Component 스프링 빈을 정의하는 가장 일반적인 방법
스프링에서 관리되는 객체임을 표시하기 위해 사용
@Controller Spring MVC에서 URL 매핑할 때 사용
MVC 중 Controller의 역할을 하기위해 사용되는 어노테이션
@Service 비즈니스 서비스 구성요소로 사용 (비즈니스 로직)
@Repository 데이터베이스에서 데이터에 접근하는 객체의 역할을 수행

 

@Component를 사용하면 전체를 포괄하여 클래스를 생성할 수 있지만, 구체적이지 못하다.

그렇기 때문에 @Component를 사용하기보다는!

용도에 따라 @Controller, @Service, @Repository를 사용하는 것이 관점(Aspect)에 연관성을 부여할 수 있다.

 

 

 

 

 

3. 애플리케이션 컨텍스트 구성 및 컴포넌트 스캔


스프링 프레임워크 초기에는 컨텍스트의 모든 구성이 XML파일로만 가능했지만

현재는 @Configuration 어노테이션을 통해 자바 컨텍스트를 구성한다.

@Configuration어노테이션을 사용한 자바 클래스에

@ComponentScan을 사용, 컴포넌트 스캔을 통해 스프링 IoC 컨테이너가 빈의 위치를 인식할 수 있다.

 

@Configuration으로 생성된 클래스에는 @Bean 어노테이션을 통해 빈을 생성할 수도 있다.

 

코드 예시는 아래와 같다.

import com.bigbell.spring.config;

@Configuration
@ComponentScan(basePackages="com.bigbell.spring")
class SpringContext {
    
    @Bean
    ...
    ...
}

 

 

 

 

4. 의존성 주입 어노테이션


어노테이션 설명
@Autowired 애플리케이션 콘텍스트에서 일치하는 의존관계를 검색
일치 항목이 1개 있다면 와이어링에 성공
일치 항목이 없거나 2개 이상이라면 와이어링에 실패
@Primary를 활용하면 2개 이상일 때도 와이어링 가능
@Qualifier @Qualifier("클래스명") 형태로 사용
@Autowired와 기능은 똑같으나 일치 항목이 2개 이상일 때 사용

 

 

 

이 외에도 @Resource라는 어노테이션도 존재하는데

위의 2개의 어노테이션이 타입을 이용해서 주입할 객체를 검색한다면

@Resource는 빈 이름을 이용해서 주입할 객체를 검색하기때문에 좀 더 세밀한 편이다.

@Resource 어노테이션은 생성자에 적용할 수 없고 필드나 메서드에만 적용할 수 있기때문에 난잡해질 수 있다.

 

대부분의 프로젝트에서는 @Autowired를 사용한 코드가 많다고 한다.

코드 예시는 아래와 같다.

 

 

- 인터페이스와 인터페이스를 상속한 클래스

interface TV {
    public void show();
}


@Component
class WideTV implements TV {
    public void show(){
        ....
    }
}

 

- @Autowired를 사용해 의존성 주입

@Service
public class TVService {
    
    @Autowired
    private TV myTV;
    
    public void show() {
        myTV.show();
    }
}

위와 같이 @Autowired 밑에 TV인터페이스의 myTV를 선언하면

TV인터페이스를 상속한 단 1개의 일치 항목인 WideTV를 연결해준다.

myTV는 WideTV로 와이어링되었으므로 WideTV클래스의 메소드를 사용할 수도 있다.

 

'Spring' 카테고리의 다른 글
  • Spring Boot 환경 QueryDSL 설정 (build.gradle & .kts)
  • [Spring] Controller와 어노테이션
  • [Spring] HTTP Message Converter
  • [Spring] 스프링 프레임워크란?
gakko
gakko
좌충우돌 개발기
  • gakko
    MYVELOP 마이벨롭
    gakko
  • 전체
    오늘
    어제
    • 분류 전체보기 (208) N
      • 끄적끄적 (6)
      • Spring (18)
      • Java (3) N
      • Redis (1)
      • Test (3)
      • 대외활동 (36)
        • 부스트캠프 (23)
        • IT커뮤니티 (5)
        • 글또 (5)
        • 컨퍼런스 (3)
      • Infra (5)
        • Docker (1)
        • Jenkins (1)
        • AWS (1)
      • CS (26)
        • 자료구조 (13)
        • 운영체제 OS (12)
        • 데이터베이스 (1)
      • MySQL (7)
      • Git & GitHub (16)
        • Git (12)
        • Github Actions (1)
        • 기타(마크다운 등) (3)
      • 프로젝트 (2)
      • 리눅스 (6)
        • 기초 (6)
        • 리눅스 서버 구축하기 (0)
      • 후기 (3)
        • Udemy 리뷰 (3)
      • Python (12)
      • 레거시모음 (64)
        • 스프링 (11)
        • 자바 클래스&메소드 (1)
        • 오류해결 (18)
        • JSP & Servlet (12)
        • 자바스크립트 기초 (3)
        • React (2)
        • 이클립스 (1)
        • 알고리즘 문제풀이 (16)
      • 디자인패턴 (0)
  • 블로그 메뉴

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

    • 우진님
  • 공지사항

  • 인기 글

  • 태그

    Spring
    java
    스프링부트
    자바
    운영체제
    알고리즘
    Git
    부스트캠프 7기
    파이썬
    Python
    MySQL
    스프링
    부스트캠프
    자바스크립트
    오류해결
    웹개발
    jsp
    GitHub
    os
    부스트캠프 멤버십
  • 최근 댓글

  • hELLO· Designed By정상우.v4.10.0
gakko
[Spring] 스프링 프레임워크 의존관계
상단으로

티스토리툴바