🔶스프링 빈 등록 후 의존성 주입해보기 (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가 숨어있기 때문이다.
2. 다음으로 Service단을 만들어 주었다.
스프링빈으로 등록되면(≒객체를 생성하면) 우리는 DI를 요청할 수 있다.
DI를 요청하는 방법은 필드 위에 @Autowired를 기재하는 방법이 대표적이다. (이 외에 여러가지 방법이 있다.)
@Autowired는 모든 메서드가 사용할 수 있도록 필드위에 선언한다.
그 밑에 TestRepository test Repository; 라는 필드를 선언한다. TestRepository 에서 @Component를 기재하여 IoC 과정을 거쳤기에 new~어쩌고 하는 생성자선언과정 필요 없음.
아래 사진과 같이 @Service에도 @component가 숨어있는 것을 확인할 수 있었다.
3. Controller단을 만든다.
이전 포스팅에서 만든 Controller단을 살펴보면, @RestController라는 어노테이션에서 @Component를 찾을 수 있다.
여기서 @RestController : 빈 등록 + Controller 기능 + 데이터전달(ResponsBody)기능 의 역할을 한다.
@Autowired 를 통한 DI는 Conroller , Service 등과 같이 스프링이 관리하는 객체에서만 동작한다.
스프링 빈으로 등록하지 않고 내가 직접 생성한 객체에서는 동작하지 않는다.
이렇게 @Controller, @Service, @Repository 안에 @Component가 숨어있는 것을 확인할 수 있었다.
조금 더 조사해보니, 결국 @Controller, @Service, @Repository 모두 @Component와 같은 기능을 한다는 것을 알았다.
/* 여담 */
아직 상기 언급한 개념들이 완전히 이해된 상태는 아니다.. 그래도 거의 4일만에 과제를 완료하였다..
개념도 이해 안되고..오류와 맞서 싸우고.. 하는 지난한 과정들을 딛고 과제를 어쨋든(?) 해냈다..ㅜㅜ
용기를 북돋아주신 송아쌤께 무한 감사를 표한다...
참고: https://mangkyu.tistory.com/150, https://mangkyu.tistory.com/75,
'IT || 개발공부 > Spring' 카테고리의 다른 글
[Spring] Entity, DTO, VO 알아보기 (0) | 2023.11.07 |
---|---|
[Spring] HTTP method에 대하여 (0) | 2023.11.06 |
[Spring boot] intelliJ로 Controller 생성 및 실행하기 (0) | 2023.11.02 |
[Spring] Controller, Service , Repository의 역할 (0) | 2023.10.31 |
[Spring] DI, IoC란? (0) | 2023.10.30 |
댓글