728x90

💡 클린코드 작성 원칙

  • 응집도는 높이고 결합도는 낮춘다.
    • 응집도(Cohesion) : 모듈 내부) 구성요소 간의 연관도
      • 응집도가 낮다? → 각 모듈이 모두 따로 놀고 있으며 단순히 모두 다른 역할을 수행하는 모듈들을 한데 모아놓기만 함
    • 결합도(Coupling ) : 모듈 외부) 모듈간의 상호의존성
      • 결합도가 높다? → 각 모듈이 비슷한 기능을 수행할 가능성이 높음

 

DI(Dependency Injection)

  • 의존성 주입
class Feed() { ... }

class Meet extends Feed { ... }
class Bone extends Feed { ... }

class Puppy {
    private Feed feed;

    public Puppy() {
        this.feed = new Meet();
      // Meet -> Bone 변경 시 일일이 변경해줘야함
    }

        ...
}
  • PuppyFeed 에 대해 의존을 갖는다.
    • ⚠️ Feed 가 변경되면 Puppy 도 변경해줘야하는 문제에 봉착한다! (= 결합도 높음)
    • 먹이(Feed)를 뭐를 줄지 생성자를 통해 내부에서 정하고 있다.(Meet)
      • 이를 외부에서 결정해서 넣어줌 (⇒ 의존성 주입)

 

의존성 주입의 세가지 조건

이일민, 토비의 스프링 3.1, 에이콘(2012), p114

  • 클래스 모델이나 코드에는 런타임 시점의 의존관계가 드러나지 않는다.
  • 그러기 위해서는 인터페이스만 의존하고 있어야 한다.
  • 런타임 시점의 의존관계는 컨테이너나 팩토리 같은 제3의 존재가 결정한다.
  • 의존관계는 사용할 오브젝트에 대한 레퍼런스를 외부에서 제공(주입)해줌으로써 만들어진다.

 


스프링에서의 의존성 주입 방법

⭐ 1. 생성자 주입

class Puppy {
    private Feed feed;

    public Puppy(Feed feed) {
        this.feed = feed;
    }
}

class PuppyOwner {
    private Puppy puppy = new Puppy(new Meet()); // 디폴트, Meet

    public void changeFeed() {
        feed = new Puppy(new Bone()); // 이후 변경, Bone
    }
}
  • 생성자 객체를 받아서 넣어준다.
  • 생성자의 호출 시점에 설정되고 이후 변하지 않는다.
  • 의존관계가 실행중 동적으로 변하는 경우가 거의 없으므로 생성자 주입을 권장한다!

 

⚠️ 2. Setter 주입

class Puppy {
    private Feed feed = new Meet(); // 디폴트, Meet

    public void setFeed(Feed feed) {
        this.feed = feed;
    }
}

class PuppyOwner {
    private Puppy puppy = new Puppy();

    public void changeFeed() {
        puppy.setFeed(new Bone()); // 이후 변경, Bone
    }
}
  • setter 메서드를 public 으로 열어둬야하므로 런타임 중 변경될 수 있다.

 

⚠️ 3. 필드 주입

class Puppy {
    @Autowired
    private Meet meet;
    @Autowired
        private Bone bone;
}

class PuppyOwner {
    private Puppy puppy = new Puppy();
}
  • 외부에서 변경이 불가능하다.
  • @Autowired 가 없으면 의존성 주입을 할 수가 없다.

 

Reference

728x90

'🏠 Framework > Spring' 카테고리의 다른 글

[Spring] Spring Security  (0) 2022.05.19