스프링 - IoC

2025. 2. 5. 11:00·Spring

 

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
'Spring' 카테고리의 다른 글
  • 스프링 핵심 원리(1)
  • 스프링 기초
  • Maven 이란?
  • Path Variable과 Request Param
공부처음하는사람
공부처음하는사람
  • 공부처음하는사람
    lazzzykim
    공부처음하는사람
  • 전체
    오늘
    어제
    • 분류 전체보기 (127)
      • Kotlin (31)
      • Java (55)
      • Spring (18)
      • Algorithm (3)
      • TroubleShooting (1)
      • 내일배움캠프 프로젝트 (14)
      • Setting (2)
      • ... (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
    • 글쓰기
  • 링크

  • 인기 글

  • 태그

    제네릭
    spring
    래퍼클래스
    내일배움캠프
    김영한
    생성자 주입
    언체크예외
    다형성
    빈 생명주기
    중첩클래스
    OCP
    @Component
    Di
    java
    배열
    싱글톤
    김영한의 실전자바
    캡슐화
    kotlin
    김영한의 실전 자바
  • hELLO· Designed By정상우.v4.10.3
공부처음하는사람
스프링 - IoC
상단으로

티스토리툴바