[Spring] 입문_스프링 빈과 의존관계(2)

gayoung·2022년 2월 24일
0

스프링 완전 정복

목록 보기
8/33

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

[ SpringConfig ]

package hello.hellospring;

import hello.hellospring.repository.MemberRepository;
import hello.hellospring.repository.MemoryMemberRepository;
import hello.hellospring.service.MemberService;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class SpringConfig {

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

    @Bean
    public MemberRepository memberRepository() {
        return new MemoryMemberRepository();
    }
}
  • MemberService(), MemoryMemberRepository()에서 @Service, @Repository, @Autowired 없애기
  • @Configuration 읽고 현재 로직을 호출해서 스프링 빈에 등록
  • memberService의 경우는 스프링빈에 등록되어있는 memberRepository()를 엮어줘야 함

[ 기타 정보 ]

  • Q. 만약, @Autowired붙이고, SpringConfig에 아무것도 없다면 작동이 될까?

    • A. No.
    • why? 스프링이 MemberService를 관리하고있지 않기 때문
    • @Autowired는 스프링이 관리하는
      객체에서만 동작함. 스프링 빈으로 등록하지 않고 내가 직접 생성한 객체에서는 동작하지 않음
  • DI 의존관계 주입방법

    1. 필드주입은 비추,, -> 바꿀 수 있는 것이 없음
    @Autowired private MemberRepository memberRepository;
    1. setter 주입 -> 단점 : public으로 노출이 됨
    • 누구나 호출 가능/개발은 호출되지않아야하는 것들이 호출되면 안됨 )-> 만약에 바꾸면 문제가 생길 수 있음

      private final MemberRepository memberRepository;
      
      @Autowired
      public void setMemberRepository(MemberRepository memberRepository) {
          this.memberRepository = memberRepository
      }
    1. 생성자 주입 -> 추천
    private final MemberRepository memberRepository;
    
      /*
      * Q. 만약, @Autowired붙이고, SpringConfig에 아무것도 없다면 작동이 될까?
      * A. No. why? 스프링이 MemberService를 관리하고있지 않기 때문 */
      public MemberService(MemberRepository memberRepository) {
          this.memberRepository = memberRepository;
      }
  • 직접 운영할 때 장점

    • 상황에 따라 구현클래스를 변경해야한다면(아직 DB가 정해지지 않은상태에서 개발진행한다면) 직접운영 좋음
    • 다른코드 변경할필요없음(컴포넌트 스캔 하면 다른거 다 뜯어고쳐야함)

0개의 댓글