Skip to content

Commit 41504c6

Browse files
authored
Merge pull request #32 from kusitms-com/refactor/blogresponse-add-field
pr Refactor/blogresponse add field
2 parents 3e59c55 + 3300a54 commit 41504c6

5 files changed

Lines changed: 83 additions & 32 deletions

File tree

src/main/java/com/kusitms/website/domain/blog/controller/BlogController.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616
import io.swagger.v3.oas.annotations.responses.ApiResponses;
1717
import io.swagger.v3.oas.annotations.tags.Tag;
1818
import lombok.RequiredArgsConstructor;
19+
import org.springframework.data.domain.Page;
20+
import org.springframework.data.domain.Pageable;
1921
import org.springframework.http.ResponseEntity;
2022
import org.springframework.web.bind.annotation.GetMapping;
2123
import org.springframework.web.bind.annotation.RequestMapping;
@@ -44,10 +46,9 @@ public ResponseEntity<BaseResponse> getBlogList(
4446
@RequestParam(required = false) Integer generation,
4547
@RequestParam(required = false) Position position,
4648
@RequestParam(required = false) Category category,
47-
@RequestParam(required = false) Long lastId,
48-
@RequestParam(defaultValue = "10") int size
49+
Pageable pageable
4950
) {
50-
List<BlogResponse> result = blogService.getFilteredPostsWithPaging(generation, position, category, lastId, size);
51+
Page<BlogResponse> result = blogService.getFilteredPostsWithPaging(generation, position, category, pageable);
5152
return ResponseEntity.ok(new BaseResponse(result));
5253
}
5354
}

src/main/java/com/kusitms/website/domain/blog/dto/response/BlogResponse.java

Lines changed: 26 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import com.kusitms.website.domain.blog.entity.BlogAuthor;
55
import com.kusitms.website.domain.blog.entity.BlogPost;
66
import com.kusitms.website.domain.blog.entity.Category;
7+
import com.querydsl.core.annotations.QueryProjection;
78
import io.swagger.v3.oas.annotations.media.Schema;
89
import lombok.*;
910

