[Spring] 의존성과 RequiredArgsConstructor

kjoo0·2024년 9월 1일

Spring 이모저모

목록 보기
7/7
post-thumbnail

의존성과 의존성 주입(Dependency Injection)

개요

  • 의존성
  • 의존성 주입(Dependency Injection)
  • RequiredArgsConstructor
  • 의존성을 외부에서 주입하는 이유와 장점
  • 직접 생성하는 방법과의 비교

의존성이란?

의존성은 한 클래스가 다른 클래스에 의존하고 있다는 것을 의미합니다. 즉, 어떤 클래스가 다른 클래스를 사용하거나 그 클래스의 기능을 필요로 할 때, 두 클래스 사이에 의존성이 존재한다고 할 수 있습니다.

예를 들어, 다음과 같은 경우를 생각해 볼 수 있습니다:

public class UserService {
    private final UserRepository userRepository; // UserRepository에 대한 의존성

    public UserService(UserRepository userRepository) {
        this.userRepository = userRepository; // 생성자 주입을 통해 의존성 설정
    }

    public void saveUser(User user) {
        userRepository.save(user); // UserRepository를 사용하여 사용자 저장
    }
}

위의 예에서 UserServiceUserRepository에 의존하고 있습니다. 즉, UserServiceUserRepository의 기능을 사용해야 하므로 두 클래스 간에 의존성이 형성됩니다.

의존성 주입이란?

의존성 주입(Dependency Injection)은 객체의 의존성을 외부에서 주입하는 디자인 패턴입니다. 이 방법을 사용하면 클래스가 필요한 의존성을 스스로 생성하지 않고, 외부에서 제공받도록 할 수 있습니다.

장점

  • 유연성: 의존성이 외부에서 주입되므로, 코드의 유연성이 높아집니다. 객체를 생성할 때 어떤 의존성을 주입할지 변경할 수 있습니다.
  • 테스트 용이성: 의존성을 쉽게 변경할 수 있으므로, 단위 테스트에서 Mock 객체를 주입하여 테스트를 수행하기가 용이합니다.
  • 결합도 감소: 의존성 주입을 사용하면 클래스 간의 결합도를 줄일 수 있어, 코드 유지보수가 쉬워집니다.

의존성 주입의 종류

  1. 생성자 주입: 의존성을 생성자를 통해 주입합니다.

    public class MyService {
        private final MyRepository myRepository;
    
        public MyService(MyRepository myRepository) {
            this.myRepository = myRepository; // 의존성 주입
        }
    }
  2. 세터 주입: 세터 메서드를 통해 의존성을 주입합니다.

    public class MyService {
        private MyRepository myRepository;
    
        public void setMyRepository(MyRepository myRepository) {
            this.myRepository = myRepository; // 의존성 주입
        }
    }
  3. 필드 주입: 직접 필드에 주입합니다. (Lombok의 @RequiredArgsConstructor와 같은 방식)

    import lombok.RequiredArgsConstructor;
    
    public class MyService {
        @Autowired
        private MyRepository myRepository; // 의존성 주입
    }

RequiredArgsConstructor의 역할

@RequiredArgsConstructor 애노테이션은 Lombok에서 제공하는 기능으로, 다음과 같은 특징을 가지고 있습니다:

  1. 자동 생성자 생성:

    • @RequiredArgsConstructor 애노테이션을 사용하면, final 또는 @NonNull이 붙은 필드를 인자로 받는 생성자가 자동으로 생성됩니다. 이 생성자는 클래스의 인스턴스를 생성할 때 필요한 의존성을 주입하는 데 사용됩니다.
  2. 의존성 주입:

    • Spring의 의존성 주입(Dependency Injection)과 함께 사용하면, 필요한 의존성을 생성자 주입 방식으로 전달받게 됩니다. 이를 통해 필드가 final로 선언되어 클래스가 생성된 이후에는 변경되지 않도록 보장할 수 있습니다.

예시 코드

import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

@Service
@RequiredArgsConstructor
public class MyService {
    private final MyRepository myRepository; // final 필드
}

의존성을 직접 생성하는 방법

의존성 주입을 사용하지 않고 클래스 내부에서 직접 객체를 생성할 수도 있습니다:

public class MyService {
    private final MyRepository myRepository = new MyRepository(); // 직접 생성

    public void saveUser(User user) {
        myRepository.save(user);
    }
}

비교: 의존성 주입 vs. 직접 생성

특성의존성 주입직접 생성
유연성높은 유연성 (구현체 교체 용이)낮은 유연성 (구현체 고정)
테스트 용이성Mock 객체로 쉽게 테스트 가능테스트 시 직접 생성된 객체 사용 필요
결합도결합도 낮음 (Loose Coupling)결합도 높음 (Tight Coupling)
생명주기 관리컨테이너에서 관리 (자동 소멸)객체의 생명주기를 수동으로 관리

결론

  • 의존성은 클래스가 다른 클래스에 의존하는 관계를 의미합니다.
  • 의존성 주입은 외부에서 필요한 의존성을 주입받는 패턴으로, 코드의 유연성, 테스트 용이성, 결합도 감소 등의 장점을 제공합니다.
  • 직접 생성하는 방식은 간단하지만, 코드의 유지보수성과 확장성 측면에서 단점이 많습니다.
  • Spring Framework에서는 의존성 주입을 통해 객체를 관리하고, 의존성을 자동으로 주입하는 기능을 제공합니다.
profile
티스토리 이사 준비 중..

0개의 댓글