ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Bean
    Back-end Developer/Server, Spring 2020. 6. 22. 18:53

    졸업 작품을 준비하며 Spring에 대해 처음 접했습니다. (많이 늦게 시작했죠.. 코딩 자체도 늦게 시작했습니다. ㅠ)

    그 이후 다양하게 찾아봤지만 제대로 이해가 어려웠고, 흐름이 와닿지 않아 힘들었던 기억이 납니다.

     

    큰 개발 경험을 두 가지 정도 접해보고, 백기선님의 Spring 강의를 통해 다양한 개념을 잘 잡을 수 있었습니다.

    홍보 아닌 홍보지만.. ㅎㅎ 개념잡기엔 정말 좋은 강의였다 생각합니다.

     

    • 유료지만 혹시 스프링 개발을 몇 번 해보셨다면 꼭 보시는 것을 추천드립니다.
    • 흐름 파악에 좋았던 것 같고, 정석적인 코드 및 개념 습득에 매우 좋았습니다.
    • 실제로 개발할 때는 상황마다 다 다르기 때문에 개발 자체를 위한 실습을 원하신다면 다른 강의를 추천드립니다.

    (이 글에 정리하는 내용 또한 개발 실습을 위한 내용이긴 합니다만, 이 내용을 안다고 해서 개발 자체가 크게 와닿진 않으실 것 같습니다.)

     

     

    Bean

    Spring IoC container가 관리하는 객체, container 내부에 만들어져 있는 객체를 의미

    (IoC container == Application Context, IoC 형태의 코드들을 동작하도록 도와줌)

     

    Bean은 Spring에서 핵심이 되는 개념 중 하나입니다.

    설명만 보면 container라는 곳에 bean을 생성해 두고 쓰는 것을 알 수 있습니다.

    생성해두고 쓴다는 것은 thread pool, connection pool, String pool 등 다양한 곳에서 유사한 개념을 가진 기능들을 볼 수 있습니다.

    낯설게만 느껴지신다면 위의 것들과 비슷한 역할을 한다고 생각하고 접근하시면 좋을 것 같습니다. :)

     

    그렇다면 왜 미리 생성해두고 쓰며, IoC container는 무엇일가요?

     

    우선 Bean에 대해 자세히 알아봅시다.

    Bean은 간단하게 java의 객체라고 생각하시면 됩니다.

    객체라고 다 Bean이냐?라고 하면 그것은 잘못된 이야기입니다.

     

    Bean은 component annotation이 설정되어 IoC Container에 등록된 객체를 의미합니다.

    (component annotation: @Service, @Controller, @Repository, @Configuration...)

    Component scan을 통해 해당 객체들은 Bean으로 등록되고, 반드시 SpringBootApplication 하위 패키지나 클래스에 존재해야 합니다.

    -> 그렇지 않은 경우는 빈을 찾지 못하는 예외가 발생합니다. (빈으로 등록이 안됨)

     

    Bean으로 등록하는 이유는 어떤 장점이 있기 때문이겠죠. 그 장점에 대해서도 간략하게 소개합니다.

     

    1. Spring IoC container -> Bean(Singleton)으로 등록한 객체를 관리

    Bean scope

    • Singleton, Prototype

    - Singleton (IoC 기본 설정): Application 전반에 걸쳐 해당 bean의 instance가 하나만 존재

    • 하나의 같은 객체(container에 이미 생성된)만 사용하여 효율적인 개발이 가능. 
    • 런타임시 성능 최적화에도 유리

    - Prototype: 매번 새로운 instance를 만들어 사용

    (scope에 대한 자세한 내용은 추후 관련 포스팅으로 보완하겠습니다.)

     

    2. 의존성 주입(DI) 가능, 결합도 ↓

    객체지향 코드에서 의존성 주입은 상당히 매력적인 부분이라 생각합니다.

    일반적으로 의존성에 대한 제어권은 해당 의존성을 사용하는 class에서 갖고 있는데요.

    IoC(Inversion of Control) 즉, 제어를 역전시켜 의존성을 밖에서 선언하여 Bean으로 주입 받는 다는 것이 DI, IoC의 이야기입니다.

     

    class에서 자신이 사용할 기능은 직접 만들어 쓴다는 것이 일반적인 의존성입니다.

    코드를 구성한다면 아래와 같이 가능합니다.

    OwnerController.java

    class OwnerController{
    	private OwnerRepository repository = new OwnerRepository();
        
        // Repository에 정의될 기능 (Query를 통한 데이터 조작 등.)
    }

     

    하지만 Spring 개발을 Bean을 통한 의존성을 주입한다면,

    Repository(Service)에서 선언한 기능들을 가져와 Controller에서 동작을 구현하고 view로 넘겨줍니다.

    OwnerController.java

    class OwnerController{
    	@Autowired
    	private OwnerRepository repository;
    
    	// repository 사용
    }

    -> @Autowired를 통해 주입 받는 방법 말고 다른 방법도 존재합니다.

    필드가 아닌 생성자나 setter를 이용한 주입도 있는데 제대로 익히게되면 정리해보도록 하겠습니다.

     

    Repository는 따로 Interface로 구현되어있다고 가정했습니다.

    이렇게 사용처에서 직접 구현하는 것이 아닌 외부에서 생성해두고 가져다 쓰는 것의존성 주입이라고 합니다.

     

    이러한 코드를 작성하게 된다면 결합도는 낮아지고, 그만큼 프로그램 수행구체적 구현의 분리를 가능하게 합니다.

    즉, 코드의 수정도 간편해지고, 프로그램의 모듈성 또한 높아지겠죠.

    3. Life cycle interface 지원

    Spring IoC Container에 포함된 Bean만 적용 가능.

    -> 이를 통한 부가적인 기능 생성 가능.

     


     

    [정리]

    Bean이란,

    IoC container(= Application Context)에서 관리하는 객체를 지칭합니다.

     

    Component Annotation 설정이 되어있는 객체는 Component scan을 통해 IoC container 내부의 bean으로 등록됩니다.

     

    Component scan은 SpringBootApplication 하위 패키지 및 클래스에만 적용되며, 그 외의 객체는 '@Component'를 지정해도 등록이 불가능합니다.

     

    Bean으로 등록하면, 아래와 같은 장점들이 존재했습니다.

    • Bean's scope = singleton / DI / Life cycle Interface

    이외에도 IoC, DI 관련한 내용들을 간략히 정리해봤습니다.

    다음엔 Bean scope에 대한 내용과 POJO(AOP, IoC, PSA)에 대한 내용을 집중적으로 포스팅 해볼까 합니다.

    (아마도 Bean scope부터 할 것 같네요.)

     

     

     

     

    코드는 '백기선님의 Spring Framework 강의' 중 발췌된 부분도 있기 때문에 무단 복제는 자제해 주세요.

    잘못된 내용이나, 이해가 잘 안되는 부분은 댓글로 알려주시면 늦지않게 답변 드리겠습니다. 감사합니다.

    반응형

    'Back-end Developer > Server, Spring' 카테고리의 다른 글

    REST API (1)  (0) 2020.07.17
    AOP  (0) 2020.06.29
    POJO  (0) 2020.06.28
    Proxy (bean scope)  (0) 2020.06.24
    Bean 그리고 scope  (0) 2020.06.23

    댓글

Designed by minchoba.