Spring

DI, IoC, Bean

장진혁 2023. 3. 12. 18:37
DI와 IoC는 TIL로 글을 쓴적이 있다.

https://jjinhyeok.tistory.com/50

 

3주차) 주특기 입문 - IoC 와 DI

자바에서 스프링으로 넘어오면서 CRUD를 경험해보면서 MVC패턴이 어떤 로직으로 이동되는지 신기하기도하고 편하게 개발할 수 있다고 생각한다. 어제 TIL에서 MVC패턴에 대해서 알아보았는데 밑에

jjinhyeok.tistory.com

3주차 때 개념을 배우고 5주차가 지난 지금 까먹은 개념도 있다.
그래서 다시한번 복습을 하면서 기억을 되새겨 볼려고한다.
의존관계 주입 DI(Dependency Injection)

객체 지향 프로그래밍에서 일반적으로 사용되는 디자인 패턴 중 하나로, 객체 간의 의존성을 느슨하게 결합시키고, 유연하고 확장 가능한 코드를 작성할 수 있도록 해줍니다.

예를 들어, A 객체가 B 객체를 사용한다면, A 객체는 B 객체에 의존하고 있다. 이 때, A 객체는 B 객체를 직접 생성하거나 참조하는 것이 일반적이다. 그러나 이러한 방식은 객체 간의 결합도를 높이고, 유연성과 확장성을 저해한다. DI를 통해서 객체 간의 의존성을 느슨하게 결합시키고, 의존성을 주입함으로써 객체 간의 결합도를 낮출 수 있다.

// 생성자 주입
public class A {
    private B b;

    public A(B b) {
        this.b = b;
    }
}
제어의 역전 IoC(Inversion of Control)

기존 프로그램은 클라이언트 구현 객체가 스스로 필요한 서버 구현 객체를 생성하고, 연결하고, 실행했다. 한마디로 구현 객체가 프로그램의 제어 흐름을 스스로 조종했다. 반대로 이것을 스프링 프레임워크가 주체가 되어 개발자가 만든 코드를 사용하는 것이 제어가 역전이 되었다라고 하여 제어의 역전이라고 한다. IoC는 의존성 주입과 함께 사용되며 객체간의 의존성을 느슨하게 결합한다. 

// 인터페이스 정의
public interface MessageService {
    void sendMessage(String message);
}

// 구현 클래스 1
public class EmailService implements MessageService {
    public void sendMessage(String message) {
        // 이메일 전송 로직 구현
        System.out.println("이메일 전송: " + message);
    }
}

// 구현 클래스 2
public class SMSService implements MessageService {
    public void sendMessage(String message) {
        // SMS 전송 로직 구현
        System.out.println("SMS 전송: " + message);
    }
}

// 클라이언트 클래스
public class Client {
    private MessageService messageService;

    // 의존성 주입을 위한 생성자
    public Client(MessageService messageService) {
        this.messageService = messageService;
    }

    public void sendMessage(String message) {
        // 의존성 주입된 MessageService를 사용하여 메시지 전송
        messageService.sendMessage(message);
    }
}

// 메인 메소드
public static void main(String[] args) {
    // 의존성 주입
    MessageService messageService = new EmailService();
    // 클라이언트 객체 생성
    Client client = new Client(messageService);
    // 메시지 전송
    client.sendMessage("안녕하세요!");
}

 

Spring Been
  • Bean은 Spring IoC 컨테이너가 관리하는 객체이다.
  • 객체를 생성하고, 관리하며, 필요한 곳에서 해당 객체를 주입하여 사용할 수 있게끔 해주는 역할을 담당
  • Bean은 Spring IoC 컨테이너에 등록되어 있으며, 필요한 곳에서 컨테이너로부터 해당 Bean을 요청하면, 컨테이너는 적절한 Bean을 생성하여 반환한다.
  • Spring IoC 컨테이너는 이러한 Bean들을 생성, 관리하며, 필요한 곳에서 해당 Bean을 주입하여 사용합니다. 이를 통해 객체 간 의존성을 느슨하게 결합하여 유연하고 확장 가능한 애플리케이션을 구성
  • 클래스들을 Been으로 등록하려면 Annotation을 이용하거나 XML 파일을 이용해야한다. 

예를 들면 밑에 코드처럼 XML을 이용하거나 

<bean id="myBean" class="com.example.MyBean">
   <property name="name" value="My Bean" />
</bean>

@Component, @Service, @Controller, @Repository 등의 Annotation을 사용하여 등록하여 사용한다.

@Component
public class MyBean {
    private String name;

    // Setter, Getter 생략

    public void doSomething() {
        System.out.println("Doing something in MyBean");
    }
}