memostack
article thumbnail
블로그를 이전하였습니다. 2023년 11월부터 https://bluemiv.github.io/에서 블로그를 운영하려고 합니다. 앞으로 해당 블로그의 댓글은 읽지 못할 수 도 있으니 양해바랍니다.
반응형

객체를 생성하는 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)

 

Spring의 IoC 컨테이너 (Inversion of Control)

IoC (Inversion of Control) IoC는 Inversion of Control 의 약자로 한국어로 번역하는 '제어의 반전' 이라는 뜻을 가짐 재사용 라이브러리의 흐름이 반대라고 말할 수 있음 내용을 살펴보기 전에 DI(Dependency I..

memostack.tistory.com

2021.03.11 - [Spring] - Spring의 AOP (Aspect Oriented Programming)

 

Spring의 AOP (Aspect Oriented Programming)

AOP AOP는 Aspect Oriented Programming 의 약자로, 번역하면 관점 지향 프로그래밍이다. AOP는 주 비지니스 로직 앞, 뒤로 부가적인 기능을 추가하고 싶을때 사용하는데 예를들어, 로그처리, 보안처리, DB

memostack.tistory.com

 

반응형
블로그를 이전하였습니다. 2023년 11월부터 https://bluemiv.github.io/에서 블로그를 운영하려고 합니다. 앞으로 해당 블로그의 댓글은 읽지 못할 수 도 있으니 양해바랍니다.
profile

memostack

@bluemiv_mm

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!