작품 갤러리 서비스에서 “좋아요” 기능을 제대로 구현하려면 누가 어떤 작품에 좋아요를 눌렀는지를 저장하는 구조가 필요하다. 이걸 위해 가장 많이 쓰는 테이블 설계 방식을 정리한다.
테이블 구조 예시 ** 보통 서비스에는 이미 **사용자(users), 작품(artworks) 테이블이 있고, “좋아요(likes)”는 아래처럼 추가로 설계한다.
| 테이블명 | 주요 컬럼 | 설명 |
|---|
| users | id (PK), username | 사용자 정보 |
| artworks | id (PK), title | 작품 정보 |
| likes | id (PK), user_id (FK), artwork_id (FK), liked_at | 누가, 어느 작품에, 언제 좋아요를 눌렀는지 기록 |
(user_id, artwork_id) 조합은 UNIQUE로 둬서 한 유저가 ** **같은 작품에 여러 번 누르지 못하게 한다.
실제 SQL 테이블 예시
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
| -- 사용자 테이블
CREATE TABLE users (
id INTEGER PRIMARY KEY,
username TEXT NOT NULL
);
-- 작품 테이블
CREATE TABLE artworks (
id INTEGER PRIMARY KEY,
title TEXT NOT NULL
);
-- 좋아요 테이블
CREATE TABLE likes (
id INTEGER PRIMARY KEY AUTOINCREMENT,
user_id INTEGER NOT NULL,
artwork_id INTEGER NOT NULL,
liked_at DATETIME DEFAULT CURRENT_TIMESTAMP,
UNIQUE(user_id, artwork_id), -- 중복 좋아요 방지
FOREIGN KEY(user_id) REFERENCES users(id),
FOREIGN KEY(artwork_id) REFERENCES artworks(id)
);
|
- 신뢰성 있는 인기 집계 → 한 명이 여러 번 누를 수 없으니, “좋아요 수”가 작품 인기의 신뢰성 있는 지표가 된다.
- 악용 및 어뷰징 방지 → 스팸 클릭, 봇, 어뷰징에 강하다.
- 다양한 기능 확장 → 내가 누른 작품 표시, 좋아요 취소(토글), 인기 작품 정렬, 추천인 알림 등 다양한 확장이 쉽다.
- 언제, 누가, 어떤 작품에 좋아요를 눌렀는지 명확하게 기록할 수 있다.
1
2
| INSERT INTO likes (user_id, artwork_id) VALUES (1, 2);
|
1
| INSERT INTO likes (user_id, artwork_id) VALUES (1, 2);
|
1
| DELETE FROM likes WHERE user_id = 1 AND artwork_id = 2;
|
1
| SELECT COUNT(*) FROM likes WHERE artwork_id = 2;
|
1
| SELECT artwork_id FROM likes WHERE user_id = 1;
|
결론 ** **이렇게 “누가 어떤 작품에 좋아요를 눌렀는지”를 별도의 테이블로 관리하면 서비스가 커져도 확장성, 안정성, 신뢰성을 모두 챙길 수 있다. 갤러리 서비스라면 꼭 이렇게 설계하는 걸 추천!