[Spring] 의존성 주입과 의존성 역전 원칙(DI ans DIP)

BE/Spring 2024. 2. 20.
반응형

  목  차

  • 의존하다
  • 의존성 역전 원칙(Dependency Inversion Principle, DIP)
  • DIP와 의존성 주입(DI)
  • DIP를 위배한 코드와 변경 후 코드
  • 문제점

 

 


 

  의존하다

 

'의존성을 주입한다', '의존한다' 라는 말들은 초보 개발자들에게 굉장히 어렵게 다가올 수 있다. 

 

간단한 예시를 통해서 이 어려운 언어들을 쉽게 바꾸어 보려고 한다. 당신은 커피를 만들기 위해서 커피머신을 사용한다고 한다. 이 때 당신은 커피머신에 '의존'하고 있는 것이다. 프로그래밍에서도 비슷한 개념이 적용된다. 한 클래스가 다른 클래스의 코드를 필요로 할 때, 우리는 그 클래스가 다른 클래스에 '의존한다' 라고 말한다.

 

 

 


 

  의존성 역전 원칙(Dependency Inversion Principle, DIP)

 

여기서 DIP의 목적만 먼저 설명하려고 한다. DIP의 주요 목적은 소프트웨어의 유연성과 확장성을 향상시키는 것이다. 이를 통해서 코드의 변경이 필요할 때 수정해야 할 코드의 양을 줄일 수 있다.

 

 

 


 

  DIP와 의존성 주입(DI)

 

DIP 에 의하면 추상에만 의존해야 하고, 구체 클래스에 의존하면 안 된다.

 

추상: 인터페이스

구체 클래스: 인터페이스를 통해서 구현한 클래스

 

 

 


 

  DIP를 위배한 코드와 변경 후 코드

 

DIP 위배 코드

 

아래 코드를 보면 EmailService 클래스는 SmtpService의존하는 것처럼 보인다.

Emailservice 에서 SmtpService(추상)를 의존하고 있지만 동시에 구체 클래스를 직접 생성하고 있다. 이 것이 바로 DIP 에 위배되는 상황이다.

먼저 변경 후 코드를 알아보고 문제점을 알아보려고 한다.

class SmtpServiceImpl implements SmtpService {
    public void sendEmail(String message) {
        System.out.println("Sending email: " + message);
    }
}

class EmailService {
    private SmtpService smtpService = new SmtpServiceImpl();

    public void sendEmail(String message) {
        smtpService.sendEmail(message);
    }
}

 

 

변경 후 코드

 

interface SmtpService {
    void sendEmail(String message);
}

class SmtpService implements SmtpService {
    public void sendEmail(String message) {
        System.out.println("Sending email via SMTP: " + message);
    }
}

class EmailService {
	// 추상(인터페이스)에만 의존
    private SmtpService smtpService;

	// 누군가 대신 구체 클래스를 넣어줌
    public EmailService(SmtpService smtpService) {
        this.smtpService = smtpService;
    }

    public void sendEmail(String message) {
        smtpService.sendEmail(message);
    }
}

 

 

 

 


 

  문제점

 

가장 큰 문제점은 유연성 부족이다. 

EmailService 가 SmtpService의 구체 클래스에 직접적으로 의존한다면, 다른 메일 서비스로 쉽게 변경하기 어렵다. 만약 다른 메일 전송 방식을 사용하고 싶다면 EmailService 의 코드를 직접적으로 변경해야 한다.

 

반응형

'BE > Spring' 카테고리의 다른 글

[Spring] 커넥션 풀과 데이터 소스  (0) 2024.07.15
[Spring] HTTP 요청과 응답 방법  (0) 2024.07.01