서버/Spring

[Spring] - Service를 Interface로 생성 하는 이유. (AOP, 결합도)

피노키오이 2021. 8. 11. 14:56
반응형

개요

대부분 Spring프로젝트를 진행하다 보면 프로젝트의 Service들에 대해서 모두 인터페이스를 만들고 이에 대해 ServiceImpl(예) 식으로 따로 생성한 인터페이스를 구현한 모습을 볼 수 있습니다.

도대체 왜? 이런식으로 개발을 진행하고 있는지 호기심이 생겨 한번 알아 보도록 하겠습니다.

 


Service를 Interface로 생성 하는 이유

 

1. OOP(객체지향프로그래밍)의 인터페이스와 Loose Coupling

Interface는 객체의 사용 방법을 정의한 타입이다. 객체의 교환성을 높여주기 때문에 다형성을 구현하는 매우 중요한 역할을 한다. 개발 코드를 수정하지 않고 사용하는 객체를 변경할 수 있도록 해준다.

인터페이스 타입에 어떤 구현 객체를 대입하는지에 따라 실행결과가 달라지도록 만드는 기술이므로 기존 구현 객체(ServiceImpl1) 비즈니스 로직이 다른 기능을 추가해야할 경우 다른 구현 객체(ServiceImpl2)를 만들어 사용하면 된다. 따라서 유지보수 측면에서 매우 좋다.

OOP에서는 클래스를 작게 나우어 다른 클래스와 의존관계를 낮추는 것이 중요한다. , 결합도를 느슨하게 만드는 것인데, 이 것또한 인터페이스를 생성함으로서 결합도를 느슨하게 만들 수 있다.

 

2. AOP

AOP와 트랜잭션은 서비스 인터페이스에서 처리한다.
스프링에서 AOP를 구현할 때 JDK의 기본 프록시를 사용하는데, 이 프록시는 인터페이스 기반으로 동작하기 때문에 Service인터페이스를 만들어 사용한다.

 


AOP란?

AOP란 기존에 OOP에서 바라보던 관점을 다르게 하여 부가기능적은 측면에서 보았을 때 공통된 요소를 추출하자는 것입니다.

 

OOP : 비즈니스 로직의 모듈화

  • 모듈화의 핵심 단위는 비즈니스 로직.

 

AOP : 인프라, 부가기능의 모듈화

  • 로깅, 트랜잭션, 보안 등등.
  • 각각의 모듈들의 주 목적 외에 필요한 부가적인 기능.

 

즉 AOP는 공통된 기능을 재사용하는 기법이다.

 


AOP의 장점.

  1. 어플리케이션 전체에 흩어진 공통 기능이 하나의 장소에서 관리되는점.
  2. 다른 서비스 모듈들이 본인의 목적에만 충실하고 그외 사항들은 신경쓰지 않아도 됨.

 

부가적인 기능을 분리하여 Aspect라는 모듈로 설계하고 개발할 수 있다.

 


@Aspect란?

  • 부가기능 모듈이라고 하며, 핵심기능에 부가되어 의미를 갖는 특별한 모듈이다.
  • 부가될 기능을 정의한 Advice와 Advice를 어디에 적용할지를 결정하는 포인트컷을 함께 가진다.

 

Aspect )

 

Advice란?

  • 실질적으로 부가기능을 담은 구현체 이다.
  • Aspect가 ‘무엇’을 ‘언제’ 할지에 대한 정의를 담고있다.
  • @Around 를 이용하여 Advice가 타겟 메소드를 감싸서 타겟 메소드 호출 전, 후 Advice 기능을 수행한다.

 


결론

이렇게 Service가 왜 인터페이스를 생성하고 따로 구현하는지에 대해서 알아보았습니다.

그러는 과정에서 AOP에 대해서 알게 되었으며, AOP역시 개념을 정리하고 나니 확실히 왜 Interface를 사용하여 Service를 생성하고 구현하는지 이해가 되었습니다.

반응형