반응형
초보개발자 신씨
뉴가든's 개발한 생각
초보개발자 신씨
전체 방문자
오늘
어제
  • 개발한 생각 (28)
    • 웹개발 (5)
      • Spring & SpringBoot (5)
      • 웹개발 개론 (0)
    • CS이것저것 (0)
      • 자료구조 (0)
      • 알고리즘 (0)
      • DB (0)
      • 네트워크 (0)
    • 백준코딩테스트 (22)
    • IT끄적끄적 (0)

블로그 메뉴

  • 홈

공지사항

인기 글

태그

  • 행렬 덧셈
  • 백준
  • post
  • put
  • springboot
  • Dependency Injection
  • 코딩테스트
  • Delete
  • Get
  • 2738
  • DI
  • HTTP
  • REST API
  • 의존성주입
  • spring

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
초보개발자 신씨

뉴가든's 개발한 생각

웹개발/Spring & SpringBoot

[Spring]의존성 주입(Dependency Injection, DI) - 미완

2022. 11. 5. 18:04
반응형

1. 의존성 주입

 

의존성 주입이란?

클래스간 의존성을 클래스 외부에서 주입하는 것을 뜻함
인터페이스를 사이에 둬서 클래스 레벨에서는 의존관계가 고정되지 않도록 하고 런타임 시에 관계를 동적으로 주입
(인터페이스를 사이에 둬 느슨한결합[결합도를 낮춤] + 클래스의 인스턴스를 외부에서 생성하여 주입)

★클래스간 의존성이란?

클래스간에 의존 관계를 가지고 있다는 뜻 -> 한 클래스가 바뀔 때 다른 클래스가 영향을 받는다.
new 키워들를 통해 객체를 생성할 때 의존성을 갖는다.

강한 결합 VS 느슨한 결합

  • 강한결합 : 객체 내부에서 다른 객체를 생성하는 경우 강한결합을 가지는 구조

강한결합의 경우 객체를 변경할 때마다 Person 객체는 두 부분을 수정해야한다.
1) 필드 와 생성자 부분
2) personDo() 메서드 바디부분

하지만, 단순히 이 예제에서는 2부분만 수정하면 되지만 소스가 길어지는 경우 손봐야할 부분이 더 많아진다!!

class Person {
    private Eat eat;
    public Person(){
        this.eat = new Eat();
    }

    public void personDo(){
        eat.eatting(); //"밥먹기"
    }
}

class Eat{
    public void eatting() {
        System.out.println("밥먹기");
    }
}

class Work{
    public void working() {
        System.out.println("일하기");
    }
}
class Person {
    private Work work;
    public Person(){
        this.work = new Work();	
    }
	
    public void personDo(){
        work.working();  //"일하기"
    }
}

class Eat{
    public void eatting() {
        System.out.println("밥먹기");
    }
}

class Work{
    public void working() {
        System.out.println("일하기");
    }
}
  • 느슨한결합 : 인터페이스(interface)를 사용하여 특정 클래스의 의존성을 줄인 구조

강한결합과 달리 Eat, Work에 따라 Person 클래스에서 변경될 코드는 Person() 생성자의 인스턴스 주입되는 부분 뿐 이다.
Interface를 사용하기 때문에 부가적인부분은 강제되는 doing()을 이용하기 때문에 해당 부분은 변경될 필요가 없다.

package org.example;

interface DoSomething{
    void doing();
}

class Person {
    private DoSomething doSomething;
    
    public void Person(){
        this.doSomething = new Eat();  
    };

    public void PersonDo(){
        doSomething.doing();
    }
}

class Eat implements DoSomething{
    @Override
    public void doing() {
        System.out.println("밥먹기");
    }
}

class Work implements DoSomething{
    @Override
    public void doing() {
        System.out.println("일하기");
    }
}

즉, 클래스간 결합도가 느슨한 경우 한 클래스가 변경될 경우 다른 클래스가 변경될 필요성이 적어진다는 뜻!!

의존성 주입

설명

package org.example;

interface DoSomething{
    void doing();
}

class Person {
    private DoSomething doSomething;

    //생성자를 통한 의존성 주입
    public void Person(DoSomething doSomething){
        this.doSomething = doSomething;
    };

    public void PersonDo(){
        doSomething.doing();
    }
}

class Eat implements DoSomething{
    @Override
    public void doing() {
        System.out.println("밥먹기");
    }
}

class Work implements DoSomething{
    @Override
    public void doing() {
        System.out.println("일하기");
    }
}

2. 의존성 주입 필요성


1) 인터페이스를 통해 강하게 결합된 클래스를 분리하므로 결합도가 약해져 한 클래스가 변경될 경우 다른 클래스의 변경 필요성이 적어진다.
2) 리팩토링의 쉬워진다.
3) 코드가 유연하다.
4) 클래스간 결합도가 약해져 특정 클래스 테스트하기 편해진다.

반응형

'웹개발 > Spring & SpringBoot' 카테고리의 다른 글

REST API - (4) DELETE METHOD 예제  (0) 2022.10.24
REST API - (3) PUT METHOD 예제  (0) 2022.10.23
REST API - (2) POST METHOD 예제  (0) 2022.10.23
REST API - (1) GET METHOD 예제  (0) 2022.10.23
    '웹개발/Spring & SpringBoot' 카테고리의 다른 글
    • REST API - (4) DELETE METHOD 예제
    • REST API - (3) PUT METHOD 예제
    • REST API - (2) POST METHOD 예제
    • REST API - (1) GET METHOD 예제
    초보개발자 신씨
    초보개발자 신씨
    공부한 내용을 공유하는 블로그

    티스토리툴바