Skip to content

Commit 69ed889

Browse files
authored
Ref: 샘플 데이터 초기화 로직 개선 (#239)
1 parent 76134fa commit 69ed889

File tree

3 files changed

+141
-120
lines changed

3 files changed

+141
-120
lines changed

src/main/java/com/back/domain/board/post/entity/PostCategory.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ public class PostCategory extends BaseEntity {
2424
private CategoryType type;
2525

2626
@OneToMany(mappedBy = "category", cascade = CascadeType.ALL, orphanRemoval = true)
27-
private List<PostCategoryMapping> postCategoryMappings;
27+
private List<PostCategoryMapping> postCategoryMappings = new ArrayList<>();
2828

2929
// -------------------- 생성자 --------------------
3030
public PostCategory(String name, CategoryType type) {
Lines changed: 6 additions & 119 deletions
Original file line numberDiff line numberDiff line change
@@ -1,61 +1,42 @@
11
package com.back.global.initData;
22

3-
import com.back.domain.board.comment.entity.Comment;
4-
import com.back.domain.board.comment.repository.CommentRepository;
5-
import com.back.domain.board.post.entity.Post;
6-
import com.back.domain.board.post.entity.PostCategory;
7-
import com.back.domain.board.post.repository.PostCategoryRepository;
8-
import com.back.domain.board.post.repository.PostRepository;
9-
import com.back.domain.user.entity.User;
10-
import com.back.domain.user.entity.UserProfile;
11-
import com.back.domain.user.entity.UserStatus;
12-
import com.back.domain.user.repository.UserRepository;
133
import lombok.RequiredArgsConstructor;
144
import org.springframework.boot.ApplicationRunner;
155
import org.springframework.context.annotation.Bean;
166
import org.springframework.context.annotation.Configuration;
177
import org.springframework.context.annotation.Profile;
188
import org.springframework.core.io.ClassPathResource;
199
import org.springframework.jdbc.datasource.init.ResourceDatabasePopulator;
20-
import org.springframework.security.crypto.password.PasswordEncoder;
21-
import org.springframework.transaction.annotation.Transactional;
2210

2311
import javax.sql.DataSource;
2412
import java.sql.Connection;
2513
import java.sql.ResultSet;
2614
import java.sql.Statement;
27-
import java.util.List;
2815

2916
@Configuration
3017
@Profile("default")
3118
@RequiredArgsConstructor
3219
public class DevInitData {
3320
private final DataSource dataSource;
34-
private final UserRepository userRepository;
35-
private final PostRepository postRepository;
36-
private final CommentRepository commentRepository;
37-
private final PostCategoryRepository postCategoryRepository;
38-
private final PasswordEncoder passwordEncoder;
21+
private final DevInitService devInitService;
3922

4023
@Bean
4124
ApplicationRunner DevInitDataApplicationRunner() {
4225
return args -> {
43-
initialize();
26+
runDataSql();
27+
devInitService.init();
4428
};
4529
}
4630

47-
public void initialize() {
48-
runDataSql();
49-
initUsersAndPostsAndComments();
50-
}
51-
5231
private void runDataSql() {
5332
try (Connection connection = dataSource.getConnection()) {
5433
connection.setAutoCommit(true);
5534
Statement stmt = connection.createStatement();
5635

5736
// post_category 테이블에 데이터 있는지 확인
58-
long count = postCategoryRepository.count();
37+
ResultSet rs = stmt.executeQuery("SELECT COUNT(*) FROM post_category");
38+
rs.next();
39+
long count = rs.getLong(1);
5940

6041
if (count == 0) {
6142
// 데이터가 없으면 data.sql 실행
@@ -74,98 +55,4 @@ private void runDataSql() {
7455
System.err.println("⚠️ data.sql execution failed: " + e.getMessage());
7556
}
7657
}
77-
78-
@Transactional
79-
public void initUsersAndPostsAndComments() {
80-
if (userRepository.count() == 0) {
81-
// -------------------- 유저 --------------------
82-
User admin = User.createAdmin("admin", "[email protected]", passwordEncoder.encode("12345678!"));
83-
admin.setUserProfile(new UserProfile(admin, "관리자", null, null, null, 0));
84-
userRepository.save(admin);
85-
86-
User user1 = User.createUser("user1", "[email protected]", passwordEncoder.encode("12345678!"));
87-
user1.setUserProfile(new UserProfile(user1, "사용자1", null, null, null, 0));
88-
user1.setUserStatus(UserStatus.ACTIVE);
89-
userRepository.save(user1);
90-
91-
User user2 = User.createUser("user2", "[email protected]", passwordEncoder.encode("12345678!"));
92-
user2.setUserProfile(new UserProfile(user2, "사용자2", null, null, null, 0));
93-
user2.setUserStatus(UserStatus.ACTIVE);
94-
userRepository.save(user2);
95-
96-
User user3 = User.createUser("user3", "[email protected]", passwordEncoder.encode("12345678!"));
97-
user3.setUserProfile(new UserProfile(user3, "사용자3", null, null, null, 0));
98-
user3.setUserStatus(UserStatus.ACTIVE);
99-
userRepository.save(user3);
100-
101-
// -------------------- 게시글 --------------------
102-
createSamplePosts(user1, user2, user3);
103-
}
104-
}
105-
106-
private void createSamplePosts(User user1, User user2, User user3) { // ⭐ @Transactional 제거
107-
Post post1 = new Post(user1,
108-
"[백엔드] 같이 스프링 공부하실 분 구해요!",
109-
"매주 토요일 오후 2시에 온라인으로 스터디 진행합니다.\n교재는 '스프링 완전정복'을 사용할 예정입니다.",
110-
null);
111-
attachCategories(post1, List.of("백엔드", "직장인", "5~10명"));
112-
113-
Post post2 = new Post(user2,
114-
"[프론트엔드] 리액트 입문 스터디원 모집",
115-
"리액트 교재를 같이 읽고 실습해보는 스터디입니다. GitHub로 코드 리뷰도 진행합니다.",
116-
null);
117-
attachCategories(post2, List.of("프론트엔드", "대학생", "2~4명"));
118-
119-
Post post3 = new Post(user2,
120-
"[CS] 컴퓨터 구조 스터디",
121-
"운영체제, 네트워크, 컴퓨터 구조 기본 개념을 함께 정리해요.\n스터디원 5명 정도 모집합니다.",
122-
null);
123-
attachCategories(post3, List.of("CS", "취준생", "5~10명"));
124-
125-
Post post4 = new Post(user3,
126-
"[알고리즘] 백준 골드 도전 스터디",
127-
"매주 3문제씩 풀이, 코드 리뷰 및 전략 공유합니다.\n실력 향상을 목표로 합니다!",
128-
null);
129-
attachCategories(post4, List.of("알고리즘", "대학생", "5~10명"));
130-
131-
Post post5 = new Post(user1,
132-
"[영어 회화] 직장인 아침 스터디",
133-
"출근 전 30분, 영어회화 연습 스터디입니다.\n줌으로 진행하고 서로 피드백 나눠요 :)",
134-
null);
135-
attachCategories(post5, List.of("영어 회화", "직장인", "2~4명"));
136-
137-
postRepository.saveAll(List.of(post1, post2, post3, post4, post5));
138-
139-
// -------------------- 댓글 --------------------
140-
createSampleComments(user1, user2, user3, post1, post2, post3);
141-
}
142-
143-
private void createSampleComments(User user1, User user2, User user3, Post post1, Post post2, Post post3) {
144-
// Post1에 댓글
145-
Comment comment1 = Comment.createRoot(post1, user2, "저도 참여하고 싶어요!");
146-
Comment reply1 = Comment.createChild(post1, user1, "좋아요 :) 디스코드 링크 드릴게요.", comment1);
147-
148-
// Post2에 댓글
149-
Comment comment2 = Comment.createRoot(post2, user3, "스터디 모집 기간은 언제까지인가요?");
150-
Comment reply2 = Comment.createChild(post2, user2, "이번 주 일요일까지 받을 예정이에요.", comment2);
151-
152-
// Post3에 댓글
153-
Comment comment3 = Comment.createRoot(post3, user1, "CS는 항상 중요하죠 💪");
154-
155-
commentRepository.saveAll(List.of(comment1, reply1, comment2, reply2, comment3));
156-
157-
// 게시글 commentCount 반영
158-
post1.increaseCommentCount();
159-
post2.increaseCommentCount();
160-
post3.increaseCommentCount();
161-
162-
postRepository.saveAll(List.of(post1, post2, post3));
163-
}
164-
165-
private void attachCategories(Post post, List<String> categoryNames) {
166-
List<PostCategory> categories = postCategoryRepository.findAllByNameIn(categoryNames);
167-
if (!categories.isEmpty()) {
168-
post.updateCategories(categories);
169-
}
170-
}
17158
}
Lines changed: 134 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,134 @@
1+
package com.back.global.initData;
2+
3+
import com.back.domain.board.comment.entity.Comment;
4+
import com.back.domain.board.comment.repository.CommentRepository;
5+
import com.back.domain.board.post.entity.Post;
6+
import com.back.domain.board.post.entity.PostCategory;
7+
import com.back.domain.board.post.repository.PostCategoryRepository;
8+
import com.back.domain.board.post.repository.PostRepository;
9+
import com.back.domain.user.entity.User;
10+
import com.back.domain.user.entity.UserProfile;
11+
import com.back.domain.user.entity.UserStatus;
12+
import com.back.domain.user.repository.UserRepository;
13+
import jakarta.persistence.EntityManager;
14+
import lombok.RequiredArgsConstructor;
15+
import org.springframework.security.crypto.password.PasswordEncoder;
16+
import org.springframework.stereotype.Service;
17+
import org.springframework.transaction.annotation.Transactional;
18+
19+
import java.util.List;
20+
21+
@Service
22+
@RequiredArgsConstructor
23+
public class DevInitService {
24+
private final EntityManager entityManager;
25+
private final UserRepository userRepository;
26+
private final PostRepository postRepository;
27+
private final CommentRepository commentRepository;
28+
private final PostCategoryRepository postCategoryRepository;
29+
private final PasswordEncoder passwordEncoder;
30+
31+
@Transactional(readOnly = true)
32+
public boolean isUserTableEmpty() {
33+
return userRepository.count() == 0;
34+
}
35+
36+
@Transactional
37+
public void init() {
38+
if (isUserTableEmpty()) {
39+
initUsersAndPostsAndComments();
40+
}
41+
}
42+
43+
public void initUsersAndPostsAndComments() {
44+
// -------------------- 유저 --------------------
45+
User admin = User.createAdmin("admin", "[email protected]", passwordEncoder.encode("12345678!"));
46+
admin.setUserProfile(new UserProfile(admin, "관리자", null, null, null, 0));
47+
userRepository.save(admin);
48+
49+
User user1 = User.createUser("user1", "[email protected]", passwordEncoder.encode("12345678!"));
50+
user1.setUserProfile(new UserProfile(user1, "사용자1", null, null, null, 0));
51+
user1.setUserStatus(UserStatus.ACTIVE);
52+
userRepository.save(user1);
53+
54+
User user2 = User.createUser("user2", "[email protected]", passwordEncoder.encode("12345678!"));
55+
user2.setUserProfile(new UserProfile(user2, "사용자2", null, null, null, 0));
56+
user2.setUserStatus(UserStatus.ACTIVE);
57+
userRepository.save(user2);
58+
59+
User user3 = User.createUser("user3", "[email protected]", passwordEncoder.encode("12345678!"));
60+
user3.setUserProfile(new UserProfile(user3, "사용자3", null, null, null, 0));
61+
user3.setUserStatus(UserStatus.ACTIVE);
62+
userRepository.save(user3);
63+
64+
// -------------------- 게시글 --------------------
65+
createSamplePosts(user1, user2, user3);
66+
}
67+
68+
private void createSamplePosts(User user1, User user2, User user3) {
69+
Post post1 = new Post(user1,
70+
"[백엔드] 같이 스프링 공부하실 분 구해요!",
71+
"매주 토요일 오후 2시에 온라인으로 스터디 진행합니다.\n교재는 '스프링 완전정복'을 사용할 예정입니다.",
72+
null);
73+
attachCategories(post1, List.of("백엔드", "직장인", "5~10명"));
74+
75+
Post post2 = new Post(user2,
76+
"[프론트엔드] 리액트 입문 스터디원 모집",
77+
"리액트 교재를 같이 읽고 실습해보는 스터디입니다. GitHub로 코드 리뷰도 진행합니다.",
78+
null);
79+
attachCategories(post2, List.of("프론트엔드", "대학생", "2~4명"));
80+
81+
Post post3 = new Post(user2,
82+
"[CS] 컴퓨터 구조 스터디",
83+
"운영체제, 네트워크, 컴퓨터 구조 기본 개념을 함께 정리해요.\n스터디원 5명 정도 모집합니다.",
84+
null);
85+
attachCategories(post3, List.of("CS", "취준생", "5~10명"));
86+
87+
Post post4 = new Post(user3,
88+
"[알고리즘] 백준 골드 도전 스터디",
89+
"매주 3문제씩 풀이, 코드 리뷰 및 전략 공유합니다.\n실력 향상을 목표로 합니다!",
90+
null);
91+
attachCategories(post4, List.of("알고리즘", "대학생", "5~10명"));
92+
93+
Post post5 = new Post(user1,
94+
"[영어 회화] 직장인 아침 스터디",
95+
"출근 전 30분, 영어회화 연습 스터디입니다.\n줌으로 진행하고 서로 피드백 나눠요 :)",
96+
null);
97+
attachCategories(post5, List.of("영어 회화", "직장인", "2~4명"));
98+
99+
postRepository.saveAll(List.of(post1, post2, post3, post4, post5));
100+
101+
// -------------------- 댓글 --------------------
102+
createSampleComments(user1, user2, user3, post1, post2, post3);
103+
}
104+
105+
private void createSampleComments(User user1, User user2, User user3, Post post1, Post post2, Post post3) {
106+
// Post1에 댓글
107+
Comment comment1 = Comment.createRoot(post1, user2, "저도 참여하고 싶어요!");
108+
Comment reply1 = Comment.createChild(post1, user1, "좋아요 :) 디스코드 링크 드릴게요.", comment1);
109+
110+
// Post2에 댓글
111+
Comment comment2 = Comment.createRoot(post2, user3, "스터디 모집 기간은 언제까지인가요?");
112+
Comment reply2 = Comment.createChild(post2, user2, "이번 주 일요일까지 받을 예정이에요.", comment2);
113+
114+
// Post3에 댓글
115+
Comment comment3 = Comment.createRoot(post3, user1, "CS는 항상 중요하죠 💪");
116+
117+
commentRepository.saveAll(List.of(comment1, reply1, comment2, reply2, comment3));
118+
119+
// 게시글 commentCount 반영
120+
post1.increaseCommentCount();
121+
post2.increaseCommentCount();
122+
post3.increaseCommentCount();
123+
124+
postRepository.saveAll(List.of(post1, post2, post3));
125+
}
126+
127+
private void attachCategories(Post post, List<String> categoryNames) {
128+
List<PostCategory> categories = postCategoryRepository.findAllByNameIn(categoryNames);
129+
if (!categories.isEmpty()) {
130+
post.updateCategories(categories);
131+
entityManager.flush();
132+
}
133+
}
134+
}

0 commit comments

Comments
 (0)