스프링, JPA의 탄생

스프링, JPA의 탄생

EJB : 자바빈즈(Enterprise JavaBeans)

EJB란 엔터프라이즈 자바빈즈(Enterprise JavaBeans; EJB)는 기업환경의 시스템을 구현하기 위한 서버측 컴포넌트 모델이다. 즉, EJB는 애플리케이션의 업무 로직을 가지고 있는 서버 애플리케이션이다. EJB 사양은 Java EE의 자바 API 중 하나로, 주로 웹 시스템에서 JSP는 화면 로직을 처리하고, EJB는 업무 로직을 처리하는 역할을 한다.

  • 스프링이 생기기전 개발자들은 엔터프라이즈 자바빈즈(Enterprise JavaBeans; EJB)라는 서버 앱으로 개발을 했는데 아래와같은 단점이 있었다.
  • EJB 단점
    • 객체지향적이지 않음
    • 복잡한 프로그래밍 모델
    • 특정 환경, 기술에 종속적인 코드
    • 컨테이너에 안에서만 동작할 수 있는 객체구조
    • 자동화된 테스트가 매우 어렵거나 불가능
    • 부족한 개발생산성, 이동성(portablity)
    • 또 EJB가 제공하는 ORM 엔티티는 기술력이 매우 낮았다고한다
    위같은 이유로 불만이 많은 개발자들이 불편해하고 불만이있었는데 그 중 두명의 개발자가 오픈소스를 만든다.
  • 두 명의 개발자

1. 로드 존슨

로드존슨

  • 로드 존슨(스프링 창시자)
    • 2002년로드존슨책출간•EJB의문제점지적
    • EJB없이도충분히고품질의확장가능한애플리케이션을개발할수있음을보여주고, 30,000라인이상의기반기술을예제코드로선보임
    • 여기에지금의스프링핵심개념과기반코드가들어가있음•BeanFactory, ApplicationContext, POJO, 제어의역전, 의존관계주입
    • 책이유명해지고, 개발자들이책의예제코드를프로젝트에사용

2. 게빈 킹(하이버 네이트 창시자)

하이버네이트

하이버네이트

  • EJB 엔티티빈 기술을 대체
  • JPA(Java Persistence API)새로운 표준 정의



정리

  1. EJB에 불만을 갖던 개발자 두 명이 오픈소스 개발
  2. 그 중 한명의 개발자 "로드 존슨" ->스프링 탄생
  3. 그 중 한명의 개발자 "케빈 킹" EJB ORM 엔티티에 불만 갖음 -> 하이버네이트 개발 ->JPA 탄생






스프링 이란

스프링이란1

스프링이란

  • 자바언어의 오픈소스 애플리케이션 프레임워크로서, 동적인 웹 사이트와 자바언어의 특성인 객체지향적인 프로그래밍을 하기위해 위 사진처럼 여러가지 서비스를 제공하는 것을 스프링또는 스프링 프레임워크라고 한다.

스프링 프레임워크

  • 핵심기술: 스프링 DI 컨테이너, AOP, 이벤트, 기타
  • 웹기술: 스프링 MVC, 스프링 WebFlux
  • 데이터접근기술:트랜잭션, JDBC, ORM 지원, XML 지원
  • 기술통합: 캐시, 이메일, 원격접근, 스케줄링
  • 테스트:스프링기반테스트지원
  • 언어:코틀린, 그루비
  • 최근에는스프링부트를통해서스프링프레임워크의기술들을편리하게사용

스프링 부트

  • 스프링을 편리하게 사용할 수 있도록 지원, 최근에는 기본으로 사용
  • 단독으로 실행할 수 있는 스프링 애플리케이션을 쉽게 생성
  • Tomcat 같은 웹 서버를 내장해서 별도의 웹 서버를 설치하지 않아도 됨
  • 손쉬운 빌드 구성을 위한 starter 종속성 제공
  • 스프링과 3rd parth(외부) 라이브러리 자동 구성
  • 메트릭, 상태 확인, 외부 구성 같은 프로덕션 준비 기능 제공
  • 관례에 의한 간결한 설정



스프링 핵심 컨셉

= 좋은 객체 지향 프로그래밍

  • 스프링은
    자바의 장점이자 가장 강력한 특징인 "좋은객체지향"적으로 애플리케이션을 개발을 도와주기 위해 만들어진 프로그램이다.

