📅 TIL - 2025-12-02
✨ Keyword 요약
💻 코딩테스트
🔹 문제(프로그래머스)
🔹 풀이 접근 방식
- 사용한 알고리즘: 단순 문자열 치환(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의 특성(빠른 삭제)도 함께 고려해야 겠다.