본문 바로가기
Framework/Spring

Spring framework 는 무엇인가

by I move forward every day. 2022. 5. 17.

출처 : https://spring.io/

Spring framework 란?


Spring framework란 자바 플랫폼을 위한 오픈 소스 애플리케이션 프레임워크이며 엔터프라이즈급 애플리케이션을 개발하기 위한 기능을 종합적으로 제공하는 솔루션이다. 간단히 Spring이라고도 한다.

엔터프라이즈급(Enterpris) 애플리케이션 이란?
대규모 조직에서 강력하고 확장 가능하도록 설계된 응용 프로그램을 나타내는 말입니다. 즉, 대규모 데이터 처리와 트랜잭션이 동시에 여러 사용자로 부터 행해지는 매우 큰 규모의 환경을 엔터프라이즈급 환경이라 한다.

 

Spring framework의 특징들


1. 생명주기 관리

스프링 프레임워크는 경량컨테이너로 Java 객체를 직접 담고 관리한다. 객체의 생성, 소멸을 직접 관리하여 언제든 Spring 컨테이너로 부터 필요한 객체만 사용할 수 있다.

 

2. 제어 역전(Inversion of Control, IoC)

Ioc란 "제어의 역전"이라는 의미로, 메소드나 객체의 호출작업을 개발자가 결정하는 것이 아니라, 외부에서 결정되는 것을 의미한다. 기존의 프로그래밍에서는 개발자가 작성한 프로그램이 외부 라이브러리의 코드를 호출했으나, 제어 역전은 이와 반대로 외부 라이브러리 코드가 개발자의 코드를 호출하게된다. 즉, 제어권이 프레임워크에게 있어 필요에 따라 스프링 프레임워크가 사용자의 코드를 호출한다.

 

스프링에서 객체가 만들어지고 실행되는 순서
1. 객체 생성
2. 의존성 객체 주입 (스스로가 만드는것이 아닌 제어권을 스프링에게 위임하여 스프링이 만들어놓은 객체를 주입한다.)
3.의존성 객체 메소드 호출
스프링은 스프링이 실행될때에 모든 의존성 객체를 다 만들어주고 필요한 곳에 주입시켜줌으로써 Bean들은 싱글턴 패턴의 특징을 가지며, 제어의 흐름을 사용자가 아닌 스프링에게 맡겨 작업을 처리한다.
스프링 빈(Spring Bean)이란?
스프링 IoC 컨테이너에 의해서 생성되고 관리되는 객체이다. 애플리케이션의 핵심을 이루는 객체들을 스프링 빈(Beans)이라고 한다. 빈은 스프링 컨테이너에 의해서 인스턴스화 되어 조립되고 관리됩니다. 스프링 컨테이너가 관리해준다는 점을 제외하면 자바 객체이다. 현재는 Annotaion 기반으로 Bean으로 등록한다.
Annotaion 사용 예 : @Bean, @Controller, @Service

싱글톤 패턴(Singleton patten)이란?
클래스의 인스턴스가 딱 1개만 생성되는 것을 보장하는 디자인 패턴이다. 최초에 스프링이 한번 기동될때에 New로 인스턴스를 생성해두거나 최초로 필요해질때에 만들어두고 서버가 내려가기 전까지는 계속 유지하여 반복 재활용을 하여 사용한다.
(클라이언트들이 스프링 빈을 요구할 때 같은 참조값을 가진 빈 객체를 반환해준다.)

singleTone 패턴에 관한 이미지
출처 :  https://cantcoding.tistory.com/47

IoC 컨테이너란?

왜 컨테이너 일까?
굉장히 많은 화물을 담아 보내주는 화물 컨테이너 처럼 스프링에 컨테이너도 여러 빈과 기능들을 담고있다 하여 컨테이너 라고 부른다.

컨테이너의 개념
컨테이너는 보통 객체의 생명주기를 관리, 생성된 인스턴스들에게 추가적인 기능을 제공하도록 하는 것. 즉, IoC 컨테이너란 스프링 프레임워크에서객체를 생성하고, 관리하고, 책임지고, 의존성을 관리해주는 컨테이너다.

