SpringBoot

Spring 입문 - DI (의존성 주입), IoC (제어의 역전), Bean

공부처음하는사람 2023. 12. 26. 21:11

Dependency Injection (의존성 주입)

  • 객체가 자체적으로 필요로 하는 의존성을 생성하는 것이 아니라, 외부에서 주입받는 디자인 패턴입니다.
  • 객체간의 결합도를 낮추기 위해 사용합니다.
  • 주로 Contructor 기반 주입, Field 기반 주입, Setter 기반 주입이 있습니다.

 

DI를 사용하지 않을 경우

package org.example.ChickenStore

class ChickenStoreWithoutDI {

    private val chicken: Chicken = FriedChicken()

    fun getCookedChicken(): Chicken {
        chicken.cook()
        return chicken
    }
}

class ChickenStoreWithoutDI2 {

    private val chicken: Chicken = BakedChicken()

    fun getCookedChicken(): Chicken {
        chicken.cook()
        return chicken
    }
}


fun main() {
    val store = ChickenStoreWithoutDI()
    val chicken = store.getCookedChicken()

    val store2 = ChickenStoreWithoutDI2()
    val bakedChicken = store2.getCookedChicken()
}

 

결합도가 높기 때문에, 구운치킨 (Baked Chicken)을 추가하려면 새롭게 클래스를 추가해야하는 문제가 발생한다.

 

DI를 사용한 경우

class ChickenStoreWithDI(private val chicken: Chicken) {

    fun getCookedChicken(): Chicken {
        chicken.cook()
        return chicken
    }
}

fun main() {

    val chicken = FriedChicken()
    val bakedChicken = BakedChicken()
    val store = ChickenStoreWithDI(bakedChicken)
    val cookedchicken = store.getCookedChicken()

}

 

단순히 main 에 bakedchicken을 정의하고 bakedchicken을 넘겨주기만 하면 된다.
결합도를 낮추고 외부에서 명시적으로 클래스의 인스턴스를 생성할 때, 같이 주입이 되어야한다고 표기해주면
훨씬 유연하게 코드작성을 할 수 있고 재활용가능성이 높아지게 된다.

constructor 기반 주입, Field 기반 주입, Setter 기반 주입 중 Constructor기반 주입을 많이 사용한다.

 

 

 

생성자 기반 주입을 사용하는 이유는 다음과 같다.

  1. 의존되는 객체의 불변성 확보
    • Field나 Setter 기반 주입은 var를 사용한다. 생성자는 val을 사용함
  2. 순환참조 방지
  3. 테스트 코드 작성의 용이

IoC (Inversion of Control, 제어의 역전)

  • 객체의 생성과 생명주기를 외부에서 제어하는 디자인 패턴이다.
  • IoC는 굉장히 넓은 의미로, DI를 포함하는 개념이다.
  • Ioc Container, 혹은 최근 DI개념을 주로 사용하기 때문에 DI Container라고도 불린다.
  • 이 DI Container를 통해서, 우리가 작성한 Class를 Spring에게 관리를 맡긴다고 이해하면 되겠다.

 

Spring Bean이란?

  • DI Container가 관리하는 객체를 Spring Bean이라고 한다.
  • Annotation을 통해 이루어진다. (@로 시작되며 프로그램 코드에 부가적인 정보를 제공한다.)
  • Bean은 기본적으로 Singleton으로 설정된다. (변경이 필요한 경우 변경이 가능함)

 

 


 

연휴 기간동안 학습이 부족했던 기초 문법강의를 마쳤다. 

 

어느정도 이해를 하긴 한 것 같은데, 사실 급한게 숙련과제인 CRUD todo list 구현인데.. 시간낭비를 한게 아닌가 걱정된다.

 

오늘 학습시간동안에 입문강의를 끝내고, 야간에 숙련강의를 들을 예정이다.

 

아직 시작하지 않았지만 기대 반, 두려움 반이다.

 

불면증이 점점 더 심해진다. 오늘은 한 2~3시간정도밖에 못잔 것 같다.

 

생체리듬이 완전 개박살이 났다. 낮 시간에 제 정신을 유지하기가 너무 힘들다....

 

국산 식물성 멜라토닌이라고 해서 쿠팡에서 주문했는데, 효과가 단 하나도 없다. 직구로 구입해야겠다..

 

오늘은 12시까지만 학습하고 일찍 누워서 쉬어야 할 것 같다.

 

내일까지 숙련 강의 완강하는게 목표인데, 완강을 목표로 잡으면 공부가 잘 될지........

 

연휴때 스프링 강의를 들었어야 됬나 후회되려고 한다..ㅋㅋ;

 

 

오늘은 꼭 일찍 잠들길.................. :(

 

'SpringBoot' 카테고리의 다른 글

Maven 이란?  (0) 2024.08.28
Path Variable과 Request Param  (0) 2024.08.06
Redis를 사용한 선착순 쿠폰발급 시스템  (0) 2024.03.21
Oauth2.0 소셜로그인 구현  (0) 2024.02.17