Framework은 기본적으로 프로그래밍을 하기 위한 어떤 틀이나 구조를 제공한다. Framework를 사용하면 효율적으로 코드를 작성할 수 있으며, 정해진 규약이 있어 애플리케이션을 효율적으로 관리할 수 있다는 장점이 있다. 또한 개발자가 애플리케이션의 핵심 로직을 개발하는 것에 집중할 수 있게 해준다. (애플리케이션의 흐름의 주도권이 개발자가 아닌 Framework에 있다)
반면에 내가 사용하려는 Framework에 대해 공부하는 것이 필요하고, 자유롭고 유연한 개발이 어렵다는 단점이 있다.
Framework와 Library와 헷갈릴 수 있는데, Library를 애플리케이션을 개발할 때 필요한 기능을 미리 구현해놓은 집합체이고, 애플리케이션 흐름의 주도권이 개발자에게 있는 것이라고 구분해야한다.
다양한 Framework중 대부분 Spring을 사용하는데, 보다 나은 성능과 서비스의 안전성이 필요한 복잡한 기업용 엔터프라이즈 시스템을 제대로 구축하기에 좋고, 객체 지향 설계원칙에 잘맞는 재사용과 확장이 가능한 애플리케이션 개발에 좋기 떄문으로 이해했다.
Spring Framework의 장점은 다음과 같다.

