1️⃣ 스프링의 콘셉트(IoC, DI, AOP, PSA) 쉽게 이해하기
💚 IoC와 DI
IoC
IoC→ Inversion of Control → 제어의 역전
기존 자바코드
제어 역전 사용
→ B객체를 어딘가서 받아와 사용
객체 외부 관리 가능, 사용시에 외부 제공 객체 사용 가능
스프링은 이 제어의 역전 개념을 사용함
외부(=객체를 관리하는 주체)를 “스프링 컨테이너” 라고 함
DI
DI → Dependency Injection→ 의존성 주입
제어의 역전을 구현하기 위해 사용하는 방법 어떤 클래스가 다른 클래스에 의존한다는 뜻
@Autowired → 스프링 컨테이너에 있는 빈(스프링 컨테이너에서 관리하는 객체)을 주입하는 역할을 하는 애너테이션
B b; 선언, 직접 객체 생성 X → 객체를 스프링 컨테이너에서 주입받고 있음
스프링 컨테이너가 B 객체를 만들어서 클래스 A에 줌
💚 빈과 스프링 컨테이너
스프링 → 스프링 컨테이너 제공
스프링 컨테이너 → 빈 생성~소멸되기까지 생명주기 관리, 빈 주입받을 수 있게 DI 지원
빈
스프링의 (컨테이너가 생성, 관리하는) 객체
@Autowired로 주입받은 B 객체가 바로 빈
MyBean이라는 클래스에 @Component 애너테이션을 붙임 → MyBean 클래스가 빈으로 등록
이후 스프링 컨테이너에서 이 클래스를 관리
이때 빈의 이름은 클래스 이름은 ‘myBean’ → 첫 글자를 소문자로 바꿔 관리
💚 AOP와 PSA
AOP
AOP → Aspect Oriented Programming → 관점 지향 프로그래밍
프로그래밍을 핵심 관점, 부가 관점으로 나누어서 모듈화 함
핵심 관점 코드에만 집중할 수 있게 해줌
PSA
PSA → Portavle Service Abstreaction → 이식 가능한 추상화
스프링에서 제공하는 기술들을 추상화시켜 개발자가 쉽게 쓰는 인터페이스
스프링에서 데이터베이스에 접근하기 위한 기술로는 JPA, MyBatis, JDBC 같은 것들이 있음. 여기에서 어떤 기술을 사용하든 일관된 방식으로 데이터베이스에 접근하도록 인터페이스를 지원함
WAS도 PSA의 예시 중 하나라고 볼 수 있음. 코드는 그대로 두고 WAS를 톰캣이 아닌 언더토우, 네티와 같은 다른 곳에서 실행해도 기존 코드를 그대로 사용할 수 있음
2️⃣ 의존성 주입, 제어의 역전
💚 의존성 주입 (Dependency Injection)
의존성 주입 → 어떤 객체에 스프링 컨테이너가 또 다른 객체와 의존성을 맺어주는 행위
의존성 주입을 적용하지 않은 경우
Gun.java
public class Gun {
...
...
}
Soldier.java
public class Soldier {
private Gun gun;
public Soldier() {
gun = new Gun();
}
}
의존성 주입을 적용한 경우
Gun.java
@Component // 스프링 컨테이너에 Bean으로 등록
public class Gun {
...
...
}
Soldier.java
public class Soldier {
@Autowired // 스프링 컨테이너에 있는 Gun 타입의 Bean을 주입
private Gun gun;
}
- Gun 객체 (Bean)을 스프링 컨테이너에 등록
- 스프링 컨테이너에서 Soldier의 gun 멤버 변수에 Bean을 주입할 수 있게 해줌
💚 제어의 역전 (Inversion of Control)
- 의존성 주입의 상위 개념
- 스프링 컨테이너가 필요에 따라 개발자 대신 Bean을 관리, 제어 하는 행위
- 스프링은 스프링 컨테이너에 빈을 등록하면 알아서 생명주기를 관리해 줌
- 객체에 대한 제어권이 컨테이너로 역전되어서 제어의 역전이라고 칭함
스프링은 제어의 역전을 지원하며 스프링 컨테이너가 객체(Bean) 들을 제어해줌
스프링 컨테이너 → 빈들의 생명주기 관리 & 필요에 따른 객체 간 의존성 주입
제어의 역전 = 의존성 주입의 상위 개념, 코드 재사용성 & 유지보수성 높임
3️⃣ 스프링 컨테이너와 빈이란?
💚 스프링 컨테이너
- 스프링 컨테이너란?
- 자바 객체의 생명 주기 관리
- 생성된 자바 객체들 (=빈(Bean)) 에게 추가적인 기능 제공
- 제어 흐름을 외부에서 관리
- 생성자, setter, @Autowired를 통해 적용
💚 스프링 컨테이너의 종류
- BeanFactory & ApplicationContext
- BeanFactory
- 빈 등록, 생성, 조회, 반환 → 빈 관리 역할
💚 싱글톤 컨테이너
- 스프링 컨테이너는 객체의 인스턴스를 싱글톤으로 관리
-> 싱글톤 컨테이너라고 불림
4️⃣ AOP란 무엇인가? (관점 지향 프로그래밍)
💚 AOP (Aspect Oriented Programming)
- AOP → 관점 지향 프로그램
- OOP → 객체 지향 프로그램
하나의 일에 대해 방법은 각자 달라도 공통 관심사인 부분이 존재 (ex. 육아)
💚 공통 관심 사항
- 공통 관심 사항 (Cross-Cutting concern)
- 애플리케이션 개발 중 공통적으로 사용되는 기능들에 대한 관심사
- 공통 관심 사항 예시
- 프로그램에 공통으로 적용되는 기능
→ 상품 주문 프로그램에 회원가입된 회원만 접속할 수 있게 제안하는 보안
→ 상품 결제 트랜잭션
- 프로그램에 공통으로 적용되는 기능
💚 핵심 관심 사항
- 핵심 관심 사항 (Core concern)
- 애플리케이션의 주 목적을 달성하기 위한 핵심 비지니스 로직에 대한 관심사
- 핵심 관심 사항 예시
- 관리자 → 상품 등록 기능
- 고객 → 상품 담고 주문하는 기능
AOP는 애플리케이션의 핵심 업무 로직에서 로깅, 보안, 트랜잭션같은 공통 기능 로직을 분리
💚 AOP가 필요한 이유
- 코드의 간결성 유지
- 객체 지향 설계 원칙에 맞는 코드 구현
- 코드의 재사용
💻 Reference
https://velog.io/@ajufresh/스프링의-콘셉트IoC-DI-AOP-PSA-쉽게-이해하기
https://steady-coding.tistory.com/459
https://ittrue.tistory.com/213
'Server > Spring Boot' 카테고리의 다른 글
[Spring Boot] 빌더(Builder) 패턴의 정의, 생성자 패턴 빌더 패턴 비교 (0) | 2023.09.25 |
---|---|
[Spring] 스프링 의존성 주입 종류와 @RequiredArgsConstructor 어노테이션을 사용한 생성자 주입 (0) | 2023.09.24 |
[Chapter 03] 스프링 부트에서 JPA로 데이터베이스 다뤄보자 (1) - 등록 (0) | 2023.09.24 |
[Chapter 02] 스프링 부트에서 테스트 코드를 작성하자 (0) | 2023.09.16 |
[Chapter 01] 인텔리제이로 스프링 부트 시작하기 (0) | 2023.09.15 |