객체를 생성하는 2가지 방법
객체를 생성하는 방법에는 2가지가 방법이 있다.
- 필요한 곳에 직접 생성하는 방법
- 외부에서 미리 생성해두고 필요한 곳에 할당(주입)하는 방법
위 그림은 직접 객체 생성하는 경우, 외부에서 객체 주입하는 경우를 그림으로 표현했다.
- 이름과 나이를 받는 Member 객체와 그 객체를 사용하는 MemberUse 클래스를 표현함
직접 객체를 생성하는 경우
위 그림에서 만약 1년이 지나 '홍길동'이 29살에서 30살이 되었다고 했을때, 모든 객체를 다 수정해줘야하는 번거로움이 있다.
// Member
public class Member {
private String name;
private int age;
public Member(String name, int age) {
this.name = name;
this.age = age;
}
}
// 직접 객체를 생성하는 방법으로 강한 결합을 가짐
public class MemberUse {
private Member member;
public MemberUse() {
member = new Member("홍길동", 29);
}
}
public class MemberUse2 {
private Member member;
public MemberUse2() {
member = new Member("홍길동", 29);
}
}
외부에서 객체 주입하는 경우
하지만, 외부에서 객체를 생성해서 주입하는 경우 한 부분만 수정하면 나머지도 모두 변경된다.
- 아래에서 자세히 살펴보겠지만 이렇게 외부에서 주입하는 방식을 DI (
Dependency Injection
)이라고 함
// 외부에서 객체를 주입 당하는 방법으로 약한 결합을 가짐
public class MemberUse {
private Member member;
public MemberUse(Member member) {
this.member = member;
}
}
// 낮은 결합도를 가짐
@Test
@DisplayName("의존성 주입 테스트")
void dependencyInjectionTest() {
Member member = new Member("홍길동", 29); // 변경사항이 있더라도, 외부에서 생성하는 부분만 변경하면 됨
MemberUse memberUse = new MemberUse(member);
MemberUse memberUse2 = new MemberUse(member);
MemberUse memberUse3 = new MemberUse(member);
// ...
}
내부에서 바로 다른 객체를 생성하는 구조는 강한 결합을 가진다고 함
외부에서 객체 생성 후 주입하는 구조는 약한 결합을 가진다고 함
DI (Dependency Injection)
Dependency Injection
의 줄임말로, 흔히 의존성 주입(의존 관계 주입)이라고 함
위에서도 살펴봤지만 외부에서 객체를 생성하고, 이 객체를 사용하는 곳에 주입하는 방식을 말한다.
스프링에서는 외부에서 객체를 생성하면 IoC 컨테이너라는 곳에 담아두는데, IoC 컨테이너 안에 저장된 객체를 빈(Bean)이라고 한다.
스프링에서 객체를 주입하는 방법은 총 3가지 방법이 있음
- Field Injection
- Setter Injection
- Constructor Injection
Field Injection
필드 주입으로, 필드에 @Autowired
어노테이션을 이용하여 의존성 주입을 한다.
public class MemberUse {
// Field Injection
@Autowired
private Member member;
}
Setter Injection
setter 주입으로, setter 메소드에 @Autowired
어노테이션을 이용하여 의존성 주입을 한다.
public class MemberUse {
private Member member;
// Setter Injection
@Autowired
public void setMember(Member member) {
this.member = member;
}
}
Constructor Injection
생성자 주입으로, 생성자에 @Autowired
어노테이션을 이용하여 의존성 주입을 한다.
public class MemberUse {
private final Member member;
// Constructor Injection
@Autowired
public MemberUse(Member member) {
this.member = member;
}
}
다른 글
2021.03.10 - [Spring] - Spring의 IoC 컨테이너 (Inversion of Control)
2021.03.11 - [Spring] - Spring의 AOP (Aspect Oriented Programming)
'Backend > Spring' 카테고리의 다른 글
Spring @ResponseBody를 이용하여 데이터 반환 (API 개발) (1) | 2021.05.17 |
---|---|
Spring의 AOP 개념 (Aspect Oriented Programming) (0) | 2021.03.11 |
Spring의 IoC 컨테이너 (Inversion of Control) (0) | 2021.03.10 |