위 그림은 Spring 삼각형이라고 불리는 유명한 그림이다. (Spring의 핵심 개념을 모두 표현한다고 보면 된다...)
위 그림처럼 POJO 라는 것을 IoC/DI, AOP, PSA를 통해서 달성할 수 있다.
영어 그대로 POJO = Java로 생성하는 순수한 객체 라고 보면된다.
POJO프로그래밍이란 POJO를 이용해서 프로그래밍 코드를 작성하는 것을 의미하며, 순수 Java 객체가 다른 기술이나 환경에 종속되지 않도록 하기 위한 프로그래밍 기법이다.
POJO프로그래밍으로 작성한 코드라고 불리기 위해서는 아래 두가지정도의 기본적인 규칙은 지켜주어야한다.
Java나 Java의 스펙(사양)에 정의된 것 이외에는 다른 기술이나 규약에 얽매이지 않아야한다.
특정 환경에 종속적이지 않아야한다.
POJO 프로그래밍이 필요한 이유는 다음과 같다.
특정 환경이나 기술에 종속적이지 않으면 재사용 가능하고, 확장 가능한 유연한 코드를 작성할 수 있다.
저수준 레벨의 기술과 환경에 종속적인 코드를 애플리케이션 코드에서 제거함으로써 코드가 깔끔해진다.
그래서 디버깅하기도 상대적으로 쉬워진다.
특정 기술이나 환경에 종속적이지 않기 때문에 테스트도 단순해진다.
❗️객체지향적인 설계를 제한없이 적용할 수 있다. (가장 중요한 이유)
IoC (Inversion of Control) 이란 애플리케이션 흐름의 주도권이 뒤바뀐 것을 말한다. Library는 애플리케이션 흐름의 주도권이 개발자에게 있고, Framework은 애플리케이션 흐름의 주도권이 Framework에 있다고 했던것을 기억하면 된다.
Spring에는 이 IoC의 개념이 DI로 적용되어있다.
IoC는 서버 컨테이너 기술, 디자인 패턴, 객체 지향 설계 등에 적용하게 되는 일반적인 개념인데 반해 DI는 IoC개념을 조금 구체화시켜 객체간의 관계를 느슨하게 해주는 것이라고 볼 수 있다.
✔️ DI(Dependency Injection)는 의존성 주입이라는 의미를 가진다.
의존성 주입은 무엇일까?
이전에 햄버거 키오스크를 만들때처럼, A클래스가 B클래스의 기능을 사용할 때 A클래스가 B클래스에 의존한다 라고한다.
클래스끼리 사용하고자 하는 클래스의 객체를 생성해서 참조하게되면 의존 관계가 성립한다.
(ex_클래스의 생성자로 객체를 전달받는 코드가 있다면, '객체를 외부에서 주입받고있구나~ 의존성 주입이 이루어지고 있구나~ 하고 생각하면 된다.)
의존성 주입은 왜 필요할까?
스텁(stub)은 메서드가 호출되면 미리 준비된 데이터를 응답하는 것이다.
이렇게 몇번 호출해도 동일한 데이터를 리턴하는 것을 멱등성을 가진다라고 한다.
예를들어 프론트와 협업을하며 메뉴 데이터 조회 API를 위한 stub을 준비하는 경우가 있다.
이때 new키워드를 사용해서 객체를 생성하게되면, 참조할 클래스가 바뀌게 될 경우 이 클래스를 사용하는 모든 클래스들을 수정해야한다.
이렇게 new키워드를 사용해서 의존 객체를 생성할 때, 클래스들 간에 강하게 결합되어있다고한다.
따라서 의존성 주입을 하더라도 클래스간의 강한 결합은 피하는 느슨한 결합이 필요하다.
느슨한 의존성 주입은 어떻게 할까?
자바에서 클래스들 간의 관계를 느슨하게 만드는 대표적인 방법은 인터페이스를 사용하는 것이다.
어떤 클래스가 인터페이스같이 일반화된 구성 요소에 의존하고있을 때, 클래스들간에 느슨하게 결합되어있다고한다.
업캐스팅을 통한 의존성 주입으로 느슨한 결합 관계를 유지시킨다.
여기 부분은 하나도 모르겠다.. 이해가 안되부려....
AOP는 관심지향 프로그래밍으로 해석하면 된다.
공통 관심 사항 (Cross-cutting concern)
애플리케이션 전반에 걸쳐 공통적으로 사용되는 기능들이 있는데, 이런 공통 기능들에 대한 관심사를 말한다.
핵심 관심 사항 (Core concern)
애플리케이션의 주목적을 달성하기 위한 핵심 로직에 대한 관심사를 말한다.
커피 주문을하는 애플리케이션으로 예를들면, 카페 주인이 커피 종류를 등록하는 것과 고객이 커피를 주문하는 기능은 애플리케이션의 핵심 관심 사항이다.
주문 애플리케이션에 아무나 접속하지 못하도록 제한하는 애플리케이션 보안에 대한 부분은 애플리케이션 전반에 공통적으로 적용되는 기능이기 떄문에 공통 관심 사항이다.
정리하면, AOP는 애플리케이션의 핵심 업무 로직에서 로깅이나 보안, 트랜잭션 ,모니터링, 트레이싱 같은 공통 기능 로직들을 분리하는 것이라고 보면된다.
추상화 (Abstraction)란, 어떤 클래스의 본질적인 특성만을 추출해서 일반화 하는 것을 말한다.
자바에서 코드로 추상화를 표현할 수 있는 대표적인 방법이 추상클래스와 인터페이스이다.
추상화를 하게되면 클라이언트 입장에서 추상 클래스만 일관되게 바라보며 하위 클래스의 기능을 사용할 수 있다.
이렇게 클라이언트가 추상화된 상위 클래스를 일관되게 바라보며 하위 클래스의 기능을 사용하는 것이 바로 PSA의 기본 개념이다.
코드 레벨에서 어떤 클래스의 기능을 사용하는 측 역시 클라이언트라고 부른다.
또한 애플리케이션에서 특정 서비스를 이용할 떄, 서비스의 기능을 접근하는 방식 자체를 일관되게 유지하면서 기술 자체를 유연하게 사용할 수 있도록 하는 것을 PSA라고 한다.
진짜 이해 안된다. .
추가로,
Java 언어를 사용함으로써 얻는 장점이 있다.
정적타입 언어로서 변수의 타입, 메서드의 입력과 출력이 어떤 타입을 가져야하는지를 강제하기 때문이다.