DI , 의존성주입
- 의존성 주입은 객체가 자신이 의존하는 다른 객체를 직접 생성하거나 관리하는 것이 아니라 외부에서 주입받는 방식으로 제어의 흐름을 반전시키는 제어의 역전 IOC(Inversion of Control, IoC)원칙을 기반으로 한다.
- 외부에서 의존성을 주입받아 객체의 생명주기와 의존성 관리는 프레임워크에 맡기고 개발자는 비즈니스 로직에만 집중한다.
- 크게 3가지 생성자주입, setter주입, 필드주입이 있다.
생성자 주입 : 필드 내에서 boardRepository를 생성하지 않고 밖에서 생성된 repository를 생성자에서 주입받아 사용
public class BoardService {
private final BoardRepository boardRepository;
// 생성자 주입
public BoardService(BoardRepository boardRepository) {
this.boardRepository = boardRepository;
}
public void addBoard(Board board) {
boardRepository.addBoard(board);
}
}Setter주입 : 객체가 생성된 후 세터 메서드를 통해 주입받는 방식 기본적으로 생성자 주입을 할 수 있다면 생성자 주입
public class BoardService {
private BoardRepository boardRepository;
// 세터 주입
public void setBoardRepository(BoardRepository boardRepository) {
this.boardRepository = boardRepository;
}
public void addBoard(Board board) {
if (boardRepository != null) {
boardRepository.addBoard(board);
} else {
throw new IllegalStateException("BoardRepository is not set.");
}
}
}필드 주입 : @Autowired 어노테이션과 함께 직접 필드안에 주입하는 방식 -> 필드 주입은 테스트가 어렵고, 리팩토링 시 문제가 발생할 가능성이 높아 안티패턴으로 간주
@Autowired는 Bean컨테이너에서 등록되어 있는 객체를 찾아 타입에 맞게 자동으로 등록된다.
import org.springframework.beans.factory.annotation.Autowired;
public class BoardService {
@Autowired
private BoardRepository boardRepository; // 필드 주입
public void addBoard(Board board) {
boardRepository.addBoard(board);
}
}IOC
- ioc는 객체의 생성, 초기화, 의존성 관리 등의 제어 흐름을 ioc컨테이너로 넘겨 관리하도록 하는 것. -> 객체의 제어권을 프레임워크로 넘기는 것.
- 스프링 컨테이너가 관리하는 객체를 Bean이라고 하고 이 Bean 컨테이너를 빈 팩토리라고 부른다.
- IoC가 구현하는 주요 방법이 DI 즉 외부에서 의존성을 주입받는 방식이고, IoC 컨테이너라 불리는 것을 Spring Container가 구현하는 것.
- 크게 2종류 BeanFactory , ApplicationContext로 나뉜다.BeanFactory
- bean이라 불리는 객체를 생성, 관리 의존성 주입한다.
- 빈이 동일한 의존성을 공유할 수 있도록 싱글톤 빈을 보장한다.ApplicationContext
- BeanFactory에서 확장한 컨테이너로 애플리케이션 레이어 통합을 지원하며, 데이터베이스 연동, 트랜잭션 관리, 웹 애플리케이션 설정 등을 하나의 컨텍스트에서 통합 관리할 수 있도록 도와준다.
- 다양한 설정 방식을 지원. XML 설정 파일을 사용하는 ClassPathXmlApplicationContext, 파일 시스템에서 XML 설정 파일을 읽어오는 FileSystemXmlApplicationContext, 그리고 어노테이션 기반의 설정을 지원하는 AnnotationConfigApplicationContext 등
Spring Container = IoC Container
- DI와 IOC를 기반으로 객체를 관리하고 의존성을 주입하며 객체간 상호작용을 조율하는 역할을 한다.
- 핵심기능은 Bean객체의 생성, 초기화, 설정, 의존성 관리이다.
- BeanFacktory와 ApplicationContext라는 두 인터페이스가 포함되어 있으며 이를통해 빈 객체와 스프링 어플리케이션의 객체를 각각 관리한다.
- ApplicationContext: BeanFactory를 확장한 형태 → 메시지 소스 접근, 이벤트 처리, 트랜잭션 관리 등 고급 기능을 지원
AOP
- 관점 지향 프로그래밍으로, 핵심 비즈니스 로직과 공통 기능(예: 로깅, 트랜잭션 관리 등)을 분리해주는 프로그래밍 패러다임.
- Spring에서는 @Aspect, @Before, @After, @Around 등의 어노테이션으로 AOP 기능을 설정
- @Aspect : 클래스가 AOP 기능을 제공하는 관점(aspect)임을 나타낸다.
- @Before: 메서드 실행 전에 특정 동작을 수행.
- @After: 메서드 실행 후에 특정 동작을 수행.
- @Around: 메서드 실행 전후에 특정 동작을 수행하며, 메서드 실행 자체를 제어할 수도 있다.
PSA
Annotation
@Configuration , @bean 컨테이너
- 스프링 컨테이너는 @Configuration 클래스 내부의 @Bean 메서드를 호출하여 반환된 객체를 싱글톤 빈으로 관리
- @Configuration : 해당 클래스가 Spring 설정 파일임을 나타낸다.
- @Bean : 직접 객체를 생성하고 Bean으로 등록할 때 사용@Component, @ComponentScan
@Configuration public class AppConfig { @Bean public BoardService boardService(BoardRepository boardRepository) { return new BoardService(boardRepository); } @Bean public BoardRepository boardRepository() { return new BoardRepository(); } }- 클래스에 @Component를 붙이면 별도 @Bean 설정 없이 자동으로 스캔
- @Component: 클래스를 Spring Bean으로 등록 → 이를 확장한 어노테이션으로 @Service, @Repository, @Controller 등이 있다.
- @ComponentScan: 지정한 패키지를 스캔하여 @Component가 붙은 클래스를 Bean으로 등록@Autowired -> 예전에는 주입받기 위해 사용하는 건데 지금은 그냥 자동으로 해줌 spring이
@Component public class BoardRepository { // Bean으로 자동 등록 }- @Autowired: Bean을 자동으로 주입합니다.
@AllArgsConstructor
- 모든 필드의 인자 있는 생성자 생성@NoArgsConstructor
@AllArgsConstructor public class Board { private Long id; private String title; private String content; }- 인자 없는 생성자 생성
- @RequiredArgsConstructor
- @RequiredArgsConstructor: 모든 final 필드 및 @NonNull로 표시된 필드를 포함하는 생성자를 자동 생성 -> 즉 반드시 생성되어야 하는 final 필드만 처리한다.
public class BoardService { private final BoardRepository boardRepository; // 반드시 생성자를 통해 주입 public void addBoard(Board board) { boardRepository.addBoard(board); } }
'Spring' 카테고리의 다른 글
| [오르미 백엔드7기](Spring 프록시객체, 지연로딩 ,즉시로딩, 영속성전이, N+1문제) (1) | 2024.11.25 |
|---|---|
| [오르미 백엔드 7기] (Spring Entity 개념, 연관관계, 공통속성정의) (0) | 2024.11.25 |
| [오르미 백엔드7기] (Spring JPA 기본,ORM이란? , JDBC) (0) | 2024.11.22 |
| [오르미 백엔드 7기] (Spring Controller, thymeleaf 실습) (1) | 2024.11.19 |
| [오르미 백엔드 7기](POJO, SPRING @Controller, Thymeleaf + CS지식(CSR, SSR)) (1) | 2024.11.18 |