<TIL> 42. DI(의존성 주입), IoC(제어의 역전), bean, @Autowired

YUJIN LEE·2023년 3월 4일
0

개발log

목록 보기
37/149

IoC(제어의 역전)

  • 용도에 맞게 필요한 객체를 그냥 가져다 사용.
    ** DI(Dependencyy Injection) - 의존성 주입
    - 사용할 객체가 어떻게 만들어졌는지 알 필요 없음.

스프링 IoC 컨테이너 사용

스프링 IoC 컨테이너

  • DI를 사용하기 위해서 객체 생성이 우선되어야 함.
    객체 생성은 어디서? 스프링 프레임워크가 필요한 객체를 생성하여 관리하는 역할.

빈(Bean) : 스프링이 관리하는 객체
스프링 IoC 컨테이너: '빈'을 모아둔 통

스프링 '빈' 등록 방법

  1. @Conponent - 클래스 선언 위에 설정. 서버가 뜰 때 IoC에 '빈' 저장

// 1. ProductService 객체 생성
ProductService productService = new ProductService();

// 2. 스프링 IoC 컨테이너에 빈 (productService) 저장
// productService -> 스프링 IoC 컨테이너

스프링 '빈' 이름: 클래스의 앞글자만 소문자로 변경

  • public class ProductService -> productService

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

@Component 적용 조건

  • @ComponentScan에 설정해 준 packages 위치와 하위 packages들

@Configuration
@ComponentScan(basePackages = "com.example.myselectshop")
class BeanConfig { ... }

@SpringBootApplication에 의해 default 설정 되어 있음

스프링 '빈' 사용방법

  1. @Autowired
  • 멤버변수 선언 위에 @Autowired -> 스프링에 의해 DI(의존성 주입) 됨
  • '빈'을 사용할 함수 위에 @Autowired -> 스프링에 의해 DI 됨

@Autowired 적용 조건

스프링 IoC 컨테이너에 의해 관리되는 클래스에서만 가능

@Autowired 생략 조건

  • Spring 4.3 버전부터 @Autowired 생략가능

  • 생성자 선언이 1개 일 때만 생략 가능

  • Lombok의 @RequestArgsConstructor를 사용하면 다음과 같이 코딩 가능

@RestController
@RequiredArgsConstructor // final로 선언된 멤버 변수를 자동으로 생성합니다.
public class ProductController {

    private final ProductService productService;
    
    // 생략 가능
		// @Autowired
		// public ProductController(ProductService productService) {
		//     this.productService = productService;
		// }
}
  • ApplicationContext
  • 스프링 IoC 컨테이너에서 빈을 수동으로 가져온느 방법
@Component
public class ProductService {

    private final ProductRepository productRepository;

    @Autowired
    public ProductService(ApplicationContext context) {
        // 1.'빈' 이름으로 가져오기
        ProductRepository productRepository = (ProductRepository) context.getBean("productRepository");
        // 2.'빈' 클래스 형식으로 가져오기
        // ProductRepository productRepository = context.getBean(ProductRepository.class);
        this.productRepository = productRepository;
    }

		// ...		
}

스프링 3계층 Annotation

스프링 Annotation
@Componet, @Autowired

@를 붙여 선언 -> 스프링이 처리

스프링 3계층 어노테이션은 모두 @Component 포함
1. @Controller, @RestController
2. @Service
3. @Repository

@Repository

  • JpaRepository<"@Entity 클래스", @Id의 데이터 타입>을 상속받는 interface로 선언
    * 스프링 Data JPA에 의해 자동으로 @Repository 추가
    • @Repository 역할 대부분 자동 수행

스프링 프레임워크란?

The Spring Framework provides a comprehensive programming and configuration model for modern Java-based enterprise applications - on any kind of deployment platform.
기업용 어플리케이션의 요구사항 해결에 초점을 맞춘 프레임워크
신뢰성이 중요, 서버 안정성 중요, 데이터 관리도 중요, 여러 사용자가 동시접속 시 데이터 일관성 유지도 중요.

Enterprise applications 개발 편의성 제공

  • 기업용 에플리케이션?
  • 스프링은 결국 기업용 애플리케이션의 요구사항에 초점을 맞춘 프레임워크
  • 기업용 애플리케이션의 특성
  1. 신뢰성 중요
  2. 서버의 안정성 유지 중요
  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)에 집중하게 해줌
  • 웹 서비스 다이어그램

API: 클라와 서버의 상호작용
비즈니스로직(@Service) - 실제 사용자의 요구사항 처리
서버와 DB 상호작용..

saveAndFlush()

  • 영속성 컨텍스트에 담겼다가 저장하는게 아니라 곧바로 DB에 insert한다.
profile
인정받는 개발자가 되고싶습니다.

0개의 댓글