DI (의존성 주입)의 이해

👉 "제어의 역전 (IoC: Inversion of Control)" 프로그램의 제어 흐름이 뒤바뀜
- 일반적: 사용자가 자신이 필요한 객체를 생성해서 사용
- IoC (제어의 역전)
- 용도에 맞게 필요한 객체를 그냥 가져다 사용
- "DI (Dependency Injection)" 혹은 한국말로 "의존성 주입"이라고 부릅니다.
- 사용할 객체가 어떻게 만들어졌는지는 알 필요 없음
- 실생활 예제) 가위의 용도별 사용
- 용도에 맞게 필요한 객체를 그냥 가져다 사용
스프링 IoC 컨테이너
👉 저희는 앞에서 DI 를 사용했을 때의 장점을 살펴 보았습니다.
- 스프링 IoC 컨테이너그런데 DI 를 사용하기 위해서는 객체 생성이 우선 되어야 했습니다. 과연 어디서 객체 생성을 해야 할까요? 바로 스프링 프레임워크가 필요한 객체를 생성하여 관리하는 역할을 대신해 줍니다.
- 빈 (Bean): 스프링이 관리하는 객체
- 스프링 IoC 컨테이너: '**빈'**을 모아둔 통
스프링 '빈' 등록 방법
1. @Component
- 클래스 선언 위에 설정
@Component
public class ProductService { ... }
- 스프링 서버가 뜰 때 스프링 IoC 에 '빈' 저장
- @Component 클래스에 대해서 스프링이 해 주는 일
// 1. ProductService 객체 생성
ProductService productService = new ProductService();
// 2. 스프링 IoC 컨테이너에 빈 (productService) 저장
// productService -> 스프링 IoC 컨테이너
- 스프링 '빈' 이름: 클래스의 앞글자만 소문자로 변경
- public class ProductService → productService
'빈' 아이콘 확인 → 스프링 IoC 에서 관리할 '빈' 클래스라는 표시
- @Component 적용 조건
- @ComponentScan 에 설정해 준 packages 위치와 하위 packages 들
@Configuration
@ComponentScan(basePackages = "com.sparta.springcore")
class BeanConfig { ... }
2. @Bean
직접 객체를 생성하여 빈으로 등록 요청
스프링 서버가 뜰 때 스프링 IoC 에 '빈' 저장
스프링 '빈' 이름: @Bean 이 설정된 함수명
public ProductRepository productRepository() {..} → productRepository
'빈' 아이콘 확인 → 스프링 IoC 에 '빈' 에 등록될 것이라는 표시
스프링 '빈' 사용 방법
- @Autowired
- 멤버변수 선언 위에 @Autowired → 스프링에 의해 DI (의존성 주입) 됨
- '빈' 을 사용할 함수 위에 @Autowired → 스프링에 의해 DI 됨
- @Autowired 적용 조건
- 스프링 IoC 컨테이너에 의해 관리되는 클래스에서만 가능
- @Autowired 생략 조건
- Spring 4.3 버젼 부터 @Autowired 생략가능
- 생성자 선언이 1개 일 때만 생략 가능
- 파라미터가 다른 생성자들
public class A {
@Autowired // 생략 불가
public A(B b) { ... }
@Autowired // 생략 불가
public A(B b, C c) { ... }
}
Lombok 의 @RequiredArgsConstructor 를 사용하면 다음과 같이 코딩 가능
@RequiredArgsConstructor // final로 선언된 멤버 변수를 자동으로 생성합니다.
@RestController // JSON으로 데이터를 주고받음을 선언합니다.
public class ProductController {
private final ProductService productService;
// 생략 가능
// @Autowired
// public ProductController(ProductService productService) {
// this.productService = productService;
// }
}
스프링 3계층 Annotation 적용
[스프링 Annotation]
앞에 '@' 를 붙여 선언 → 스프링이 처리
@Component, @Autowired
- 스프링 3계층 Annotation 은 모두 @Component
- @Controller, @RestController
- @Service
- @Repository
스프링 프레임워크 재이해
<스프링 프레임워크란?>
The Spring Framework provides a comprehensive programming and configuration model for modern Java-based enterprise applications - on any kind of deployment platform.
configuration 구성
enterprise : 기업용
deployment 배포
- Enterprise applications 개발 편의성 제공
- Enterprise applications? 기업용 애플리케이션??
- 고객 대상 웹 서비스 ex) 구글, 네이버, 쿠팡 등
- Enterprise applications? 기업용 애플리케이션??
- 스프링은 결국 기업용 애플리케이션의 요구사항 해결에 초점을 맞춘 프레임워크
- 기업용 애플리케이션 특성
- 신뢰성이 중요 (ex. 병원에서 수술 시 환자 기록이 바뀐다면?)
- 서버의 안정성 유지 중요 (ex. 복권 실시간 추첨에 서버 다운 된다면? )
- 데이터 관리가 중요
- 막대한 양의 데이터 관리 필요
- 여러 사용자가 동시 접속 시 데이터 일관성
- → 대부분 DB (데이터베이스) 사용
<스프링의 핵심요소>
A key element of Spring is infrastructural support at the application level: Spring focuses on the "plumbing" of enterprise applications so that teams can focus on application-level business logic, without unnecessary ties to specific deployment environments.
- 비즈니스 로직 (business logic) 에 집중하게 해 준다?
- 웹 서비스 다이어그램

- 서버 개발자들이 신경써야 할 부분이 너무 많음
- API: 클라이언트 ↔ 서버
- 비즈니스 로직 (@Service)
- 실제로 사용자의 **"요구사항이 처리"**되는 부분!!
- DB: 서버 ↔ DB
- **"기업의 요구사항"**에만 집중하여 개발할 수 있도록!
- 반복되고, 실수가 많은 부분 → 스프링이 대신~!!
03. Controller,Repository,Service
Goal 1. 스프링의 Controller, Service, Repository 각 역할을 이해한다.
teamsparta.notion.site
'항해99 > 스프링입문' 카테고리의 다른 글
03-1 Controller,Repository,Service (0) | 2022.10.07 |
---|---|
03. 기본 CRUD API 구현 - Level 3 (0) | 2022.10.03 |
02. 기본 CRUD API 구현 - Level 2 (0) | 2022.10.03 |
02. 기본 CRUD API 구현 - Level 1 (1) | 2022.10.02 |
01. RDBMS, SQL, JPA 기본 (0) | 2022.10.02 |