이진숲 스터디 발표 자료
1. 스프링 프레임워크란?
2. 스프링 프레임워크의 주요 특징
자바 엔터프라이즈 개발을 편하게 해주는 오픈소스 경량급 애플리케이션 프레임워크
스프링 프레임워크을 줄여서 스프링이라고도 많이 부른다.
위 정의는 무슨 뜻일까?? 네 부분으로 나누어서 하나씩 살펴보자.
스프링이 있기 이전에 자바로 엔터프라이즈 애플리케이션을 개발하는 가장 일반적인 방법은 EJB를 사용하는 것이었다.
위와 같은 목표를 가지고 처음 등장을 했지만, 기대와 달리 무겁고, 복잡, 불편한 점이 많았다.
스프링은 이 잘못 돌아가는 상황에 대한 대안을 찾다가 등장
스프링 프레임워크가 제공하는 기술이 아니라 자신이 작성하는 애플리케이션의 로직에 더 많은 관심과 시간을 쏟게 해준다.
초기에 스프링의 기본 설정과 적용 기술만 잘 선택하고 준비해두면, 이후로 애플리케이션 개발 중에는 스프링과 관련된 코드나 API에 대해 개발자가 거의 신경쓸 일이 없다.
오픈소스: 소스가 모두에게 공개되고, 특별한 라이선스를 취득할 필요없이 얼마든지 가져다 자유롭게 이용해도 된다.
Spring의 저장소: https://github.com/spring-projects/spring-framework
Spring: Apache License 2.0을 따른다.
Apache Server : 'open source' 라이선스에 따라 배포되어 마음대로 쓸 수 있는 Http 웹 서버
작은 규모의 코드로 이루어졌다라는 뜻이 아님
웹 컨테이너나 가볍고 단순한 환경에서도, 복잡한 EJB와 고가의 WAS를 갖춰야만 가능했던 엔터프라이즈 개발의 고급 기술을 대부분 사용할 수 있다.
따라서 만들어진 코드가 지원하는 기술수준은 비슷하더라도 훨씬 빠르고 간편하게 작성하게 해줌으로써 생산성과 품질 면에서 유리하다.
프레임워크: 소프트웨어의 구체적인 부분에 해당하는 설계와 구현을 재사용이 가능하게끔 일련의 협업화된 형태로 클래스들을 제공하는 것(Ralph Johnson) = 기본적으로 구성하는 뼈대
- 경량 컨테이너로서 자바 객체를 직접 관리한다.
- Plain Old Java Object(POJO) 기반의 프레임워크이다.
- 제어 반전(IoC : Inversion of Control)을 지원한다.
- 의존성 주입(DI : Dependency Injection)을 지원한다.
- 관점 지향 프로그래밍(AOP : Aspect-Oriented Programming)을 지원한다.
- 영속성과 관련된 다양한 서비스를 지원한다.
- 확장성이 높다.
스프링 프레임워크는 개발자를 대신해서 스프링의 빈을 생성하고 관리하는 컨테이너를 가지고 있고, 이를 스프링 컨테이너라고 부른다. 컨테이너가 대신 빈을 관리(Inversion of Control, 제어의 역전)해주기 때문에 개발자는 모듈 간의 의존과 결합으로 인해 발생하는 문제로부터 자유로워졌다.
스프링이 처음 뜰 때 스프링 컨테이너라는 통이 생기는데 컨테이너에 ComponentScan을 통해 @Component
가 붙은 클래스들의 객체인 스프링 빈을 생성하여 컨테이너에 넣어두고 관리한다.
BeanFacory
: 스프링 컨테이너의 최상위 인터페이스, 스프링 빈을 관리, 조회하는 역할ApplicationContex
: BeanFactory의 모든 기능을 상속받고, 편리한 부가 기능들도 함께 제공new
키워드로 생성한 객체는 빈이 아니다ApplicationContext.getBean()
으로 가져올 수 있다.애플리케이션을 작성할 때 의존성 주입을 받아 의존 객체로 사용하고 싶은 경우에는 객체를 bean으로 만들어주어야 한다.
Component Scan과 자동 의존관계 설정
@Component
가 있으면 스프링 빈으로 자동 등록@Controller
, @Service
, @Repository
는 모두 @Component
를 포함Configuration에서 @Bean
을 통해 직접 스프링 빈 등록하기
또다시 EJB 두둥등장
마틴 파울러는 널리 사용된 복잡하고 무거운 EJB(Enterprise Java Beans)보다는 단순한 자바 객체에 도메인 로직을 넣어서 사용하는 것이 훨씬 편리하고 많은 장점이 있는데 왜 사람들이 EJB가 아닌 평범한 자바 오브젝트
를 사용하기를 꺼려하는지에 의문을 가졌다.
이 의문에 대한 답으로 단순한 오브젝트는 EJB와 같은 그럴듯한 이름이 없어서 사람들이 그 사용을 주저하는 것이라고 결론을 내렸고, plain old java object(POJO)라는 용어를 만들었다.
Bean class
Spring을 이용하면 POJO 프로그램의 장점을 살려서 깔끔하고 간결하게 코드를 작성 가능하다.
컨테이너가 개발자를 대신하여 메서드가 호출될 때와 메서드가 필요한 자원을 전달하는 설계 구조
제어의 흐름을 바꿈으로써 객체의 의존성을 역전시켜 객체 간의 결합도를 줄이고 유연한 코드를 작성할 수 있게 해서 가독성이나 코드 중복, 유지 보수를 편하게 할 수 있게 한다.
스프링이 다른 프레임워크와 차별화되어 제공하는 의존 관계 주입 기능이다.
객체를 직접 생성해서 객체 의존관계를 주는 것이 아닌, 외부에서(스프링이) 생성해서 주입시켜주는 방식
IOC는 메서드가 필요로 하는 자원을 코드가 실행될 때 전달한다.
모듈 간의 결합도가 낮아지고 유연성이 높아진다.
new
를 통해 각자 직접 객체를 생성했기 때문에 두 memberRepository
는 다른 인스턴스MemberRepository
를 스프링 빈으로 등록하면 기본으로 싱글톤으로 등록되기 때문에, 각 Service에서 레포지토리를 주입받는다면 같은 인스턴스를 사용한다.Field injection is not recommended
경고 문구@Autowired
는 생략 가능aspect
라는 특별한 객체로 모듈화핵심 비즈니스 로직과 관련이 없고, 여러 곳에서 공통적으로 쓰이는 기능들을 공통 관심사로 분리하여 개발하고, 실행 시에 서로 조합할 수 있다.
애플리케이션 로직을 담당하는 코드에 남아있는 기술 관련 코드를 분리해서 별도의 모듈로 관리하게 해주는 강력한 기술
코드를 단순하고 깔끔하게 작성할 수 있다.
AAAA
, BBBB
가 여기저기서 사용된다AAAA
, BBBB
@LogExecutionTime
이라는 annotation을 만들어서 적용a()
, b()
, c()
는 자신이 해야할 작업인 핵심 로직 aaaa
, bbbb
, cccc
만을 가지게 된다.서비스 추상화: 추상화 계층을 사용하여 어떤 기술을 내부에 숨기고 개발자에게 편의성을 제공해준다.
예시
@Transactional
을 선언하는 것만으로도 내부적으로 트랜잭션 코드가 추상화되어서 숨겨져 있기 때문에 별도의 코드 추가 없이 트랜잭션 서비스를 이용 가능하다.
스프링은 완성도가 높은 라이브러리와 연결할 수 있는 인터페이스를 제공하고, 다른 프레임워크들과의 통합을 지원한다.