반응형
※유튜버 '나무소리'님의 강의를 참고하였습니다.
자원 접근 레이어
- 비즈니스 컴포넌트: 도메인 규칙과 업무 흐름을 캡슐화해서 입력을 받아 결정·변환·검증하고, 필요한 인프라(리포지토리, 외부 API)를 오케스트레이션한 뒤 결과를 내는 자율적인 모듈
- 도메인 규칙과 업무 흐름을 캡슐화
- 도메인 규칙: 할인, 재고, 상태전이 같은 비즈니스 룰/불변식
- 캡슐화: 메서드 몇 개만 노출
- 입력을 받아
- 컨트롤러나 다른 계층이 넘겨주는 커맨드/DTO를 파라미터로 받는다.
- 필요한 인프라(리포지토리, 외부 API)를 오케스트레이션 한 뒤
- 리포지토리: 엔티티 저장·조회 같은 영속성 접근자
- 외부 API: 결제/알림/배송 같은 시스템 연동
- 오케스트레이션: 호출 순서/트랜잭션 경계를 잡고 조율
- 비즈니스 로직 레이어에 놓여있다.
- 도메인 규칙과 업무 흐름을 캡슐화
- 자원 접근 모듈: DB·파일시스템·외부 HTTP API·메시지 브로커·캐시 같은 외부 자원에 안전하게 붙었다 떼는 인프라 전담 모듈
- 연결/세션 관리: 커넥션 풀, 타임아웃, TLS 설정
- 요청 생성 전송: SQL/쿼리 빌드, HTTP 요청 조립, 메시지 퍼블리시
- 응답 처리
- 에러 번역
- 자원 접근 레이어에 놓여있다.
- 모듈: 갈아끼울 수 있다.
- 어떤 객체의 정보가 자원 접근 레이어를 통해서 저장될 때 하나의 인터페이스를 타고 들어감
- 하지만, 실제로 그 데이터가 저장되는 경로는 자원 접근 레이어에서 어떤 모듈이 처리하는가에 따라 다름
- 겉에는 '저장해'라는 한 줄짜리 문(인터페이스)만 보이지만, 문 안쪽에서 어떤 통로(모듈)을 타느냐에 따라 실제 저장 장소와 방식이 달라진다.
- 하나의 인터페이스를 타고: 비즈니스 코드는 DocumentStore.save(doc) 같은 단일 포트(인터페이스)만 호출한다.
- 저장되는 경로는...어떤 모듈이 처리하는가에 따라 다름: 그 포트를 구현한 어댑터/모듈이 여러 개일 수 있다.
- MySQL에 INSERT, S3에 업로드, 로컬 디스크에 파일 저장...런타임에 어떤 구현을 바인딩 하느냐에 따라 물리 경로와 프로토콜이 달라진다.
- 겹치는 부분 = 포트(인터페이스)
- 비즈니스 레이어가 항상 이 문 하나를 통해서만 "저장해/찾아와"를 요청
- 자원 접근 레이어 안에는 여러 구현 모듈이 있다.
- 전부 같은 인터페이스를 구현하지만, 실제 저장 경로/프로토콜/일관성은 제각각
- JdbcDocumentStore → RDBMS INSERT(BLOB/TEXT 등)
- S3DocumentStore → S3 PutObject(최종적 일관성)
- FileSystemStore → 파일시스템 write
- 비즈니스 레이어
- 저장소 세부를 모름
- 규칙과 흐름만 책임지고 '어디에'는 자원 접근 레이어가 결정
객체의 세상과 테이블의 세상
- 객체 중심의 객체지향 어플리케이션과 테이블 중심의 관계형 데이터베이스는 서로의 목표가 다름
- 객체지향 앱은 '현실 도메인의 행동/규칙을 잘 표현' 하려고 하고, RDB는 '데이터를 안전하고 빠르게 질의·보관'하려고 한다.
- 객체지향: 도메인 모델, 캡슐화, 불변식, 메시지 전달, 테스트 용이성
- 관계형: 정규화, 무결성 제약, 트랜잭션, 동시성, 집합 연산 기반 질의 성능
- 영속적으로 데이터를 저장하기 위해 객체의 세상과 테이블의 세상을 서로 맞추는 과정 필요
- 우리가 저장하고자 하는 데이터는 객체이고, 이것이 RDBMS에 저장될 때는 다른 형태로 저장이 되어야 한다.
객체지향 모델 | 관계형 모델 |
객체, 클래스 | 테이블, 로우 |
속성(attribute, property) | 컬럼 |
Identity | Primary Key |
Relationship/다른 엔티티 참조 | Foreign Key |
상속/다형성 | 없음 |
메서드 | SQL 로직, SP, 트리거 |
코드의 이식성 | 벤더 종속책임 |
- Persistence Framework: 자바 어플리케이션에서 관계형 데이터베이스의 사용을 돕는 프레임워크
- SQL Mapping: 자바 코드와 SQL을 분리하며 개발자가 작성한 SQL의 수행 결과를 객체로 매핑한다.
- Mybatis: SQL Mapper 방식(Object → SQL)
- OR Mapping: 객체와 관계형 데이터베이스 사이에서 매핑을 담당하며 SQL을 행성하여 패러다임의 불일치를 해결한다.
- Hibernate: ORM 방식(Object → Relational)
- SQL Mapping: 자바 코드와 SQL을 분리하며 개발자가 작성한 SQL의 수행 결과를 객체로 매핑한다.