김영한님의 인프런 스프링 강의 리뷰입니다. XD
스프링 빈을 등록하고 의존관계 설정하기
회원 컨트롤러가 회원서비스와 회원 리포지토리를 사용할 수 있도록 의존관계를 준비하자.
"회원 컨트롤러에 의존관계 추가"
package hello.hellospring.controller;
import hello.hellospring.domain.Member;
import hello.hellospring.service.MemberService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
@Controller
public class MemberController {
//스프링 컨테이너에 등록하여 1개만 생성
private final MemberService memberService;
//의존관계 주입
@Autowired
public MemberController(MemberService memberService) {
this.memberService = memberService;
}
}
스프링 빈을 등록하는 두가지 방법이 있습니다.
- 컴포넌트 스캔과 자동 의존관계 설정 (애노테이션을 사용합니다.)
- 자바 코드로 직접 스프링 빈 등록하기
이번에는 컴포넌트 스캔으로 의존관계를 자동으로 설정하는 방법을 다룹니다.
어노테이션을 사용하면 컨테이너에 객체로 자동으로 등록이 됩니다.
아래는 어노테이션 종류입니다.
- @Component : 스프링빈이 자동 등록된다.
- @Controller : 컨트롤러가 스프링 빈으로 자동 등록된 이유도 컴포넌트 스캔 때문이다.
@Component 를 포함하는 다음 애노테이션도 스프링 빈으로 자동 등록됩니다.
- @Controller : 컨트롤러라는 객체를 만들어서 컨테이너에 등록하도록 한다. ( 이를 스프링 빈이 관리된다고 함 )
- @Service
- @Repository
- @Autowired : 연관관계를 만들어서 연결을 시켜주는 역할을 한다.
- ex) Controller가 memberService를 사용할 수 있게 해줌
- ex) memberService가 memberRepository를 사용할 수 있게 해줌
컨트롤러에서 외부의 요청을 받고, 서비스에서 비즈니스 로직을 짜고, 리포지토리에서 데이터를 저장하는 것이 스프링의 정형화된 패턴입니다.
만약 다른 패키지에서 어노테이션으로 스프링 빈을 등록할 수 있을까?
일반적으로 불가능합니다. 메인 어플리케이션에서 package 하위에 있는 어노테이션만 컨테이너가 찾아 돌립니다.
그러므로 다른 패키지에 어노테이션을 등록해도 컴포넌트 스캔이 불가능합니다. ( 하지만 따로 설정할 수는 있음 )
참고 : 스프링은 스프링 컨테이너에 스프링 컨테이너에 스프링 빈을 등록할 때, 기본으로 싱글톤으로 등록합니다.
(유일하게 하나만 등록해서 공유한다)
따라서 같은 스프링 빈이면 모두 같은 인스턴스입니다. 설정으로 싱글톤이 아니게 설정할 수 있지만, 특별한 경우를 제외하면 대부분 싱글톤을 사용합니다.
'Computer Engineering > Java & Spring' 카테고리의 다른 글
자바의 정석 : 13장 스레드 (0) | 2022.09.13 |
---|---|
[자바의 정석 2회독] 11챕터 : 컬렉션 프레임 웍 (0) | 2022.09.11 |
자바의 입력을 담당하는 BufferedReader와 StringBuilder (2) | 2022.08.24 |
스프링의 세가지 핵심 프로그래밍 모델(loC, AOP, PSA) (0) | 2022.07.21 |
[spring] 스프링 빈과 의존관계2- 자바 코드로 직접 스프링 빈 등록 (0) | 2022.06.26 |