- EJB는 java에서 인정한 표준기술이었는데 분산기술(ex.지금의 Dao,Service),ORM 등 놀라운 신기술이었지만 비용이 굉장히 비쌌고, 개발자가 사용하기에는 복잡하고 어렵고 느렸다.
- 스프링:EJB 컨테이너 대체, 단순함, 현재 사실상 표준기술인 SPRING 개발
- 하이버네이트 : EJB 엔티티빈 기술 대체, 후에 'JPA' 새로운 표준 정의
- 요즘 표준 인터페이스는 거의 대부분 JPA, 구현체는 하이버네이트이다.
- 2002년 로드 존슨(Rod Johnson) 책 출간
- EJB의 문제점을 지적함과 동시에 EJB없이 확장 가능한 고품격 애플리케이션을 30000라인 이상의 기반 기술을 예제 코드로 선보임
- BeanFactory, ApplicationContext,POJO, DI, IOC 등 지금의 spring 기술들
- spring의 이름은 EJB라는 겨울을 넘어 시작하는 봄의 뜻으로 지음
Spring Framework
1) 핵심기술 : 스프링 DI 컨테이너, AOP, 이벤트...
2) 웹기술 : 스프링 MVC, 스프링 WebFlux
3) 데이터 접근 기술 : 트랜잭션, JDBC, ORM 지원, XML 지원
4) 기술 통합 : 캐시, 이메일, 원격접근, 스케줄링
5) 테스트 : 스프링 기반 테스트 지원
6) 언어 : 코틀린, 그루비
Spring Boot
1) 스프링을 편리하게 사용할 수 있도록 지원, 최근에는 기본으로 사용
2) 단독으로 실행할 수 있는 스프링 애플리케이션을 쉽게 생성
3) Tomcat 같은 웹 서버를 내장해서 별도의 웹 서버를 설치할 필요 X
4) 손쉬운 빌드 구성을 위한 starter 종속성 제공
5) 스프링과 3rd parth(외부) 라이브러리 자동 구성
6) 메트릭, 상태확인, 외부 구성 같은 프로덕션 준비 기능 제공
7) 관례에 의한 간결한 설정
이 둘은 다른게 아니라, 스프링 프레임워크를 기반으로 편리하게 사용 가능한 Spring Boot가 나옴
- Spring Data : 관계형 DB를 편리하게 사용하기 위해 많이 사용
- Spring Session : 세션 기능을 편리하게 사용할 수 있게 도와줌
- Spring Security : 보안 기능
- Spring Rest Docs : API 문서를 편리하게 사용할 수 있게 해줌
- Spring Batch : 배치처리에 특화
- Spring Cloud : 클라우드 기술에 특화
- 스프링은 자바 언어 기반의 프레임워크
- 자바 언어의 가장 큰 특징이 객체 지향 언어인데, 스프링은 객체 지향 언어가 가진 강력한 특징을 살려내는 프레임워크이다.
- 즉, 스프링은 좋은 객체 지향 애플리케이션을 개발할 수 있게 도와주는 프레임워크 이다.
1) 레고 조립하듯, 키보드, 마우스, 컴퓨터 부품을 갈아 끼우듯 컴포넌트를 쉽고 유연하게 변경하며 개발할 수 있는 방법
2) 다형성이 가장 중요하고, 스프링은 다형성을 극대화해서 이용할 수 있게 도와준다.
3) 스프링에서 이야기하는 IOC, DI은 다형성을 활용해서 역할과 구현을 편리하게 다룰 수 있다.
다형성이란,
- 다형성은 interface를 통해 다양한 기능을 구현할 수 있다는 의미로, 역할과 구현으로 설명할 수 있다.
- 객체를 설계할 때 역할(인터페이스)과 구현(인터페이스를 구현한 클래스, 구현 객체)을 명확히 분리하고, 객체 설계시 역할(인터페이스)을 먼저 부여하고, 그 역할을 수행하는 구현 객체를 만든다.
즉, 인터페이스 먼저 구현한다가 point!
- 예로 인터페이스를 구현한 객체를 실행 시점에 유연하게 변경할 수 있는 자바의 오버라이딩된 메소드가 있다.
물론, 클래스의 상속 관계에서도 다형성과 오버라이딩이 적용 가능하다.
- 인터페이스를 구현한 객체 인스턴스를 실행 시점에 유연하게 변경할 수 있다.
- 다형성의 본질을 이해하려면 협력이라는 객체사이의 관계에서 시작해야한다.
- 클라이언트를 변경하지 않고, 서버의 구현 기능을 유연하게 변경할 수 있다.
정의
- 실세계의 역할과 구현이라는 편리한 컨셉을 다형성을 통해 객체 세상으로 가져올 수 있다.
- 유연하고 변경이 용이하며 확장 가능한 설계
- 클라이언트에 영향을 주지않는 변경 가능
- 인터페이스를 안정적으로 잘 설계하는 것이 중요!
한계
- 역할(인터페이스) 자체가 변하면, 클라이언트, 서버 모두에 큰 변경 발생
- 자동차를 비행기로 변경해야 한다면?
- 대본 자체가 변경된다면? USB 인터페이스가 변경된다면?
- 인터페이스를 안정적으로 잘 설계하는 것이 중요