항해99/스프링입문

03-2 DI(Dependency Injection), IOC(Inversion of Control)

숲별 2022. 10. 8. 01:09
728x90

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 ProductServiceproductService

 

'빈' 아이콘 확인 → 스프링 IoC 에서 관리할 '빈' 클래스라는 표시

 

  • @Component 적용 조건
    • @ComponentScan 에 설정해 준 packages 위치와 하위 packages 들
@Configuration
@ComponentScan(basePackages = "com.sparta.springcore")
class BeanConfig { ... }

 

 

2. @Bean

직접 객체를 생성하여 빈으로 등록 요청

스프링 서버가 뜰 때 스프링 IoC 에 '빈' 저장

스프링 '빈' 이름: @Bean 이 설정된 함수명

public ProductRepository productRepository() {..}productRepository

'빈' 아이콘 확인 → 스프링 IoC 에 '빈' 에 등록될 것이라는 표시

 

 

 

스프링 '빈' 사용 방법

  1. @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
    1. @Controller, @RestController
    2. @Service
    3. @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) 구글, 네이버, 쿠팡 등
  • 스프링은 결국 기업용 애플리케이션의 요구사항 해결에 초점을 맞춘 프레임워크
  • 기업용 애플리케이션 특성
    1. 신뢰성이 중요 (ex. 병원에서 수술 시 환자 기록이 바뀐다면?)
    2. 서버의 안정성 유지 중요 (ex. 복권 실시간 추첨에 서버 다운 된다면? )
    3. 데이터 관리가 중요
      • 막대한 양의 데이터 관리 필요
      • 여러 사용자가 동시 접속 시 데이터 일관성
      • → 대부분 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) 에 집중하게 해 준다?
  • 웹 서비스 다이어그램

  • 서버 개발자들이 신경써야 할 부분이 너무 많음
    1. API: 클라이언트 ↔ 서버
    2. 비즈니스 로직 (@Service)
      1. 실제로 사용자의 **"요구사항이 처리"**되는 부분!!
    3. DB: 서버 ↔ DB
  • **"기업의 요구사항"**에만 집중하여 개발할 수 있도록!
    • 반복되고, 실수가 많은 부분 → 스프링이 대신~!!

 

 

강의자료 : https://teamsparta.notion.site/03-Controller-Repository-Service-9eaec2062723451cb8f252debd44abc4#d6956a20c10b4ab7a452b3ae322fa5d1

 

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