Programming/Clean Code

Controller, Service, Repository를 Static으로 하지 않는 이유!!

JaeHoney 2022. 4. 13. 22:38

Static class ?

어제 레거시 프로젝트를 받아서 기능 개선을 진행하게 되었습니다.

 

코드가 조금 신기했던게, Controller, Service, Repository가 정적 클래스(class)로 되어 있었습니다.

 

Controller에서 Service의 메소드를 호출할 때 Service.method() 형식으로 호출하고 인스턴스를 생성하지 않는 방법입니다.

 

Why?

정적 클래스(Static class)로 사용하면 어차피 재사용하게되고, 큰 문제는 없지 않나? 싶었습니다.

 

실제로 99%의 MVC 메서드는 정적으로 사용할 수 있다고 합니다.

 

그렇다면 왜 정적 클래스를 사용하지 않고, 싱글톤(Singleton)으로 instance를 만들어서 사용할까요?

 

 

DI(의존성 주입)

정적 클래스는 상태를 가지지 않습니다.

-> 생성자나 필드를 통해 의존성을 주입할 수도 없게 됩니다.

 

 

객체지향

정적 클래스는 다른 클래스를 상속할 수 없습니다. 인터페이스도 사용할 수 없습니다.

-> 객체 지향의 추상화, 다형성과 같은 개념을 사용할 수 없습니다.

 

즉, static은 객체 지향의 패러다임과 상반됩니다.

 

 

테스트

테스트 코드는 인터페이스를 구현하거나 클래스의 가짜 객체(Mock Object)를 생성해서 동작합니다.

-> Static method는 상속하거나 구현할 수 없기 때문에 Mock이 복잡합니다.

 

Mocking이 완전하지 않을 경우 결함이 발생하기도 쉽습니다.

 

 


"절대로 Static을 사용해선 안된다는 것은 아닙니다."

 

절차적 패러다임과 객체 지향 패러다임의 장단점과 차이가 존재하는 것이고,

오늘날 MVC 서비스에 국한해서는 객체 지향 패러다임이 더 유리하다고 보는게 맞는 것 같습니다.

 

감사합니다.