본문 바로가기
Java/공부

의존성 주입에 대한 관점

by wooksss 2025. 1. 21.

문득 프로젝트를 진행하다가 이런 생각이 들었다.

"왜 레포지토리나 서비스를 생성자로 처리하는 것일까?" 

private final UserRepository userRepository;

public CustomUserDetailsService(UserRepository userRepository){
    this.userRepository = userRepository;
}

 

궁금해서 찾아보니 세 가지 방식이 있었다. 

1. @Autowired 생성자 주입

2. @RequiredArgsConsructor lombok 사용

3. 수동 생성자 주입

 

위 소스코드는 수동 생성자 주입 방법이고 세 가지 방법에서 효율차이가 있는지 살펴봤다.

근데 황당하게도 성능적인 차이는 실제로 없다고 한다. 

 

 

@Autowired를 사용한 생성자 주입

 

  • 장점:
    • 간단하고 짧은 코드로 의존성 주입 가능
    • 빠른 개발에 유용
  • 단점:
    • 불변성을 보장할 수 없고, final 필드를 사용할 수 없음
    • 의존성 주입이 명시적이지 않아 코드 가독성이 떨어짐
    • 테스트가 어려울 수 있음

 

@Component
public class MyService {
    private final MyRepository myRepository;

    @Autowired  // 명시적으로 @Autowired를 사용
    public MyService(MyRepository myRepository) {
        this.myRepository = myRepository;
    }

    /*
    @Autowired
    private MyRepository myRepository;
    이 방법은 불변성을 보장할 수 없기 때문에 사용 지양
    */
}

 

@RequiredArgsConstructor를 사용한 생성자 주입

 

  • 장점:
    • 코드가 간결해지고, final 필드로 불변성 보장
    • 생성자 주입을 자동으로 처리하여 코드 길이 감소
  • 단점:
    • Lombok 라이브러리 의존성이 추가됨
    • Lombok을 모르거나 이해하지 못하는 개발자에게는 불편할 수 있음

 

 

@Component
@RequiredArgsConstructor  // Lombok을 사용하여 생성자 자동 생성
public class MyService {
    private final MyRepository myRepository;
    
}

 

수동 생성자 주입 (수동으로 생성자 작성)

 

  • 장점:
    • 의존성이 명시적으로 보이고, 불변성 보장
    • 의존성 주입이 명확하게 드러나므로 가독성 좋음
  • 단점:
    • 코드가 길어질 수 있음
    • 반복적인 코드 작성이 필요해짐 (특히 의존성이 많을 경우)

 

@Component
public class MyService {
    private final MyRepository myRepository;

    // 생성자를 수동으로 작성
    public MyService(MyRepository myRepository) {
        this.myRepository = myRepository;
    }

}

 

필자는 @RequiredArgsConstructor 방식을 가장 선호하는데 (짧을수록 좋다는 생각)

처음 스프링 부트를 공부한다면 수동 생성자 주입 방식이 가장 좋다고 생각한다.

점점 개발을 진행할 수록 lombok에 대한 내용을 파악하게 된다면

자연스레 @RequiredArgsConstructor 방식으로넘어가지 않을까 한다

'Java > 공부' 카테고리의 다른 글

효율적인 리팩토링을 위한 전략  (0) 2025.01.24
자바 컬렉션 프레임워크 종류와 사용 사례  (0) 2025.01.23