어떻게 동작을 하는걸까?

SpringApplicationContext것이 컨테이너 안에서 계속 동작을 하고있고 우리가 만든 클래스들을 Bean으로 등록하겠다는 설정을 해주면 컨테이너 안에 Bean으로 등록해주는 일을 해준다.

Bean으로 등록하는 의미는 무엇일까?
Bean으로 등록하는 의미는 우리가 만든 클래스를 실제 인스턴스화 한다는 것이다. 근데 이 클래스들을 그냥 쓰는것이 아니라 SpringApplicationContext가 가지고있는 온갖 설정 값들을 클래스에 입혀준다.


인스턴스의 생성부터 소멸까지 인스턴스 생명주기를 개발자가 아닌 컨테이너가 대신해준다. 그렇기에 객체관리의 주체가 프레임워크(Container)가 되기 때문에 개발자는 로직에 집중할 수 있는 큰 장점이 있다.

 

3. 의존성 주입(Dependency Injection, DI)

DI는 "의존성 주입"이라는 의미로 프로그래밍에서 구성요소 간의 의존 관계가 소스코드 내부가 아닌 외부에서 설정을 통해 정의되는 방식이다. 즉, 객체를 직접 생성하는게 아닌 외부에서 생성한 후 주입 시켜주는 방식이다. DI의 장점은 DI를 통해서 모듈간의 결합도를 낮춰 유연성이 높아지고 코드 재사용률을 높여 소스코드를 다양한 곳에 사용할 수 있다.

 

의존성 주입에 관한 이미지1
출처 : https://velog.io/@gillog/Spring-DIDependency-Injection

첫번째 방법은 A객체가 B와 C객체를 new생성자를 통해 직접 생성하는 방법이고, 두번째 방법은 외부에서 생성된 객체를 setter()또는 생성자를 통해 사용하는 방법이다. 두번째 방식이 의존성 주입의 예시이다. 즉, A객체에서 직접 생성하는 것이 아닌외부(IoC컨테이너)에서 생성된 B,C객체를 조립(주입)시켜 setter() 또는 생성자를 통해 사용하는 방식이다.

의존성 주입에 관한 이미지2
출처 : https://velog.io/@gillog/Spring-DIDependency-Injection

각 클래스간의 의존관계를 빈 설정(Bean Definition)정보를 바탕으로 컨테이너가 자동으로 연결해준다. 위의 이미지에 IOC컨테이너 안에 생성된 객체들을 Bean이라고 하는 것이다. 

 

4. AOP(Aspect Oriented Programming)

AOP는 관점 지향 프로그래밍이라고 불린다. 관점 지향은 쉽게 말해 어떤 로직을 기준으로 핵심적인 관점, 부가적인 관점으로 나누어서 보고 그 관점을 기준으로 각각 모듈화하겠다는 것이다. 여기서 모듈화란 어떤 공통된 로직이나 기능을 하나의 단위로 묶는 것을 말한다. 대표적인 예로는 트랜잭션 관리 기능이 있다. 출처 : 스프링 AOP

  • 장점 : 특정 타이밍, 시점에 어떠한 기능을 넣어주고 싶을때에 AOP를 사용하면 기존 로직을 건드리지 않고 코드에 녹여내기 좋다. 공통적이지만 특정 몇몇 공통적인곳에 쓰는 기법이라고 보면 된다. 
  • 단점 : 실무에서 AOP를 사용하면 코드 분석에 어려워지는 부분이 있어 꼭 사용이 필요한 곳에만 사용하는 것이 좋다고 한다.

