![[Tistory] Category, Post 테이블 생성 (+복합 유니크 키 설정)](https://image.inblog.dev?url=https%3A%2F%2Finblog.ai%2Fapi%2Fog%3Ftitle%3D%255BTistory%255D%2520Category%252C%2520Post%2520%25ED%2585%258C%25EC%259D%25B4%25EB%25B8%2594%2520%25EC%2583%259D%25EC%2584%25B1%2520%28%252B%25EB%25B3%25B5%25ED%2595%25A9%2520%25EC%259C%25A0%25EB%258B%2588%25ED%2581%25AC%2520%25ED%2582%25A4%2520%25EC%2584%25A4%25EC%25A0%2595%29%26logoUrl%3Dhttps%253A%252F%252Finblog.ai%252Finblog_logo.png%26blogTitle%3DCoding_study&w=2048&q=75)
[ Category ]
package site.metacoding.blogv3.category;
import jakarta.persistence.*;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.hibernate.annotations.CreationTimestamp;
import site.metacoding.blogv3.post.Post;
import site.metacoding.blogv3.user.User;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
@Entity
@NoArgsConstructor
@Data
@Table(name = "category_tb", uniqueConstraints = {
@UniqueConstraint(columnNames = {"categoryName", "user_id"})
})
public class Category {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
private String categoryName;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "user_id")
private User user;
@CreationTimestamp
private LocalDateTime createdAt;
@Builder
public Category(Integer id, String categoryName, User user, LocalDateTime createdAt) {
this.id = id;
this.categoryName = categoryName;
this.user = user;
this.createdAt = createdAt;
}
}

복합 유니크 설정 되었음! 유저와 카테고리는 1 : N
[ 복합 유니크 설정 방법 ]
동일한 사용자가 동일한 카테고리 이름을 가질 수 없도록
categoryName과 user를 복합 유니크 키(Unique Key)로 설정해야 함
[ User user 같은 경우는 명시적으로 [ user_id ] 로 설정 ]
User user 같은 경우는 명시적으로 [ user_id ] 로 설정해줘야한다.
그냥 user만 columnNames에 걸면 아래와 같은 에러 발생.
categoryName은 필드랑 이름을 맞춰주던가,
아니면 user처럼 @JoinColumn을 사용해서 명시적으로 이름을 지정해줘도 된다.

[ Post ]
package site.metacoding.blogv3.post;
import jakarta.persistence.*;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.hibernate.annotations.CreationTimestamp;
import site.metacoding.blogv3.category.Category;
import site.metacoding.blogv3.image.Image;
import site.metacoding.blogv3.user.User;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
@Entity
@NoArgsConstructor
@Data
@Table(name = "post_tb")
public class Post {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
private String title;
@Lob
private String content;
@ManyToOne(fetch = FetchType.LAZY)
private User user;
@ManyToOne(fetch = FetchType.LAZY)
private Category category;
private String thumbnailFile; //섬네일
@CreationTimestamp
private LocalDateTime createdAt;
@Builder
public Post(Integer id, String title, String content, User user, Category category, String thumbnailFile, LocalDateTime createdAt) {
this.id = id;
this.title = title;
this.content = content;
this.user = user;
this.category = category;
this.thumbnailFile = thumbnailFile;
this.createdAt = createdAt;
}
}
post랑 카테고리는 N : 1
post랑 이미지는 1 : N
[ 더미 ]
-- 유저 더미
INSERT INTO user_tb (username, password, email, email_confirm, created_at)
VALUES ('ssar', '1234', 'ssar@nate.com', true, now());
INSERT INTO user_tb (username, password, email, email_confirm, created_at)
VALUES ('cos', '1234', 'cos@nate.com', true, now());
INSERT INTO user_tb (username, password, email, email_confirm, created_at)
VALUES ('love', '1234', 'love@nate.com', true, now());
-- 유저 더미 끝
-- 카테고리 더미 (it도 넣기)
INSERT INTO category_tb (category_name, user_id, created_at)
VALUES ('여행', '1', now());
INSERT INTO category_tb (category_name, user_id, created_at)
VALUES ('동물', '1', now());
INSERT INTO category_tb (category_name, user_id, created_at)
VALUES ('동물/여행', '2', now());
INSERT INTO category_tb (category_name, user_id, created_at)
VALUES ('음식', '2', now());
INSERT INTO category_tb (category_name, user_id, created_at)
VALUES ('다이어트', '3', now());
-- 카테고리 더미 끝
-- 게시글(포스트) 더미
INSERT INTO post_tb (title, content, user_id, category_id, thumbnail_file, created_at)
VALUES ('스위스 13박 14일 여행 후기❤', '스위스에서 보낸 13박 14일 여행 후기!! 아름다운 자연 경관과 맛있는 음식들을 즐길 수 있었습니다.', 1, 1, 'swiss.jpg', NOW()),
('여름에 일본 빨리 갔다오기 (자유 여행)', '안녕하세요~ 오늘은 일본 여행에 대한 포스팅을 해보려고 해요!! 이번 여름에 일본을 갔다왔는데, 덥더라구요~~~', 1, 1, 'japan.jpg', NOW()),
('강아지와의 만남', '산책 나갔을 때 보았던 강아지!', 1, 2, 'dog.jpg', NOW()),
('고양이 집사의 하루 (네로와 함께)', '우리 집 고양이 네로와 함께하는 하루 이야기를 들려드립니다.', 1, 2, 'cat.jpg', NOW()),
('요리 레시피 - 마르게리타 피자', '간단하지만 맛있는 마르게리타 피자 만들기! 레시피를 공유합니다~ 아이들 점심 식사나 간식으로 좋아요^^', 2, 4, 'pizza.jpg', NOW()),
('맛있는 파스타 만들기', '집에서 직접 만든 맛있는 파스타 레시피를 공유합니다.', 2, 4, 'pasta.jpg', NOW()),
('뉴질랜드 가보신분? (저요! 🙋♀️)', '뉴질랜드의 아름다운 바다 풍경을 담은 사진입니다 ^^', 2, 3, 'newZealand.jpg', NOW()),
('홈트레이닝 다이어트 루틴', '집에서 운동하는 분들을 위한 효과적인 홈트레이닝 루틴을 소개합니다.', 3, 5, 'exercise.jpg', NOW());
-- ('IT 기술 동향 - 5G 네트워크 발전', '최근 5G 네트워크 기술의 발전 동향과 향후 전망에 대해 정리해보았습니다.', 5, 2, '5g_network.jpg', NOW()),
[ 카테고리 ]
여행, 동물, 취미, 음식, 다이어트, IT, 일상, 게임 ...
Share article