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