Springboot

Spring boot 백엔드 아키텍쳐 Infra Layer

25G 2023. 8. 17. 19:24

Infra Layer?

infra layer는 다른 애플리케이션이나 데이터베이스등 외부 요소와 연결을 수행합니다. 예를들어 db서버와의 연결 Message Queue(kafka, rabbitMQ), 외부 API 요청방식 정의 등이 있습니다.

Infra Layer 기능

  1. DB로의 요청/응답 처리
    가장 흔히 사용되는 Jdbc라는 javaAPI가 있고 스프링 내부적으로 디비접근기술에 대한 것은 다 추상화처리를 해 놓았기때문에 개발자는 설정만 정의해서 사용하면된다.
  2. RestApI 연결 방식 구현
    Spring은 api요청이 서버로 오게되면 Template라는 원칙으로 설계를 통일하여 외부 서버와 RestTemplate로 통신할 수 있게 되었습니다. 더 나아가 비동기식 호출을 원하는 경우에는 WebClient라는 객체를 사용하여 요청할 수 있습니다.
  3. 메시지 전송

DB Access 방식

Table Data Gateway(dao)

해당 방식은 SQL문을 도메인/애플리케이션 로직과 분리하자는 아이디어에서 시작됐고 Table Data Gateway는 일반적으로 하나의 테이블에 대한 CRUD메서드들을 정의합니다. 이 인터페이스를 사용해서 sql문을 어떻게 사용하는지에 대한 맥락을 배제할 수 있습니다.
Table data Gateway방식은 DTO와 함께 많이 사용되며 트랜잭션 스크립트와 함께 사용됩니다.

Active Record

해당 패턴은 하나의 객체가 테이블에 대한 처리에 관한 메서드를 제공하고, 그 결과 데이터 또한 스스로 가지고 있는 형태입니다.
Table Data Gateway 방식과 마찬가지로 테이블 스키마와 대체로 일치하는 경향을 보입니다. 이 방법은 CRUD에 특화된 방법이지만 활성 레코드 수준까지는 테이블과의 연광성과 영속화 로직과의 결합이라는 특징때문에 아직도 도메인 모델이라 불리기에는 부족하다고 합니다. 하지만 트랜잭션 스크립트와는 같이 쓰기 편한형태입니다.
이러한 특징으로 간단하게 개발하는 python의 django와 node.js의 sequelize이 채택하고 있는 방식입니다.

Data Mapper

Data Mapper에 접어들면서 개발자들은 테이블 스키마와 객체를 분리하기 시작했습니다.
테이블을 구성하는 메커니즘과 객체를 구성하는 메커니즘이 달라 패러다임의 불일치가 오는데 다음과같은 차이점들이 존재합니다.

  1. 데이터베이스에서는 상속과 같은 객체의 중요한 개념을 지원하지 않는다.
  2. 객체는 자신이 직접 다른 객체에 대한 참조를 가질 수 있지만, Table에서는 이를 Join을 이용해 표현해야합니다.
  3. 객체들은 참조 관계로 연결되며, 참조 객체가 수정될 경우도 함께 반영되어야 합니다.
    Data Mapper의 구현은 매우 복자하여 만들어진 ORM을 사용합니다. 이렇게하면 객체와 DB가 분리될 수 있기 때문에 도메인 모델과 온전히 함께 사용할 수 있게 됩니다. 객체들간의 관계와 협력만으로 모든 도메인 로직을 구현할 수 있게 됩니다.

spring에서 DataMapper를 어떻게 사용할까

Repository는 영속성 작업을 수행하기 위해 일반적인 컬렉션과 비슷한 인터페이스를 가지도록 하여 DB에 대한 구현 의존성을 줄이고 Infra Layer를 객체지향적으로 바라볼 수 있게 해줍니다.
이러한 목적때문에 Repository는 일반적으로 DomainLayer에 정의되고 Repository의 구현을 Infra Layer에서 하는 경우가 많습니다.
spring에서 해당 방식을 Data Mapper를 사용하는 예제가 바로 EntityManager이고 Repository에 해당하는 것이 JpaRepository나 CrudRepsository입니다.