지금까지 멤버의 객체, 서비스, 리포지토리를 만들었습니다.앞으로 회원 가입을 하고 회원 목록을 보여주는 컨트롤러를 작업할 것입니다. 컨트롤러에서 맴버 서비스와 리포지토리를 통해서 회원가입을하고 데이터를 조회할 수 있어야합니다. 이러한 관계를 컨트롤러가 서비스를 의존한다고 하며, 스프링의 방식으로 의존관계를 설정해보겠습니다.
컴포넌트 스캔과 자동 의존관계 설정
우선 멤버 컨트롤러를 만들어줍니다. 이때, @Controller라는 어노테이션이 있으면 스프링이 뜰 때 객체를 생성해서 스프링 컨테이너에서 관리를 합니다. 그렇기 때문에 스프링과 관련된 기능들이 동작할 수 있게 됩니다. @Autowired 어노테이션으로 Spring 컨테이너에서 Member 서비스를 가져옵니다.
기존에 작성된 맴버 서비스는 순수 자바 클래스 입니다. 따라서, 스프링에서 알 수 있도록 @Service를 붙여줍니다. 그리고, 맴버 리포지토리를 사용할 수 있도록 @Autowired로 리포지토리를 연결합니다.
리포지토리도 마찬가지로 구현체에 @Repository 를 붙여 스프링에서 알 수 있도록 해줍니다.
멤버 컨트롤러에서 사용할 수 있도록 서비스를 @Autowired 해주는 것, 서비스에서 리포지토리를 사용할 수 있도록 @Autorwired 해주는 것을 의존성을 주입한다고 합니다. 참고로, 생성자가 1개만 있으면 @Autowired는 생략가능합니다.
스프링 빈 등록 이미지
등록된 스프링 빈 의존관계를 표현하면 다음과 같습니다.
스프링 빈을 등록하는 방법은 2가지가 있습니다. 2가지 방법을 모두 알아야합니다.
우선 앞서 등록한 방식을 컴포넌트 스캔 방식이라고 하며 원리는 다음과 같습니다.
컴포넌트 스캔 원리
- @Conponent 어노테이션이 있으면 스프링 빈으로 자동 등록된다.
- @Component 를 포함하는 다음 어노테이션들은 컴포넌트 스캔으로 스프링 빈으로 자동 등록됩니다.
- @Controller
- @Service
- @Repository
- 스프링은 컨테이너에 스프링 빈을 등록할 때, 기본으로 싱글톤으로 등록합니다.(유일하게 하나만 등록해서 공유한다.) 따라서 같은 스프링 빈이면 모두 같은 인스턴스입니다.
자바 코드로 직접 스프링 빈 등록하기
향후 메모리 리포지토리를 다른 리포지토리로 변경할 예정이므로, 회원 서비스와 리포지토리의 @Service, @Repository, @Aurowired 어노테이션을 제거하고 자바 코드로 직접 스프링 빈을 등록해보겠습니다.
- SpringConfig를 직접 작성합니다.
- @Configuration 을 등록하고, @Bean으로 작성합니다.
- Controller는 스프링이 관리하는 것이기 때문에 어쩔 수 없음, 컴포넌트 스캔방식으로 하면 됩니다.
참고사항
DI에는 필드 주입, setter 주입, 생성자 주입 3가지 방식이 있습니다. 의존관계가 실행중에 동적으로 변경하는 경우가 거의 없으므로 (실무에서는 거의 0) 생성자 주입을 주로 사용하며 권장합니다.
- 필드 주입은 DI를 사용하여 객체를 바꿀 수 있는 방법이 없어 권장하지 않습니다.
- Setter 방식은 public으로 열려있어 set으로 다른 곳에서도 조작 가능합니다. 실행되는 어플리케이션은 변경되면 곤란합니다.
당연한 이야기이지만 @Autowired를 통한 DI는 스프링이 관리하는 객체 (스프링 컨테이너에 등록된 스프링 빈) 에서만 동작합니다. 스프링 빈으로 등록하지 않고 직접 생성한 객체에서는 동작하지 않습니다.
정형화된 컨트롤러, 서비스, 리포지토리는 컴포넌트 스캔을 사용합니다. 정형화 되지 않거나, 상황에 따라 구현 클래스를 변경해야 하면 설정을 통해 스프링 빈으로 등록합니다.
이 글은 김영한 님의 스프링 입문 강의를 복습하기 위해 작성된 글 입니다.
'Dev > Spring' 카테고리의 다른 글
[spring-intorduction] 스프링 DB 접근 기술 (0) | 2022.10.07 |
---|---|
[spring-introduction] 회원관리 웹 MVC 개발 (0) | 2022.10.07 |
[spring-introduction] 회원 관리 예제로 백엔드 개발 및 테스트 해보기 (0) | 2022.10.03 |
[spring-introduction] 정적 컨텐츠, MVC와 템플릿 엔진, API 을 활용한 웹 개발 방식 비교 (0) | 2022.10.02 |
[spring-introduction] 빌드하고 실행하기 (0) | 2022.09.30 |