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

gayoung·2022년 2월 24일
0

스프링 완전 정복

목록 보기
7/33

스프링 빈을 등록하는 2가지 방법

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


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

1-1. [ MemberController ]

package hello.hellospring.controller;

import hello.hellospring.service.MemberService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;

@Controller
public class MemberController {

    private final MemberService memberService;

    @Autowired
    public MemberController(MemberService memberService) {
        this.memberService = memberService;
    }
}
  • @Controller
    • Spring실행하면 Spring Container라는 통이 생김
    • @Controller있으면 MemberController객체를 생성해서 Spring안에 넣어두고 관리(스프링 빈이 관리됨)
  • private final MemberService memberService;
    • new로 생성해서 쓸 수도 있지만, spring container에 등록해서 container에서 받아서 쓸 수 있게 해야함
    • why? new하면 다른 컨트롤러들이 MemberService사용할 때, 여러개 생성할 필요없이 하나 생성해서 공유하면 됨(container 하나 등록하면 여러가지 효과 볼 수 있음(이는 나중에 설명해주신다고,,,))
  • @Autowired
    • @Autowired붙이면 컨테이너 생성할 때 생성자 호출 -> memberService를 연결시켜줌(스프링이 연관된 객체를 스프링 컨테이너에서 찾아서 넣어줌)

1-2. 실행

  • 에러가 나는 이유?
    • memberService가 스프링 빈으로 등록되어있지 않음
  • 해결방안
    • MemberService는 순수한 자바 클래스 -> 스프링이 MemberService를 인식할 수 없음 -> @Service, @Repository를 넣어 인식하게 만들어라

1-3. 컴포넌트 스캔 원리

  • @Service안에 @Component가 포함되어있음
  • 컴포넌트 스캔 -> 스프링 실행시킬 때 컴포넌트 관련 어노테이션있으면 하나씩 객체 만들어서 컨테이너에 미리 등록해놓음 + autowired는 연결시켜줌
  • Q. 이때, 아무곳에 넣으면 되나?
    • A. No. HelloSpringApplication을 실행시키는 것이므로 이 패키지 밑에 있어야 컴포넌트 등록가능 (그치만 @ComponentScan이라는 어노테이션붙이면 하위에 없어도 가능하긴함)
  • 스프링컨테이너에 스프링 빈 등록할 때 기본은 싱글톤 -> 같은 스프링빈이면 모두 같은 인스턴스.(메모리 줄고 좋음) / 특수 케이스로 아니게할 수는있지만 보통 다 싱글톤

1-4. 최종 코드

[ MemberController ]

@Controller
public class MemberController {

    private final MemberService memberService;

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

[ MemberService ]

@Service
public class MemberService {

    private final MemberRepository memberRepository;

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

[ MemoryMemberRepository ]

@Repository
public class  MemoryMemberRepository implements MemberRepository{}

0개의 댓글