프로그램을 짤 때 좋은 코드인지 볼 수 있는 척도 중 하나

느슨한 결합도 높은 응집도

 

오늘은 어제 다 못한 스프링 트라이앵글을 마저 학습했다.

오늘 학습한건 AOP와 PSA이다.

Spring 삼각형

 

 

❑ AOP(Aspect Oriented Programming)

 

 

➤ AOP란?

 

번역하면 관심지향 프로그래밍

객체 지향은 알겠는데 관심지향 프로그래밍에서 관심은 무엇을 의미할까?

 

고양이를 키우는 집사들은 다 다른 방식으로 키운다.

어떤 집사는 고양이에게 좋은 음수대를 사주고 또 어떤 집사는 비싼 캣타워를 사준다.

이렇게 집사들의 고양이 키우는 방식은 다 다르지만 모두 공통적으로 고양이의 행복을 바란다.

집사들이 고양이의 행복이라는 공통 관심사를 가지고 있는 것처럼 AOP에서 'Aspect'는 애플리케이션에 필요한 기능 중에서 공통적으로 적용되는 기능에 대한 관심이다.

 

 

➤ 공통 관심사항과 핵심 관심사항

 

AOP에서 관심사항에는 공통 관심사항핵심 관심사항이 있다.

공통 관심사항 : 애플리케이션 전반에 걸쳐 공통적으로 사용하는 기능들에 대한 관심사

핵심 관심사항 : 비즈니스 로직, 애플리케이션의 주 목적을 달성하기 위한 핵심 로직에 대한 관심사

핵심 관심사항과 반대되는 의미에서 공통 관심사항을 부가 관심사항이라고 부르기도 한다.

 

예를 들어서 음식을 주문하는 애플리케이션을 만든다고 했을 때

핵심 기능에는 음식 선택, 계산, 주문 취소가 들어갈 수 있고

공통적으로 들어가는 기능에는 로깅, 보안, 트랜잭션이 있다.

관심사 예시

 

공통 관심사와 핵심 관심사를 그림으로 그려보면 위와 같이 그려진다.

핵심기능과 부가기능은 떨어져 있고 부가기능들이 핵심기능을 관통한다.

결론적으로 AOP는 애플리케이션을 만들 때 핵심기능 로직에서 공통기능 로직을 분리해서 따로 작성하는 것이다.

 

 

 

➤ 왜 AOP가 필요할까?

 

핵심 로직과 공통 로직을 분리하면 다음과 같은 장점이 있다.

  • 코드가 간결해진다
  • 객체 지향적으로 설계할 수 있다
  • 코드를 재사용하기 쉽다

 

 

※ AOP의 예시로 학습자료에 있던 JDBC 트랜잭션에서 중요한 부분을 정리해보았다.

트랜잭션(Transaction) : 데이터를 처리하는 하나의 작업 단위

같은 트랜잭션 내에 있는 기능 중 하나라도 오류를 발생하면 모든 작업은 취소된다. (All or Nothing)

모든 작업이 정상적으로 수행되어야만 정상적으로 반영한다. (commit)

하나의 작업이라도 실패하면 모든 작업을 롤백(rollback) 시킨다.

 

 

 

 

❑ PSA(Portable Service Abstraction)

 

 

➤ 추상화(Abstraction)의 개념

 

어떤 클래스의 본질적인 특성만을 추출해서 일반화 하는것을 추상화라고 한다.

설계의 관점에서는 추상화보다 일반화가 적절한 용어이다.

자바에서 추상화의 대표적인 방법이 인터페이스(Interface) 이다.

 

클라이언트가 추상화된 상위 클래스를 일관적으로 바라보며 하위 클래스들의 기능을 사용하는 것이 일관된 서비스 추상화(PSA)이다.

여기서 클라이언트의 영역에 대해서 조금 생각해보자.

서버/클라이언트에서 클라이언트는 서버측의 기능을 이용하는 입장이다.

대표적인 클라이언트는 웹 브라우저이다.

하지만 코드 레벨에서 어떤 클래스의 기능을 사용하는 측 역시 클라이언트라고 부른다.

 

 

➤ 서비스에 적용되는 일관된 서비스 추상화(PSA) 기법

 

예시로 java 콘솔 애플리케이션에서 클라이언트가 데이터베이스에 연결하기 위해서는 JdbcConnector라는 기능을 사용하려고 한다.

JdbcConnector는 애플리케이션에서 사용하는 서비스 중 하나라고 생각하면 된다.

데이터베이스에 연결하기 위한 JDBC 인터페이스의 구현체는 OracleJdbcConnector, MariaDBJdbcConnector, SQLiteJdbcConnector가 있다.

이때 클라이언트가 JDBC의 구현체에 바로 연결하는 것이 아닌 JdbcConnector 인터페이스를 통해 간접적으로 연결되어 느슨한 결합으로 연결되어 있다.

어떤 JdbcConnector를 이용해도 JDBC에 작성되어 있는 공통기능을 일관된 방식으로 사용할 수 있다.

기능이 작동하는 방식은 각각의 JDBC를 구현한 객체에 작성되어 있는데로 작동한다.

 

이처럼 애플리케이션에서 서비스의 기능을 접근하는 방식 자체를 일관되게 유지하면서 기술을 유연하게 사용할 수 있도록 하는 것을  PSA(일관된 서비스 추상화)라고 한다.

 

 

➤ PSA가 필요한 이유

 

어떤 서비스를 이용하기 위한 접근 방식을 일관된 방식으로 유지해서

애플리케이션에서 사용하는 기술이 변경되더라도 최소한의 변경만으로 변경된 요구사항을 반영하기 위해서이다.

 

PSA를 통해서 애플리케이션의 요구 사항 변경에 유연하게 대처할 수 있다.

 

Spring에서 PSA가 적용되는 분야로는 트랜잭션 서비스, 메일 서비스,  Spring Data 서비스 등이 있다.

 

 

 

 

 

읽어주셔서 감사합니다. 🥰 좋은하루 되시길 바랍니다.

오개념에 대한 지적은 늘 환영입니다. ^^