카테고리 없음

[JPA 스터디] 객체와 테이블

코코무 2025. 8. 28. 21:31
반응형

※유튜버 '나무소리'님의 강의를 참고하였습니다.


자원 접근 레이어

  • 비즈니스 컴포넌트: 도메인 규칙과 업무 흐름을 캡슐화해서 입력을 받아 결정·변환·검증하고, 필요한 인프라(리포지토리, 외부 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
  • 비즈니스 레이어
    • 저장소 세부를 모름
    • 규칙과 흐름만 책임지고 '어디에'는 자원 접근 레이어가 결정

정확히는 JPA는 관계형 데이터 접근 모듈 - RDBS 사이에서 일어남

객체의 세상과 테이블의 세상

  • 객체 중심의 객체지향 어플리케이션과 테이블 중심의 관계형 데이터베이스는 서로의 목표가 다름
    • 객체지향 앱은 '현실 도메인의 행동/규칙을 잘 표현' 하려고 하고, 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)