1. ERD(엔티티 관계 다이어그램, Entity Relationship Diagram)란 무엇인가?

ERDEntity Relationship Diagram의 약자로,
데이터베이스에서 테이블 간의 관계를 시각적으로 표현한 다이어그램입니다. 이 다이어그램을 통해 데이터베이스의 구조를 한눈에 파악할 수 있으며, 테이블 간의 연관성, 주요 필드(컬럼), 그리고 데이터 흐름을 직관적으로 알 수 있습니다.

2. ERD를 왜 사용하나요?

  • 데이터베이스 설계:
    프로젝트나 시스템의 데이터베이스 구조를 설계할 때,
    테이블 간의 관계를 미리 정의하고,
    각 테이블에 어떤 데이터가 들어가는지 시각화합니다.
  • 데이터 흐름 이해:
    각 테이블이 어떤 식으로 연결되고 데이터를 주고받는지 쉽게 이해할 수 있습니다.
  • 효율적인 커뮤니케이션:
    개발자뿐 아니라 디자이너, 기획자 등 다양한 팀원이 데이터베이스 구조를 쉽게 이해할 수 있도록 도와줍니다.
  • 문제 파악:
    데이터베이스 구조의 문제점을 미리 파악하고, 개선할 수 있는 기회를 제공합니다.

3. ERD 사용법

  • 엔티티(Entity):
    데이터를 저장하는 테이블을 나타냅니다.
    예를 들어, MEMBER(회원), DOCUMENT(문서) 같은 테이블들이 엔티티입니다.
  • 속성(Attribute):
    각 엔티티에 포함된 필드(컬럼)를 나타냅니다. 예를 들어, MEMBER 엔티티의 MemberID, Name, Gender 등이 속성입니다.
  • 관계(Relationship):
    엔티티 간의 관계를 나타냅니다.
    예를 들어, MEMBERDOCUMENTMemberID를 통해 연결됩니다.

4. ERD 사용 시 유의사항

  • 정규화:
    중복된 데이터를 최소화하고, 효율적인 데이터 저장을 위해 테이블을 적절히 나누는 것이 중요합니다.
  • 외래 키(Foreign Key) 설정:
    테이블 간의 관계를 정확하게 정의하고,
    외래 키를 통해 연결된 테이블 간의 참조 무결성을 유지해야 합니다.
  • 확장성 고려:
    ERD는 현재 시스템뿐만 아니라 미래의 확장성을 고려하여 설계해야 합니다. 추가될 가능성이 있는 기능과 테이블을 미리 염두에 두고 설계하는 것이 중요합니다.

5. 이 프로젝트의 ERD 분석

이 프로젝트의 ERD를 분석하여 각 테이블의 역할과 시스템이 어떻게 설계되어 있는지 살펴보겠습니다.

주요 엔티티 및 기능:

  1. MEMBER(회원):

    • 기능:
      사용자(회원)의 기본 정보를 관리하는 테이블입니다.
      사용자 이름, 비밀번호, 실명, 닉네임, 성별, 계정 생성일 등 중요한 정보가 저장됩니다.
    • 프로필(Profile)과 연결되어, 사용자는 자신만의 테마와 언어를 설정할 수 있습니다.
  2. DOCUMENT(문서):

    • 기능:
      사용자가 소유한 각종 증명서(여권, 운전면허증, 주민등록증 등)를 저장하고 관리하는 테이블입니다. 해당 문서에 연결된 파일이나 이미지 경로, 발급일, 만료일 등과 같은 정보가 저장됩니다.
    • MEMBER1:1 관계로 연결되어 있으며, 사용자의 신분증 정보들을 관리합니다.
  3. PASSPORT(여권):

    • 기능:
      여권 정보를 저장하는 테이블입니다.
      여권 발급 국가, 생년월일, 발급일, 만료일, 성별 등의 정보를 포함하며, 여권의 이미지 파일 경로도 함께 저장됩니다.
  4. DRIVER_LICENSE(운전 면허증):

    • 기능:
      사용자의 운전면허증 정보를 관리하는 테이블입니다.
      이름, 주소, 발급일, 만료일 등 운전면허증 관련 정보가 저장됩니다.
  5. RESIDENT_REGISTRATION_CARD(주민등록증):

    • 기능:
      사용자의 주민등록증 정보를 관리합니다.
      주소, 발급일, 발급 기관 등의 정보와 주민등록증의 이미지 경로가 저장됩니다.
  6. SNS(커뮤니티 게시판):

    • 기능:
      사용자가 작성한 게시글을 관리하는 테이블입니다.
      게시글의 제목, 내용, 이미지 경로, 위치 정보 등이 저장되며, MEMBER와 연결되어 누가 작성했는지 관리합니다.
    • COMMENT(댓글)LIKE(좋아요)를 통해 게시글에 대한 피드백을 저장합니다.
  7. TRAVEL_CERTIFICATE(여행 증명서):

    • 기능:
      사용자의 여행 기록을 증명하는 문서를 관리하는 테이블입니다. 방문한 국가, 여행일자, 이미지 경로 등을 저장합니다.
    • DOCUMENT와 연결되어 있으며, 여행 증명서 정보가 포함됩니다.
  8. BUSINESS_CARD(명함):

    • 기능:
      명함 정보를 관리하는 테이블입니다. 사용자의 이름, 소속 회사, 이메일, 전화번호, QR 코드 등의 정보가 저장됩니다. RECEIVED_BUSINESS_CARD를 통해 받은 명함도 관리됩니다.
  9. INTERNATIONAL_STUDENT_CARD(국제 학생증):

    • 기능: 사용자의 국제 학생증 정보를 저장하는 테이블입니다. 생년월일, 학교 이름, 학적 상태, 만료일 등의 정보가 포함됩니다.

