jhhan의 블로그

Spring - DI(의존성 주입) 본문

Spring

Spring - DI(의존성 주입)

jhhan000 2020. 9. 20. 19:12

이번에는 Spring의 의존성 주입에 대해 알아보겠습니다.

(이 주제도 이전에 한 번 쓴적이 있는데

사실 만족스럽지 않아서 이번에 다시 한번 써볼려고 합니다.)

 

저번에 썼던 글에서 이어서 나가겠습니다.

프로젝트 구조입니다.

controller 패키지 밑에 MemberController를 만들겠습니다.

@Controller
public class MemberController {

}

그리고 @Controller라는 어노테이션을 추가합니다.

이렇게 하면 Spring 컨테이너에 MemberController라는 객체를 생성하고 관리합니다.

@Controller
public class MemberController {

    private final MemberService memberService;

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

이렇게 적습니다.

그러면 아마 다음과 같은 상태가 될 것입니다.

memberService에서 오류가 생기는데요.

MemberService는 현재 순수 자바 클래스입니다.

Spring 컨테이너에는 MemberService가 등록되지 않았기 때문에, @Autowired 어노테이션을 써도 빨간 줄이 생깁니다.

다음 그림을 보겠습니다.

그림처럼 @Service 어노테이션을 추가하면 빨간 줄이 사라집니다.

그럼 아마 또 다음처럼 보일 것입니다.

memberRepository에 빨간 줄이 생겼습니다.

그럼 이제 MemberRepository로 가보겠습니다.

MemberRepository는 Interface이기 때문에 이를 구현한 구현체로 가야 합니다.

앞에서 MemoryMemberRepository라는 클래스를 만들었기 때문에 거기로 가보겠습니다.

그리고 다음과 같이 추가해봅니다.

@Repository라는 어노테이션을 추가합니다.

그리고 MemberService 클래스에 다시 가보면

빨간 줄이 사라진 것을 확인할 수 있습니다.

 

사실 Spring에서는 이렇게 어노테이션을 선언하는 것이 정형화된 패턴이라고 합니다.
(@Controller, @Service, @Repository)

  • @Controller: 외부 요청을 받습니다.
  • @Service: 비즈니스 로직을 만듭니다.
  • @Repository: 데이터 저장을 합니다.

이렇게 정형화된 패턴이라고 합니다.

다시 한번 보겠습니다.

  1. 일단 Controller와 Service를 연결해야합니다.
  2. 연결할 때 @Autowired를 이용해서 연결합니다.
  3. 그러면 MemberController가 생성될 때 Spring 컨테이너에 등록된 MemberService 객체를 넣어주게 됩니다.
  4. 이 과정이 바로 Dependency Injection이라고 합니다.
  5. 그러면 이제 MemberService를 보겠습니다.
  6. MemberService는 MemberRepository가 필요합니다.
  7. 그러면 MemberService가 생성될 때 Spring 컨테이너에 등록된 MemberRepository를 넣어주게 됩니다.
    (여기서는 MemoryMemberRepository라는 구현체가 있어서 이것을 넣어줍니다.)
  8. 이렇게 MemberController, MemberService, MemberRepository가 연결이 됩니다.

 

Spring Bean에 대해 알아보겠습니다.

Bean: Spring IOC 컨테이너가 관리하는 자바객체를 Bean이라고 합니다.

이 빈을 만드는(등록하는) 방법은 크게 2가지가 있습니다.
-> 이 2가지는 모두 알아야 합니다.... (저도 아직 잘 모릅니다.. 공부하는 중입니다.)

  1. 컴포넌트 스캔 & 자동 의존관계 설정
  2. 자바 코드로 직접 스프링 빈 등록

그 중에서 이번에는 1번의 방법을 선택해서 진행한 것입니다.

컨트롤러 어노테이션을 한번 보겠습니다.

Ctrl + 마우스클릭을 진행하시면 다음과 같은 그림이 보입니다.

컨트롤러에는 @Component 어노테이션이 등록되어 있습니다.

Service 와 Repository 역시 마찬가지입니다.

컨트롤러, 서비스, 레포지토리 모두 @Component라는 어노테이션이 등록되어 있습니다.

@Component 어노테이션을 가지고 있으면 Spring이 객체를 생성해서 Spring 컨테이너에 등록합니다.

그리고 @Autowired를 통해 서로서로를 연결해 줍니다.

이 방법이 컴포넌트 스캔과 자동 의존관계 설정입니다.

 

참고로 이렇게 자동으로 스프링 빈 객체가 설정되는 범위는

HelloSpringApplication에 가보면 맨 위에 package 하고 범위가 나옵니다.

hello/hellospring 폴더 안에 있는 녀석들만 자동으로 생성됩니다.

그 외의 범위에 있으면 자동으로 생성되지 않습니다.

 

그리고 스프링은 스프링 컨테이너에 스프링 빈을 등록할 때 기본으로 싱글톤으로 등록합니다.

 

 

이렇게 DI에 대해서 마치겠습니다.

다음은 아마 '자바 코드로 스프링 빈 직접 등록'이 될 것입니다.

'Spring' 카테고리의 다른 글

Spring - 웹 기능(MVC)  (0) 2020.09.28
Spring - DI(2)  (0) 2020.09.26
Spring - Test Code 작성(2)  (0) 2020.09.13
Spring - Test Code 작성  (0) 2020.09.12
Spring - static  (0) 2020.09.06