일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- 멋사 서류평가
- API
- 멋사10기
- 멋사 합격
- 멋사 면접
- 멋사12
- 멋쟁이사자처럼10기
- 멋사11기
- 멋쟁이사자처럼11기
- django
- 크롤링
- 멋쟁이사자처럼 서류
- 코딩동아리
- discord
- 멋사 10기
- 웹동아리
- 멋사
- 멋쟁이사자처럼
- 파이썬 크롤링
- 디스코드봇
- IT동아리
- 알림봇
- 파이썬
- ㅏㄴ
- 멋쟁이사자처럼대학
- 멋쟁이 사자처럼
- 멋사 서류
- 깃허브
- 백엔드
- 기사 제목 크롤링
- Today
- Total
ACHO.pk devlog
[Springboot] 스프링 빈과 의존관계 본문
인프런 김영한 강사님의 "스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술"의 강의를 듣고 학습하였습니다.
컴포넌트 스캔과 자동 의존관계 설정
• 회원 컨트롤러가 회원서비스와 회원 리포지토리를 사용할 수 있게 의존관계를 준비
스프링 빈을 등록하는 2가지 방법
① 컴포넌트 스캔과 자동 의존관계 설정
▹컴포넌트 스캔 : 스프링이 스프링 빈(Bean)으로 등록될 준비가 된 클래스들을 스캔하여 빈(Bean)으로 등록해주는 과정
▹ @Configuration, @Service, @Repository, @Controller, 등의 어노테이션에도 전부 @Component이 포함되어 있어 자동으로 컴포넌트 스캔의 대상이 된다.
▹ 내 프로젝트인 Springboot.study 패키지 하위의 패키지에는 스프링이 스캔을 한다.
② 자바 코드로 직접 스프링 빈 등록하기
컴포넌트 스캔 원리
• @Component 애노테이션이 있으면 스프링 빈으로 자동 등록된다.
• @Controller 컨트롤러가 스프링 빈으로 자동 등록된 이유도 컴포넌트 스캔 때문이다.
• @Component 를 포함하는 다음 애노테이션도 스프링 빈으로 자동 등록된다.
▹@Controller
▹@Service
▹@Repository
회원 컨트롤러에 의존관계 추가
① controller 폴더 하위에 "MemberController" 클래스를 생성한다.
▹스프링 컨테이너에 MemberController 객체를 생성해서 스프링에 넣어두고, 관리를 한다.
② MemberController 클래스 내부의 코드를 작성한다.
▹MemberService를 통해 회원가입을 하고, 회원을 조회할 수 있어야한다.
▹즉, MemberController가 MemberService를 의존한다 == 의존관계에 있다 !
package Springboot.study.controller;
import Springboot.study.service.MemberService;
import org.springframework.beans.factory.annotation.Autowired;
public class MemberController {
private final MemberService memberService;
@Autowired
public MemberController(MemberService memberService) {
this.memberService = memberService;
}
}
▸ @Autowired : 스프링이 연관된 객체를 스프링 컨테이너에서 찾아서 넣어준다.
▹MemberController가 생성될 때 스트링 빈에 등록되어 있는 MemberService 객체를 가져다 넣어준다.
▹ 이렇게 객체 의존관계를 외부에서 넣어주는 것을 DI (Dependency Injection), 의존성 주입이라 한다. 이전 테스트에서는 개발자가 직접 주입했고, 여기서는 @Autowired에 의해 스프링이 주입해준다.
private final MemberService memberservice = new MemberService();
▹ 위와 같은 코드도 가능하지만, new 연산자를 사용해서 생성하게 되면 MemberController 이외에도 다른 컨트롤러에서 MemberService를 가져다 사용할 수 있다.
▹ 스프링 컨테이너에 등록을 하고 사용하면 하나만 등록이 된다.
에러
Consider defining a bean of type 'Springboot.study.service.MemberService' in your configuration
MemberService가 스프링 빈으로 등록되어 있지 않아서 그런 것이다.
이를 해결하기 위해 MemberService에는 @Serivce 어노테이션을, MemberRepository에는 @Repository 어노테이션을 추가해주면 된다.
스프링이 해당 어노테이션을 확인하고 스프링 컨테이너에 MemberService와 MemberRepository를 등록해준다.
③ MemberService와 MemberRepository에 각각 어노테이션을 추가하고, MemberService에는 @AutoWired 어노테이션을 추가해준다.
@Service
public class MemberService {
private final MemberRepository memberRepository;
@Autowired
public MemberService(MemberRepository memberRepository){
this.memberRepository = memberRepository;
}
참고: 스프링은 스프링 컨테이너에 스프링 빈을 등록할 때, 기본으로 싱글톤으로 등록한다(유일하게 하나만 등록해서 공유한다) 따라서 같은 스프링 빈이면 모두 같은 인스턴스다. 설정으로 싱글톤이 아니게 설정할 수 있지만, 특별한 경우를 제외하면 대부분 싱글톤을 사용한다.
'프레임워크 > Springboot' 카테고리의 다른 글
[Springboot] 회원 웹 기능(홈 화면 추가, 등록, 조회) (0) | 2023.01.22 |
---|---|
[Springboot] 자바 코드로 직접 스프링 빈 등록하기 (0) | 2023.01.21 |
[Springboot] 회원 서비스 개발 및 테스트 (0) | 2023.01.19 |
[Springboot] 회원 레포지토리 테스트 케이스 작성 (0) | 2023.01.18 |
[Springboot] 회원 도메인과 레포지토리 생성 (0) | 2023.01.17 |