좋은 객체 지향 프로그래밍 이란?

좋은 객체 지향을 알아보기 앞서 객체지향 특징으로

  • 추상화
  • 캡슐화
  • 상속
  • 다형성

    이 있다.

그리고 객체지향 4가지 특징 중 행심은 다형성 이다.

그리고 다형성을 실세계로 비유할때
역할구현으로 세상을 구분한다.
그 예로 운전자(역할)와 자동차(역할)을 보자.

운전자-자동차



운전자의 역할은 자동차를 운전하는것 이다.

그리고 자동차의 역할은 운전자가 운전을 하고 갈 수 있는 역할이 있다.

그리고 자동차를 k3,아반테,테슬라 중 자동차의 모델의 종류에 상관없이 운전자는 운전을 할 수 있다.



이게 가능한 이유는 자동차를 역할 , 구현으로 구혔했기떄문이다.

자동차는 여러가지 종류의 자동차를 가르키는 추상적인 개념이고 "k3,아반테,테슬라"도 자동차의 한 종류 중 하나이기 때문에 또는 자동차의 카테고리 안에 다 들어갈 수 있기때문이다.



중간정리

  • 객체지향의 특진인 다형성으로 클라이언트를 변경하지 않고, 서버의 구현 기능을 유연하게 변경할 수 있따.
  • 역할과 구현을 분리 함으로써
    유연하고, 변경이 용이(어떤차를 운전해도 운전자는 바뀌지 않아도 됌)
  • 확장가능한 설계
  • 인터페이스를 안정적으로 잘 설계하는 것이 중요

스프링과 객체지향

  • 다형성이 가장 중요하다!
  • 스프링은 다형성을 극대화해서 이용할 수 있게 도와준다.
  • 스프링의 기능 제어의 역전(IoC),의존관계 주입(DI)은 다형성을 활용해서 역할과 구현을 편리하게 다룰 수 있도록 지원한다.
  • 스프링을 사용하면 마치 레고 블럭 조립하듯이 구현을 편리하게 변경할 수 있다.



좋은객체지향설계의 5가지원칙(SOLID)

 

SRP: 단일 책임 원칙(single responsibility principle)문제점

 

  • 한클래스는하나의책임만가져야한다.

 

OCP 개방-폐쇄원칙Open/closed principle

  • 소프트웨어요소는확장에는열려있으나변경에는닫혀있어야한다OCP 문제점
  • MemberService 클라이언트가구현클래스를직접선택 MemberRepository m = new MemoryMemberRepository(); //기존코드 MemberRepository m = new JdbcMemberRepository(); //변경코드
  • 구현객체를변경하려면클라이언트코드를변경해야한다.
  • 분명다형성을사용했지만 OCP 원칙을지킬수없다.

LSP: 리스코프 치환 원칙 (Liskov substitution principle)

  • 프로그램의객체는프로그램의정확성을깨뜨리지않으면서하위타입의인스턴스로바꿀수있어야한다

ISP: 인터페이스 분리 원칙 (Interface segregation principle)

  • 특정클라이언트를위한인터페이스여러개가범용인터페이스하나보다낫다자동차인터페이스 -> 운전인터페이스, 정비인터페이스로분리

    사용자클라이언트 -> 운전자클라이언트, 정비사클라이언트로분리

DIP: 의존관계 역전 원칙 (Dependency inversion principle) 중요 원칙

  • 구현클래스에의존하지말고, 인터페이스에의존
    그런데 OCP에서설명한 MemberService는인터페이스에의존하지만, 구현클래스도동시에의존한다.

    •MemberService 클라이언트가구현클래스를직접선택

    •MemberRepository m = new MemoryMemberRepository();•DIP 위반

정리

  • 객체 지향의 핵심은 다향성
  • 다향성 만으로는 OCP,DIP를 지킬수 없다.
  • 뭔가 더 필요하다. ->스프링의 DI컨테이너를 활용한다.



참고자료

스프링핵심 기본(인프런 김영한)

https://woongsin94.tistory.com/357

https://ko.wikipedia.org/wiki/%EC%97%94%ED%84%B0%ED%94%84%EB%9D%BC%EC%9D%B4%EC%A6%88_%EC%9E%90%EB%B0%94%EB%B9%88%EC%A6%88