이 글은 스터디 내에서 스프링 입문을 위한 자바 객체 지향의 원리와 이해를 읽고 정리한 글입니다.
IoC/DI - 제어의 역전/의존성 주입
프로그래밍에서 의존성이란?
- 전체가 부분에 의존한다는 것과 프로그래밍에서 의존 관계는 new로 표현된다.
스프링 없이 의존성 주입하기 1 - 생성자를 통한 의존성 주입
- 의존성 주입을 하면 확장성이 좋아짐
스프링 없이 의존성 주입하기 2 - 속성을 통한 의존성 주입
최근에는 속성을 통한 의존성 주입보다는 생성자를 통한 의존성 주입을 선호하는 사람이 많음
-> 프로그램에서는 한번 주입된 의존성을 계속 사용하는 경우가 더 일반적이기 때문
스프링을 통한 의존성 주입 - XML 파일 사용
속성을 통한 의존성 주입
- ApplicationContext를 통해 스프링 컨텍스트 생성
- context.getBean을 통해 필요한 빈 가져오기
스프링을 통한 의존성 주입 - 스프링 설정 파일(XML)에서 속성 주입
- XML에 파일에 Car을 bean으로 설정하고, property를 통해 의존성을 주입해주면 된다.
- 자바에서 접근자 및 설정자 메서드를 속성 메서드라고 하는데, 영어로 속성은 Property 이다.
스프링을 통한 의존성 주입 - @Autowired
@Autowired의 의미: 스프링 설정 파일을 보고 자동으로 속성의 설정자 메서드에 해당하는 역할을 해주겠다는 의미
- tire의 의존성 주입에서 다른 Tire로 바꾸고 싶다면 -> 바꾸고 싶은 tire의 빈 id 속성을 tire로 지정해주면 된다.
- 만약 id 속성을 삭제하면? -> 그래도 의존성 주입 가능
- 스프링의 @Autowired는 type 기준 매칭(인터페이스 구현여부)을 실시 한다. 같은 타입을 구현한 클래스가 여러개 있다면 bean 태그의 id로 구분함
스프링의 @Autowired는 id 매칭보다 type 매칭이 우선이기 때문에 bean id가 달라도 인터페이스를 구현한 객체가 빈으로 등록되어 있다면 의존성 주입 가능!
스프링을 통한 의존성 주입 - @Resource를 통한 속성 주입
- @Resource는 type과 id 가운데 매칭 우선순위는 id가 더 높음!
- @Resource의 경우 id로 매칭할 빈을 찾지 못한 경우 type으로 매칭할 빈을 찾게 된다.
@Autowired와 @Resource 중에서는 @Resource 추천
@Resource와 <property> 중에서는 <property> 추천
다수의 클래스를 만들고 의존 관계를 지정하다 보면 유지보수에 무관한 관계 -> @Resource
유지보수와 밀접하거나 자주 변경된다면 -> <property>
DI(의존 관계)
- 변수에 값을 할당하는 모든 곳에 의존 관계가 생김
- DI는 외부에 있는 의존 대상을 주입하는 것을 말함
- 의존 대상을 구현하고 배치할 때 SOLID와 응집도를 높이고, 결합도를 낮추라는 기본 원칙에 충실
AOP
- 프로그램을 작성하다 보면 다수의 모듈에 공통적으로 나타나는 부분이 존재 -> 횡단 관심사(cross-cutting concern)
- 코드 = 핵심 관심사 + 횡단 관심사(공통으로 반복되는 부분)
AOP에서 메서드에서 코드를 주입할 수 있는 곳
1. Before: 메서드 시작 전
2. After: 메서드 종료 후
3. AfterReturning: 메서드 정상 종료 후
4. AfterThrowing: 메서드에서 예외가 발생하면서 종료된 후
- @Aspect는 이 클래스를 이제 AOP에서 사용하겠다는 의미
- @Before는 대상 메서드 실행 전에 이 메서드를 실행하겠다는 의미
- 스프링 AOP는 프록시를 사용한다.
- 호출하는 쪽에서나 호출당하는 쪽, 프록시가 존재하는지조차 모름.
- 오직 스프링 프레임워크만 프록시의 존재를 안다.
스프링 AOP의 핵심
- 스프링 AOP는 인터페이스(interface) 기반
- 스프링 AOP는 프록시(proxy) 기반
- 스프링 AOP는 런타임(runtime) 기반
[AOP 용어]
- Pointcut: 횡단 관심사를 적용할 타깃 메서드를 선택하는 지시자(메서드 선택 필터)
- JoinPoint: Pointcut의 후보가 되는 모든 메서드(스프링 AOP에서는 스프링 프레임워크가 관리하는 빈의 모든 메서드)
- Advice: pointcut에 적용할 로직, 즉 메서드
- Aspect: AOP에서는 Advice들 + Pointcut들
- Advisor: 한개의 Advice + 한 개의 Pointcut
AOP 기초 완성
After 어드바이스는 해당 JoinPoint 메서드를 실행 한 후에 실행됨
PSA - 일관성 있는 서비스 추상화
서비스 추상화: 어댑터 패턴을 이용해 같은 일을 하는 다수의 기술을 공통의 인터페이스로 제어할 수 있게 한 것
서비스 추상화의 예: JDBC
'📗 BOOK > 스프링 입문을 위한 자바 객체 지향의 원리와 이해' 카테고리의 다른 글
부록 B - 자바 8 람다와 인터페이스 스펙 변화 (0) | 2022.04.22 |
---|---|
부록 A - 스프링 MVC를 이용한 게시판 구축 (0) | 2022.04.22 |
06 스프링이 사랑한 디자인 패턴 (0) | 2022.04.08 |
05 객체 지향 설계 원칙 - SOLID (0) | 2022.04.08 |
04 자바가 확장한 객체 지향 (0) | 2022.03.25 |