📗 BOOK/스프링 입문을 위한 자바 객체 지향의 원리와 이해

07 스프링 삼각형과 설정 정보

미미누 2022. 4. 15. 19:18

 

이 글은 스터디 내에서 스프링 입문을 위한 자바 객체 지향의 원리와 이해를 읽고 정리한 글입니다.


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