6. 이 프로젝트의 주요 정보 요약

이 프로젝트는 회원 관리 시스템과 문서(여권, 운전면허증 등) 및 증명서(여행 증명서, 예방 접종 증명서 등)를 관리하는 기능을 포함하고 있습니다. 또한, SNS와 같은 게시판 기능도 포함되어 사용자가 게시글을 작성하고 피드백을 주고받을 수 있습니다. 이를 통해 사용자 정보를 관리하고 다양한 문서를 저장 및 조회하는 시스템을 구축할 수 있습니다.



개발자가 앞서 설명한 정보를 활용하여 프로젝트를 진행할 때,
데이터베이스 설계, API 개발, 비즈니스 로직 구현 등 여러 작업을 효율적으로 할 수 있습니다. 이제 구체적으로 ERD(엔티티 관계 다이어그램)를 어떻게 활용하고, 프로젝트 작업 과정에서 어떤 방식으로 이를 적용할 수 있는지 설명하겠습니다.


1. 데이터베이스 설계 및 구축

ERD는 데이터베이스 설계의 기본입니다.
개발자는 ERD를 보고 테이블 간의 관계를 이해하고,
각 테이블을 데이터베이스에 정확하게 설계하고 구축합니다.

활용 방법:

  • 테이블 생성:
    각 엔티티(예: MEMBER, DOCUMENT 등)를 데이터베이스 테이블로 생성하고, 속성(컬럼)을 명시한 대로 정의합니다.

    CREATE TABLE MEMBER (
        MemberID INT PRIMARY KEY AUTO_INCREMENT,
        ProfileID INT,
        UserName VARCHAR(50),
        Password VARCHAR(255),
        Name VARCHAR(50),
        Nickname VARCHAR(30),
        Gender VARCHAR(10),
        CreatedAt TIMESTAMP DEFAULT CURRENT_TIMESTAMP
    );
  • 외래 키(Foreign Key) 설정:
    테이블 간의 관계를 ERD에서 정의한 대로 설정합니다.
    예를 들어, DOCUMENT 테이블과 MEMBER 테이블은 MemberID로 연결됩니다.

    CREATE TABLE DOCUMENT (
        DocumentID INT PRIMARY KEY AUTO_INCREMENT,
        MemberID INT,
        PassportID INT,
        DriverLicenseID INT,
        FOREIGN KEY (MemberID) REFERENCES MEMBER(MemberID)
    );

2. API 개발

ERD를 참고하여, API의 엔드포인트를 설계할 때 사용됩니다.
어떤 데이터를 받아야 하고, 어떤 데이터를 반환해야 하는지 명확히 정의할 수 있습니다.

활용 방법:

  • 회원 가입 및 로그인 API:
    MEMBER 테이블에 맞춰, 회원 가입 시 필요한 데이터를 받고 이를 INSERT합니다.

    • 회원 가입 API 예시: <자바스크립트>
      app.post('/register', async (req, res) => {
          const { userName, password, name, nickname, gender } = req.body;
          const hashedPassword = await bcrypt.hash(password, 10);
          const newUser = await db.query(
              `INSERT INTO MEMBER (UserName, Password, Name, Nickname, Gender) VALUES (?, ?, ?, ?, ?)`,
              [userName, hashedPassword, name, nickname, gender]
          );
          res.json({ message: "User registered successfully" });
      });
  • 문서 업로드 및 관리 API:
    DOCUMENT 테이블을 기반으로 사용자가 각종 문서(여권, 운전면허증 등)를 등록하거나 조회할 수 있는 API를 개발합니다.

    • 문서 조회 API 예시:
      app.get('/documents/:memberId', async (req, res) => {
          const { memberId } = req.params;
          const documents = await db.query(
              `SELECT * FROM DOCUMENT WHERE MemberID = ?`, [memberId]
          );
          res.json(documents);
      });

