-의존관계란 무엇일까?

회원가입 프로세스에서 컨트롤러가 데이터를 입력받고 이를 서비스에 넘겨준다고 하면 이는 컨트롤러와 서비스간에 의존관계가 있다고 말할 수 있다. 스프링에서는 이러한 의존관계를 Annotation을 통해 설정해 줄 수 있다.

 

-컴포넌트 스캔 방식(@Annotation)과 자동 의존관계 설정

@Controller
public class MemberController {

    private final MemberService memberService;

    @Autowired
    public MemberController(MemberService memberService) {
        this.memberService = memberService;
    }
}

@Controller와 같이 Annotation을 달아주면 스프링 어플리케이션은 이 객체를 스프링 컨테이너에 빈으로 등록한다.

(위 코드의 경우 컨트롤러 빈으로 등록)

 

만약 스프링 컨테이너에 1개의 서비스가 존재하고 여러개의 컨트롤러가 이 서비스를 사용한다고 하면 어떻게 될까?

컨트롤러마다 동일한 서비스 객체를 만들어서 사용해야 할까?

스프링 빈이 있기 때문에 그럴 필요가 없다!!

위의 코드처럼 @Autowired를 통해 @Service로 선언된 아래 코드를 바로 사용할 수 있다!!

@Service
public class MemberService {

    private final MemberRepository memberRepository;

    @Autowired
    public MemberService(MemberRepository memberRepository) {
        this.memberRepository = memberRepository;
    }
}

서비스 또한 마찬가지로 @Repository로 선언된 저장소와 의존관계로 설정해 줄 수 있다.

@Repository
public class MemoryMemberRepository implements MemberRepository {

    private static Map<Long, Member> store = new HashMap<>();
    private static long sequence = 0L;
}

이게 바로 DI(Dependency Injection)이다. 스프링이 동작하면서 class의 객체를 만들고 자동으로 의존 관계를 주입해준다.


DI란 외부에서 두 객체 간의 관계를 결정해주는 디자인 패턴으로, 인터페이스를 사이에 둬서 클래스 레벨에서는 의존관계가 고정되지 않도록 하고 런타임 시에 관계를 다이나믹하게 주입

출처: https://mangkyu.tistory.com/150 [MangKyu's Diary]


-자바 코드로 직접 스프링 빈 등록하기

Annotation을 사용하지 않고 스프링 컨테이너에 빈을 등록할 수 있다.

Application파일과 같은 경로에 Config파일을 만든다. 아래와 코드를 통해 MemberService, MemberRepository 클래스를 빈에 등록할 수 있다.

@Configuration
public class SpringConfig {

    @Bean
    public MemberService memberService() {
        return new MemberService(memberRepository());
    }

    @Bean
    public MemberRepository memberRepository() {
        return new MemoryMemberRepository();
    }
}

이렇게 따로 config 파일에 빈을 등록하는 경우는 정형화 되지 않거나, 상황에 따라 구현 클래스를 변경해야 하면 설정을 통해 스프링 빈으로 등록한다.

 

현재는 메모리 DB를 사용하고 있는데 나중에 DB를 변경할 경우 Config의 MemoryMemberRepository() 부분만 변경해주면 의존관계를 변경할 수 있다.

+ Recent posts