-
Spring을 쓰긴 쓸 건데, 도대체 왜 써야 할까?Today I Learned 2022. 10. 18. 23:57
포트폴리오 프로젝트 애플리케이션에 사용될 기술 스택을 정의하기 위해 계속해서 자료들을 찾아보고 있다. 오늘은 웹 서버 프레임워크로 Spring을 사용하는 것이 다른 프레임워크들을 사용하는 것에 비해 어떤 점이 좋은지 찾기 위해 Spring의 주요 특성들을 찾아보고, 다른 웹 서버 프레임워크들을 조금씩 찾아보면서 Spring과 어떤 차이가 있는지 알아보았다.
일단 작업의 진척도는 Spring에 대해서는 조사를 일정량 진행했지만, 비교 대상이 될 다른 웹 프레임워크들에 대해서는 조사가 조금 더 필요한 상태이다.
오늘 가장 크게 발목을 잡았던 부분은 도대체 Spring을 사용해야 하는 이유를 어느 범위에서부터 잡아나가야 할지 어려웠다는 점이었다. 단계별로 차근차근 밟아나가는 편이 좋을까 싶어 일단 웹 서버 개발에 프레임워크를 사용하는 이유부터 정리해보기로 했다.
웹 서버 개발에 웹 프레임워크를 사용해야 하는 이유?
일단 프레임워크는 프레임워크 제작자가 설계한 구조를 따라야 하기 때문에 자유롭고 유연한 개발에는 한계가 있지만, 밑바닥부터 구현하는 것보다 시간, 비용이 절약되어 생산성이 좋아지며, 프레임워크의 구조를 따르기 때문에 코드가 체계화므로 유지보수에 안정적이게 된다. 웹 서버로의 요청, 요청에 대한 처리, 클라이언트에 대한 응답 등 서버가 수행해야 하는 수많은 동작과 아키텍처를 제로 베이스에서부터 구현하는 것은 생산성이 떨어지기 때문에 미리 구축된 웹 프레임워크를 사용하는 것이 좋다.
웹 서버 개발에 Spring을 사용해야 하는 이유?
이번 프로젝트에서 Spring을 사용해야 하는 가장 큰 요인 중의 하나로는 구현하는 프로그램의 규모가 대단히 크고, 요청을 처리하고 응답을 생성하기 위해 많은 수의 객체들이 상호 협력해야 한다는 지점에 있다.
이러한 이유가 Spring을 이용해 웹 서버를 개발하기 유리한 지점이라고 볼 수 있다. Spring은 의존성 주입 및 IoC를 통해 객체지향 설계 원칙을 지키기 위한 프로그래밍을 수행하는 데 최적화되어 있다고 볼 수 있다.
의존성 주입, IoC Container
Spring 프레임워크의 대표적인 특징 중 하나인 의존성 주입은 Bean 객체가 생성자의 인수나, 팩토리 메서드의 인수, 또는 객체 인스턴스에 설정된 속성을 통해서만 객체의 종속성이 정의되도록 하는 것이다. 이 Bean은 IoC Container에서 인스턴스화되어 필요한 지점에 해당 Bean 객체가 주입된다.
의존성 주입 원칙을 사용하면 의존성이 있는 객체를 효과적으로 분리할 수 있다는 이점이 있다. 의존성을 주입받은 클래스와 주어진 객체의 결합도가 낮아지므로 유지보수에 용이해진다.
또한 의존성이 주입될 경우 특정한 객체를 구현하기 위한 복잡한 상속이나 구현 과정 없이 POJO(Plain Old Java Object)를 이용한 개발이 가능해진다는 이점이 있다. 이는 객체 간의 관계를 구성할 때, 별도의 API를 사용하지 않아도 되므로 코드를 작성할 때 특정 라이브러리나 컨테이너의 기술에 종속되지 않을 수 있음을 의미한다.
의존성 주입이 없을 경우 나타날 수 있는 문제는?
만약 애플리케이션의 크기가 충분히 커지고 객체 간의 관계성이 복잡해진 상태에서 의존성 주입이 없다면 개발 과정에서 어떤 문제가 발생할 수 있을까?
애플리케이션의 여러 위치에서 사용되고 있던 클래스의 메서드 같은 속성이 변경될 경우, 메서드가 사용되는 지점에 의존성이 있는 모든 코드들이 수정되어야 한다. 해당 객체와 관련된 모든 부분이 수정되는 과정에서 코드의 품질과 안정성이 떨어지는 문제가 발생할 수 있을 것이다.
AOP의 손쉬운 구현이 가능
AOP(Aspect-oriented Programming)란 애플리케이션에서 공통적으로 나타나는 부가적인 기능들을 독립적으로 모듈화하는 프로그래밍 모델을 의미한다.
Spring에서는 비즈니스 로직에는 속하지 않지만 보안, 로그 시간 측정, Transaction과 같이 애플리케이션 곳곳에서 나타날 수 있고, 반드시 처리되어야 하는 공통 관심사항들을 비즈니스 로직에서 분리하면서도 별도의 공통된 로직으로 만들어 필요한 부분에 공통 관심 사항을 적용할 수 있도록 할 수 있다.
다른 웹 프레임워크들의 특성에 대해 비교까지 하고 싶었지만 오늘의 글에는 추가하기가 애매한 관계로 다음의 자료에 내용을 지속적으로 추가하면서 비교를 진행할 예정이다.
'Today I Learned' 카테고리의 다른 글
포트폴리오 주간 프로젝트 1주차 기획 중간점검 (0) 2022.10.20 React는 다른 프론트엔드 프레임워크에 비해 어떤 이점이 있을까? (0) 2022.10.19 웹 지도 클러스터링 기법을 활용할 때 NoSQL 계열의 데이터베이스가 유리한 이유는 무엇인가? (0) 2022.10.17 테스트도 결국 좋은 애플리케이션을 만들기 위한 과정인 것 (레벨 테스트 10일차 작업 회고) (0) 2022.10.14 여전히 통제가 안 되는 영역이 있다는 불안감 (레벨 테스트 9일차 작업 회고) (0) 2022.10.13