본문 바로가기
IT || 개발공부/Spring

[Spring] 스프링 빈 등록 후 의존성 주입해보기

by saesong 2023. 11. 6.

🔶스프링 빈 등록 후 의존성 주입해보기 (Service, Repository 추가구현하기)

 

 

Spring에서는 객체생성 및 관리를 개발자가 일일이 하지 않고, Spring에게 위임하게 되는데,
이를 'IoC(Inversion of Control: 제어의 역전)'라고 한다.

그리고 스프링은 IoC컨테이너(≒스프링컨테이너)에 객체를 담는다.

🔹

DI에 대한 개념은 조금 더 정리가 필요하여, 우선 구글링하여 최대한 내가 이해한 내용으로 정리해보겠다..

DI(Dependency Injection : 의존성주입) 는 한 객체가 다른 객체를 사용할 수 있도록 의존성을 주입해주는 것으로,
두 객체 간의 관계(의존성)을 맺어주는 것으로서, 주로 생성자 주입 방법이 대표적이다.

DI를 사용하는 이유는 예를들어,
A클래스 안에 B클래스의 객체를 직접 생성해서 사용하면 A클래스와 B클래스의 의존성이 높아진다고 한다.
의존성이 높다는 것은 결합도가 높다는 의미와 같으며, 두 클래스(객체)가 강하게 결합되어 있는 경우 결합도를 낮추고 유연성 확보 위해 사용한다고 한다.

A라는 클래스에서 B라는 객체를 사용하기 위해서는 애플리케션 실행 시점에 필요한 객체(빈)을 생성해야 하며,
의존성이 있는 두 객체를 한 객체로 주입시켜야한다.
예를들어, Apple이라는 객체를 생성하고, Apple을 Fruits이라는 클래스로 주입시켜주는 역할을 위해 DI컨테이너가 필요한 것이다.

🔹

 

스프링 빈(Bean)이란, 스프링이 생성한 객체 그자체를 의미한다.

 

스프링 빈을 등록하는 방법에는 2가지 방법이 있다고 한다. => 즉, 빈 등록 하는 거 자체가 IoC 과정임!

1. @Configuration + @Bean 조합

       - 수동으로 스프링컨테이너에 빈을 등록하는 방법

       - @Bean을 사용하는 클래스에는 반드시 @Configuration 어노테이션을 활용하여 해당 클래스에서 Bean을 등록하고자 함을 명시해주어야 한다.
       - 개발자가 직접 제어가 불가능한 라이브러리를 빈으로 등록할때 불가피하게 사용
2. @Component

       - @Configuration + @Bean 방법은 수동으로 빈을 등록하므로 생산력 저하를 야기함. 그래서 스프링이 @Component 어노테이션이 있는 클래스들을 찾아서 자동으로 Bean 등록을 해줌.
       - XML파일에서 객체를 불러온다는 언급이 없더라도, @Component가 있는 객체를 자동으로 가져오기 위해 사용한다는 의미.

 

 

11.09 수정)

0. 우선 각 클래스파일을 생성해준다.

 

 

개발할 때는 Repository->Service->Controller 순으로 코드를 써준다.

 

1. Repository 생성

@Component 써도 좋지만 @Repository도 그 역할을 똑같이 한다. 

왜냐면 밑의 사진에서 알 수 있듯 @Repository를 열어보면 @Component가 숨어있기 때문이다.

@Repository 안에 숨어있는 @Component

 

 

2. 다음으로 Service단을 만들어 주었다.

 

스프링빈으로 등록되면(≒객체를 생성하면) 우리는 DI를 요청할 수 있다.

DI를 요청하는 방법은 필드 위에 @Autowired를 기재하는 방법이 대표적이다. (이 외에 여러가지 방법이 있다.)

 

@Autowired는 모든 메서드가 사용할 수 있도록 필드위에 선언한다.

그 밑에 TestRepository test Repository; 라는 필드를 선언한다. TestRepository 에서 @Component를 기재하여 IoC 과정을 거쳤기에 new~어쩌고 하는 생성자선언과정 필요 없음.

 

아래 사진과 같이 @Service에도 @component가 숨어있는 것을 확인할 수 있었다.

@Service에 숨어있는 @Component

 

 

 

3. Controller단을 만든다.

이전 포스팅에서 만든 Controller단을 살펴보면, @RestController라는 어노테이션에서 @Component를 찾을 수 있다.

여기서 @RestController : 빈 등록 + Controller 기능 + 데이터전달(ResponsBody)기능 의 역할을 한다.

@RestController안에 숨어있는 @Component 방법

 

Controller단에 @Autowired 기재함

 

@Autowired 를 통한 DI는 Conroller , Service 등과 같이 스프링이 관리하는 객체에서만 동작한다.
 스프링 빈으로 등록하지 않고 내가 직접 생성한 객체에서는 동작하지 않는다.

 


이렇게 @Controller, @Service, @Repository 안에 @Component가 숨어있는 것을 확인할 수 있었다.

조금 더 조사해보니, 결국 @Controller, @Service, @Repository 모두 @Component와 같은 기능을 한다는 것을 알았다.


 

 

 

/* 여담 */

아직 상기 언급한 개념들이 완전히 이해된 상태는 아니다.. 그래도 거의 4일만에 과제를 완료하였다..

10차과제를 처음 봤을때 나의 모습.gif

 

개념도 이해 안되고..오류와 맞서 싸우고.. 하는 지난한 과정들을 딛고 과제를 어쨋든(?) 해냈다..ㅜㅜ

용기를 북돋아주신 송아쌤께 무한 감사를 표한다...

 

 

다음과제도..열심히...해볼게요...((^人^))

 

 

 

 

참고: https://mangkyu.tistory.com/150, https://mangkyu.tistory.com/75

https://velog.io/@falling_star3/Spring-Boot-%EC%8A%A4%ED%94%84%EB%A7%81-%EB%B9%88bean%EA%B3%BC-%EC%9D%98%EC%A1%B4%EA%B4%80%EA%B3%84, 

https://summer-light.tistory.com/112?category=967790

댓글