IoC
IoC는 객체의 생성 및 관리 권한을 개발자가 직접 하지 않고, Spring Container가 대신 처리하는 개념
즉, 객체의 생성, 초기화, 소멸 등의 작업을 Spring이 대신 해주기 때문에 비즈니스 로직에 집중할 수 있다.
package org.springframework.samples.petclinic.sample;
public class SampleController {
SampleRepository sampleRepository;
public SampleController(SampleRepository sampleRepository) {
this.sampleRepository = sampleRepository;
}
public void doSomething() {
sampleRepository.save();
}
}
package org.springframework.samples.petclinic.sample;
public class SampleRepository {
public void save() {
}
}
package org.springframework.samples.petclinic.sample;
import org.junit.jupiter.api.Test;
class SampleControllerTest {
@Test
public void testDoSomething() {
SampleRepository sampleRepository = new SampleRepository(); // 직접 생성 및 주입
SampleController sampleController = new SampleController(sampleRepository);
sampleController.doSomething();
}
}
IoC가 적용되지 않은 코드
위 코드는 SampleRepository와 SampleController의 인스턴스를 개발자가 직접 생성하고 있다.
Spring IoC에선 객체(Bean)를 직접 생성하지 않고, Spring이 관리해야 한다.
@Controller
class OwnerController {
private final OwnerRepository owners;
public OwnerController(OwnerRepository owners) {
this.owners = owners;
}
IoC가 적용된 코드
위 코드는 Spring이 OwnerRepository의 구현체를 자동으로 생성해서 OwnerController에 주입해 준다.
즉 OwnerController가 생성될 때 Spring Container에서 관리하는 OwnerRepository Bean을 주입해 주는 것이다.
위 방식은 생성자 주입 방식이다.
스프링 컨테이너 작동 방식
- 스프링 컨테이너가 OwnerRepository 객체를 미리 한 개 생성(Bean 등록)해서 관리함.
- 필요할 때마다 새로운 객체를 생성하는 것이 아닌, 같은 객체(싱글톤 Bean)을 주입
헷갈렸던 부분
1. 스프링이 자동으로 생성해준다고 했는데, 그럼 필요시에만 생성하고 주입하는가?
- 필요할 때마다 객체를 새로 생성해서 사용하는 것이 아니라, spring이 관리하는 하나의 인스턴스를 재사용한다.
2. @Bean 어노테이션이 없는데 어떤걸 보고 자동으로 주입되는가?
- spring boot, spring framework에서는 @Component, @Service, @Repository, @Controller 같은 어노테이션이
달린 클래스들을 자동으로 빈으로 등록한다.
public interface OwnerRepository extends JpaRepository<Owner, Integer> {..}
OwnerRepository는 JPA에서 제공하는 JpaRepository를 상속한다.
JpaRepository를 상속하면 자동으로 구현체(프록시 객체)를 생성해서 빈으로 등록하게 된다.
따라서 @Repository 어노테이션을 붙이지 않아도 내부적으로 알아서 붙여서 관리하게 된다.
즉, @Bean을 직접 등록하지 않아도 Spring이 알아서 (@ComponentScan이)
Repository 인터페이스 -> 구현체 생성 -> 빈 등록 -> 주입 해주는 것
'Spring' 카테고리의 다른 글
스프링 핵심 원리(1) (0) | 2025.02.19 |
---|---|
스프링 기초 (1) | 2025.02.13 |
Maven 이란? (0) | 2024.08.28 |
Path Variable과 Request Param (0) | 2024.08.06 |
Redis를 사용한 선착순 쿠폰발급 시스템 (0) | 2024.03.21 |