[스프링 입문] 스프링 빈과 의존 관계

김우경·2021년 1월 7일
0

Spring Framework

목록 보기
4/12

김영한님의 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술을 보면서 공부한 내용입니다.

의존성의 주입

Controller에서 Service를 통해 작성한 비즈니스로직을 사용하고 싶다. 이때 객체를 new해서 새로 생성할 필요 없이 외부에서 주입시킬 수 있도록 의존관계를 만들어 보자.

@Autowired

Application을 Run해서 MemberController를 띄울때 생성자가 호출된다. 이때, 생성자가 @Autowired 를 가지고 있으면 Controller가 MemberService를 필요로 함을 알고, 스프링 컨테이너에 등록되어 있는 MemberService 객체를 가져와서 넣어준다

컨트롤러와 서비스의 연결 역할

@Controller
public class MemberController {
    private final MemberService memberService;

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

→ 생성자에 @Autowired 사용시, 객체 생성 시점에 스프링 컨테이너에서 해당 스프링 빈을 찾아서 주입

마찬가지로 MemberServive에서도 MemoryMemberRepository의 로직을 통해 비즈니스 로직을 처리하려고 한다.
직접 new로 객체를 생성하는 것이 아닌, 외부에서 주입시킬 수 있도록 @Autowired 어노테이션을 사용한다.

public class MemberService {

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

→ 스프링 컨테이너에 있는 레포지토리를 주입해줌
→ 스프링에서 관리하는 객체에서만 적용됨 스프링 빈으로 등록하지 않은 객체에서는 동작하지 x

의존성 주입의 세가지 방법

생성자 주입

위와 같은 방법

e.g. 생성자를 통해서 MemberService가 MemberController로 주입됨

필드 주입

@Autowired
private MemberService memberService;

→ 스프링 뜰때만 넣어주고 바꿀 수 있는 방법이 x, 추천하는 방법이 아님

setter 주입

생성은 생성대로 되고, setter를 추후에 호출해서 주입
public하게 노출되어야 사용할 수 있음 안전하지 x

→ 의존관계는 한번 세팅되면 동적으로 바뀌지 않으므로 주로 생성자 주입을 사용한다.

그럼 이때, 스프링 컨테이너에 각각의 Controller, Service, Repository을 스프링 빈으로 등록하는 방법은?

스프링 빈의 등록

컴포넌트 스캔으로 자동으로 스프링 빈에 등록하는 방법과 자바 코드로 직접 스프링 빈에 등록하는 방법 두가지가 있다.

컴포넌트 스캔과 자동 의존관계 설정

@Component

@Component와 관련된 annotation이 있으면 스프링이 객체를 하나씩 생성해서 컨테이너에 등록함
→ 관련 annotations

  • @Controller
  • @Service

  • @Repository

→ 실행시키는 Aplication을 포함한 하위 디렉토리를 쭉 스캔해서 해당 어노테이션을 가지고 있으면 모두 스프링빈으로 등록한다.

@Controller, @Service, @Repository

위와 같이 스프링 컨테이너에 스프링 빈으로 등록될 수 있게 어노테이션을 추가해준다 !

정형화된 코드에 사용

참고 스프링 빈 등록시 싱글톤으로 유일하게 하나만 등록 → 같은 스프링 빈이면 같은 인스턴스

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

컨트롤러는 스프링이 관리하므로 컴포넌트 스캔 그대로 놔두고, 위의 실습에서 @Service, 서비스의 @Autowired, @Repository를 지워준다.

같은 레벨의 디렉토리에 SpringConfig생성

@Bean

: 스프링 빈 등록하라는 어노테이션

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

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

뜰때 MemberService와 MemberRepository 둘 다 컨테이너에 등록된다.
→ 이때 MemberService 등록시에는 스프링 빈에 등록되어 있는 MemberRepository를 서비스에 넣어준다.

참고 과거에는 XML으로 설정 : 지금은 잘 사용하지 x

상황에 따라 구현 클래스를 변경해야 하는 경우 사용
: 지금의 시나리오같은 경우

출처

김영한님의 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술을 보면서 공부한 내용입니다.

profile
Hongik CE

0개의 댓글