-
[Spring]스프링 컨테이너와 스프링 빈, DISpring 2023. 3. 20. 20:48반응형
[모든 포스팅은 개인적 공부를 위해 작성된 글입니다]
<스프링 컨테이너>
- 스프링에서 자바 객체들을 관리하는 공간
- 빈의 생성부터 소멸까지를 개발자 대신 관리해주는 곳
<빈>
- 자바 객체를 의미
<DI(Dependency Injection)>
- 의존성 종속
- Dependency == 객체가 다른 객체와 상호작용 하는 것
- 즉, 한 클래스가 다른 클래스의 메서드를 실행하는 것(변경에 의해 다른 클래스에 영향을 받는 것)
- ex) 의존하는 클래스의 메서드명이 바뀌면 해당 클래스의 코드도 바뀜
- DI : 의존하는 객체를 직접 생성(new) 하는 대신 의존 객체를 전달받는 방식
- 클래스 간의 의존관계를 스프링 컨테이너가 자동으로 연결해주는 것
<스프링 빈을 등록하는 방법 2가지>
- 1. 컴포넌트 스캔과 자동 의존관계 설정(@Controller, @Service, @Repository 등등을 사용하는 방식)
*@Controller, @Service, @Repository 등은 @Component를 포함하고 있음*
- 2. 자바 코드로 직접 스프링 빈 등록하기
@Configuration public class SpringConfig { @Bean //스프링 빈을 등록할 것이라는 의미 public MemberService memberService(){ return new MemberService(memberRepository());//매개변수는 @Bean으로 등록한(스프링 빈에 등록된) 것을 넣어줘야 함 //MemberService가 MemberRepository를 의존 } @Bean public MemberRepository memberRepository(){ return new MemoryMemberRepository(); } }
*스프링은 스프링 컨테이너에 스프링 빈 등록할 때 기본적으로 싱글톤으로 등록(하나만 등록해서 공유) -> 그러므로 같은 스프링 빈이면 모두 같은 인스턴스임 -> 설정으로 싱글톤 아니게 지정할 수 있지만 특별한 경우 제외하고는 대부분 싱글톤 사용*
<@Autowired>
- 스프링 빈에서 인스턴스 생성된 이후 @Autowired가 붙은 메서드가 자동으로 호출되고 인스턴스가 자동으로 주입됨(의존선 주입을 도와주는 어노테이션)
- 스프링 컨테이너에 빈들을 모두 등록한 후 의존성 주입이 이루어짐
- 필드, Setter 메서드, 생성자에 적용 가능
- 스프링 컨테이너에 올라간 것들만 Autowried가 동작
- 의존 객체가 2개 이상인 경우 오류 발생
<@Configuration>
- 해당 클래스가 스프링 설정 클래스(스프링 설정 담당하는 클래스)라는 의미
<@Bean>
- 해당 메서드가 생성한 객체를 스프링 빈이라고 설정
- 메서드의 이름을 빈 객체의 이름으로 사용(메서드명으로 스프링에 등록됨)
return new MemberService(memberRepository());
- 여기에서 memberRepository() 메서드가 생성한 객체를 MemberService 클래스가 주입받는다는 의미
<의존관계 주입 방법 4가지>
- 1. 생성자 주입
- 2. 수정자 주입/Setter 주입
- 3. 필드 주입
- 4. 일반 메서드 주입
-> 4가지 방법 중 생성자 주입을 가장 권장
-> 실무에서는 정형화된(일반적으로 작성하는) 컨트롤러, 서비스, 리포지토리 같은 코드는 컴포넌트 스캔 사용
-> 정형화되지 않거나 상황에 따라 구현 클래스를 변경해야 하면 설정 통해 스프링 빈으로 등록
<참고>
https://life-with-coding.tistory.com/433
https://m42-orion.tistory.com/100
*계속 추가 예정*
반응형'Spring' 카테고리의 다른 글
[Spring]Welcome Page와 우선순위 (0) 2023.03.21 [Spring]JUnit Test (0) 2023.03.20 [Spring]API 방식 (0) 2023.03.20 [Spring]Model (0) 2023.03.20 [Spring]@RequestParam으로 값 받아오기 (0) 2023.03.20