스프링 - Bean, IOC, DI

산하·2021년 12월 3일
0

Spring

목록 보기
1/6
post-thumbnail

9월 중순 스프링을 처음 접해 거의 아무것도 모르는 상태일 때 DI와 IOC에 대한 정리를 했었다. 그 때 작성했던 내용에 추가 작성!

Bean

  • Spring Ioc 컨테이너에 의해 관리(생명주기(life Cycle)관리)되는 객체

    Bean 설명을 보다가 4주차 강의애서 비슷한 개념 설명을 들은 것 같은 기억이 나서 찾아보았다

  • 내가 실행시키지 않아도 주기적으로 목록을 업네이트 하는 클래스였는데 bean의 개념 설명을 보니 @component가 떠올랐다!

  • @component여기 정의한 이 class를 Bean으로 등록해줘! 라는 말과 같다!

  • 위 주석과 같이 스프링이 필요할 때 자동으로 생성하고 실행시키고 중지시키는 클래스 목록, 즉 컨테이너에 넣는 것이고 목록 하나하나가 Bean이 된다!


    + 추가

@Bean@Component의 차이

@Bean

  • 외부 라이브러리를 bean으로 등록하고 싶을 때 사용
  • JavaConfig가 @Bean이 붙은 메소드를 만나면 해당 메소드를 실행하고 반환값을 BeanFactory에 Bean으로 등록
  • 기본적으로 bean의 이름과 메소드의 이름은 동일
  • @Bean(initMethodName="메소드이름")으로 Bean 이름 변경 가능

@Component

  • 사용자가 직접 생성한 클래스를 Bean으로 등록할 때 사용
  • 런타임시 @Component를 찾아 Bean으로 등록


IOC

제어의 역전 Inversion Of Control

  • 객체 생명주기 관리를 개발자가 아닌 컨테이너가 대신 해준다.
  • Container는 어플리케이션을 구성하는 Bean들을 관리하기 위해 IOC를 사용한다.

+ 추가

  • 순수 자바 프로그램은 사용자가 객체를 직접 생성하고 그 객체들이 프로그램 플로우를 결정했다.
    객체 생성 = 제어의 주체 = 사용자
  • 제어의 역전은 사용자에게 있던 제어권을 다른 주체가 가지게 되는 것을 뜻한다. 즉 스프링에서 말하는 IOC는
    객체 생성 = 제어의 주체 = 스프링 컨테이너가 되는 것을 의미한다!

DI

의존 관계 주입(Dependency Injection)

개념

  • 어떤 객체가 사용하는 객체(의존하는 객체)를 직접 만들어 사용하지 않고, 주입 받아 사용하는 방법
  • 사실 말이 뭔가 영어 두단어 줄여서 말해서 뭔가 있는 놈인가 싶은데 별거 없다. 메서드를 기준으로 로직에 사용되는 객체를 메서드 안에서 생성하느냐, 밖에서 생성한 객체를 인자로 받느냐 차이다.
  • 이름도 의존 관계 주입인 만큼 후자가 DI다.

장점

  • 변경사항이 있을 때 주입받는 객체와 메서드에서 쓰이는 객체가 같기 때문에 메서드 밖에서 생성되는 객체와 메서드에서 쓰이는 객체 사이의 의존성이 줄어든다.
  • 의존성이 줄면 객체나 메서드 등 변경사항이 있을 때 서로에게 미치는 영향도 낮아진다.


DI 쉽게 이해하기

쉽게 이해하기라고 9월의 내가 야심차게 써놨는데 지금보니 짠하다... 어떻게든 이해해보려고 하는 노력 칭찬해... 산하야...그때의 노력이 가상해서 기록으로 남길게..

쉬운 이해를 위해 객체간 의존관계를 필름 카메라에 비유했다.

필름 카메라를 예시로 들어보면, 필름카메라는 필름 없이 제 역할을 하지 못하므로

필름카메라는 필름에 의존한다고 할 수 있다.

이 개념을 빌려서 객체간의 의존관계를 설명하자면,

카메라 와 필름 각각을 서로 다른 객체라고 할 수 있고

카메라 객체는 필름 객체에 의존 한다고 할 수 있다.

필름 카메라는 내장형 1회용 필름카메라분리형 다회용 필름카메라로 나눌 수 있다.

내장형 필름카메라는 필름과 카메라를 분리하면 제 역할을 하지 못하기 때문에(강하게 결합되어 있기 때문에)

강한 결합이라고 할 수 있으며, 동시에 유연하지 못한 구조라고 할 수 있다.

교체형 필름 카메라는 필름과 카메라를 분리할 수 있기 때문에(약하게 결합되어 있기 때문에)
약한 결합이라고 할 수 있으며, 동시에 유연한 구조라고 할 수 있다.

이를 코드로 구현해보자!

public class Film {
    public void film(){
}
   
public class FilmCamera {

    	//일회용 필름 카메라
    	public void disposableFilmCamera(){  										
        //카메라 안에 필름이 내장되어 있어서 강한 결합입니다!			
        	Film film = new Film();								
                                                                
   		}												    

    

    public void multiUesFilmCamera(Film film){					
        //카메라에 필름을 넣어준 것이기 때문에 약한 결합입니다!	
        //필름을 카메라에 주입시킨 것이기 때문에 의존성 주입!		
        Film myfilm = film;									
    }                                                            
}															
    

카메라처럼 시각화하면 이렇게 됩니다!

profile
반갑습니다 :) 백앤드 개발자 산하입니다!

0개의 댓글