AOP의 기본 개념들

  • Aspect
    • 여러 클래스나 기능에 걸쳐서 있는 관심사, 그리고 그것들을 모듈화함 AOP중에서 가장 많이 활용되는 부분은 @Transactional(트랜잭션 관리)기능. 
  • Advice
    • 조언, AOP에서 실제로 적용하는 기능(로깅,트랜잭션,인증 등)을 뜻함
  • Join point
    • 모듈화된 특정 기능이 실행될 수 있는 연결 포인트. 모든 흐름에 AOP를 심을수 없기에 특정 심을수 있는 포인트를 조인 포인트라고 칭함(Aspect를 심을 수 있는 포인트)
  • Pointcut
    • Join point 중에서 해당 Aspect를 적용할 대상을 뽑을 조건식. 심어지는 포인트들을 계속해서 발생한다면 번거로워지기 때문에 특정 조건식을 사용하여 Aspect를 심어줄 위치를 지정해준다.
  • Target Object
    • Advice가 적용될 대상 오브젝트
  • AOP Proxy
    • 대상 오브젝트에 Aspect를 적용하는 경우 Advice를 덧붙이기 위해 하는 작업을 AOP Proxy라고 한다. 주로 CGLIB(실행 중에 실시간으로 코드를 생성하는 라이브러리) 프록시를 사용하여 프록싱 처리를 한다. 
  • Weaving
    • Advice를 비즈니스 로직 코드에 삽입하는 것을 말함

 

5. 포조(Plain Old Java Object, POJO)

스프링 프레임워크는 POJO방식의 프레임워크이다. 포조란 Plain Old Java Object란 말 그대로 평범한 자바 오브젝트를 뜻하며, 일반적으로 우리가 알고 있는 getter, setter 같이 기본적인 기능만 가진 자바 객체를 말한다.

public class User{
	private int id;
    private String name;
    private String phonNum;
    private Date birthDay;
    
    public int getId(){
    	return id;
    }
    public String getName(){
    	return name;
    }
    public String getEmail(){
    	return email;
    }
    public Date getBirthDay(){
    	return birthDay;
    }
    
    public void setId(int id){
    	this.id = id;
    }
    public void setName(String name){
    	this.name = name;
    }
    public void setEmail(String email){
    	this.email = email;
    }
    public void setBirthDay(Date birthDay){
    	this.birthDay = birthDay;
    }
 }

 

EJB 란?
이전에 자바를 이용해 비즈니스 서비스를 개발할 때 비즈니스 로직 뿐만 아니라 트랜잭션,보안 등 로우레벨의 로직까지 작성해야하는 부담감이 있었다. 그래서 부담감을 없애고자 재사용이 가능한 로직을 개발하기 위해 EJB(Enterprise Java Beans)가 탄생했다.

EJB의 문제점

그러나 EJB는 한 두가지의 기능을 사용하기 위해 EJB를 상속받거나 implements하게 되어 가벼운 서비스 조차도 무겁게 만들어 졌고, 다른 기능으로 대체하기 위해서는 전체 코드를 수정해야 하는 문제점이 있었다.

해결방안과 POJO를 기반으로 둔 이유
Java의 기본 개념인 객체지향에 집중하고, 특정 클래스나 라이브러리에 종속되지 않는 POJO구성으로 코드를 작성한다면 이런 문제점을 해결할 수 있을 것이라고 생각하여 SpringFramework는 POJO를 기반으로 두었다.

단순 오브젝트는 의존성이 없고 추후 테스트 및 유지보수가 편리하여 유연성의 장점을 가진다.

 

 

마무리


SpringFramework에 기본 개념들을 간단하게 정리해봤다. 잘못 이해하거나 설명한 개념이 있다면 언제든지 말씀 해주시면 감사하겠습니다.

 

참고했던 블로그들과 강의

한 번에 끝내는 Spirng 완전판 초격차 패키지

SpringFramework란? 기본 개념 핵심 정리

Spring의 기본 특징 POJO

나무위키 Spring

Spring DI, IoC 정리

 

'Framework > Spring' 카테고리의 다른 글

Spring framework MVC 패턴 알아보기  (0) 2022.05.22
Maven의 설정파일 Pom.xml을 알아보자  (0) 2022.05.15