Skip to content

Commit 7c1e884

Browse files
authored
Merge pull request #22 from jeondain/refactor/#21
[refactor #21] 학과 게시판 목록 조회 로직 수정
2 parents f41bf27 + 35e3e00 commit 7c1e884

8 files changed

Lines changed: 85 additions & 7 deletions

File tree

src/main/java/com/fromm/leafmap/domain/major/entity/Major.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.fromm.leafmap.domain.major.entity;
22

33
import com.fromm.leafmap.domain.member.entity.Member;
4+
import com.fromm.leafmap.domain.post.entity.Post;
45
import com.fromm.leafmap.global.common.BaseEntity;
56
import jakarta.persistence.*;
67
import lombok.*;
@@ -39,6 +40,9 @@ public class Major extends BaseEntity {
3940
@OneToMany(mappedBy = "major", cascade = CascadeType.ALL)
4041
private List<MajorCategoryMap> majorCategoryMaps = new ArrayList<>();
4142

43+
@OneToOne(mappedBy = "major", fetch = FetchType.LAZY)
44+
private Post post;
45+
4246
public void setCurriculumUrl(String curriculumUrl) {
4347
this.curriculumUrl = curriculumUrl;
4448
}

src/main/java/com/fromm/leafmap/domain/post/controller/PostController.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import com.fromm.leafmap.domain.post.dto.PostRequestDTO;
55
import com.fromm.leafmap.domain.post.dto.PostResponseDTO;
66
import com.fromm.leafmap.domain.post.entity.BoardType;
7+
import com.fromm.leafmap.domain.post.service.MajortipsPostInitService;
78
import com.fromm.leafmap.domain.post.service.PostService;
89
import com.fromm.leafmap.global.annotation.CurrentMember;
910
import com.fromm.leafmap.global.apiPayload.ApiResponse;
@@ -22,6 +23,14 @@
2223
public class PostController {
2324

2425
private final PostService postService;
26+
private final MajortipsPostInitService majortipsPostInitService;
27+
28+
@PostMapping(value = "/MAJOR_TIPS/init")
29+
@Operation(summary = "학과 게시판 게시글 생성 (연동 X)")
30+
public ApiResponse<String> createMajortipsPosts() {
31+
majortipsPostInitService.createPostsFromMajors();
32+
return ApiResponse.onSuccess("Majortips 게시글 생성 완료");
33+
}
2534

2635
@PostMapping(value = "/{boardType}", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
2736
@Operation(summary = "게시글 작성", description = "게시글 정보는 JSON 형식으로, 이미지는 Multipart(Form-Data) 형식으로 함께 전달해주세요.\n\n" )

src/main/java/com/fromm/leafmap/domain/post/dto/PostResponseDTO.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,9 @@ public static class PostPreviewDTO {
2323
private Long postId;
2424
private String title;
2525
private String contentPreview; // 내용 첫 줄
26+
27+
private Long majorId;
28+
private String majorName;
2629
}
2730

2831
@Getter

src/main/java/com/fromm/leafmap/domain/post/entity/Post.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.fromm.leafmap.domain.post.entity;
22

3+
import com.fromm.leafmap.domain.major.entity.Major;
34
import com.fromm.leafmap.domain.member.entity.Member;
45
import com.fromm.leafmap.global.common.BaseEntity;
56
import jakarta.persistence.*;
@@ -52,4 +53,8 @@ public class Post extends BaseEntity {
5253

5354
@OneToMany(mappedBy = "post", cascade = CascadeType.ALL)
5455
private List<PostLike> likes = new ArrayList<>();
56+
57+
@OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
58+
@JoinColumn(name = "major_id")
59+
private Major major;
5560
}

src/main/java/com/fromm/leafmap/domain/post/repository/PostRepository.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111

1212
public interface PostRepository extends JpaRepository<Post, Long> {
1313

14+
boolean existsByMajorId(Long majorId);
15+
1416
@Query("SELECT p FROM Post p " +
1517
"WHERE p.boardType = :boardType " +
1618
"AND p.id < :cursor " +
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
package com.fromm.leafmap.domain.post.service;
2+
3+
import com.fromm.leafmap.domain.major.entity.Major;
4+
import com.fromm.leafmap.domain.major.repository.MajorRepository;
5+
import com.fromm.leafmap.domain.post.entity.BoardType;
6+
import com.fromm.leafmap.domain.post.entity.Post;
7+
import com.fromm.leafmap.domain.post.repository.PostRepository;
8+
import lombok.RequiredArgsConstructor;
9+
import org.springframework.stereotype.Service;
10+
import org.springframework.transaction.annotation.Transactional;
11+
12+
import java.util.List;
13+
14+
@Service
15+
@RequiredArgsConstructor
16+
public class MajortipsPostInitService {
17+
18+
private final PostRepository postRepository;
19+
private final MajorRepository majorRepository;
20+
21+
@Transactional
22+
public void createPostsFromMajors() {
23+
List<Major> majors = majorRepository.findAll();
24+
25+
for (Major major : majors) {
26+
27+
if ("미래융합학부1".equals(major.getName())
28+
|| "미래융합학부2".equals(major.getName())
29+
|| "자유전공학부".equals(major.getName())) {
30+
continue;
31+
}
32+
33+
boolean exists = postRepository.existsByMajorId(major.getId());
34+
if (exists) continue;
35+
36+
Post post = Post.builder()
37+
.title(major.getName())
38+
.isPublic(true)
39+
.boardType(BoardType.MAJOR_TIPS)
40+
.major(major)
41+
.build();
42+
43+
postRepository.save(post);
44+
}
45+
}
46+
}

src/main/java/com/fromm/leafmap/domain/post/service/PostServiceImpl.java

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -59,13 +59,21 @@ public PostResponseDTO.PostListResultDTO getPostList(BoardType boardType, Member
5959

6060
List<Post> posts = postRepository.findPostList(boardType, cursor, PageRequest.of(0, limit));
6161

62-
6362
List<PostResponseDTO.PostPreviewDTO> previews = posts.stream()
64-
.map(post -> PostResponseDTO.PostPreviewDTO.builder()
65-
.postId(post.getId())
66-
.title(post.getTitle())
67-
.contentPreview(extractFirstLine(post.getContent()))
68-
.build())
63+
.map(post -> {
64+
PostResponseDTO.PostPreviewDTO.PostPreviewDTOBuilder builder = PostResponseDTO.PostPreviewDTO.builder()
65+
.postId(post.getId())
66+
.title(post.getTitle())
67+
.contentPreview(extractFirstLine(post.getContent()));
68+
69+
// MAJOR_TIPS 게시판인 경우 Major 정보 포함
70+
if (boardType == BoardType.MAJOR_TIPS && post.getMajor() != null) {
71+
builder.majorId(post.getMajor().getId())
72+
.majorName(post.getMajor().getName());
73+
}
74+
75+
return builder.build();
76+
})
6977
.toList();
7078

7179
Long nextCursor = posts.isEmpty() ? null : posts.get(posts.size() - 1).getId();

src/main/java/com/fromm/leafmap/global/config/SecurityConfig.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,8 @@ public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Excepti
4040
.requestMatchers(
4141
"/api/signup",
4242
"/api/login",
43-
"/api/majors/**"
43+
"/api/majors/**",
44+
"api/posts/MAJOR_TIPS/init"
4445
).permitAll()
4546
.anyRequest().authenticated()
4647
)

0 commit comments

Comments
 (0)