웹 애플리케이션 개발을 위한 프레임워크에는 Spring뿐 아니라 Django, Express, Flask, Lalavel 등 다양한 프레임워크가 있다.
프레임워크마다 사용하는 언어도 다르고 개발방법도 조금씩 달라진다. 우리는 왜 이 중에 스프링 프레임 워크를 사용하는가?
1. POJO(Plan Old Java Object)기반의 구성
2. IoC/DI(Inversioin of Control) / (Dependency Injection) 지원
3. AOP(Aspect Oriented Programming, 관점지향 프로그래밍) 지원
4. PSA (Portable Service Abstraction,추상화 구조)
객체지향 설계 원칙에 잘 맞는 재사용과 확장이 가능한 애플리케이션 개발스킬과 서비스의 안정성이 필요한 기업용 엔터프라이즈 시스템을 제대로 구축할 수 있도로 해주는 것이 스프링프레임워크을 우리가 사용해야하는 이유이다.
POJO: JAVA로 생성하는 순수한 객체
💡 POJO프로그래밍이란 무엇일까?
순수 자바 객체만을 사용해서 프로그래밍 코드를 작성하는 것
💡 그러나 POJO프로그래밍으로 작성된 코드라고 하기위해서는 두 가지 기본규칙이 있다.
💡 POJO프로그래밍이 필요한 이유?
스프링프레임워크를 사용하기 전에는 원하는 특정기술을 직접적으로 사용하는 객체를 만들어 사용했다. 그러나 프로젝트의 규모가 커짐에 따라 기술들이 들어나면서 특정기술과 환경에 종속되는 경우가 자주발생하게 되었다. 이는 작성된 코드의 유지/보수를 어렵게하고 특정 클래스를 상속받게 되어 기능의 확장을 막았다. 이에따라,
좋은 객체지향설계를 할 수 있는 자바언어를 사용하면서도 객체지향설계 본질을 잃어버리는 문제들을 해결하는 방법으로 POJO라는 개념이 등장하게 되었다.
💡 IoC란?
애플리케이션 흐름의 주도권이 개발자에서 프레임워크(Spring)로 뒤바뀐 것을 바로 IoC(Inversion of Control)라고한다.
일반적인 흐름은 개발자가 작성한 코드가 순차적으로 실행되지만 웹에서 동작하는 애플리케이션의 경우 클라이언트가 외부에서 접속하기 때문에 main()메서드가 종료되면 실행할 수 없기 때문에 종료가되면 안된다.
서블릿 컨테이너에는 서블릿사용에 맞게 작성된 서블릿 클래스만 존재할 뿐 별도의 main()메서드가 존재하지 않는다.
서블릿 컨테이너의 경우, main()메서드가 없더라도 클라이언트의 요청이 들어올 때마다 컨테이너 로직(service() 메서드)이 서블릿을 직접 실행시켜 주기 때문에 main() 메서드가 필요없다.
이러한 경우 서블릿컨테이너가 서블릿을 제어하고 있기 때문에 주도권은 서블릿 컨테이너에게 있다고 봐야하다.
이것을 서블릿과 웹 애플리케이션간에 IoC(제어의 역전)개념이 적용됐다고 표현한다.
Spring에서도 이 IoC의 개념(일반적인 개념)이 적용되어 있는데 이를 DI(Dependency Injection, 의존성주입, IoC개념을 더 구체화 시킨 것) 라고 한다.
💡 DI란?
DI란 의존성 주입을 의미하는데 a라는 클래스에서 b라는 클래스를 사용하고 있다면 이것은 'a가 b를 의존한다' 라고 이야기할 수 있다.
어떤 클래스가 인터페이스같이 일반화된 구성요소에 의존하고 있는것을 '느슨한결합'이라고한다.
우리는 코드를 작성할 때 'new' 키워드를 쓸것인가 말것인가를 고민해야 한다. 자바에서 생성하긴 위해선 new키워드는 필수였다 그러나 스프링에선 new키워드를 사용하지 않고도 인터페이스를 생성하여 의존성주입이 가능하다.
AOP를 한글로 번역하면 '관심지향프로그래밍'으로 해석할 수 있다.
AOP에서 'Aspect'는 애플리케이션에 필요한 기능 중에 공통적으로 적용되는 공통 기능에 대한 관심이다.
💡공통 관심 사항 & 핵심 관심 사항
애플리케이션을 개발할 때 공통적으로 사용되는 기능들이 있다. 예를들면 커피를 주문하기 위한 애플리케이션이 있다고할 때 로깅, 보안, 트랜잭션은 공통관심사항이 된다.
반대로 우리가 흔히 비즈니스 로직이라고 하는 핵심로직에 대한 관심사를 핵심관심사항이라고 한다.
AOP: 애플리케이션의 핵심 업무 로직에서 로깅이나 보안, 트랜잭션 같은 공통 기능 로직들을 분리하는 것이다.
애플리케이션의 핵심로직에서 공통 기능을 분리하는 이유는 3가지로 정리할 수 있다.
애플리케이션을 제작하면서 항상 기본적으로 가졌으면 하는 사고는 ‘어떻게 하면 이 코드를 깔끔하게 유지할 수 있을까?’, ‘어떻게하면 여기 저기 중복되는 코드들을 재사용할 수 있을까?’라는 것이다.
어떤 클래스의 본질적인 특성만을 추출해서 일반화 하는 것을 바로 추상화(Abstraction)라고 한다.
객체지향 프로그래밍 언어인 java에서는 코드로 추상화를 표현하는 대표적인 방법이 바로 추상클래스와 인터페이스다.
서비스의 기능을 접근하는 방식 자체를 일관되게 유지하면서 기술 자체를 유연하게 사용할 수 있도록 하는 것을 PSA(일관된 서비스 추상화)라고 한다.
💡 PSA가 필요한 이유?
📖 PSA정리
1. 클래스의 본질적인 특성을 일반화하는 것을 추상화라고 한다.
2. 클라이언트가(데이터를 요청하는 쪽) 추상화 된 상위클래스를 일관되게 바라보며 하위클래스의 기능을 사용하는 것이 PSA의 기본개념이다.
3. 서비스의 기능에 접근하는 방식을 일관되게 유지하면서 기술자체를 유연하게 사용할 수 있도록 하는 것이 PSA이다.
4. 애플리케이션에서 사용하는 기술이 변경되더라도 최소한의 변경만으로 변경된 요구사항을 반영하기 위해 PSA가 필요하다.