![[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