일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- cache
- js
- 프로토타입
- vuex
- Stateless
- DB
- javascript
- Excel
- Kotlin
- JPA
- Java
- 로그인
- di
- Vue.js
- vue-cli
- Singleton
- HTTP
- thymeleaf
- dependency injection
- VUE
- 캐시
- Setter
- 라이프 사이클
- 싱글톤
- Security
- BEAN
- Spring
- HTTP 메서드
- Repository
- 의존성 주입
- Today
- Total
jhhan의 블로그
Spring - DI(의존성 주입) 본문
이번에는 Spring의 의존성 주입에 대해 알아보겠습니다.
(이 주제도 이전에 한 번 쓴적이 있는데
사실 만족스럽지 않아서 이번에 다시 한번 써볼려고 합니다.)
저번에 썼던 글에서 이어서 나가겠습니다.
프로젝트 구조입니다.
controller 패키지 밑에 MemberController를 만들겠습니다.
@Controller
public class MemberController {
}
ㄱ
그리고 @Controller라는 어노테이션을 추가합니다.
이렇게 하면 Spring 컨테이너에 MemberController라는 객체를 생성하고 관리합니다.
@Controller
public class MemberController {
private final MemberService memberService;
@Autowired
public MemberController(MemberService memberService) {
this.memberService = memberService;
}
}
이렇게 적습니다.
그러면 아마 다음과 같은 상태가 될 것입니다.
memberService에서 오류가 생기는데요.
MemberService는 현재 순수 자바 클래스입니다.
Spring 컨테이너에는 MemberService가 등록되지 않았기 때문에, @Autowired 어노테이션을 써도 빨간 줄이 생깁니다.
다음 그림을 보겠습니다.
그림처럼 @Service 어노테이션을 추가하면 빨간 줄이 사라집니다.
그럼 아마 또 다음처럼 보일 것입니다.
memberRepository에 빨간 줄이 생겼습니다.
그럼 이제 MemberRepository로 가보겠습니다.
MemberRepository는 Interface이기 때문에 이를 구현한 구현체로 가야 합니다.
앞에서 MemoryMemberRepository라는 클래스를 만들었기 때문에 거기로 가보겠습니다.
그리고 다음과 같이 추가해봅니다.
@Repository라는 어노테이션을 추가합니다.
그리고 MemberService 클래스에 다시 가보면
빨간 줄이 사라진 것을 확인할 수 있습니다.
사실 Spring에서는 이렇게 어노테이션을 선언하는 것이 정형화된 패턴이라고 합니다.
(@Controller, @Service, @Repository)
- @Controller: 외부 요청을 받습니다.
- @Service: 비즈니스 로직을 만듭니다.
- @Repository: 데이터 저장을 합니다.
이렇게 정형화된 패턴이라고 합니다.
다시 한번 보겠습니다.
- 일단 Controller와 Service를 연결해야합니다.
- 연결할 때 @Autowired를 이용해서 연결합니다.
- 그러면 MemberController가 생성될 때 Spring 컨테이너에 등록된 MemberService 객체를 넣어주게 됩니다.
- 이 과정이 바로 Dependency Injection이라고 합니다.
- 그러면 이제 MemberService를 보겠습니다.
- MemberService는 MemberRepository가 필요합니다.
- 그러면 MemberService가 생성될 때 Spring 컨테이너에 등록된 MemberRepository를 넣어주게 됩니다.
(여기서는 MemoryMemberRepository라는 구현체가 있어서 이것을 넣어줍니다.) - 이렇게 MemberController, MemberService, MemberRepository가 연결이 됩니다.
Spring Bean에 대해 알아보겠습니다.
Bean: Spring IOC 컨테이너가 관리하는 자바객체를 Bean이라고 합니다.
이 빈을 만드는(등록하는) 방법은 크게 2가지가 있습니다.
-> 이 2가지는 모두 알아야 합니다.... (저도 아직 잘 모릅니다.. 공부하는 중입니다.)
- 컴포넌트 스캔 & 자동 의존관계 설정
- 자바 코드로 직접 스프링 빈 등록
그 중에서 이번에는 1번의 방법을 선택해서 진행한 것입니다.
컨트롤러 어노테이션을 한번 보겠습니다.
Ctrl + 마우스클릭을 진행하시면 다음과 같은 그림이 보입니다.
컨트롤러에는 @Component 어노테이션이 등록되어 있습니다.
Service 와 Repository 역시 마찬가지입니다.
컨트롤러, 서비스, 레포지토리 모두 @Component라는 어노테이션이 등록되어 있습니다.
@Component 어노테이션을 가지고 있으면 Spring이 객체를 생성해서 Spring 컨테이너에 등록합니다.
그리고 @Autowired를 통해 서로서로를 연결해 줍니다.
이 방법이 컴포넌트 스캔과 자동 의존관계 설정입니다.
참고로 이렇게 자동으로 스프링 빈 객체가 설정되는 범위는
HelloSpringApplication에 가보면 맨 위에 package 하고 범위가 나옵니다.
hello/hellospring 폴더 안에 있는 녀석들만 자동으로 생성됩니다.
그 외의 범위에 있으면 자동으로 생성되지 않습니다.
그리고 스프링은 스프링 컨테이너에 스프링 빈을 등록할 때 기본으로 싱글톤으로 등록합니다.
이렇게 DI에 대해서 마치겠습니다.
다음은 아마 '자바 코드로 스프링 빈 직접 등록'이 될 것입니다.
'Spring' 카테고리의 다른 글
Spring - 웹 기능(MVC) (0) | 2020.09.28 |
---|---|
Spring - DI(2) (0) | 2020.09.26 |
Spring - Test Code 작성(2) (0) | 2020.09.13 |
Spring - Test Code 작성 (0) | 2020.09.12 |
Spring - static (0) | 2020.09.06 |