본 글은 inflearn의 김영한님의 강좌를 ref합니다
- Java 진영에서 표준으로 사용하는 기술 인 EJB(J2EE)를 사용
- 이론적으로 괜찮았지만 실제 사용 비용이 비싸며 사용하기가 매우 복잡 --> 추후 Spring 등장의 원인
EJB Entity Bean
(EJB에서 사용하던 ORM방식의 기술)
: 수준이 낮은 편이였기 때문에 추후Hibernate
가 개발됨
이러한Hibernate
개발자를 데려와서 Java표준으로 만든 것이JPA
이다!
(JPA는 표준 인터페이스 일 뿐 구현체들이 필요함)
- Spring의 등장
- 전통적인 J2EE(EJB)라는 겨울을 넘어 새로운 시작이라는 뜻으로 Spring이름을 가짐
2003년 Spring Framework 1.0
등장2009년 최초로 자바 코드로 Spring 설정
이 가능해짐2014년 Spring Boot 1.0 출시!
(설정간편 / 서버내장)
필수
- 스프링 프레임워크
- 핵심 기술 : 스프링 DI 컨테이너 / AOP / 이벤트 등
- 웹기술 : 스프링 MVC / 스프링 WebFlux
- 데이터 접근 기술 : 트랜잭션 / JDBC / ORM 등
- 기술 통합 : 캐시 / 이메일 / 스케줄링 등
- 테스트 : 스프링 기반 테스트 지원
- 언어 : 코틀린 / 그루비
- 스프링 부트
- 스프링을 편리하게 사용할 수 있도록 지원하는 기술
- 최근에는 아예 스프링 부트 개발이 기본이 되었음
- 단독으로 실행할 수 있는 Spring App을 쉽게 생성
(내장 톰켓 사용 등)- 손쉬운 빌드 구성을 위한 starter 종속성 제공
- 스프링 / third parth(써드파티) 라이브러리 자동 구성
- 메트릭 / 상태 확인 같은 프로덕션 준비 기능 제공
- 관례에 의한 간결한 설정!!
선택
- 스프링 데이터
: 어떤 DB든 기본적인 CRUD를 편리하게 사용할 수 있게 해줌- 스프링 세션 : 세션 기능을 편리하게 사용할 수 있게 해줌
- 스프링 시큐리티 : 보안 관련
- 스프링 배치 : 배치 처리에 특화된 기술
- 기술 스택을 바라보는 좋은 2가지 관점
- 이 기술을 왜 만들었는가?
- 이 기술의 핵심 컨셉은?
Spring은 왜 만들었는가?
- EJB는 EJB에 너무 의존적이고 종속적인 개발을 해야했다
--> Java의 객체지향 특징을 살리지 못함POJO(Plain Old Java Object)
처럼 프레임워크에 종속된 방식을 탈출하자는 단어가 나온 것도 이해가 된다- 이러한 이유로 Spring이 등장
Spring의 핵심 컨셉?
- 좋은 객체 지향 애플리케이션을 개발할 수 있게 도와주는 프레임워크
- Java 언어 기반의 프레임워크 --> Java는 객체 지향 언어
- Spring은 이러한
Java의 객체 지향 언어의 장점
을 살리는프레임워크
객체지향 프로그래밍 ?
- 컴퓨터 프로그램을 명령어의 목록으로 보는 시각에서 벗어나 독립된 단위인 '객체'들의 모임으로 파악하는 방식의 프로그래밍
- 프로그램을 유연하고 변경이 용이하게 만들기 때문에 대규모 소프트웨어 개발에 많이 사용
유연 하고 용이 ? (다형성!)
- 컴포넌트를 쉽고 유연하게 변경하면서 개발할 수 있는 방법
- 레고 블럭 조립하듯
- 컴퓨터 부품 갈아 끼우듯
- 즉, 다형성(Polymorphism)이 핵심
다형성 (Polymorphism)
[ 핵심 ]
- 역할과 구현으로 세상을 구분하면 유연해지며 변경도 편리해짐
( 역할 - 인터페이스 / 구현 - 인터페이스를 구현한 구현 객체 )- 클라이언트를 변경하지 않고, 서버의 구현 기능을 유연하게 변경
[ 비유 ]
- 운전자(Client)
- 자동차 역할(interface)
- K3 / 아반떼 / 테슬라 - (구현체)
- 자동차가 바뀐다고 운전자가 새로운 면허를 딸 필요가 없음
--> 자동차라는 추상체를 기반으로 모두 만들어졌기 때문[ 다형성의 장점 ]
- 클라이언트는 대상의 역할(인터페이스)만 알면 된다
- 클라이언트는 구현 대상 내부 구조를 몰라도 된다
- 클라이언트는 구현 대상의 내부 구조가 변경되어도 영향 X
Java언어의 다형성
오버라이딩(over ridding)
: 부모를 상속받아 메서드를 재정의 해서 사용하는 것- 오버라이딩을 통해 하나의 부모 아래에 다양한 구현체를 만들 수 있음
- 다양한 구현체들을 실행시점에 유연하게 변경할 수 있다
(Service에서 Repository를 사용할 때 생성을 변경!)
(나중에@Autowired
사용하면 해당 코드가 불필요해진다)
정리
- 실세계이 역할과 구현의 컨셉을 다형성을 통해 객체 세상으로 가져올 수 있음
- 유연하고 변경이 용이
- 확장 가능한 설계
--> 클라이언트에 영향을 주지 않는 변경 가능- 인터페이스를 안정적으로 잘 설계하는 것이 매우 중요
스프링과 객체 지향
- 다형성이 가장 중요하다 !
- Spring은 다형성을 극대화해서 이용할 수 있게 도와준다 !
- 제어의 역전(IoC) / 의존성 주입(DI) 등등은 결국 다형성을 활용해서 역할과 구현을 편리하게 다룰 수 있도록 지원하는 것!