FrameWork/Spring Boot

스프링 콘셉트 (feat. IoC, DI, AOP, PSA)

soooy0 2025. 2. 26. 21:47
스프링 부트의 등장
  • 스프링은 장점이 많은 개발 도구이지만, 설정이 복잡하다는 단점이 존재했다. 그래서 등장한 것이 스프링 부트이다.
  • 스프링 부트는 빠르게 프로젝트를 설정할 수 있고, 의존성 세트라고 불리는 스타터를 사용해 간편하게 의존성을 사용하거나 관리할 수 있다. 개발자가 비즈니스 로직 개발에만 집중할 수 있도록 만들어주는 도구인 것이다. 
1. 톰캣, 제티, 언더토우 같은 WAS(Web application Server)가 내장되어 있어서 따로 설치하지 않아도 독립적으로 실행 가능하다.
2. 빌드 구성을 단순화 하는 스프링 부트 스타터를 제공한다.
3. XML 설정을 하지 않고 자바 코드로 모두 작성 가능하다.
4. JAR을 이용해서 자바 옵션만으로도 배포가 가능하다.
5. 애플리케이션의 모니터링 및 관리도구인 스프링 액츄에이터를 제공한다.
  • 스프링 부트는 스프링에 속한 도구로서 스프링과 차이점이 있다.

 

스프링 VS 스프링 부트
  스프링 스프링 부트
구성 애플리케이션 개발에 필요한 환경을 수동으로 구성하고, 정의 스프링 코어와 MVC의 모든 기능을 자동으로 로드하므로 수동으로 개발 환경을 구성할 필요가 없다.
내장 WAS의 유무(
  • 스프링 애플리케이션은 톰캣과 같은 WAS에서 배포된다.)
별도로 수동 설정 내장형 서버를 제공해 별도의 설정이 필요 없다. 
jar 파일만 만들면 된다. 상황에 필요한 WAS를 선택할 수도 있다.
설정 파일 개발자가 수동으로 자동으로
XML 일부 파일은 직접 생성하여 관리 사용하지 않음

 

 

IoC (Inversion of Control)
  • 스프링은 모든 기능의 기반을 IoC와 DI에 두고 있다.
  • IoC는 Inversion of Control의 약자이다. 제어의 역전이라고도 한다.
  • 우리는 지금까지 자바 코드로 객체를 생성할 때, 객체가 필요한 곳에서 직접 생성했다.
public class A {
	b = new B();
}
  • 하지만 스프링 부트에서는 이제 이렇게 직접 객체를 생성하고 제어하는 것이 아니라, 역으로 외부에서 관리하는 객체를 가져와 사용하게 된다.
  • 스프링은 스프링 컨테이너가 객체를 관리, 제공하는 역할을 한다.

 

DI(Dependency Injection)
  • 앞에서 말한 IoC를 구현하기 위해 사용하는 방법이 DI이다.
  • 직역하면 의존성 주입이라는 뜻이다.
  • 어떤 클래스가 다른 클래스에 의존한다는 의미이다.
    • @Autowired 라는 어노테이션은 스프링 컨테이너에 있는 빈이라는 것을 주입하는 역할을 한다.
    • 빈이란? 스프링 컨테이너에서 관리하는 객체
    • 즉, 위에서 말했던 것처럼 개발자가 직접 객체를 생성하지 않고 스프링 컨터에너에서 객체를 주입받는 것.
public class A{

	@Autowired
	B b;
}

 

 

 

스프링 컨테이너란?
  • 빈을 생성하고 관리하는 역할.
  • 빈이 생성되고 소멸되기까지의 생명주기를 이 스프링 컨테이너가 관리하는 것이다.
  • 또한 개발자가 @Autowired와 같은 어노테이션을 사용해 빈을 주입받을 수 있도록 DI를 지원하기도 한다.
빈(bean)이란?
  • 스프링 컨테이너가 생성하고 관리하는 객체
  • 스프링은 빈을 스프링 컨테이너에 등록하기 위해 XML파일 설정, 어노테이션 등의 방법을 제공한다. 즉, 빈을 등록하는 방법은 여러가지가 있다. 

1. @Component 어노테이션 붙이기

  • 클래스 위에 @Component 어노테이션을 붙이면 Mybean 클래스가 빈으로 등록된다. 이후 스프링 컨테이너에서 이 클래스를 관리하게 된다.
  • 이때, 빈 이름은 클래스의 이름 첫글자를 소문자로 바꾸어 관리한다. = mybean

 

Aop(Aspect Oriented Programming)
  • 직역하면 관점 지향 프로그래밍이다.
  • 프로그래밍에 대한 관심을 핵심 관점, 부가 관점으로 나누어서 관심기준으로 모듈화하는 것을 의미한다.
    • ex) 계좌이체, 고객관리 프로그램이 있을 때, 각 프로그램에는 로깅 로직(지금까지 벌어진 일을 기록하기 위한 로직)/ 데이터베이스 연결 로직(여러 데이터를 관리하기 위함)이 포함된다.
    • 이때, 핵심 관점: 계좌이체, 고객관리 로직
    • 부가 관점: 로깅, 데이터베이스 연결 로직이다.
    • 로깅/데이터베이스 연결은 모두 계좌이체, 고객관리에 필요하다. 여기에 AOP 관점을 적용하면?
    • -> 부가 관점에 해당하는 (로깅/데이터베이스 연결)로직을 모듈화해 앞에서 본 그림처럼 개발할 수 있게 해준다.
    • 부가 관점 코드를 핵심 관점 코드에서 분리할 수 있게 해주며 프로그래머가 핵심 관점 코드에만 집중할 수 있도록 해준다.

 

PSA(Portable Service Abstraction)
  • 이식 가능한 서비스 추상화이다.
  • 스프링에서 제공하는 다양한 기술들을 추상화해 개발자가 쉽게 사용하는 인터페이스를 의미한다.
  • 클라이언트의 매핑과 클래스, 메서드의 매핑을 위한 어노테이션이 있다. 
  • ex) 스프링에서 데이터베이스에 접근하기 위한 기술로 JPA, MyBatis, JDBC 등이 있는데, 여기서 어떤 기술을 사용하든 일관된 방식으로 데이터베이스에 접근하도록 인터페이스를 지원한다.
  • ex) 코드는 그대로, WAS를 톰캣이 아닌 언더토우와 같은 다른 곳에서 실행해도 기존 코드를 그대로 사용할 수 있다.

 


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