728x90
💡 클린코드 작성 원칙
- 응집도는 높이고 결합도는 낮춘다.
- 응집도(Cohesion) : 모듈 내부) 구성요소 간의 연관도
- 응집도가 낮다? → 각 모듈이 모두 따로 놀고 있으며 단순히 모두 다른 역할을 수행하는 모듈들을 한데 모아놓기만 함
- 결합도(Coupling ) : 모듈 외부) 모듈간의 상호의존성
- 결합도가 높다? → 각 모듈이 비슷한 기능을 수행할 가능성이 높음
- 응집도(Cohesion) : 모듈 내부) 구성요소 간의 연관도
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 변경 시 일일이 변경해줘야함
}
...
}
Puppy
는Feed
에 대해 의존을 갖는다.- ⚠️
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 |
---|