Springboot/lecture

[springboot] 스프링 빈과 의존관계

Alchemists 2022. 8. 2. 11:35
728x90

🌈 스프링 빈 등록하는 방법

- 컴포넌트 스캔과 자동의존 관계

( @Controller - @Service - @Repository 연결)

- 자바코드로 직접 스프링 빈 등록하기 

 

 

컴포넌트 스캔 

 

화면을 붙이려면 컨트롤러와 view template이 필요하다. 우선 회원 컨트롤러를 만들어보겠다. 

 

회원 컨트롤러를 만들어서 MemberService와 연결해줬는데, 이때는 new로 새로운 객체를 만들지 않고 스프링 컨테이너에 bean으로 등록했다. 그래서 생성자를 만들어줬다. 그래서 이 생성자를 가지고 뭘할거냐 하면 ! Member Controller와 MemberService를 연결시켜줄거다. 그리고 MemberSerivce는 Member Repository와 연결시켜줄 것이다. 

이렇게 생성자를 통해 주입시켜주는것을 "생성자 주입"이라고 한다. 

 

정리하자면 컨트롤러에서 외부로직을 받고 -> Service에서 비즈니스 로직 생성 -> Repository 에서 데이터 저장하는 과정을 컴포넌트 스캔이라고 하고, 컴포넌트 스캔을 통해서 스프링 컨테이너에 bean으로 등록할 수 있다.

얘네를 연결시켜줄 때  @Autowired를 통해 MemberService와 MemberRepository 연결 , MemberService와 MemberController 연결해준다! 

 

MemberController

 

 

🔔 스프링은 스프링 컨테이너에 스프링 빈을 등록할 때, 기본으로 싱글톤으로 등록한다. (유일하게 하나만 등록해서 공유) 따라서 같은 스프링 빈이면 같은 인스턴스. (예를 들어 memberService는 memberService 1개만 스프링 빈으로 등록함.) 

 

왜 싱글톤으로 등록해야 할까? 

싱글톤은 클래스의 인스턴스가 딱 1개만 생성되는 것을 보장하는 디자인 패턴이다. 

예를 들어 클라이언트가 서버에 회원가입이라는 요청을 보낸다고 하자. A도 회원가입을하고,

B도 회원가입을 하고, C도 회원가입을 하는데 그때마다 회원가입하는 객체가 따로 생성해서 응답한다면 메모리가 파국일거다.

그래서 동일한 요청에 대해서 같은 객체를 사용해 응답해주기 위해서는 싱글톤 패턴을 적용한다.

 

 

https://hongchangsub.com/springcore5/

 

<Spring> 스프링 핵심원리 이해 5 - 싱글톤 컨테이너

웹 어플리케이션과 싱글톤의 관계여러 고객이 동시에 동일한 서비스를 요청하는 경우통상적으로 서비스를 운영하다보면 위 그림과 같이 동일한 요청이 서로 다른 클라이언트로부터 동시에 들

hongchangsub.com

MemberRepository

 

Repository 어노테이션을 추가해줬다.

 

MemberService

 

Service 어노테이션과 MemberRepository와 연결해주기 위해 Autowired 어노테이션을 추가해줬다. 

 

 

 

자바 코드로 직접 스프링 빈 등록하기 

 

먼저 SpringConfig라는 클래스를 만들어줬다.

 

@Configuration을 통해 bean에 등록할 것임을 알려주고 @Bean을 통해 bean을 생성해준다. MemberService를 만들려면

MemberRepository가 있어야하기에 둘다 bean에 등록하면

 

이제 @Autowired를 통해 MemberController에 연결할 수 있다. (Autowired는 스프링 컨테이너에 등록된 bean들을 연결시켜준다)

 

MemberController

 

정리하자면 SpringConfing에서 MemberRepository와 MemberService를 연결시켜주고,

그 MemberService가 MemberController에 생성자로 들어오면서 MemberSerivce와 Controller가 연결된다. 

 

 

++) 실무에서는 정형화된 컨트롤러, 서비스, 리포지토리 같은 코드는 컴포넌트 스캔 사용, 정형화되어있지 않거나 상황에 따라 구현클래스를 변경해야하는 경우는 자바코드로 직접 bean 코드 짜야함.

 

 

 

728x90