EJB(Enterprise JavaBeans) : EJB는 애플리케이션 작성을 쉽게 해준다.
EJB는 선언적 프로그래밍 모델이고, 트랜잭션, 보안, 분산 컴퓨팅을 쉽게 할 수 있다 라는 배경이다.
EJB를 구동시킬 수 있는 Web Application Server가 등장
EJB의 불편함을 통해 대표적으로 2가지의 Open Source가 등장한다
로드 존슨의 J2EE Design and Development의 예제 코드들이 지금의 Spring 기본 코드가 됨.
- EJB 컨테이너의 대체
개빈 킹의 하이버네이트 ORM(Object Relation Mapping) 프레임워크의 등장
EJB 엔티티 빈 기술을 대체하고, JPA(Java Persistence API)의 새로운 표준 정의
JPA는 표준 인터페이스, 하이버네이트는 JPA의 구현체
Java에서는 인스턴스 생성을 프로그래머가 직접 인스턴스를 생성한다.
Book book = new Book();
Bean은 컨테이너가 관리하는 객체를 말한다.
컨테이너란 Bean의 생명주기(객체의 생명주기)를 관리한다.
book.java
public class Book { -- Book 클래스
private String title; -- title field
private int price; -- price field
-- 생성자--
public Book(String title, int price) {
this.title = title;
this.price = price;
}
public String getTitle() {
return title;
}
public int getPrice() {
return price;
}
public void setTitle(String title) {
this.title = title;
}
public void setPrice(int price) {
this.price = price;
}
}
Book 클래스의 인스턴스 생성
Book book1 = new Book("즐거운 자바", 20000);
Bean 만들 때 규칙
package Exam;
import java.io.FileInputStream;
import java.io.IOException;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
public class ApplicationContext {
//1. 싱글턴 패턴 적용 - 자기 자신을 참조하는 static한 필드를 선언한다. 바로 초기화
//3, 1에서 만든 인스턴스를 반환하는 statioc한 메소드를 만든다.
//4. Spring은 엄청나게 좋은 ApplicationContext를 만든다. [예시]
public static ApplicationContext getInstance()
{
return instance;
}
private static ApplicationContext instance = new ApplicationContext();
// 2. 싱글턴 패턴 적용 - 생성자를 private로 바꾼다.
Properties props;
Map objectMap;
private ApplicationContext() {
Properties props = new Properties();
objectMap = new HashMap<String, Object>();
try {
props.load(new FileInputStream("src/main/resources/Beans.properties"));
}catch (IOException e)
{
e.printStackTrace();
}
}
public Object getBean(String id) throws ClassNotFoundException {
Object o1 = objectMap.get(id);
if(o1 == null)
{
String className = props.getProperty(id);
Class clazz = Class.forName(className);
// Object o = clazz.newInstance();
// objectMap.put(id,o);
// o1 = objectMap.get(id);
}
// class name에 해당하는 문자열을 가지고 인스턴스를 생성할 수 있다.
// class.forName(className)은 CLASSPATH부터 ClassName에
// 해당되는 클래스를 찾은 후 그 클래스의 정보를 반환한다.
// System.out.println(clazz.getMethod());
// Method[] methods = clazz.getMethods();
// for(Method m : methods)
// {
// System.out.println(m.getName());
//}
// Object o = clazz.newInstance(); // 기본 생성자가 있어야한다.
//return o;
return o1;
}
}

2002년 로드 존슨이 EJB의 문제점을 지적하면서 고품질의 확장 가능한 애플리케이션을 개발할 수 있음을 보여주고, 30,000 라인 이상의 기반 기술 예제 코드를 선보이면서 시작되었다.
30,000라인의 예제 코드에는 현재 스프링의 핵심 개념과 기반 코드인 BeanFactory, ApplicationContext, POJO, IoC(제어의 역전) , DI(의존성 주입)등 이 포함되었다.
로드 존슨의 책 출간 직후 유겐 휠러(Juergen Hoeller)와 Yann Caroff(얀 카로프)가 오픈소스 프로젝트를 제안하고 이후 지금까지도 스프링의 핵심 코드는 유겐 휠러가 개발하고 있다.
2003년 스프링 프레임워크 1.0의 출시, 2014년 스프링 부트 1.0 출시, 2020년 현재 스프링 프레임워크 5.2.x, 스프링 부트 2.3.x
스프링 프레임워크, 스프링 부트와 함께 스프링 데이터, 스프링 세션, 스프링 시큐리티, 스프링 RestDocs, 스프링 배치, 스프링 클라우드 등과 함께 사용된다.
스프링 프레임워크의 핵심 개념은 DI 컨테이너, AOP등 이며, 스프링 MVC와 같은 웹기술을 제공하고 JDBC, ORM 프레임워크의 지원, Mybatis와 같은 XML기반 데이터 접근 기술을 지원한다. 또한, 스프링 기반 테스트를 지원한다.
스프링 프레임워크의 장기간에 걸친 환경설정과 어려움을 해결하기 위해 스프링 부트가 등장했다.
스프링 부트의 장점
Tomcat같은 웹 서버를 내장함으로써 스프링 프레임워크와 달리 웹 서버를 설치하지 않아도 됨
단독으로 실행하도록 스프링 애플리케이션을 쉽게 생성해줌
간단한 빌드 구성을 위한 starter 종속성 제공
스프링과 써드 파티 라이브러리의 자동 구성
스프링의 핵심 개념은 무엇일까? 웹 애플리케이션을 만들고 DB 접근을 편리하게 해주는 기술? 아니다. 차례 대로 파악해보자.
스프링은 Java 언어 기반의 프레임 워크이다. 그렇다면 Java의 가장 큰 특징은?
Java는 객체 지향 언어이다. 그렇다면 스프링 프레임워크는 객체 지향 언어의 강력한 특징을 살려내 줄 수 있는 프레임워크이다. 이는 좋은 객체 지향 애플리케이션을 개발할 수 있게 도와주는 프레임워크라는 것이다.
Spring Framework -> Java 언어 -> 객체 지향 언어
Spring Framework는 객체 지향 애플리케이션 개발 프레임워크
Inflearn 김영한 님의 스프링 핵심 원리 - 기본편 : https://www.inflearn.com/course/스프링-핵심-원리-기본편/dashboard
위키피디아 EJB : https://ko.wikipedia.org/wiki/엔터프라이즈_자바빈즈
https://velog.io/@zayson/Spring-%ED%95%B5%EC%8B%AC-%EC%9B%90%EB%A6%AC-%EA%B8%B0%EB%B3%B8%ED%8E%B8-1-Spring%EC%9D%98-%EB%93%B1%EC%9E%A5%EB%B0%B0%EA%B2%BD%EA%B3%BC-Spring%EC%9D%B4%EB%9E%80
위키피디아 POJO : https://ko.wikipedia.org/wiki/Plain_Old_Java_Object