미션

  • 워크북을 바탕으로 설계한 ERD에 대해서 정규화 작업을 진행할것
  • 서버에 요청 지연등의 원인으로 인해 중복 요청이 발생했을때 대응방법 고안

정규화?

데이터 정규화(normalization)이란 관계형 데이터베이스(RDBMS)에서 데이터의 중복을 줄이고 데이터를 정해진 형태에 맞추어 구조화하는 과정을 의미하며 이 형태는 총 6가지가 존재하며 각각 제 1 ~ 3 정규형 과 BCNF, 그리고 제 4~5 정규형 으로 구성되어져있다.

여기서는 가장 많이 사용되는 제 1~3정규형에 대해서 알아보는걸로 하자.

제 1 정규형(1NF)

테이블에 속한 모든 속성(컬럼)이 같은 도메인의 원자값으로만 구성되어져 있어야한다.

정규형 위반

위와 같이 각 인원들이 선호하는 음식 타입을 기록한다고 하자.

지금 위 사진을 보면 알겠지만 고길동에 경우 선호하는 음식 타입이 두 개 인 것을 확인할 수 있다.

그러나 위와 같이 복수의 데이터를 한 레코드에 몰아서 저장을하게 되면 추후 데이터를 찾을때 더 번거로워지고 검색 성능 또한 떨어지게 된다.

정규화 결과

이번에는 제 1 정규화를 진행한 결과이다.

고길동씨의 선호하는 음식 타입이 여러 레코드로 분리가 되어 저장된것을 볼 수 있다.

이렇게 데이터를 저장하게되면 정규화 전보다 더 간단한 쿼리를 통해 원하는 데이터를 검색하기 수월해지며

위와 같은 정규화를 진행함으로서 제 1 정규형을 만족하게 된다.

제 2 정규형(2NF)

기본 키가 아닌 모든 속성이 기본 키에 완전 함수 종속, 즉 연관이 있는 데이터 만이 테이블 컬럼 으로 존재 해야함.

정규형 위반

위 사례에서 이름과 선호하는 음식 타입 두 컬럼을 이용해 기본키로 활용하는 복합키로 볼때 이때 대표 음식 컬럼은 복합키 전체가 아닌 선호하는 음식 타입 컬럼에 만 종속되어 완전 함수 종속이 이루어지지 못하므로 제 2 정규형을 위반하는 것이 된다.

정규화 결과

위와 같이 두개의 테이블로 분리 함으로써 제 2 정규형을 만족하게 된다. 이를 통해 만야 대표음식 데이터가 변경된다고 할때 정규화 전보다 더 쉽고 더 적은 레코드만 수정할 수 있게 된다.

제 3 정규형(3NF)

테이블의 컬럼 중에서 기본키를 제외한 일반 컬럼에만 연관이 있는 컬럼이 존재하지 않아야 한다. (이행적 종속이 존재하지 않아야 한다.)

정규형 위반

위 사례에서 강사의 성별 정보는 강사 컬럼에만 종속되고 기본키와는 관련이 없고, 수업→강사→성별순으로 이행적 종속 관계가 존재하므로 제 3 정규형을 위반한것으로 볼 수 있다.

정규화 결과

위와 같이 강사의 성별 데이터를 가진 테이블을 별도로 분리함으로써 제 3 정규형을 만족하게 된다.

BCNF와 제 4,5 정규형에 경후 사용빈도가 낮아 이글에서는 생략한다.

정규화 실습

위 사진은 워크북에서 제시된 샘플 서비스를 기반으로 직접 설계한 ERD이다.

기본적으로 설계를 하는 과정에서부터 정규화를 어느정도 고려를 하며 설계하여 크게 정규화의 필요성이 보이는 테이블은 보이지는 않지만 ERD를 작성하면서 아래와 같은 방법으로 정규화를 실시간으로 진행하였다.

  • 먼저 유저 테이블과 유저 선호 음식 타입을 제 2 정규화를 기반으로 별도의 테이블로 분리하였고, 제 1 정규화 기법에 의거하여 유저가 선택한 복수의 선호 음식 타입을 각각의 레코드로 추가하도록 설계하였다.
  • 리뷰, 문의, 프로필에는 사진을 추가할 수 있는데 기능에 따라서는 복수의 사진을 추가할수있다. 각 테이블에 사진컬럼을 넣기에는 제 1 정규화와 제 2 정규화에 어긋나게 되기 때문에 사진만을 위한 별도의 테이블을 1차적으로 만들고 리뷰, 문의 , 프로필 기능에 각각 사진들을 매칭할 수 있는 총 3개의 매핑 테이블을 추가로 만들어서 설계하였다.

중복 요청 대응

예를 들어 프론트 단에서 유저가 미션 시작 버튼을 눌렀을때 여러가지 이유로 요청이 지연되어 완전히 처리되기전에 복수로 요청이 발생할 수 있다. 이를 방지하기 위해서는 프론트, 백에서 모두 대응을 하여 2중, 3중으로 유효성을 검사하는것이 좋다.

프론트

  • 미션 도전 버튼을 눌러 작업이 시작되었을때 별도의 state를 생성하여 작업 진행중 상태를 기억하도록 한다. 이 상태에 따라서 미션 도전 버튼의 활성화 여부를 제어하여 버튼이 연속으로 눌려 중복 요청이 되는 것을 방지한다.

  • 초단시간에 빈번한 요청이 발생하는 것을 막기위해 일종의 쿨타임 기능을 구현한다. 예를들어 쿨타임이 1초라면 버튼이 연속으로 눌려 요청이 다수 발생했을때 1초보다 짧은 중복 요청은 무시하도록 하여 중복 처리를 방지한다.
  • 미션 도전 요청이 발생했을때 이미 시작한 미션에 대해 DB에서 관련 레코드에 표식을 남겨 동일한 요청이 발생해도 이미 시작된 미션임을 확인후 오류를 반환하도록 한다.