Spring - 핵심가치(POJO와 핵심기능)
Spring(이하 스프링)은 Java로 웹 어플리케이션을 편하게 개발할 수 있도록 도와주는 오픈소스 프레임워크다. 스프링은 이전 기술들과 비교해 웹 개발을 보다 간편하게 할 수 있어 개발 생산성을 높여준다. 이전 개발자가 작성해야했던 불필요하고 복잡한 코드들을 제거하여 비즈니스 로직에 집중할 수 있도록 도와준다. 스프링 프레임워크의 장점을 정리하자면 다음과 같다.
- 규칙성 : 프레임워크가 제시하는 직관적인 규칙만으로 필요한 기능을 구현할 수 있음
- 경량성 : 개발자들이 필요한 모듈만을 사용할 수 있도록 모듈화되어 있음
- 확장성 : 수 많은 모듈들을 지원하며, 사용중이던 모듈을 별도로 분리하기도 편리
- 넓은 생태계 : 오랜 역사로 지속적인 발전을 해오며 안정적인 개발과 개선이 보장됨. 수 많은 커뮤니티가 존재하고 레퍼런스가 많음
- IoC/DI, AOP, PSA 등의 기능들을 제공하여 유지/보수에 탁월
POJO 지향
스프링으로 개발할 때의 강점은 POJO(Plain Old Java Object) 프로그래밍 지향과 이를 지원하는 확장기술들에서 나온다. POJO는 순수한 자바 객체를 의미하며, 이러한 순수 자바만을 사용하는 것을 POJO 지향 프로그래밍이라고 한다. POJO를 지향한다는 것은 자바의 객체지향을 활용한 개발을 한다는 것을 의미한다.
다른 서버사이드 프레임워크를 사용해 본 사람들은 ‘자바 어플리케이션에서 순수 자바와 객체지향을 사용하는건 당연한 거 아닌가?’라는 의문이 들 수도 있다. 스프링에서 POJO를 강조하는데에는 이유가 있다. 스프링 이전 웹 개발을 위해 사용한 EJB(Enterprise JavaBeans)에서는 비즈니스 로직을 처리하기 위해 EJB에 종속된 여러가지 인터페이스를 구현하고 클래스를 상속시켜야했다. 때문에 자바 본연의 객체 지향의 효과를 발휘하지 못했다. 이러한 문제점과 더불어 느린 성능, 낮은 개발 생산성 등으로 EJB는 몰락했고, 객체지향적인 설계의 장점을 살리며, 외부 기술이나 규약의 변화에 얽매이지 않는 자바 객체인 POJO와 그러한 POJO기반 개발을 지향하는 스프링이 각광받게 되었다.
💡 POJO의 진정한 가치
POJO의 진정한 가치는 객체지향의 기본 원칙을 따르면서 확장성과 유지보수성이 뛰어난 코드를 작성할 수 있다는 것이다. POJO는 특정 프레임워크나 라이브러리에 종속되지 않기 때문에 어떤 환경에서도 재사용이 가능하다. 또한, 의존성이 없고 단순하고 간결하여 테스트 코드 작성에도 용이하다.
스프링은 개발자들이 POJO 지향 개발을 하면서 해결하기 어려운 문제, 또는 객체지향 프로그래밍의 한계를 해결하고 높은 유지보수성과 확장성을 제공하기 위하여 확장기능들을 제공한다. Spring Triangle이라고 불리는 IoC/DI, AOP, PSA가 바로 그 주인공들이다.
IoC/DI
💡 Notice
이 글에서는 POJO 지향개발에 어떠한 도움을 주는지에 대한 핵심 설명만을 담았습니다.
IoC와 DI에 관한 자세한 설명은 다음 포스팅인 Spring - 핵심개념2(IoC/DI) 를 참고해 주시길 바랍니다.
IoC(Inversion Of Control, 제어의 역전)은 의존 객체의 생성과 관리에 대한 책임을 외부에 맡기는 원칙이며, DI(Dependency Injection, 의존성 주입)은 IoC 원칙을 준수하며, 생성한 객체를 의존하는 객체에게 주입시켜주는 방법이다. IoC와 DI(+ DIP)를 이용함으로써 객체를 쉽게 교체할 수 있어 확장에 용이하고 테스트 코드 작성이 수월해진다.
하지만 어디선가 객체를 생성하고 생명주기를 관리하며 의존하는 객체들에게 주입시켜주는 역할을 맡는 객체가 필요하다. 이러한 역할을 담당하는 객체를 IoC Container 혹은 DI Container라고 부른다.
IoC Container를 직접 구현한다면 의존관계가 복잡해질수록 코드의 복잡성도 증가할 것이다. 뿐만 아니라 객체관리를 위해 싱글톤 패턴을 사용한다면 테스트 코드를 작성하는데도 문제가 생긴다. 이러한 문제들을 해결하기 위하여 스프링은 IoC Container을 내장하여 개발자로 하여금 관리의 어려움을 덜어준다.
개발자는 어노테이션을 이용해 등록함으로써 객체의 생성과 관리, 의존성주입을 프레임워크에게 손쉽게 위임할 수 있다. 즉, 스프링 프레임워크의 IoC Container 내재화 덕분에 POJO 만을 사용하여 확장가능하고 유연한 어플리케이션을 설계할 수 있다.
AOP
💡 Notice
이 글에서는 POJO 지향 개발에 어떠한 도움을 주는지에 대한 핵심 설명만을 담았습니다.
AOP에 관한 자세한 설명은 다음 포스팅인 Spring - 핵심개념3(AOP) 를 참고해 주시길 바랍니다.
AOP(Aspect Oriented Programmin, 관점지향개발)는 공통기능(횡단관심사)을 모듈화하여 재사용 가능하도록 만드는 방법이다. 잘 만들어진 클래스와 메서드라면 하나의 메서드에는 하나의 핵심기능만을 가진다. 하지만 핵심기능 속에 부가적인 기능을 작성하는 경우도 있다. 예를 들어, 메서드의 실행시간 측정, 로깅, 캐시처리와 같은 부분들이다. 이런 부가기능들은 여러 클래스의 메서드들에서 동일한 코드로 작성될 가능성이 크다.
순수한 객체지향에서는 이렇게 중복되는 코드들(횡단 관심사)을 모듈화하기 힘들다. 하나의 클래스가 아닌 여러 클래스에서 중복되는 코드가 발생하기 때문이다. 스프링은 이러한 횡단관심사를 모듈화 시킬 수 있는 AOP 기능을 내장하고 있다. 덕분에 객체지향의 한계를 극복하고 보다 재사용가능한 모듈을 작성할 수 있다.
PSA
💡 Notice
이 글에서는 POJO 지향 개발에 어떠한 도움을 주는지에 대한 핵심 설명만을 담았습니다.
PSA에 관한 자세한 설명은 다음 포스팅인 Spring - 핵심개념4(PSA) 를 참고해 주시길 바랍니다.
PSA(Portable Service Abstraction)은 내부 코드와 외부 기술사이에 추상화 계층을 제공한다. 이를 통해, 환경이나 특정 기술에 종속되지 않고 유연한 어플리케이션을 만들 수 있다.
외부 기술과 연동되는 부분. 예를 들어, JDBC API, JPA, Hibernate, MyBatis와 같은 데이터 액세스 라이브러리들을 스프링이 제공하는 일관된 인터페이스를 통해 사용할 수 있다. 덕분에 개발자들의 POJO 코드가 외부 라이브러리 코드에 직접적으로 노출되지 않게 만들 수 있다. 뿐만 아니라 테스트하기 어려운 라이브러리들을 설정을 통해 쉽게 구현을 변경 할 수 있다는 장점도 있다.
댓글남기기