Spring Framework의 특징

Spring Framework의 특징

이번 포스팅은 Spring Framework의 특징에 대해 알아보려한다.

Spring Framework의 특징


image

DI/IoC + AOP + PSA를 통해 POJO를 달성할 수 있다는 것을 의미한다. 그렇다면 이것들에 대해 알아보자.

POJO (Plain Old Java Object)


Java 프로그래밍은 Object간의 관계가 맺어진다. 이 방식을 스프링에서 그대로 사용하여 별도의 API사용 없이 구성할 수 있다.

  • 특정 환경이나 기술의 종속에서 벗어나 확장 가능하고 재사용 가능한 코드작성을 할 수 있다.
  • 코드가 간결해지며 디버깅이 용이해지고 또한 테스트 역시 단순해진다.
  • 객체지향적 설계를 제한없이 적용할 수 있다.

코드를 작성하면서 작성된 코드가 객체지향적인가? 돌아보는 습관을 가지도록 하자.

DI/IoC


어플리케이션이 시작되는 Entry Point가 Spring에서는 없다. 이는 서블릿 컨테이너에 요청이 들어올 때, 서블릿을 직접 실행시키기 때문에 일반적인 Java 프로그래밍과 같은 main() 메서드가 필요하지 않다.

즉, 서블릿 컨테이너에서 서블릿을 제어하기에 개발자가 아닌 주도권이 서블릿 컨테이너에 있는 IoC가 적용되어 있는 것이다.

DI (Dependency Injection)

IoC는 일반적인 개념인 것이고 DI는 IoC를 구체화시킨 것이다.

A객체가 B객체없이 동작이 불가능하다면 A가 B에 의존적이다. 이는 의존성에 관한 개념이다.

외부 클래스의 객체를 사용한다는 것은 new 키워드를 필요로 한다는 것인데, 이를 사용하지 않아야 한다. 이유는 클래스들 간의 강한 결합으로 인해 수정이 있다면 코드의 변경이 빈번히 일어나기 때문이다.

즉, 의존성 주입이라는 것은 A객체에 필요한 B객체를 외부에서 밀어넣는다는 의미가 된다. 결국 밀어넣게 되는 것이기에 A객체는 따로 신경쓸 필요가 없으며, 이에 따라 코드의 변화도 없게 될 것이다. 이를 통해 느슨한 결합으로 구성한다.

image

또한, stub와 같은 테스트, 더미 데이터 요청이 있을 때 매번 Service 관련된 객체 주입 부분을 바꾸게되면 이에 따른 코드 수정이 많이 일어날 수 있으므로, 인터페이스를 의존케하여 업캐스팅을 활용해야한다.

스프링에서는 ApplicationContext가 이 역할을 담당하여 관리하는 객체들(Bean)을 생성, 주입한다.

AOP (Aspect Oriented Programming)


핵심 관심사(Core concern)에서 공통 관심사(Cross-cutting concern)를 분리하는 것이다.

핵심적인 로직에 공통적인 코드가 들어가면 코드가 복잡해지는 것은 물론! 수정이 필요하면 모든 부분을 수정해주어야 하는 문제가 있다.

대표적인 예로 트랜잭션 작업의 경우 DB를 다루는 메서드에서 commit()메서드와 rollback()메서드가 매번 중복되어 등장할 것이다. 이를 해결하기 위해 Spring 내부적으로 AOP를 이용하는 @Transactional 어노테이션을 사용한다.

즉, 공통된 기능(트랜잭션, 로깅, 보안, 모니터링 등)을 핵심 로직에서 분리하여 재사용 가능하게끔 구성할 수 있다.

PSA (Portable Service Abstraction)


상위 클래스(추상 클래스)를 사용하여 하위 클래스의 기능을 이용하는 것이 PSA의 기본개념이다.

예로 JdbcConnectoer 인터페이스의 getConnection() 메서드를 구현한 하위 클래스들(MySQL, MariaDB, Oracle..)은 일관되게 JdbcConnector 인터페이스를 통해(업캐스팅) 유연하게 사용할 수 있다.

DI에 설명했던 Service 인터페이스PSA를 이용했다 볼 수 있다.

결론


Spring의 특징! 면접에서도 단골 질문으로 나온다고 풍문으로 많이 듣곤했다. 마침 Section2 수업을 하면서 겸사겸사 정리할 좋은 기회를 얻게 되었다

처음 Spring을 접했을 때는 ‘이게 무슨말인가~?’ 싶어 넘겼었던 기억이 얼핏 난다. 그러다 얼추 적응이 되었을때는 자연스레 접하게 되었고, 깔끔하게 정리해놓으면 다시 볼때마다 상기시킬 수 있겠다는 생각은 항상 했지만, 나의 게으름으로 인해 이제서야 정리하게 되었다🤐