일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
29 | 30 | 31 |
- 인프런
- Exception
- transaction
- java
- springdatajpa
- QueryDSL
- Servlet
- AOP
- 스프링
- Android
- 알고리즘
- 스프링 핵심 기능
- Greedy
- JPQL
- 백준
- db
- jpa
- 그리디
- Spring Boot
- Proxy
- pointcut
- 자바
- spring
- Thymeleaf
- JDBC
- kotlin
- SpringBoot
- 김영한
- 스프링 핵심 원리
- http
- Today
- Total
개발자되기 프로젝트
Spring Bean과 의존관계(@Component 스캔) 본문
스프링 빈을 등록하는 방법은 두 가지가 있다.
- 컴포넌트 스캔 & 자동 의존관계 설정
- 자바 코드로 직접
먼저 컴포넌트 스캔에 대하여 알아보자.
1) 컴포넌트(@Component) 스캔과 자동 의존관계 설정
@Controller, @Service, @Repository 등은 모두 @Component
컴포넌트 스캔은 스프링이 시작될 때 @Component붙은 클래스를 bean으로 등록!
스프링은 컨테이너에 빈을 등록할 때 싱글톤으로 등록. 따라서 유일한 인스턴스 존재.
@Autowired의 역할을 해당 bean들을 필요한 곳에 연결시키는 역할을 함.
1. @Controller
@Controller
public class MemberController {
}
스프링이 처음 뜰 때 스프링 컨테이너가 생김 이 때,
@Controller가 붙어있으면 객체를 만들어서 스프링 컨테이너에 넣어둠.
그리고 스프링이 그 객체를 관리함.(bean으로 등록)
일반적으로 인스턴스를 만들 때 아래처럼 new를 통해 직접 생성하여 사용할 수 있다.
@Controller
public class MemberController {
private final MemberService memberService = new MemberService();
}
하지만 스프링에서 관리하게 되면, 스프링 컨테이너에 등록이 되고, 컨테이너에서 받아 쓰도록 바꿔야 한다.
만약 MemberService를 여러 controller에서 사용한다고 가정해 보자.
Service는 현재 별 기능이 없어서 한 번만 만들어서 같이 사용하면 되는데,
각 controller에서 매 번 생성하여 사용하기는 비효율적이다.
자 그러면 Spring 컨테이너에 등록을 하고 받아서 사용해 보자.
(컨테이너에는 하나씩만 등록이 가능하다. 싱글톤...!)
2. @Autowired
@Controller
public class MemberController {
private final MemberService memberService;
@Autowired
public MemberController(MemberService memberService) {
this.memberService = memberService;
}
}
위와같이 Contstructor를 생성하고 @Autowired를 붙여주자. 그럼 어떻게 진행되냐.?
- 스프링 시작
- 스프링 컨테이너 생성
- MemberController 객체 생성될 때!
- 스프링이 컨테이너에 있는 MemberService객체와 연결시켜야 하느데..? 등록돼있어야 하는데..?
- 따라서 MemberService는 @Service로 스프링 bean으로 등록
@Service public class MemberService { private final MemberRepository memberRepository; //repository를 직접 생성하는 것이 아니라, 외부에서 넣어주도록 변경. //MemberService입장에서 외부에서 Repository를 주입받음 = Dependancy Injection(DI) @Autowired public MemberService(MemberRepository memberRepository) { this.memberRepository = memberRepository; }
- @Service가 붙어있으면 스프링이 뜰 때 얘도 컨테이너에 등록됨.
- 그런데 MemberService 객체가 생성되려면 @Autowired를 통해 MemberRepository도 커네이너에서 가져와야함.
- 주입되는 객체는 MemberRepository의 구현체인 MemoryMemberRepository이다!
- Repository는 @Repository로 bean으로 등록 가능,
@Repository public class MemoryMemberRepository implements MemberRepository{
@Controller, @Service, @Repository를 붙여주면 스프링이 뜰때 해당 객체를 싹 컨테이너에 등록을 한다.
2. Spring Bean을 등록하는 방법
1) 컴포넌트(@Component) 스캔과 자동 의존관계 설정
@Controller, @Service, @Repository 모두 @Component
스프링이 시작될 때 @Component붙은 클래스를 bean으로 등록!
@Autowired를 통해 해당 bean들을 연결시킨다.
--> 웬만한 것은 bean으로 등록하고 사용해야 이점이 많다.
스프링은 컨테이너에 빈을 등록할 때 싱글톤으로 등록. 따라서 유일한 인스턴스 존재.
2) 자바 코드로 직접(다음에 ㅎ)
3. GitHub : 210722, Component scan, DI
'Spring Boot' 카테고리의 다른 글
홈 화면 추가 & 웹 기능 (0) | 2021.07.22 |
---|---|
Spring Bean과 의존관계(JAVA로 직접 등록) (0) | 2021.07.22 |
회원 서비스 개발 & Test (0) | 2021.07.22 |
회원 도메인, Repository 만들기 (0) | 2021.07.22 |
비즈니스 요구 사항 정리 (0) | 2021.07.22 |