스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술 (4) 스프링 빈과 의존관계

강아람·2022년 8월 14일
0

스프링 개발 입문

목록 보기
4/7
post-thumbnail

스프링 빈과 의존관계

스프링 빈에 등록되면 의존관계가 성립할 수 있다.

스프링 빈 등록 방법

1) 컴포넌트 스캔
2) 자바 코드로 직접 스프링 빈 등록

controller와 Member service의 의존 관계

  • Member controller가 Member service를 통해 데이터에 접근하고 조회할 수 있어야 한다.

    Member controller는 Member service에 의존한다.




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

Spring Container

  • 웹 서버가 spring container에게 요청을 전달하면 spring container는 정의된 controller 객체를 생성하고 관리 (@Controller annotation)

spring container는 @Controller annotation을 통해 controller를 인식하여 객체로 만들 수 있지만 우리가 만든 service, repository는 단순 자바 코드이기 때문에 인식할 수 없음

annotation을 이용해 spring container가 service와 repository를 인식할 수 있게 해주어야 한다.

= 스프링 빈에 등록해주어야 한다.


컴포넌트 스캔 : annotation을 통해 spring bin에 등록 가능

@Controller, @Service, @Repository 모두 컴포넌트의 특수한 케이스이므로, 컴포넌트 스캔으로 스프링 빈에 등록된다.


기본적인 spring 구조

  • controller : 요청을 받음
  • service : 비즈니스 로직 구현
  • repository : 데이터 저장

DI (Dependency Injection, 의존관계 주입)

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

controller 생성자를 통해 controller 객체가 생성될 때 service 객체를 주업해준다.


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

service 객체가 생성될 때 repository 객체를 주입해준다.

@Autowired

: 자동 의존관계 설정

스프링 빈에 등록되지 않은 객체는 @Autowired를 통한 DI가 동작하지 않음





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

@Configuration
public class SpringConfig {

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

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

DI

DI에는 필드 주입, setter 주입, 생성자 주입이 존재 ▶ 생성자 주입 권장

  • 필드 주입 : 스프링이 처음 실행될 때 상태에서 변경할 수 없기 때문에 권장하지 않음
  • setter 주입 : 다른 개발자에 의해 호출되어 변경될 수 있기 때문에 권장하지 않음




스프링 빈 등록

  • 실무에서는 정형화된 컨트롤러, 서비스, 리포지토리 같은 코드는 컴포넌트 스캔 사용
  • 🌟 정형화되지 않거나 상황에 따라 구현 클래스를 변경해야 하는 경우 설정을 통해 스프링 빈에 등록

메모리 리포지토리가 아직 선정되지 않았다고 가정했기 때문에
컴포넌트 스캔 방식 대신 자바 코드로 스프링 빈 설정

0개의 댓글