무결성이란
: 정보가 서로 모순이 없고 일관적이라는 뜻.
무결성 위배되는 경우
: 사용자 중복 검사를 시행할 때,
- 사용자 A 가 회원 등록 시도 => 중복 검사 => 중복되지 않음!
- (사용자 A 의 회원 등록이 db 에 적용되기 전)
사용자 B 가 동일한 회원 등록 시도 => 중복검사 => 중복 안됨! - 사용자 A 의 회원 정보 저장
- 사용자 B 가 A와 동일한 회원 정보 저장
데이터 무결성을 지키는 방법
1. 유일 키 제약
: 가장 강력한 수단이지만, 코드 상으로 드러나지 않고 비지니스 코드가 db 에 의존적이라는 단점이 존재. 트랜젝션과 함께 사용하는 것이 좋다.
2. 트랜젝션
1. db 트랜젝션 객체 이용
: 아래 코드는 트랜잭션 코드를 통해 무결성을 확보한다. 하지만 이 경우에는 인프라 객체인 conn 에 의존하게 된다는 문제가 있다. 관계형 데이터베이스에 기초한 객체이기 때문에, 인메모리나 noSql 등의 데이터베이스를 사용하게 된다면 사용할 수 없게된다. 특성 기술에 의존하는 코드는 위험하다.
try {
int id = Integer.parseInt(idValue);
conn = DriverManager.getConnection(jdbcDriver, dbUser, dbPass); // connection 객체를 이용해 트랜젝션 사용
conn.setAutoCommit(false); // 트랜젝션의 자동 커밋 비활성
pstmtItem = conn.prepareStatement("insert into ITEM values (?, ?)");
pstmtItem.setInt(1, id);
pstmtItem.setString(2, "상품 이름 " + id);
pstmtItem.executeUpdate()
pstmtDetail = conn.prepareStatement(
"insert into ITEM_DETAIL values (?, ?)");
pstmtDetail.setInt(1, id);
pstmtDetail.setString(2, "상세 설명 " + id);
pstmtDetail.executeUpdate();
conn.commit(); // 트랜젝션 커밋
} catch(Throwable e) {
/* ...생략... */
} finally {
/* ...생략... */
}
2. 트랜젝션 패턴
: 데이터 무결성을 확보하는 것은 분명히 추상화 수준이 낮은 특정 기술 기반의 역할이다. 하지만 무결성이라는 개념 자체가 특정 기술에 뿌리를 둘 만큼 추상화 수준이 낮은 개념이 아니다. 따라서 비지니스 로직에는 데이터 무결성을 확보하기 위한 구체적인 구현 코드보다는 '이 부분에서 데이터 무결성을 확보해야 한다'는 것을 명시적으로 보여주는 코드가 담겨야 한다.
: 아래는 실제 inhabas.com 을 Django 로 구현하면서 사용했던 트랜젝션 관련 코드이다.
# 게시글 등록 시 파일과 함께 트랙젝션 처리
# 파일 등록에 실패하면, 게시글 저장도 실패
if board_form.is_valid() and file_form.is_valid():
with transaction.atomic():
# ...생략... #
board = board_form.save(**board_param)
file_form.save(instance=board)
create_board_notice_alarm(board)
return redirect("board_detail", board_no=board.board_no)
3. AOP 패턴 이용
: java 에서 쉽게 볼 수 있는 패턴이다. @Transactional 어노테이션을 이용하여, 코드를 수정하지 않고 적용할 수 있다. 파이썬의 데코레이터로도 비슷한 효과를 낼 수 있다.
4. 레파지토리 패턴 이용
: 어떤 객체의 변경 사항을 기록하는 객체이다. 객체를 읽어들일 때 레파지토리가 객체의 상태를 기록한다. 대상 객체가 변경되거나 삭제돼도 레파지토리가 이를 모르는 상태에서는 데이터스토어에 변화가 반영되지 않는다. 이러한 패턴을 적용하면 퍼시스턴시 대상이 되는 객체의 생성, 변경, 삭제 등의 동작이 모두 레파지토리를 통하게 된다. 자바의 JPA 같은 느낌이다.
'책 > 도메인 주도 설계 철저 입문' 카테고리의 다른 글
[도메인 주도 설계 철저 입문] 12. 도메인의 규칙을 지키는 "어그리게이트" (0) | 2022.04.29 |
---|---|
[도메인 주도 설계 철저 입문] 7. 의존 관계 제어 (0) | 2022.03.11 |
[도메인 주도 설계 철저 입문] 6. 어플리케이션 서비스 - 도메인 서비스와의 분리! (0) | 2022.03.10 |
[도메인 주도 설계 철저 입문] 5. 레파지토리 - 데이터와 관계된 처리를 분리하자 (0) | 2022.03.08 |
[도메인 주도 설계 철저 입문] 4. 도메인 서비스 - 부자연스러운 도메인 객체의 행동을 맡기자 (0) | 2022.03.08 |