[Spring] 스프링 프레임워크의 핵심요소

스프링 프레임워크의 핵심요소

  • POJO (Plain Old Java Object)
  • PSA (Portable Service Abstraction)
  • IoC (Inversion of Control) / DI (Dependency Injection)
  • AOP (Aspect Oriented Programming)

POJO (Plain Old Java Object)

POJO는 특정 프레임워크나 기술에 의존적이지 않는 일반 자바 클래스이다. 즉 POJO는 새롭게 만들어진 개념이 아니라, 원래 존재하던 것을 가리키는 단어이다.

과거에는 웹 프로젝트에서 EJB(Enterprise Java Bean)를 많이 사용했는데, 상당히 불편하고 복잡하다. 이를 개선하기 위해, 이와 상충하는 방법을 사용하면서 새로운 용어가 필요했고, 일반 자바 빈(Bean)이라는 말 대신 POJO를 사용하기 시작했다.

그리고 웹 애플리케이션 컨테이너와 상관없이 독립적으로 빈의 생명주기를 관리할 수 있는 스프링 프레임워크를 만들게 되었고, 큰 인기를 얻었다.

  • 그래서 POJO가 왜 핵심요소인가?

스프링 프레임워크는 POJO를 지원하며, 특정한 인터페이스를 구현하거나 클래스 상속 없이도 사용 가능하다. POJO는 테스트하기 용이하며 객체지향 설계를 자유롭게 적용할 수 있다.

PSA (Portable Service Abstraction)

환경과 세부기술의 변경과 관계없이 일관된 방식으로 기술에 접근할 수 있게 해주는 설계 원칙이다. 쉽게 말하면, 추상화를 통해서 기술의 내부 구현과 기술의 사용을 분리하여, 편의성을 제공한다는 것이다. 예를 들어 DB에 관계없이 동일하게 적용할 수 있는 트랜잭션 처리 방식과 같은 것이다.

IoC (Inversion of Control) / DI (Dependency Injection)

IoC는 ‘제어의 역전’이라는 의미로, 프로그램의 생명주기에 대한 주도권이 웹 애플리케이션 컨테이너에 있다. 자바 기반의 웹 프로그램 개발 시, 클라이언트의 요청을 처리하는 클래스들의 인스턴스 관리를 해야하는데, 일괄적으로 인스턴스를 관리하기 위해서 객체의 생성을 관리할 수 있는 도구가 필요했다.

인터페이스를 활용해서 결합도를 낮추더라도, 결국 인스턴스화하기 위해서 반드시 객체 생성에 필요한 코드가 필요하므로 결합도를 완전히 분리해 낼 수 없다. 즉 프로그램이 정상 동작하기 위해서는 인스턴스화할 수 있는 코드에 대한 의존성을 갖게 된다. 이를 해결하는 것이 의존성 주입(DI)이다.

개념만으로는 DI가 어떤 의미인지 와닿지 않지만, 직접 스프링 프레임워크를 다루다 보면 정말 객체 생성하는 코드 없이 동작한다. 인스턴스를 생성했던 작업을 스프링에 위임하는 것이다. 물론 저절로 되는 것은 아니고, 스프링이 인스턴스를 관리할 수 있도록 설정하는 작업이 필요하다.

스프링은 설정 파일이나, 어노테이션을 통해서 객체 간의 의존 관계를 설정할 수 있다. 따라서 객체는 의존하고 있는 객체를 직접 생성하거나 검색할 필요가 없다.

AOP (Aspect Oriented Programming)

관심사의 분리를 통해서 소프트웨어의 모듈성을 향상시킨다. 공통 모듈을 여러 코드에 쉽게 적용 가능하다.

반복되는 코드를 공통 모듈로 만들어서 사용한다는 의미이다. 예를 들어, 로거(logger)를 구현한다고 할 때, 각 메소드가 실행될 때마다 로그를 출력하는 코드를 분리한다. 각 메소드는 자기 기능에 집중할 수 있도록 한다.

스프링은 자체적으로 프록시 기반의 AOP를 지원한다. 트랜잭션, 로깅, 보안과 같이 여러 모듈에서 공통으로 필요하지만, 실제 모듈의 핵심이 아닌 기능들을 분리하여 관리할 수 있다.

댓글 남기기