3. 비즈니스 로직 구현

ERD를 보고 비즈니스 로직을 설계하고 구현할 수 있습니다. 테이블 간의 관계를 기반으로 각 엔티티가 어떻게 상호작용하는지를 설계하고, 이를 통해 실제 로직을 구현합니다.

활용 방법:

  • 회원 문서 관리:
    MEMBERDOCUMENT 테이블의 관계를 기반으로,
    사용자가 자신의 문서를 업로드하거나 수정할 수 있는 로직을 작성합니다.

    • 사용자가 문서를 업로드할 때, DOCUMENT 테이블과 관련된 하위 테이블(예: PASSPORT, DRIVER_LICENSE)도 업데이트됩니다.
    • 예를 들어, 사용자가 자신의 여권 정보를 업데이트하려면 DOCUMENT 테이블과 PASSPORT 테이블이 함께 업데이트됩니다.
  • SNS 기능 구현:
    SNS 테이블과 MEMBER, LIKE, COMMENT 테이블의 관계를 활용하여, 게시글 작성 및 좋아요, 댓글 기능을 구현할 수 있습니다.

    • 게시글에 좋아요를 누르면 LIKE 테이블에 기록되며, BoardIDMemberID를 기반으로 연결됩니다.
    • 댓글을 작성하면 COMMENT 테이블에 BoardIDMemberID가 저장되며, 이 관계를 기반으로 게시글의 댓글을 불러올 수 있습니다.

4. 데이터 흐름 및 트랜잭션 관리

ERD를 통해 데이터를 어떻게 주고받는지 파악할 수 있기 때문에, 개발자는 효율적으로 데이터 흐름을 설계할 수 있습니다.

활용 방법:

  • 트랜잭션 처리:
    여러 테이블에 걸친 작업이 이루어질 때, 트랜잭션을 적용하여 데이터 무결성을 보장할 수 있습니다.
    • 예를 들어, 사용자가 명함을 저장하고 동시에 자신의 문서를 업데이트하는 작업을 할 때, 두 작업이 모두 성공해야만 최종적으로 커밋(commit)됩니다. 하나라도 실패하면 롤백(rollback)하여 데이터 불일치를 방지합니다.

5. 정규화 및 데이터 중복 방지

ERD를 보고 테이블 간의 관계를 잘못 정의하면 데이터 중복이 발생할 수 있기 때문에, 정규화를 통해 중복 데이터를 최소화하는 설계를 진행할 수 있습니다.

활용 방법:

  • 정규화 적용: 데이터를 중복 저장하지 않고, 관계를 통해 필요한 정보를 가져올 수 있도록 테이블을 분리합니다.
    • 예를 들어, DOCUMENT 테이블에서 여권 정보는 PASSPORT 테이블에 따로 저장되며, DocumentID로 연결됩니다. 이렇게 함으로써, 중복된 데이터를 줄이고 각 테이블에서 필요한 정보만 저장하도록 설계합니다.

6. 데이터 유효성 검사

ERD를 보고 각 필드의 속성(예: VARCHAR, INT)을 정의하여, 데이터의 유효성을 검사할 수 있습니다.

활용 방법:

  • 유효성 검사 구현:
    예를 들어, MemberIDINT 타입이고, UserNameVARCHAR(50)로 제한되어 있습니다. 따라서 API에서 데이터를 받을 때 이러한 속성을 고려해 유효성 검사를 구현할 수 있습니다.
    • 유효성 검사 예시:
      <자바스크립트>
      if (typeof userName !== 'string' || userName.length > 50) {
          return res.status(400).json({ error: 'Invalid username' });
      }

결론

이 ERD를 통해 개발자는 프로젝트의 전반적인 데이터베이스 구조를 쉽게 이해할 수 있고, 이를 기반으로 데이터베이스 테이블을 생성하고, API를 개발하며, 비즈니스 로직을 구현할 수 있습니다. 테이블 간의 관계를 정확하게 파악함으로써 효율적인 데이터 흐름을 설계할 수 있으며, 정규화 및 유효성 검사를 통해 데이터의 무결성과 일관성을 유지할 수 있습니다.

0개의 댓글