backend
  • README
  • DOCS
    • Java Docs
    • Servlet Docs
    • JSP Docs
    • DB & SQL Docs
    • Spring Boot Docs
    • Spring Security Docs
    • AWS Docs
  • 설치하기
    • Intellij 설정
  • 자바
    • 01 Java란?
    • 02 자바 시작하기
    • 03 자료형과 연산자
    • 04 제어문
    • 05 메소드
    • 06 클래스 기초
      • Static 보충자료
      • 패키지 보충자료
    • 07 객체지향 프로그래밍
    • 08 클래스 더 알아보기
      • 열거형 ENUM 보충자료
    • 09 클래스와 자료형
      • 다형성 보충자료
      • 제네릭 보충자료
    • 10 컬렉션 프레임워크
      • 컬렉션 프레임워크 보충자료
    • 11 람다식과 함수형 프로그래밍
      • 람다식 보충자료
    • 12 오류 대비하기
      • 오류 보충자료
    • 13 멀티태스킹
      • 멀티태스킹 보충자료
    • 교재보충
      • java.lang
  • 스프링
    • 서블릿, JSP
      • 05 Servlet(서블릿)
        • 서블릿 보충자료
        • 서블릿 추가코드
        • XML, YAML, JSON
      • 06 JSP(자바 서버 페이지)
        • JSP 보충자료
      • 07 JSTL(JSP 스탠다드 태그 라이브러리)
        • JSTL 보충자료
      • 08 Cookie(쿠키), Session(세션)
      • 09 서블릿,필터,리스너
        • 서블릿,필터,리스너 보충자료
      • 11 도서관리 프로젝트 실습
    • Spring Boot
      • 01 스프링 등장 배경, 객체지향
        • 스프링 등장 배경, 객체지향 보충자료
      • 02 IOC(제어의 역전), DI(의존성 주입)
        • IOC 보충자료
        • DI 보충자료
      • 03 스프링 구조
        • 스프링 구조 보충설명
      • 04 테스트코드 실습
      • 05 스프링 빈 설정
        • 스프링 빈 설정 보충자료
      • 06 싱글톤
        • 싱글톤 보충 자료
      • 07 스프링 빈 자동설정
        • 스프링 빈 자동설정 보충자료
      • 08 빈 생명주기
        • 빈 생명주기 보충자료
      • 09 빈 스코프
        • 빈 스코프 보충자료
      • 10 스프링 MVC
        • 스프링 MVC 보충자료
        • 데이터베이스 연동에 필요한 부분
      • 11 Validation(검증)
        • Validation(검증) 보충자료
      • 12 Bean Validation(빈검증)
        • Bean Validation(빈검증) 보충자료
      • 13 예외처리
        • 예외처리 보충자료
      • 14 타입변환
      • 15 JDBC(Java Database Connectivity)
      • 16 커넥션풀
      • 17 트랜잭션
        • 트랜잭션 보충자료
      • 18 JDBC 템플릿 활용
      • 19 MyBatis
      • 20 JPA(Java Persistence API)
      • 22 게시판 프로젝트 실습
    • Spring Security
      • 보안(Security)
      • Spring Security
      • 2. Spring Security 알아보기
        • 보안 위협 실제 사례와 방어 전략
      • 3. Spring Security 기본 동작 흐름
      • 4. Spring Security로 인증 권한 추가하기
        • Spring Security의 인증 및 인가
      • 5. Spring Security에서 세션 관리하기
        • 세션(Session)과 쿠키(Cookie) 비교, 토큰(Token)과의 관계
        • 해싱 및 해싱알고리즘
        • base64
      • 6. Spring Security 악용 보호
        • SameSite
      • 7. Spring Security로 인가 권한 추가하기
      • 8. Bcrypt(비크립트) 암호화
      • OAuth2 적용하기
  • 네트워크
    • HTTP
    • OSI 7계층
  • DB&SQL
    • 01 Database(데이터베이스)와 SQL 개요
    • 02 관계형 모델
    • 03 집합
    • 04 JOIN 연산
    • 05 MySQL
      • 세이브포인트
      • DBeaver, Mysql 오토커밋 설정 관련
    • 06 SQL 기초
      • 예시데이터 쿼리문
    • 07 SQL 실습
      • 실습 스키마
    • 08 Join 활용
      • 실습스키마
    • 09 SQL 활용
      • 실습스키마
    • 10 정규화
      • 실습 스키마
    • 데이터타입
    • 예시 프로젝트 스키마 구성
  • AWS
    • SSL 연결하기
    • 보충설명
Powered by GitBook
On this page
  • IoC(Inversion of Control, 제어의 역전)
  • 1. IoC란 무엇인가?
  • 2. IoC의 주요 개념
  • 3. IoC의 장점
  • 4. IoC의 실제 구현 방식
  • 5. IoC 컨테이너의 역할
  • 6. IoC 적용의 사례
  • 7. IoC의 핵심 목표
  1. 스프링
  2. Spring Boot
  3. 02 IOC(제어의 역전), DI(의존성 주입)

