Servlet 기반의 MVC 패턴은 웹 어플리케이션 개발에서 매우 일반적으로 사용되는 패턴 중 하나입니다.

그러나 이 패턴에는 몇 가지 단점이나 한계가 존재합니다.


1. 코드 중복성

Servlet 기반의 MVC 패턴에서는 컨트롤러, 모델, 뷰를 모두 자바 클래스로 구현합니다. 이 때, 각 컨트롤러나 모델에서 비슷한 코드가 중복될 수 있습니다. 이러한 중복성은 유지보수를 어렵게 만들 수 있습니다.

2. 복잡성

Servlet 기반의 MVC 패턴은 일반적으로 복잡한 로직이나 대규모 프로젝트에서 사용됩니다. 이는 MVC 패턴의 각 부분을 설계하고 구현하는 것이 쉽지 않기 때문입니다. 또한, 이 패턴은 개발자들에게 많은 학습 곡선을 제공합니다.

3. 제한된 확장성

Servlet 기반의 MVC 패턴은 일반적으로 비교적 단순한 애플리케이션에서 가장 잘 작동합니다. 그러나 더 큰 규모의 프로젝트에서는 확장성에 한계가 있을 수 있습니다. 이는 구성 요소 간의 의존성이 높아지기 때문입니다.

4. 유연성 부족

Servlet 기반의 MVC 패턴은 모든 프로젝트에 적합하지는 않습니다. 특히 다른 기술과 함께 사용하려는 경우에는 유연성 부족이 문제가 될 수 있습니다.

5. 테스트의 어려움

Servlet 기반의 MVC 패턴에서는 모델, 뷰, 컨트롤러를 모두 자바 클래스로 구현합니다. 이는 테스트를 작성하는 것이 어렵게 만들 수 있습니다. 특히 뷰와 컨트롤러는 일반적으로 서버와 상호 작용하므로, 테스트를 작성하는 것은 더 어려울 수 있습니다.


각 단점에 대해서는 아래와 같이 보완할 수 있습니다.

 

1. 코드 중복성

컨트롤러나 모델에서 코드 중복성을 줄이기 위해서는 상속이나 인터페이스를 사용하여 공통 코드를 추상화할 수 있습니다. 또한, 유틸리티 클래스를 만들어 공통 코드를 분리하거나, AOP(Aspect Oriented Programming)를 사용하여 중복 코드를 제거할 수 있습니다.

자바에서 추상화 클래스를 만드는 이유는 다음과 같습니다.

1. 상속 관계에서의 일관성
추상화 클래스를 사용하면 상속 관계에서 일관성을 유지할 수 있습니다. 즉, 서로 다른 클래스가 동일한 추상화 클래스를 상속받으면, 해당 클래스들은 공통된 속성이나 메서드를 갖게 되어 일관성 있게 설계할 수 있습니다.

2. 다형성의 활용
추상화 클래스를 사용하면 다형성을 적극적으로 활용할 수 있습니다. 추상화 클래스를 상속받은 다양한 클래스들은 추상화 클래스의 메서드를 오버라이딩하여 자신의 특성에 맞게 구현할 수 있으며, 이렇게 다형성을 활용하면 코드의 재사용성과 확장성을 높일 수 있습니다.

3. 구현 강제성
추상화 클래스는 추상 메서드를 갖을 수 있으며, 이러한 추상 메서드는 자식 클래스에서 반드시 구현되어야 합니다. 이는 자식 클래스가 특정한 동작을 반드시 구현하도록 강제하는 효과를 가지며, 이를 통해 설계상의 일관성과 안정성을 유지할 수 있습니다.

4. 표준화된 인터페이스 제공
추상화 클래스는 특정한 인터페이스를 제공하며, 이 인터페이스는 자식 클래스들이 구현해야 하는 메서드와 속성들을 표준화하여 정의합니다. 이를 통해 코드의 가독성과 유지보수성을 높일 수 있습니다.

5. 캡슐화
추상화 클래스를 사용하면 메서드와 속성을 캡슐화하여 외부에서의 직접적인 접근을 제어할 수 있습니다. 이를 통해 클래스의 내부 구현을 숨기고, 외부에서 필요한 기능만을 노출하여 보다 안전하게 사용할 수 있습니다.

 

2. 복잡성

프로젝트 규모가 커지면 모델, 뷰, 컨트롤러 등의 구성 요소 간의 의존성이 높아지기 때문에, 각 요소를 더 작은 단위로 분리하고 각각을 독립적으로 개발할 수 있는 모듈화된 아키텍처를 적용하여 복잡성을 줄일 수 있습니다.

3. 제한된 확장성

이러한 문제를 해결하기 위해 DI(Dependency Injection)나 IoC(Inversion of Control)를 사용하여 의존성을 줄이고, 모듈화된 아키텍처를 적용하여 각 구성 요소를 독립적으로 개발할 수 있도록 합니다.

4. 유연성 부족

다른 기술과 함께 사용하려는 경우에는 서블릿 기반의 MVC 패턴이 적합하지 않을 수 있습니다. 이 경우, 다른 기술과 잘 통합되는 다른 웹 프레임워크를 선택할 수 있습니다.

5. 테스트의 어려움

뷰와 컨트롤러를 테스트하는 것은 어려울 수 있습니다. 이를 해결하기 위해서는, 뷰와 컨트롤러를 분리하여 뷰는 HTML 파일과 같은 정적 리소스로 분리하고, 컨트롤러는 JUnit과 같은 유닛 테스트 프레임워크를 사용하여 테스트할 수 있습니다. 또한, Mock 객체를 사용하여 서버와 상호작용하지 않는 가짜 객체를 만들어 테스트하는 것이 가능합니다.

 

출처 : 스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술

+ Recent posts