티스토리 뷰

728x90
반응형

1. DI (Dependency Injection)

(1) 의존성(Dependency)

  • 한 객체(A)가 다른 객체(B)를 사용하는 것을 의미한다. A->B
    • 만약 B가 변경된다면 A에도 영향을 미친다. 즉 A는 B의 변화에 취약하다.
    • 이를 개선하기 위해 인터페이스를 두어 서로의 결합도가 느슨해지도록 설계를 하기도 한다.

 

(2) 의존성 주입(Dependency Injection / DI)

  • 런타임 시 의존 관계를 맺는 대상을 외부(스프링 프레임워크)에서 결정하고 주입해 주는 것을 의미한다.
    • 스프링 프레임워크는 DI 기능을 지원해 주는 프레임워크이다.

 

(3) DI 장점

  • 의존성 주입을 인터페이스 기반으로 설계하면,
    • 느슨한 결합도(loose coupling)를 가질 수 있고,
    • class 간의 결합도를 낮출 수 있으며,
    • 변경에 유연해진다.
  • 느슨한 결합도를 갖는 객체끼리는 부품을 갈아 끼우듯 쉽게 변경할 수 있다.
  • 즉, 테스트하기 좋은 코드가 된다.

 

2. DI 프레임워크 실습

(1) 의존성 추가

// reflection
implementation 'org.reflections:reflections:0.10.2'

// assertj (가독성)
testImplementation ‘org.assertj:assertj-core:3.22.0’

 

(2) 구현 참고사항

출처: 패스트 캠퍼스  나만의 MVC 프레임워크 만들기 ch7 강의 노트

  • Controller Annotation을 생성한다.
    • @Tartget({ElementType.TYPE}) : class에 붙일 어노테이션임을 명시한다.
    • @Retention(REtentionPolicy.TUNTIME) : 유지기간은 런타임 동안이란 뜻이다.
  • Service Annotation을 생성한다. Service는 Controller와 동일한 어노테이션을 붙인다.
  • Inject Annotation도 생성한다.
    • @Target의 타입으로 CONSTRUCTOR, FIELD, METHOD를 추가한다. 생성자 필드 메서드에 붙일 수 있다는 의미이다.
    • @Retention 유지기간은 동일하게 런타임 시로 설정한다.
  • 테스트를 위해 임의로 UserController와 UserService 객체를 생성하고, UserController에 userService를 입력하는 임의의 코드를 작성하여 의존성을 부여한다. 
  • BeanFactoryTest
    • Reflections와 beanfactory 를 필드로 설정한다.
    • 테스트 실행 전, reflections를 생성한다. Reflections는 org.example 하위 클래스를 모두 포함하게 설정한다.
    • 테스트 코드로는 getBean을 사용하여 객체를 key로하고 인스턴스를 value로 하여 객체가 입력되었을 때, 인스턴스를 반환하는 코드를 구현한다.
  • getTypesAnnotaedWith 메서드는 Controller 어노테이션과 Service 어노테이션이 붙은 클래스들을 set 형태로 return 하는 메서드이다.
  • beanFactory는 위 메서드를 통해 받은 클래스 set을 받아 저장한다.
  • 인스턴스를 반환하기 위해 인스턴스를 가져올 Map을 생성하는데, 이때 생성자와 파라미터를 통해 인스턴스를 생성하여 저장한다.
  • ReflectionUtils.getAllConstructors를 통해 모든 constructor를 가져올 수 있다. 이 때 ReflectionUtils.withAnnotation을 통해 특정 어노테이션이 붙은 class만 가져올 수 있다.

 

본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성하였습니다.

https://bit.ly/43z0P6S

 

 

#패스트캠퍼스 #포트폴리오 #직장인자기계발 #환급챌린지 #포트폴리오챌린지 #패스트캠퍼스후기 #초격차패키지 #오공완

728x90
반응형
댓글