[Java] Spring이란?

etc-image-0

Spring이란?

Spring은 자바 엔터프라이즈 개발을 위한 오픈소스 애플리케이션 프레임워크입니다.

Java 객체의 생성부터 소멸까지의 라이프사이클을 Spring이 직접 관리합니다.

프레임워크?

프레임워크 VS 라이브러리

etc-image-1
프레임워크, 라이브러리의 관계

프레임워크

  • 소프트웨어를 만드는데 기본이 되는 일련의 클래스 묶음이나 뼈대, 틀, 골격이 제공되는 것을 의미
  • 개발자는 프레임워크라는 틀 안에서 소프트웨어 개발을 수월하게 할 수 있음.

라이브러리

  • 개발자가 만든 클래스들의 나열로, 다른 프로그램들에서 사용할 수 있도록 제공하는 방식
  • 개발자가 소프트웨어를 만들 때 필요에 따라 원하는 기능을 구현하기 위해 가져다 쓸 수 있는 도구 역할

결론적으로 프레임워크와 라이브러리의 차이는 어플리케이션의 Flow(흐름)을 누가 쥐고 있느냐에 따라서 나뉘게 되는 것입니다. 프레임워크는 스스로 제어 흐름의 주도성을 갖고 있는 반면에 라이브러리는 개발자가 가지고 있습니다.

Spring의 Concept

1. 제어의 역전과 의존성 주입 (IoC & DI)

제어의 역전(IoC)이란?

public class A {
	b = new B();
}

Spring 이전 Java 코드를 작성해 객체를 생성할 때는 위와 같이 객체가 필요한 곳에 직접 객체를 생성했습니다. 이 경우 객체 간의 결합으로 인해 코드의 유연성과 확장성이 떨어지고, 객체 생성 방식이 고정되므로 변경이 필요할 때마다 해당 코드를 수정해야 하는 번거로움이 발생합니다.

이러한 번거로움을 해결하기 위해 제어의 역전(Inversion of Control)이라는 개념이 등장했습니다. 제어의 역전은 다른 객체를 직접 생성하거나 제어하는 것이 아니라 외부에서 관리하는 객체를 가져와 사용하는 방식을 의미합니다.

public class A {
	private B b;
    
    public A(B b) {
        this.b = b;
    }
}

제어의 역전을 적용하면 B 객체는 외부에서 주입되어 A 클래스가 직접 객체를 생성하지 않아도 됩니다.

Spring에서는 IoC를 통해 객체 생성 및 관리를 외부로부터 받아와 사용하도록 변경하여 코드의 구조가 보다 유연하고 확장 가능하게 합니다.

 

의존성 주입(DI)이란

앞서 이야기한 것 처럼 스프링에서는 객체들을 관리하기 위해 제어의 역전을 사용한다고 했는데, IoC를 구현하는 방식으로, 필요한 객체를 외부에서 주입받는 것을 의존성 주입(DI)이라고 합니다.

public class A {
	@Autowired
	private B b;
}

위의 코드를 보시면 @Autowired 어노테이션을 통해 Spring Container에서 B 객체(Bean)를 주입받습니다.

  • @Autowired라는 어노테이션은 스프링 컨테이너에 있는 빈이라는 것을 주입하는 역할을 합니다.
  • Bean은 쉽게 말해서 스프링 컨테이너에서 관리하는 객체를 뜻합니다.

13212321.png
https://wikidocs.net/237050

이전에는 클래스 A가 B 객체를 직접 생성했지만, Spring의 경우에는 클래스 A가 B 객체를 사용하고 싶은 경우 Spring Container로 부터 객체를 주입받아 사용합니다.

2. 빈과 스프링 컨테이너

Spring Container(ApplicationContext)란?

스프링에서는 Spring Container(Application Context)를 통해 여러 빈(Bean)들의 생명주기(Lifecycle)를 관리합니다. Application Context에 대해서는 할 이야기가 많아서 나중에 정리해보겠습니다!!

Bean이란?

스프링 컨테이너가 생성하고 관리하는 객체로, Annotation이나 XML 파일 설정 등을 통해 Spring Container에 객체를 등록할 수 있습니다.

  • 위의 사진에서 객체 B가 Bean이라고 생각하면 됩니다.

3. 관점 지향 프로그래밍(AOP)

etc-image-3etc-image-4

AOP는 프로그래밍의 관심사를 핵심 관점부가 관점으로 나누고, 관심 기준으로 모듈화하는 기법입니다.

로깅, 보안, 트랜잭션과 같은 공통 기능을 분리하여 각 모듈이 하나의 책임만 가지도록 설계합니다.

예를 들어, 계좌 관리, 입출금, 이자 계산 같은 핵심 관점은 그대로 유지하고, 로깅, 보안, 트랜잭션 같은 부가 관점은 별도로 관리합니다.

프로그래머는 AOP를 통해 핵심 로직에만 집중할 수 있고, 프로그램의 변경과 확장에도 유연하게 대응할 수 있도록 도와줍니다.

4. 이식 가능한 서비스 추상화(PSA)

이식 가능한 서비스 추상화(PSA)는 스프링에서 제공하는 다양한 기술들을 추상화해 개발자가 쉽게 사용하는 인터페이스 말합니다.

예를 들어 스프링에서 데이터베이스에 접근하기 위한 기술로는 JPA, MyBatis, JDBC 같은 것들이 있는데요. 여기에서 어떤 기술을 사용하든 일관된 방식으로 데이터베이스에 접근하도록 인터페이스를 지원합니다.

또한 WAS도 PSA의 예시 중 하나라고 볼 수 있는데요. 코드는 그대로 두고 WAS를 톰캣이 아닌 언더토우, 네티와 같은 다른 곳에서 실행해도 기존 코드를 그대로 사용할 수 있다고 합니다.

한 줄로 정리하는 스프링 핵심 4가지

  - IoC : 객체의 생성과 관리를 개발자가 하는 것이 아니라 프레임워크가 대신하는 것
  - DI : 외부에서 객체를 주입받아 사용하는 것
  - AOP : 프로그래밍을 할 때 핵심 관점과 부가 관점을 나누어서 개발하는 것
  - PSA : 어느 기술을 사용하던 일관된 방식으로 처리하도록 하는 것

레퍼런스

 

2.2 스프링 콘셉트 공부하기

본격적인 스프링 부트 공부를 하기 전에 스프링이라는 프레임워크가 돌아가는 원리를 이해하기 위해서 스프링 콘셉트를 우선 공부하고 넘어가겠습니다. 실습 전에 공부할 내용이 너무 많은…

wikidocs.net