이번 포스팅에서는 스프링 빈이 무엇인지와 그들간의 의존성에 대해 알아보겠다.
스프링 빈이란?
스프링이 돌 때, 컨트롤러 annotation을 보고 컨테이너에 넣어서 관리 = 스프링 빈이라고 함.
컨트롤러가 서비스를 통해 작업을 함 = 컨트롤러가 서비스에 의존적이라고 함
코드로 표현하면, 컨트롤러는 생성자에 인자로 서비스를 받는다 => 생성자 주입(DI의 방법중 하나)
멤버 컨트롤러 생성자에 멤버 서비스를 파라미터로 받는다 -> 서비스에 의존적
spring에서 의존성 주입(Dependency Injection)의 방법은 두가지가 있다.
1.컴포넌트 스캔
사실 컨트롤러에서 서비스를 new로 생성하면 다른 컨트롤러가 멤버 서비스를 가져다 쓸 수 있다.
이걸 방지하기 위해 스프링 컨테이너에 등록하는 것이다!
how?
생성자를 만들고 @controller와 @autowired 어노테이션을 작성(스프링 빈으로 등록 된 컨트롤러랑 서비스, 그리고 리포지토리를 연결해준다)
@controller 작성 시 스프링 빈으로 등록, 그리고 @autowired를 통해 서비스와 연결
@service 작성 시 스프링 빈으로 등록, 그리고 @autowired를 통해 리포지토리와 연결
만약, 서비스가 어노테이션이 없는 순수 자바 코드라면 -> @service를 작성해주자 그럼 스프링이 컨테이너에 서비스를 스프링 빈으로 등록해준다. 마찬가지로 리포지토리도 @repository 붙여주자
=> 이들은 실무에서 정형화된 패턴이라고 한다.
(컨트롤러를 통해 외부 요청을 받고 서비스에서 비즈니스 로직을 만들고 리포지토리에서 저장하고..)
Di(dependency injection)의 3가지 방법이란?
1. 주로 생성자 주입방식을 채택 -> 조립(컨테이너에 스프링 빈들이 올라가는 과정) 시에 딱 하나만 생성되고 추후에 변동될 위험 x
2. setter주입이 있는데, 이것은 public이라 실행중에 의존성이 동적으로 변할 위험이 존재한다.
-> 보통 실행중에 의존성을 바꾸고 싶으면 config 파일을 수정하고 서버를 재구동
3. 필드 주입 방식은 거의 사용하지 않는다..
추가로 xml방식이 있다고 하는데 마찬가지로 잘 사용되지 않는다고 한다.
컴포넌트 스캔이면 @component인데 @service,@repository라고 써도 괜찮은 이유는 @service안에 들어가보면 @component 존재한다!!
정리
컴포넌트 스캔 하면 스프링 컨테이너안에 자동으로 객체(스프링 빈) 생성되고, @autowired를 통해 객체를 연결
그럼 다 가능하냐? 아니다!! 패키지의 하위 파일들만 가능하다.
빨간 밑줄이 패키지 이름이다
어떠한 설정에 의해서 가능은 하다고 한다..
스프링 빈은 싱글톤 방식인데, 싱글톤이란 객체를 하나만 등록해서 공유한다는 뜻이다 , 즉 같은 스프링 빈이면 같은 객체이다. 대부분 싱글톤으로 사용한다고 한다
2. 자바 코드로 직접 스프링 빈 등록하기
(컨트롤러 제외) 서비스,지포지토리에 있는 모든 어노테이션을 지우고, 클래스 파일 하나 만들어서 이름은 SprinfConfig라고 하고 어노테이션을 @configuration로 작성해보자.
그리고 서비스 생성할 때 @Bean 어노테이션 사용, 서비스와 리포지토리 모두 작성해준다.
*컨트롤러는 어떻게 할 수 없으므로 컴포넌트스캔 사용*
이렇게 되면 의존성이 주입된 것이다!
두가지 방법을 언제 사용해야할까?
1. 컴포넌트 스캔 : 정형화된 컨트롤러, 서비스, 리포지토리 사용할 때(실무에서 주로 사용하는 방법이라고 함)
2. 코드로 스프링 빈 등록 : 상황에 따라 구현 클래스를 변경할 때 설정(config)을 통해 등록한다.
(ex. 데이터베이스를 선정하지 못했을 때 등등) 이 때 코드로 스프링 빈을 등록하면 추후에 config파일만 살짝 수정하면 바로 변경사항 적용 가능하다는 장점이 있다.
주의 - 스프링 빈으로 등록되지 않은 class 내부에서 autowired(연결)는 적용되지 않음 + 내가 직접 생성한 객체도 마찬가지이다.
즉, 컨테이너에 올라간 것만 @autowired 가능
'스프링(JAVA)' 카테고리의 다른 글
스프링 DB 접근 기술 #1 JDBC, JDBC Template (0) | 2022.09.25 |
---|---|
Spring 웹mvc 간단 회원 관리 예제(홈 화면, 등록, 조회) (0) | 2022.09.25 |
Spring 회원 관리 예제 - 테스트 코드 (0) | 2022.09.25 |
Spring 회원 관리 예제 (0) | 2022.07.12 |
Spring 입문 (0) | 2022.07.12 |