Framework
Framework는 어플리케이션 개발 시 필요한 기본 구조와 뼈대를 제공하는 툴이다.
제공되는 구조에 맞게 코딩을 진행하면 되기 때문에 개발 시간이 줄고 효율적인 개발을 할 수 있다.
코드의 재활용성을 증가 시키기 위해 일련의 클래스 묶음이나 뼈대, 틀을 라이브러리 형태로 제공한다.
Library
자주 사용되는 기능을 모아둔 코드의 모음집이다.
개발자 또는 회사에서 개발한 기능(코드)를 라이브러리로 만들어서 배포한다.
-> 해당 기능이 필요한 개발자가 라이브러리를 자신의 프로젝트에 추가해서 사용한다.
API
서로 다른 소프트웨어 구성 요소 간 상호 작용을 정의하는 규약이다.
API를 통해 서로 다른 프로그램들이 데이터를 주고 받거나 기능을 호출해 통신할 수 있다.
Spring Framework
자바 플랫폼을 위한 오픈 소스 애플리케이션 프레임워크. 간단하게 스프링 이라고 부른다.
동적인 웹사이트 개발을 위한 여러 서비스를 제공한다.
주요 특징
IOC(Inversion of Control) 제어 반전.
- 컨트롤의 제어권이 개발자가 아닌 프레임워크에 있다.
- 객체의 생성부터 생명 주기 관리를 프레임워크가 주도한다.
- 개발자가 객체를 생성하고 호출하지 않고, Spring Container가 만들어둔 객체를 필요할 때 얻어와 사용한다.
- 클래스간 결합도를 낮추고 유지보수성이 향상 된다.
DI(Dependency Injection) 의존성 주입
- 설정 파일(XML)이나 어노테이션을 통해 객체 간 의존 관계를 설정.
- 개발자가 직접 객체를 생성하지 않고 Spring Container가 만들어둔 객체를 필요한 위치에 주입한다.
(의존 == 직접 객체를 만들지 않고 Spring이 만든 객체를 얻어와 사용
POJO(Plain Old Java Object)
- Spring은 J2EE, EJB와 같은 특정 기술이나 라이브러리의 내용을 상속 받아 클래스를 구현하지 않고, 일반적인 자바 객체(POJO)를 사용할 수 있도록 지원한다.
- 이를 통해 개발자는 프레임워크 학습 곡선을 낮추고 코드의 가독성을 높일 수 있다.
*J2EE : Servlet, JSP 레벨의 서버 프로그래밍 인터페이스 (Java2 Enterprise Edition)
*EJB : 쉽게 웹 개발이 가능한 기술. 객체지향 장점을 포기해야 하는 단점이 있음. (Enterprise Java Bean)
AOP(Aspect Oriented Programming) 관점 지향 프로그래밍
- 로깅, 보안, 트랜잭션 관리 등 공통적인 관심사를 분리해 코드 중복을 줄이고 유지보수성을 향상 시키는 기능을 지원한다.
Spring MVC
- MVC(Model, View, Controller) 디자인 패턴을 적용할 수 있는 어노테이션을 지원.
- IOC/DI 를 이용해 의존 관계를 관리하여 개발자가 아닌 서버가 객체들을 관리하는 웹 애플리케이션을 구축.
PSA(Portable Service Abstraction)
- 스프링은 다른 여러 모듈을 사용함에 있어 별도의 추상화 레이어를 제공하여 특정 기술에 종속되지 않으면서
다양한 기술 스택을 쉽게 사용할 수 있음.
(외부 라이브러리, API 등 외부 기술을 쉽게 이용할 수 있도록 여러 인터페이스, 추상 클래스를 제공함)
Servlet과 Spring
Java 객체 : new 연산자를 통해 Heap 영역에 클래스에 작성된 내용대로 생성된 객체.
instance : 개발자가 직접 만들고 관리하는 객체.
Bean : Spring Container가 만들고 관리하는 객체이다.
기존 Servlet은 클래스 단위로 하나의 요청만 처리가 가능했다.
Spring은 메서드 단위로 요청 처리가 가능하다.
클래스명 위에 공통 주소로 매핑을 하면
@RequestMapping("param")
공통 주소로 묶인 다른 요청이 올 때 이 공통 주소 클래스에 있는 매핑된 메서드들로 연결된다.
예시)
@RequestMapping("insert") // /param/insert 매핑
public String 메서드명() {}
@RequestMapping("select") // /param/select 매핑
public String 메서드명() {}