Spring의 3대 요소 : 전체 보기

Eojin·2023년 6월 20일
0

작성일

20230621
20230627
20230710


➡️ 스프링(Spring)이란?


프로그래밍 언어 자바(Java) 사용자들의 대부분이 Web Framework로 스프링을 사용한다. 즉, 스프링은 프로그래밍 언어를 좀더 편리하게 작성하도록 도와주는 프레임워크이다.



➡️ Spring 프레임워크를 왜 만들었을까?


✅ 엔터프라이즈 애플리케이션

대규모의 복잡한 데이터를 관리하는 애플리케이션으로, 많은 사용자의 요청을 동시에 처리해야 하므로 서버의 성능과 안정성, 보안이 매우 중요하다. 그러면서 기본적인 사이트의 기능 즉, 비즈니스 로직을 갖추어야 한다.

EX. 은행 애플리케이션


✅ 스프링의 등장

위와 같은 상황에서 서버 성능, 안정성, 보안을 높은 수준으로 제공하는 스프링 프레임워크의 등장으로, 개발자들은 기본인 비즈니스 로직 개발에 집중할 수 있게 되었다.



➡️ 3대 요소 첫 번째, IoC(제어의 역전)과 DI(의존성 주입)

클래스 간의 결합을 느슨하게 만들어서 의존 관계에 있는 클래스를 변경해도 영향이 덜 가도록 해준다.


✅ IoC(Inversion of Control)

객체의 생성과 관리를 개발자가 하는 것이 아니라 프레임워크가 대신하는 것


지금까지는 아래의 코드와 같이 객체를 생성할 때 객체가 필요한 곳에서 직접 생성했다.
//객체를 생성하는 보편적인 방법
public class A {
	b = new B(); 
}

제어의 역전(IoC)는 다른 객체를 직접 생성하거나 제어하는 것이 아니라 외부에서 관리하는 객체를 가져와 사용하는 개념이다.

CF. 스프링은 스프링 컨테이너가 객체를 관리 및 제공하는 역할을 한다.

//스프링 컨테이너가 객체를 관리하는 방식 
public class A {
	private B b;
}

스프링은 위와 같이 '코드에서 객체를 생성하지 않고 어디선가 받아온 객체를 변수 b에 할당'하는 방식을 사용한다. 그리고 이러한 방식을 제어의 역전이라고 부른다.



✅ DI(Denpendency Injection)

외부에서 객체를 주입받아 사용하는 것


우리는 앞서 스프링에서 객체를 관리하는 방법으로 제어의 역전 개념을 사용한다는 사실을 살펴봤다.

이러한 제어의 역전을 구현하기 위해 **의존성 주입**을 사용한다. 의존성 주입은 어떤 클래스가 다른 클래스에 의존한다는 의미의 용어다.

코드로 의존성 주입을 좀더 알아보자.
public class A {
	//A에서 B를 주입받음
    @Autowired
    B b;
}

위 코드는 @Autowired라는 애너테이션을 붙여줌으로써, 스프링 컨테이너에 있는 빈(Bean)을 b에 주입해주는 코드다. 앞서 말했듯이 역전의 제어를 하지 않을 경우 직접 B 객체를 생성하여 사용했지만, 역전의 제어를 할 경우 B b;라고 선언할 뿐 객체를 생성하지는 않는다.

Bean이란?
요약하자면 스프링 컨테이너에서 관리하는 객체를 가리키는 용어이다.


이는 우리가 스프링 프로젝트 클래스에서 다짜고짜 B b;라고 선언하면, 스프링 컨테이너가 B라는 객체를 만들어 클래스 A에게 전달하기 때문에 가능하다. 이러한 과정을 '객체의 주입'이라고 부른다.


즉, 스프링을 사용하지 않으면 일단 B라는 클래스를 직접 작성하고 원하는 곳에서 B 클래스를 이용해서 B 객체를 생성해야지만 드디어 사용할 수 있지만, 스프링 프레임워크를 사용하면 스프링 컨테이너라는 녀석 덕분에 듣보잡인 B 클래스 타입인 b 쓸거야!라고 무작정 땡깡을 부려도 알아서 척척 해준다.


이렇게 객체를 주입하는 것을 의존성 주입(DI)라고 부르는 이유는 어떤 객체를 다른 객체(엄밀하게는 아직 클래스인 상태)가 사용하는 것을 의존성이 생긴다고 표현하기 때문이다. 다시 말하자면, 어떤 객체(A 객체)가 어엿하게 독립적인 존재로 있는 것이 아니라 외부의 도움(B 객체)을 통해 즉, 의존적으로 존재하는 것이다. 따라서 우리는 객체를 주입하는 행위를 의존성 주입이라고 부른다.



➡️ 3대 요소 두 번째, AOP(관점 지향 프로그래밍)

모든 클래스에 공통되는 기능
즉, 프로그래밍을 할 때 핵심관점과 부가관점을 나누어 개발하는 것
(EX. @Transactional, @RestController, etc.)


✅ AOP(Aspect Oriented Programming)

프로그래밍을 할 때 관심사를 기준으로 모듈화 하는 것을 의미한다.


예를 들어, 은행 프로그램이 있다고 해보자.

프로그램에는 여러 로직이 포함되어 있는데, 그 중에서도 계좌이체 로직, 고객관리 로직, 발생한 작업들을 기록하기 위한 로깅 로직, 데이터베이스 연결 로직을 AOP에 따라 살펴보면 다음과 같이 볼 수 있다.

계좌이체와 고객 관리 로직로깅과 데이터베이스 연결 로직이 각각 구현된다고 할때, 부가 관점인 로깅, 데이터베이스 연결 로직계좌이체와 고객관리 로직은 핵심 관점 코드에서 분리하여 개발할 수 있게 한다.

핵심 관점계좌이체 로직고객관리 로직
부가 관점로깅 로직로깅로직
데이베이스 연결 로직데이베이스 연결 로직

이렇듯 AOP는 코드 상에서 공통 부분과 전체 프로그램을 관장하는 부분을 분리하여, 핵심 줄기에 해당하는 코드에 보다 집중할 수 있을 뿐만 아니라 프로그램의 변경과 확장에도 유연해질 수 있게 한다.



➡️ 3대 요소 세 번째, PSA(서비스 추상화)

이식 가능한 서비스 추상화 즉, 어느 기술을 사용하던 일관된 방식으로 처리하도록 하는 것


✅ PSA(Portable Service Abstraction)

스프링에서 제공하는 다양한 기술들을 추상화해서 해야 할 일들을 파격적으로 줄여준 인터페이스들을 가리킨다.


예를들어, 스프링의 데이터베이스 접근 기술인 JPA, MyBatis, JDBC 등이 이에 해당한다.

➡️ 참고자료


[교재]
스프링부트3 백엔드 개발자되기 자바편

[블로그]
https://devlog-wjdrbs96.tistory.com/166
https://sabarada.tistory.com/66


profile
'함께'가 즐거운 개발 공부하는 사람입니다.

0개의 댓글

관련 채용 정보