김대용
JPA

엔티티 매니저와 영속 컨텍스트를 비전공자에게 가르쳐보자.

--------------------

내가 쓰는 책을 중국어로 출판하고 싶어서 중국어 번역가를 고용했다. 이 번역가는 실력이 상당해서 한국어에서 중국어로, 그 반대로도 매번 똑같은 내용으로 번역해준다. 내가 가지고 있던 한국어 책이 불타도 중국어로 번역된 내용을 이 번역가에게 맡기면 똑같은 한국어 책이 나온다는 얘기다.

안녕하세요 -> 번역가 -> 您好
您好 -> 번역가 -> 안녕하세요

나와 번역가는 한 페이지 단위로 번역을 요청하도록 일의 단위를 정했다.

페이지 조회: 앗 내가 쓰던 페이지가 없어졌다!

다행히도 중국어로 번역된 페이지가 있다. 이 페이지의 쪽수가 5번째라고 치자. 번역가에게 5 페이지를 잃어버려 한국어로 번역해달라고 했다. 번역가는 궁시렁 대면서 한국어로 번역을 해줬다.

헉, 얼마안가 이번에는 내가 5 페이지를 불태워버렸다. 미안하지만 번역가에게 다시 문서를 달라고 요청했다. 번역가는 이 놈이 또 잃어버릴 것을 대비해 복사본을 준비했었다. 번역가는 별 일이 아니라는 듯 복사본을 넘겨줬다.

이렇게 복사본을 만들어두니 번역가는 또 번역을 안해도 된다. 이를 캐싱(Caching)이라고 한다.

페이지 저장: 새로운 페이지를 썼는데, 번역해줘!

나는 새로운 페이지를 쓸 때마다 번역가에게 번역해달라고 요청한다. 혹시 내가 쓴글을 잃어버릴까봐(불탈까봐). MZ한 번역가라 그런지 왜 이렇게 짤짤이로 주냐고 한꺼번에 몰아서 하는게 집중 잘된다고 짜증을 내더라. 그래서 내가 글 쓰는게 끝나면 알려줄테니깐 그때 한꺼번에 하라고 정했다.

이렇게 내가 글 쓰기 시작하고 끝나는 일의 단위를 트랜잭션(Transaction)이라고 한다. 그리고 이 일이 끝날 때 한꺼번에 번역해주는 행위를 쓰기지연이라고 한다.

페이지 수정: 이 페이지를 수정했는데, 반영해줘!

참 이 번역가도 극한직업이다. 내가 수정한 페이지를 줄 때 뭐가 바뀐지 안알려준다. 그래도 번역가는 알아서 복사해둔(캐싱한) 페이지를 보고 일일이 비교해 뭐가 바뀐지 알아채내 중국어 문서에 그대로 반영한다. 번역가가 이래도 괜찮긴 한데, 일의 시작과 끝에 포함해달라고 하더라.

이렇게 기존과 뭐가 바뀌었는지 파악하는 과정을 더티체킹(dirty-checking)이라고 한다.

페이지 삭제: 이 페이지를 없애줘!

책을 쓰다보니 이 페이지는 쓸모 없는 것 같더라. 그래서 번역가에게 없애달라고 얘기했다. 번역가가 그 페이지를 그대로 없애준다. 대신, 마찬가지로 일의 시작과 끝에 이 요청을 포함해달라고 한다.

이 과정을 컴퓨터 세계와 연결해보면?

나는 애플리케이션, 내가 쓰는 한국어 책은 엔티티, 그리고 번역된 중국어 책은 데이터베이스라고 볼 수 있다. 애플리케이션이 쓰는 언어(Java, C#...)와 데이터베이스가 쓰는 언어(SQL)는 다를 수 밖에 없다. 그래서 번역가(엔티티 매니저)가 필요할 수 밖에 없다.

번역가가 쓰는 사무실을 영속성 컨텍스트라고 할 수 있다. 사무실에 앞으로 번역해야하는 새로운 페이지, 변경해야하는 페이지, 삭제해야하는 페이지, 페이지 복사본 등등을 모아 둘 것이다. 즉, 한국어 페이지들을 모아둔 공간이다.

사실 이 공간은 어디든 될 수 있을 것이다. 카페에 이 내용을 두어도 되고, 천재 번역가라면 그냥 머릿속에 다 넣을 수도 있을 것이다. 이처럼 영속성 컨텍스트는 일종의 개념이다. 사무실이, 카페가, 머릿속이 영속성 컨텍스트가 될 수 있는 것이다.

총정리

용어를 정리해보자면, 이와 같다.

컴퓨터 용어예제 용어
애플리케이션
엔티티한국어 페이지
데이터베이스중국어 페이지
엔티티 매니저번역가
영속성 컨텍스트번역가 사무실, 머릿속 등 페이지를 보관하는 장소
트랜잭션글을 작성하는 일의 시작과 끝. 즉, 글쓰기 작업의 모음

영속성 컨텍스트가 있어서 좋은 점

  • 캐싱: 번역가를 거쳐간 페이지를 기억한다.
  • 더티체킹: 변경된 페이지의 내용을 내가 안알려주더라도 번역가가 알아서 알 수 있다.
  • 트랜잭션 내 쓰기지연: 번역가가 짤짤이로 일을 쳐내는 게 아닌, 한꺼번에 몰아서 할 수 있다. (일의 효율성 증가)

진짜 (준)비전공자의 피드백

완전 비전공자는 아니고 연관된 학과에 다니는 친구다.

  • 일의 시작과 끝에 대해 좀 더 풀어서 설명하면 좋겠다. (반영완료)
    • 너무 컴공적인 접근이다.
    • 이건 전제를 깔고 스토리로 풀어보면 좀 더 재미있을 것 같다.
      • 두 테이블 이 있다고 치자. 내 책상, 번역가 책상
      • 번역가가 좀 MZMZ해서 일을 몰아서하는게 집중이 더 잘된다고 한다.
      • 그래서 내가 글을 쓰거나 수정하면 번역가 책상에 올려두고, 내 오늘치 글쓰기가 끝났다고 말하면 번역가가 그제서야 번역일을 시작하더라.
  • 영속성 컨텍스트를 번역가 사무실로 비유한건 좋은 것 같다.
--------------------