정규화 적용 및 중복 요청 처리 방법

kimyuchan·2025년 3월 24일
0

ERD 설계 과정과 정규화(1NF, 2NF, 3NF) 적용

이 글은 Figma로 제공된 요구사항을 기반으로 ERD를 설계하고, 제1정규형부터 제3정규형까지 단계별로 적용하며 데이터의 중복 문제를 해결해 나가는 과정을 설명합니다.

1. 초기 ERD 설계 (비정규형)

처음에는 모든 정보를 하나의 테이블에 넣거나 반복 컬럼 형태로 구성하는 경우가 있습니다.

예를 들어 사용자 테이블(User)에 다음과 같은 구조가 있습니다.

user_id | email | password | gender | favorite_food1 | favorite_food2 | favorite_food3

이러한 형태는 다음 문제를 발생시킵니다.

  • 반복 컬럼 (favorite_food1, 2, 3)
  • 데이터 중복 및 확장 어려움

2. 제1정규형(1NF) 적용

1NF의 목적은 반복 컬럼을 제거하고 모든 컬럼을 원자값으로 만드는 것입니다.

변경된 구조:

  • 사용자(User) 테이블과 선호 음식(UserFavoriteFood) 테이블로 분리합니다.
User(user_id, email, password, gender)
UserFavoriteFood(user_favorite_food_id, user_id, food_id)
Food(food_id, food_name)

장점

  • 반복 속성 제거로 인해 중복 저장 방지
  • 데이터 추가/삭제 용이

3. 제2정규형(2NF) 적용

2NF는 복합키 중 일부에만 의존하는 속성(부분 종속)을 제거하는 것입니다.

예시로 UserMission 테이블을 봅시다.

UserMission(user_id, mission_id, status, completed_at, user_name)

여기서 user_name은 user_id에만 의존하므로 부분 함수 종속에 해당됩니다.

해결 방법:

  • user_name을 User 테이블로 이동합니다.
UserMission(user_mission_id, user_id, mission_id, status, completed_at)
User(user_id, user_name, email, password, gender)

장점

  • 부분 함수 종속 제거로 데이터 무결성 증가
  • 중복 데이터 관리 문제 방지

4. 제3정규형(3NF) 적용

3NF는 이행적 종속을 제거합니다. 즉, A → B, B → C 관계를 A → C 관계로 바꾸어 테이블을 나누는 과정입니다.

문제 상황:

Store(store_id, store_name, region_name, region_code)

여기서 region_name과 region_code는 region_id에 의존합니다.

해결 방법:

  • Region 테이블을 분리하여 이행적 종속을 제거합니다.
Store(store_id, store_name, region_id)
Region(region_id, region_name, region_code)

장점

  • 데이터 일관성 및 무결성 증가
  • 중복 저장 최소화 및 변경 관리 용이

최종 ERD 구조

중복 요청 처리 방법

사용자가 버튼을 빠르게 여러 번 클릭할 때 중복 요청이 발생할 수 있습니다. 이를 방지하기 위한 방법:

프론트엔드

  • 버튼 비활성화(disabled)
  • 로딩 스피너로 처리 중임을 시각적으로 안내

백엔드

멱등성 키(Idempotency Key) 사용

  • 요청 시 고유한 키(UUID 등)를 함께 보내 서버가 중복 요청 여부를 판단하도록 합니다.
  • 이미 처리된 요청이면 서버가 무시하거나 기존 응답을 재전송합니다.

유니크 제약(Unique Constraint) 적용

  • 데이터베이스의 특정 칼럼 또는 복합 키에 유니크 제약을 설정하여 중복 데이터 삽입을 방지합니다.

낙관적/비관적 락(Optimistic/Pessimistic Lock) 적용

  • 낙관적 락: 데이터 업데이트 시 버전(version)을 체크해 충돌 시 재시도 또는 취소합니다.
  • 비관적 락: 특정 데이터 접근 시 락을 걸어 동시 접근을 차단합니다.

분산 락(Redis)을 활용한 동시성 제어

  • Redis와 같은 인메모리 저장소를 사용하여 특정 작업에 대해 분산 환경에서도 락을 설정할 수 있습니다.
  • 작업이 끝나면 락을 해제하여 다른 요청이 처리될 수 있게 합니다.

최적의 접근 방법

프론트엔드에서 기본적인 중복 요청을 차단하고, 백엔드에서 멱등성 키와 유니크 제약을 통해 완전한 무결성을 보장하는 혼합 방식을 적용해야 합니다.

결론

1NF, 2NF, 3NF를 적용하여 데이터 중복을 최소화하고, 데이터 무결성을 강화했습니다. 또한, 중복 요청 문제에 대한 다양한 해결 방법을 생각해보았습니다.

profile
Learn from yesterday, live for today, hope for tomorrow

0개의 댓글