Article - 깊게 탐구하기

내 실수 목록

조금씩 차근차근 2025. 6. 14. 20:51

데이터베이스 + ACID 소실

  • 서로 다른 저장소 간 관계있는 데이터를 사용할 땐, ACID 소실 문제에 주의하자.
    • 서로 다른 저장소에서 데이터를 조회하다보면, 일관된 버전이 보장되지 않는다.
    • 락/버전 관리/오프라인 동시성 문제 해결 도구 등을 이용해 함께 동시에 버전을 일치시키지 않는 한, 반드시 원자성/일관성/고립성 문제가 발생한다.
  • 이벤트는 원자성 발행에 조심하라.
    • 커밋이 안되면, 이벤트는 발행되지 않아야 한다.
    • 트랜잭션 아웃박스 패턴 혹은 TransactionalEventListener를 사용하라.
  • Exactly Once 이벤트는 매우 조심히 다뤄야 한다.
    • 발행 - 브로커 간에도 Exactly Once가 유지되어야 하고
    • 브로커 - 구독자 간에도 Exactly Once가 유지되어야 한다.
    • 브로커는 기본적으로 멍청하다.

스프링 + JPA

  • OSIV의 동작 방식을 이해해둬라.
    • 트랜잭션 커밋은 메소드가 종료될 때 끝난다.
    • 그때, 모든 객체는 준영속 상태로 전환된다.
    • 그 이후 커넥션을 즉시 반환하느냐, 들고 있느냐의 차이
    • 커넥션 즉시 반환 - LazyInitializationException
    • 커넥션 지연 반환 - 지연 로딩
  • JPA는 @Transactional이 필수이다.
    • 스프링 데이터 JPA가 모든 메소드 앞에 @Transactional 을 붙여준 것일 뿐이다.
  • 어노테이션과 프록시를 항시 조심하라.
    • Spring AOP를 사용하는 기능에 특히 더욱 조심하라.
    • @Transactional
    • @Async

협업 & 코드 리뷰

  • 코드 리뷰 시에는, 항상 횡단 관심사로 적용되는 어노테이션 기능까지 같이 고려해서 읽자.
  • 코드도 여러번 반복해서 읽어야 한다. 하고자 하는 목적을 파악하고, 그 동작방식을 파악하고, 놓친 기능은 없는지 파악하자.
  • 프레임워크 사용 시에는 해당 프레임워크의 동작 방식까지 포함시켜 리뷰하자.