[TIL | 내일배움캠프] CH5 - ERD 설계

변채주·2025년 12월 2일

Spring

목록 보기
10/13

📅 TIL - 2025-12-02

✨ Keyword 요약

  • dbdiagram 활용해 ERD 설계하기

💻 코딩테스트

🔹 문제(프로그래머스)

🔹 풀이 접근 방식

  • 사용한 알고리즘: 단순 문자열 치환(replace?)
  • 시간복잡도: O(n)
  • 예외 처리나 경계 조건:
    숫자 문자열은 변하지 않을 값이니 Enum으로 정의해두면 나중에 수정하기 편할 것이라 생각했다. 근데 다른 사람의 풀이를 보니 map이나 문자열 배열String[]을 주로 사용했더라. 코딩테스트에서는 Enum까지는 잘 안 쓰는 것으로 보인다. 내가 너무 범위를 크게 생각했던 걸까?

🔹 New / Review

  • REVIEW - String.replaceAll(바꿀 문자열, 대체할 문자열)

🔹 코드 스니펫

class Solution {
    public int solution(String s) {
        for (NumberCase n : NumberCase.values()) {
            s = s.replaceAll(n.getName(), n.getValue());
        }
        return Integer.parseInt(s);
    }

    public enum NumberCase {
        ZERO("zero", "0"),
        ONE("one", "1"),
        TWO("two", "2"),
        THREE("three", "3"),
        FOUR("four", "4"),
        FIVE("five", "5"),
        SIX("six", "6"),
        SEVEN("seven", "7"),
        EIGHT("eight", "8"),
        NINE("nine", "9");

        String name;
        String value;

        NumberCase(String name, String value) {
            this.name = name;
            this.value = value;
        }

        public String getName() {
            return name;
        }

        public String getValue() {
            return value;
        }
    }
}

📓 (과제) CH5 실시간 투표시스템

🔹 ERD 설계

  • dbdiagram 활용
Table Votes {
  id bigint [pk, increment] 
  title varchar(30)
  author varchar(30)
  status varchar
  total_votes bigint
  created_at timestamp
  closed_at timestamp

  author_id bigint [ref:> Users.id]
}

Table Users {
  id bigint [pk, increment]
  login_id varchar
  nickname varchar
  created_at timestamp
}

Table Candidates {
  id bigint [pk, increment]
  name varchar(30)
  vote_count int
  
  title_id bigint [ref:> Votes.id]
}

Table VoteRecord {
  voted_at timestamp
  updated_at timestamp

  candidate_id bigint [ref:> Candidates.id]
  vote_id bigint [ref:> Votes.id]
  user_id bigint [ref:> Users.id]
}

🔹 실습 내용

  • 아직 강의를 다 수강하지 못해서인지 제공된 프로젝트 내용을 다 파악하지 못했다.
    그러나 README가 상세하게 적혀있어서 일단 정독했다.
    node.js와 npm을 업데이트해준 뒤 '빠른 시작' 방법대로 npm run dev로 로컬호스트에서 실행해봤다.

    아직 Entity를 설정하지 않아 제대로된 멤버 이름이 보이지 않는 상태다.

📝 회고 및 메모

  • 메모 겸 금주 계획(강의+과제)
    • 강의 1차 완강을 목표로!
      강의 내용이 실습 위주이고 세세한 코드나 팁을 설명해주고 있어서 일단 한번 싹~들어보고 작업 순서를 체계적으로 세워야겠다고 생각했다.
  • 고민 해결하기
    실시간 통신이나 DB 활용량(비용)을 고려해야 하니 고민이 된다. 예를 들어 ERD에 작성해 둔 투표Votes 테이블의 경우, 작성자(author, author_id)는 투표 하나가 생성될 때 처음 등록되고 그 이후 변하지 않는 값이므로 컬럼으로 저장하기로 결정했으나 총 투표수(total_votes)는 통신 1회가 끝날 때마다 상태가 업데이트되어야 한다.내가 Websocket 통신 방식을 제대로 이해한게 맞다면...
    그렇게 된다면 쿼리가 author에 비해 여러번 발생하는 게 아닐까? 응답을 보낼 때마다 계산으로 처리하는 방식과 Vote의 필드로 지정하고 상태 저장까지 하는 방법, 어느 게 더 DB 사용을 덜 하고 효율적인 방식일까?
    이번 프로젝트는 Redis를 활용할 예정이니 Redis의 특성(빠른 삭제)도 함께 고려해야 겠다.
profile
우당탕탕얼레벌레 개발 일지

0개의 댓글