프로그래밍을 위한 틀, 뼈대, 구조
ex) Collection Framework
효율적으로 코드를 작성할 수 있음
✔️ 프레임워크가 라이브러리의 형태로 다양한 기능을 제공
효율적인 앱 관리
✔️ 프레임워크의 정해진 규약이 존재하고, 이 규약에 맞춰 작성하기 때문에 유지보수가 필요한 경우에 더 빠르고 쉽게 문제점을 해결할 수 있음
개발자가 핵심로직을 작성하는 데 집중할 수 있음
주도권의 차이
❗️프레임워크 : 전체적인 프로그램의 틀
개발자가 메소드 내에 코드를 작성하면, 프레임워크는 개발자가 만든 코드를 사용해서 앱의 흐름을 만듦
➡️ 프레임워크가 주도권을 가진다
❗️라이브러리 : 특정 기능을 미리 구현해놓은 코드
개발자가 필요할 때 갖다 쓸 수 있음
➡️ 개발자가 주도권을 가진다
Java 기반의 웹 애플리케이션 개발을 위한 Framework
Spring Framework 이전에는 JSP(Java Server Page), Servlet을 사용했지만, 너무 복잡하고 가독성이 떨어짐
➡️ Spring MVC 방식 도입, but 여전히 불편
➡️ Spring Boot 등장!
순수한 자바 객체
❗️규칙
Java나 Java의 스펙에 정의된 것 이외에는 다른 기술이나 규약에 얽매이지 않아야 함 'Plain'
ex) 특정 기술을 상속받아 코딩하는 경우
➡️ 특정 기술에 종속적
➡️ 애플리케이션 요구사항이 바뀌는 경우 일일이 수정해야 함
특정 환경에 종속적이지 않아야 함
ex) servlet이 바뀌는 경우
➡️ 최악의 경우 전면 수정 필요
❗️POJO가 필요한 이유
Spring 에서는 POJO 프로그래밍을 지향하기 위해 IoC/DI, AOP, PSA 기술을 제공
애플리케이션 흐름의 주도권을 Spring이 가짐
✔️순수 Java 콘솔 애플리케이션의 경우, main() 메소드를 실행시키며 개발자가 작성한 코드를 순차적으로 실행
❗️웹 상에서 돌아가는 서블릿 기반의 Java 웹 애플리케이션
➡️ 서블릿 컨테이너 내의 컨테이너 로직이 서블릿을 직접 실행
➡️ main() 메소드 필요 없음
➡️ 애플리케이션의 주도권은 서블릿 컨테이너에게 있음
IoC는 DI로 이루어짐
객체간의 의존성을 주입하는 것
생성자를 통해 어떤 클래스의 객체를 전달받아 의존성 주입을 구현
❗️DI가 필요한 이유
애플리케이션 내부에서 new
키워드를 직접 사용시 객체지향 설계의 관점에서 중요한 문제 발생
new
키워드가 포함된 모든 코드를 수정해야 함 (강한 결합, Tight Coupling)➡️ 느슨한 의존성 주입으로 해결 ➡️ 인터페이스 사용
❗️BUT 최소한의 객체 생성을 위한 생성자는 ???
Spring 영역에서 해결!
Config
: Config에 정의해둔 A객체를 Spring의 도움을 받아 B클래스에 제공
❗️Spring의 영역이기 때문에 애플리케이션에 관여 x
관심 지향 프로그래밍, 공통 관심 사항을 분리하는 것
회원가입과 회원조회 기능에 로깅이 공통으로 들어갈 경우, 모든 작업에 비슷한 코드를 작성하게 되면 유지보수가 어렵다!
해결
config
에 Aop 클래스를 만들고 @Aspect, @Component
애너테이션을 붙여주어 공통 관심 사항을 분리
➡️ 직접 구현하지 않아 코드가 간결해짐
➡️ 코드의 재사용 가능
➡️ 원하는 적용 대상 지정 가능
클라이언트가 추상화된 상위 클래스를 일관되게 바라보며 하위 클래스의 기능을 사용하는 것
인터페이스에 접근하여 하위클래스의 기능 사용
➡️ 접근 방식 일관됨
➡️ 기술 자체를 유연하게 사용할 수 있음
❗️PSA가 필요한 이유
요구사항 변경 시 최소한의 수정으로 요구사항을 반영할 수 있음
➡️ 애플리케이션의 요구사항에 유연한 대처가 가능함