
Spring은 JAVA에서 많이 사용하는 프레임워크이다.
스프링의 핵심 가치는 아래와 같다
“애플리케이션 개발에 필요한 기반을 제공해서 개발자가 비즈니스 로직 구현에만 집중할 수 있도록 하는 것”
가장 유명한것은 IoC(제어의 역전), DI(의존성 주입), AOP(관점 지향 프로그래밍)으로 볼 수 있다.
IoC(Inversion of Control) : 제어의 역전
사용할 객체를 직접 생성하지 않고, 객체의 생명주기 관리를 외부(스프링 컨터에너)에 위임 하는 것
외부는 스프링 컨테이너(Spring Container) 또는 IoC 컨테이너(IoC Container)를 의미한다.
객체의 관리를 컨테이너에 맡겨 제어권이 넘어간 것을 제어 역전이라고 부르며, 제어 역전을 통해 의존성 주입(DI : Dependency Infection), 관점 지향 프로그래밍(AOP : Aspect-Oriented Programming) 등이 가능해진다.
IoC의 장점

Sercie Locator 패턴
의존성을 관리하는 방법 중 하나로, 클라이언트가 서비스를 직접 찾을 수 있도록 중앙 집중식 레지스트리를 제공한다. 이를 통해 클라이언트와 서비스 간의 결합도를 낮추고, 모듈화 수준을 높일수 있다.
Lookup 기능
주어진 키나 식별자를 사용하여 데이터나 객체를 찾는 과정을 의미한다. 이는 데이터베이스, 컬렉션, 또는 다른 저장소에서 특정 항목을 검색할 때 사용한다.

Events Delegates는 개념은 거의 같은데 delegate는 어디서든 호출이 가능하고 event는 public 한정자로 생성해도 생성된 클래스 내에서만 호출이 가능하다.
다른 곳에서는 직접호출 불가능하다. 만약 다른 클래스에서 사용하려면 Update처럼 뭔가를 만들어서 안에 넣어서 사용해야 된다. event는 메서드르 추가할 때 꼭 +=, -=를 사용한다.
의존성 주입 DI(Dependency Injection)
제어 역전의 방법 중 하나로, 사용할 객체를 직접 생성하지 않고 외부 컨테이너가 생성한 객체를 주입받아 사용하는 방식

스프링에서 의존성을 주입하는 방법은 세 가지가 있다.
스프링에서는 @Autowired 라는 어노테이션(annotation)을 통해 의존성을 주입할 수 있다.
(스프링 4.3 이후 버전은 생성자를 통해 의존성을 주입할 때 @Autowired 어노테이션을 생략할 수도 있다)
예제)
일반적인 자바 객체 생성
@RestController
public class NoneDIController {
private MyService service = new MyServiceImpl();
//Controller Codes
}
생성자를 통한 의존성 주입
@RestController
public class DIController {
**MyService myService;
@Autowired
public DIController(MyService myService) {
this.myService = myService;
}**
@GetMapping("/di/hello")
public String getHello(){
return myService.getHello();
}
}
필드 객체 선언을 통한 의존성 주입
@RestController
public class FieldInfectionConotroller {
**@Autowired
private MyService myService;**
}
setter 메서드를 통한 의존성 주입
@RestController
public class SetterInjectionController {
**MyService myService;
@AutoWired
public void setMyService(MyService myService){
this.myService = myServie;
}**
}
스프링 공식 문서에서 권장하는 의존성 주입 방법은 생성자를 통해 의존성을 주입하는 방식!!
다른 방식과는 다르게 생성자를 통해 의존성을 주입받는 방식은 레퍼런스 객체 없이 객체를 초기화할 수 없게 설계할 수 있기 때문이다.