의존성 주입 (DI)
사용할 객체를 직접 생성하지 않고 IoC컨테이너가 생성한 객체를 주입받아 사용하는 방식
ex) 사용자를 등록하는 클래스를 구현한다.
의존성 주입 (DI) 가 없다면?
UserServiceImpl을 구현하는 시점에 JDBCUserRepository가 구현되어 있어야 함
JDBCUserRepository가 수정되면, UserServiceImpl도 같이 수정되어야 함 (할 때마다 new 해야함..)
의존성 주입 (DI) 를 사용한다면 ?
UserServiceImpl이 생성될 때 UserRepository 의 구현 클래스가 자동으로 생성되어 주입
UserService를 사용하고 싶은 어플리케이션은 IOC 컨테이너에서 UserService를 가져오고, Repository는 이미 조합
IoC
Inversion of Control : 제어의 역전 (프레임워크가 주체가 되어 내 코드를 활용)
사용한 객체를 직접 사용하지 않고 객체의 생명주기 관리를 IoC컨테이너에 위임.
객체의 관리를 IoC컨테이너에 맡겨 제어권이 넘어간 것
인스턴스 생성, 의존 관계 설정, 빈 제공
스프링 프레임워크에서는 "ApplicationContext"가 IoC 컨테이너의 역할을 수행
IoC 컨테이너의 인스턴스 꺼내기
IoC 컨테이너의 설정 파일 역할을 하는 설정 클래스를 파라미터로 전달(설정 클래스는 여러 개 정의 가능)
어플리케이션과 ApplicationContext의 관계
Bean 설정 방법
대표적으로 Bean을 설정하는 방법 3가지
최근에는 자바 기반 + 어노테이션을 혼합하여 사용
자바 기반 설정 방식 (@Bean)
- @Configuration 어노테이션을 붙여 설정 클래스로 선언
- @Bean 어노테이션을 붙여 빈을 정의 (메소드 명이 빈의 이름)
- 다른 컴포넌트를 참조해야 하면, 해당 컴포넌트의 메소드를 호출
- 파라미터를 추가하는 방식으로도 의존성 주입 가능 (파라미터를 전달되는 인스턴스는 빈으로 설정되어 있어야 함 UserRepository)
어노테이션 기반 설정 방식 (@Component, @Service, @Repository)
- 빈으로 등록할 수 있는 어노테이션을 각 클래스에 부여하고 IoC 컨테이너가 이를 관리하도록 함
- 서버가 시작될 때, 어노테이션이 부여된 클래스를 탐색하여 IoC 컨테이너에 자동으로 등록
- 이때 IoC 컨테이너가 자동으로 주입
의존성 주입 방식
총 3가지 방법으로 의존성 주입을 할 수 있음
- 설정자 기반 의존성 주입 방식
- 생성자 기반 의존성 주입 방식
- 필드 기반 의존성 주입 방식
생성자 기반 DI
생성자의 파라미터를 사용해 의존성을 주입하는 방식
@RestController
public class MarketController{
MyService myService;
@Autowired
public Controller(MarketService marketService){
this.marketService = marketService;
}
@GetMapping("/hello")
public String getHello(){
return marketService.getHello();
}
}
어노테이션 기반으로 설정
필드 기반 DI
생성자 또는 설정자 메소드를 사용하지 않고 IoC 컨테이너가 바로 의존성을 주입하는 방식
@RestController
public class Controller{
@Autowired
private MarketService marketService;
}
필드에 @Autowired 어노테이션 부여
오토와이어링 (@Autowired)
@Bean 요소를 사용하지 않고 IoC 컨테이너에 빈을 자동으로 주입하는 방식
타입 @Autowired
IoC 컨테이너에 같은 타입의 빈이 두 개 이상 발견이 되면 예외가 발생
@Qualifier 어노테이션을 활용해서 빈 이름을 지정하고 원하는 빈만 선택해서 사용할 수 있음
Bean Scope
빈의 생존 기간을 의미
IoC에 등록되는 빈은 기본적으로 싱글턴(singleton)으로 생성
AOP
Aspect Oriented Programming
여러 클래스에 흩어져 있는 횡단 관심사를 중심으로 설계와 구현을 하는 프로그래밍 기법
스프링과 AOP
스프링 프레임워크에는 스프링 AOP가 포함
스프링 AOP에는 IoC 컨테이너에서 관리하는 빈을 타겟으로 어드바이스를 적용하는 기능이 있음
빈을 꺼내면, 프록시 형태로 어디바이스 기능이 감싸진 빈을 꺼내게 됨
MVC 패턴
모델 (Model), 뷰 (View), 컨트롤러 (Controller)와 같은 세 가지 역할의 컴포넌트 구성
스프링 MVC 아키텍쳐
Json 형식
JavaScript Object Notation의 약자로 '자바 스크립트 객체 표기법'.
데이터를 쉽게 ' 교 환 ' 하고 ' 저 장 ' 하기 위한 텍스트 기반의 데이터 교환 표준.
Appendix
인터페이스 : 클래스간 결합을 줄이기 위해
jDBC가 뭔지? -> Java를 이용하여 데이터베이스에 접속, SQL질의문의 실행과 그 결과를 데이터로 핸들링하는 절차 및 규약
@Componet가 뭔지 -> 싱글톤 클래스 빈을 생성하는 어노테이션
@Configuration : 자바에서 사용하는 설정파일이라 인지 -> 설정파일을 만들기 위한 애노테이션
의존성 주입 에서 생성자가 뭔지 -> 인스턴스가 생성될 때 호출되는 '인스턴스 초기화 메서드'이다.
@Qualifier가 뭔지 -> Bean 에서 사용할 의존 객체를 선택할 수 있도록 해준다.
Hellow World 띄우기
package com.example.practice1;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class TestController {
//hello world 띄우기
@GetMapping("/v1/test")
public String helloWorld() {
return "hello world";
}
}
'Back_end > Spring' 카테고리의 다른 글
SPRING [#1] 메인페이지, 로그인페이지, 회원가입페이지 (0) | 2022.11.17 |
---|---|
SPRING [#0] 프로젝트 생성 및 환경설정 (0) | 2022.11.14 |
SPRING[4] 스프링 Unit Test (0) | 2022.11.11 |
SPRING[3] 스프링 JPA + 배치 (0) | 2022.11.10 |
SPRING[2] 클린 아키텍쳐 (0) | 2022.10.26 |
댓글