IOC 보충자료

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

1. IoC란 무엇인가?

IoC(Inversion of Control, 제어의 역전)는 프로그램의 흐름을 제어하는 주체를 개발자가 아닌 외부 프레임워크나 컨테이너에 위임하는 설계 원칙입니다. 객체가 의존성을 직접 관리하지 않고 외부에서 주입받아 사용하는 방식을 통해 유연성과 확장성을 높이는 데 목적이 있습니다.


2. IoC의 주요 개념

전통적인 객체 생성 방식

  • 객체가 필요한 의존 객체를 직접 생성합니다.

  • 예: Car 클래스 내부에서 Engine 객체를 직접 생성하여 사용.

    public class Car {
        private Engine engine;
        
        public Car() {
            this.engine = new Engine(); // 직접 생성
        }
    }

IoC 방식

  • 의존 객체의 생성 및 관리 책임을 외부 컨테이너가 담당합니다.

  • 객체는 필요한 의존성을 외부로부터 주입받아 사용합니다.

    public class Car {
        private Engine engine;
    
        public Car(Engine engine) { // 의존성 주입
            this.engine = engine;
        }
    }

3. IoC의 장점

  1. 유연성 증가

    • 객체 간의 결합도를 낮추고, 코드 변경 없이도 다른 구현체로 쉽게 교체 가능.

  2. 테스트 용이성

    • 의존성을 외부에서 주입받으므로, 테스트 시 Mock 객체를 쉽게 주입 가능.

  3. 재사용성 향상

    • 객체의 생성 및 관리 책임이 분리되므로 객체 자체는 독립적으로 설계 가능.

  4. 유지보수 용이

    • 객체 간의 의존 관계를 한 곳에서 관리하므로, 유지보수가 쉽고 오류 발생 가능성을 줄임.


4. IoC의 실제 구현 방식

의존성 주입(Dependency Injection)

IoC의 가장 일반적인 구현 방법으로, 외부에서 객체의 의존성을 주입받는 방식입니다.

1. 생성자 주입(Constructor Injection)

  • 생성자를 통해 의존성을 주입받는 방식.

  • 장점: 의존성이 명확하고 불변성을 보장.

    public class Car {
        private final Engine engine;
    
        public Car(Engine engine) { // 의존성 주입
            this.engine = engine;
        }
    }

2. 세터 주입(Setter Injection)

  • 세터 메서드를 통해 의존성을 주입받는 방식.

  • 장점: 선택적인 의존성 주입 가능.

    public class Car {
        private Engine engine;
    
        public void setEngine(Engine engine) {
            this.engine = engine;
        }
    }

3. 필드 주입(Field Injection)

  • 필드에 직접 의존성을 주입받는 방식.

  • 단점: 테스트 시 Mock 객체 주입이 어려움.

    public class Car {
        @Autowired
        private Engine engine;
    }

5. IoC 컨테이너의 역할

IoC 컨테이너는 객체의 생명 주기와 의존성을 관리하는 역할을 합니다. 대표적인 예는 스프링 컨테이너입니다.

주요 기능

  1. 빈 관리

    • 컨테이너에 등록된 객체(빈)의 생성, 초기화, 소멸 관리.

  2. 의존성 주입

    • 객체 간의 의존성을 컨테이너에서 주입.

  3. 설정 관리

    • XML, Java Config, 어노테이션을 통해 객체 설정.

스프링 컨테이너 예제

@Configuration
public class AppConfig {
    @Bean
    public Engine engine() {
        return new Engine();
    }

    @Bean
    public Car car(Engine engine) {
        return new Car(engine); // 의존성 주입
    }
}

6. IoC 적용의 사례

스프링 프레임워크

  • 스프링은 IoC 컨테이너를 통해 객체의 생성과 의존성 주입을 관리합니다.

  • 개발자는 빈 설정만 정의하고, 객체 생성과 관리는 스프링 컨테이너가 처리합니다.

@Component
public class Engine {
}

@Component
public class Car {
    private final Engine engine;

    @Autowired
    public Car(Engine engine) { // 의존성 주입
        this.engine = engine;
    }
}

실행 시

ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
Car car = context.getBean(Car.class); // 스프링이 객체 생성 및 주입

7. IoC의 핵심 목표

IoC는 객체 간의 결합도를 줄이고, 코드의 유연성과 재사용성을 극대화하는 데 있습니다. 개발자는 객체의 생성 및 의존성 관리에서 벗어나, 객체의 본래 역할에만 집중할 수 있습니다.

Previous02 IOC(제어의 역전), DI(의존성 주입)NextDI 보충자료

Last updated 4 months ago