@@ -12,32 +13,45 @@
1213
@Getter
1314
@Builder
1415
@NoArgsConstructor
15-
@AllArgsConstructor
1616
public class BlogResponse {
1717
@JsonProperty("blog_post_id")
1818
@Schema(description = "블로그 글 아이디")
1919
private Long id;
2020
@Schema(description = "블로그 글 제목")
2121
private String title;
22-
@Schema(description = "블로그 카테고리 이름")
23-
private Category category;
2422
@Schema(description = "블로그 주소")
2523
private String address;
2624
@Schema(description = "블로그 이미지 주소")
2725
private String imageAddress;
2826
@Schema(description = "블로그 글 내용")
2927
private String content;
28+
@Schema(description = "활동명")
29+
private String categoryName;
30+
@Schema(description = "기수")
31+
private Integer cardinal;
32+
@Schema(description = "파트명")
33+
private String position;
3034

31-
public static BlogResponse fromEntity(BlogPost post) {
32-
return BlogResponse.builder()
33-
.id(post.getId())
34-
.title(post.getTitle())
35-
.category(post.getCategory())
36-
.address(post.getAddress())
37-
.imageAddress(post.getImageAddress())
38-
.content(post.getContent())
39-
.build();
35+
@QueryProjection
36+
public BlogResponse(Long id,
37+
String title,
38+
String address,
39+
String imageAddress,
40+
String content,
41+
String categoryName,
42+
Integer cardinal,
43+
String position) {
44+
this.id = id;
45+
this.title = title;
46+
this.address = address;
47+
this.imageAddress = imageAddress;
48+
this.content = content;
49+
this.categoryName = categoryName;
50+
this.cardinal = cardinal;
51+
this.position = position;
4052
}
4153

4254

55+
56+
4357
}
Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
package com.kusitms.website.domain.blog.repository;
22

3+
import com.kusitms.website.domain.blog.dto.response.BlogResponse;
34
import com.kusitms.website.domain.blog.entity.BlogPost;
45
import com.kusitms.website.domain.blog.entity.Category;
56
import com.kusitms.website.domain.blog.entity.Position;
7+
import org.springframework.data.domain.Page;
8+
import org.springframework.data.domain.Pageable;
69

7-
import java.util.List;
810

911
public interface BlogPostQueryRepository {
10-
List<BlogPost> findByFiltersWithPaging(Integer generation, Position position, Category category, Long lastId, int size);
12+
Page<BlogResponse> findByFiltersWithPaging(Integer generation, Position position, Category category, Pageable pageable);
1113
}

src/main/java/com/kusitms/website/domain/blog/repository/BlogPostQueryRepositoryImpl.java

Lines changed: 44 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,15 @@
11
package com.kusitms.website.domain.blog.repository;
22

3+
import com.kusitms.website.domain.blog.dto.response.BlogResponse;
34
import com.kusitms.website.domain.blog.entity.*;
45
import com.querydsl.core.BooleanBuilder;
6+
import com.querydsl.core.types.Projections;
7+
import com.querydsl.core.types.dsl.CaseBuilder;
58
import com.querydsl.jpa.impl.JPAQueryFactory;
69
import lombok.RequiredArgsConstructor;
10+
import org.springframework.data.domain.Page;
11+
import org.springframework.data.domain.PageImpl;
12+
import org.springframework.data.domain.Pageable;
713
import org.springframework.stereotype.Repository;
814

915
import java.util.List;
@@ -15,7 +21,7 @@ public class BlogPostQueryRepositoryImpl implements BlogPostQueryRepository {
1521
private final QBlogAuthor blogAuthor = QBlogAuthor.blogAuthor;
1622

1723
@Override
18-
public List<BlogPost> findByFiltersWithPaging(Integer generation, Position position, Category category, Long lastId, int size) {
24+
public Page<BlogResponse> findByFiltersWithPaging(Integer generation, Position position, Category category, Pageable pageable) {
1925

2026
BooleanBuilder builder = new BooleanBuilder();
2127

@@ -31,16 +37,46 @@ public List<BlogPost> findByFiltersWithPaging(Integer generation, Position posit
3137
builder.and(blogPost.category.eq(category));
3238
}
3339

34-
if (lastId != null) {
35-
builder.and(blogPost.id.lt(lastId));
36-
}
37-
38-
return queryFactory
39-
.selectFrom(blogPost)
40+
List<BlogResponse> results = queryFactory
41+
.select(Projections.constructor(
42+
BlogResponse.class,
43+
blogPost.id,
44+
blogPost.title,
45+
blogPost.address,
46+
blogPost.imageAddress,
47+
blogPost.content,
48+
new CaseBuilder()
49+
.when(blogPost.category.eq(Category.DOCUMENT)).then(Category.DOCUMENT.getDescription())
50+
.when(blogPost.category.eq(Category.INTERVIEW)).then(Category.INTERVIEW.getDescription())
51+
.when(blogPost.category.eq(Category.GIFT)).then(Category.GIFT.getDescription())
52+
.when(blogPost.category.eq(Category.MEETUP)).then(Category.MEETUP.getDescription())
53+
.when(blogPost.category.eq(Category.GROUP_TF)).then(Category.GROUP_TF.getDescription())
54+
.otherwise("기타"),
55+
blogAuthor.generation,
56+
// Position → description
57+
new CaseBuilder()
58+
.when(blogAuthor.position.eq(Position.FRONTEND)).then(Position.FRONTEND.getDescription())
59+
.when(blogAuthor.position.eq(Position.BACKEND)).then(Position.BACKEND.getDescription())
60+
.when(blogAuthor.position.eq(Position.PLAN)).then(Position.PLAN.getDescription())
61+
.when(blogAuthor.position.eq(Position.DESIGNER)).then(Position.DESIGNER.getDescription())
62+
.otherwise("기타")
63+
))
64+
.from(blogPost)
4065
.join(blogPost.blogAuthor, blogAuthor)
4166
.where(builder)
67+
.offset(pageable.getOffset())
68+
.limit(pageable.getPageSize())
4269
.orderBy(blogPost.id.desc())
43-
.limit(size)
4470
.fetch();
71+
72+
// ② total count 조회
73+
long total = queryFactory
74+
.select(blogPost.count())
75+
.from(blogPost)
76+
.join(blogPost.blogAuthor, blogAuthor)
77+
.where(builder)
78+
.fetchOne();
79+
80+
return new PageImpl<>(results, pageable, total);
4581
}
4682
}

src/main/java/com/kusitms/website/domain/blog/service/BlogService.java

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
import com.kusitms.website.domain.blog.repository.BlogPostQueryRepository;
88
import com.kusitms.website.domain.blog.repository.BlogPostRepository;
99
import lombok.RequiredArgsConstructor;
10+
import org.springframework.data.domain.Page;
11+
import org.springframework.data.domain.Pageable;
1012
import org.springframework.stereotype.Service;
1113

1214
import java.util.List;
@@ -18,16 +20,12 @@ public class BlogService {
1820

1921
private final BlogPostRepository blogPostRepository;
2022

21-
public List<BlogResponse> getFilteredPostsWithPaging(
23+
public Page<BlogResponse> getFilteredPostsWithPaging(
2224
Integer generation,
2325
Position position,
2426
Category category,
25-
Long lastId,
26-
int size
27+
Pageable pageable
2728
) {
28-
return blogPostRepository.findByFiltersWithPaging(generation, position, category, lastId, size)
29-
.stream()
30-
.map(BlogResponse::fromEntity)
31-
.collect(Collectors.toList());
29+
return blogPostRepository.findByFiltersWithPaging(generation, position, category, pageable);
3230
}
3331
}

0 commit comments

Comments
 (0)