Skip to content

Commit 9dfa0e8

Browse files
authored
페이징 처리 && 트랜젝션 추가 (#66)
1 parent a7cd5ef commit 9dfa0e8

File tree

9 files changed

+255
-26
lines changed

9 files changed

+255
-26
lines changed

back/src/main/java/com/back/domain/post/comment/controller/PostCommentController.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@
2020

2121
@RestController
2222
@RequestMapping("/post/comment")
23-
@RequiredArgsConstructor
2423
public class PostCommentController {
2524
@Autowired
2625
private Rq rq;

back/src/main/java/com/back/domain/post/post/controller/InformationPostController.java

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,12 @@
88
import com.back.global.rsData.RsData;
99
import io.swagger.v3.oas.annotations.Operation;
1010
import jakarta.validation.Valid;
11+
import lombok.Getter;
1112
import lombok.RequiredArgsConstructor;
13+
import org.springframework.data.domain.Page;
14+
import org.springframework.data.domain.Pageable;
15+
import org.springframework.data.domain.Sort;
16+
import org.springframework.data.web.PageableDefault;
1217
import org.springframework.web.bind.annotation.*;
1318

1419
import java.util.List;
@@ -21,6 +26,19 @@ public class InformationPostController {
2126
private final Rq rq;
2227

2328

29+
@Operation(summary = "게시글 조회 - 페이징 처리")
30+
@GetMapping
31+
public RsData<PostPagingResponse> getPostWithPage(
32+
@RequestParam(defaultValue = "0") int page,
33+
@RequestParam(defaultValue = "10") int size,
34+
@RequestParam(required = false) String keyword
35+
) {
36+
Page<PostDto> postPage = postService.getPosts(keyword, page,size);
37+
PostPagingResponse resDto = PostPagingResponse.from(postPage);
38+
39+
return new RsData<>("200", "게시글이 조회 되었습니다.", resDto);
40+
}
41+
2442
@Operation(summary = "게시글 생성")
2543
@PostMapping
2644
public RsData<PostCreateResponse> createPost(
@@ -34,7 +52,7 @@ public RsData<PostCreateResponse> createPost(
3452
}
3553

3654
@Operation(summary = "게시글 다건 조회")
37-
@GetMapping
55+
@GetMapping("/all")
3856
public RsData<List<PostAllResponse>> getAllPost() {
3957
List<PostAllResponse> postAllResponse = postService.getAllPostResponse();
4058

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package com.back.domain.post.post.dto;
2+
3+
4+
import com.back.domain.post.post.entity.Post;
5+
6+
public record PostDto(
7+
Long postId,
8+
String title,
9+
String content
10+
) {
11+
public static PostDto from(Post post) {
12+
return new PostDto(
13+
post.getId(),
14+
post.getTitle(),
15+
post.getContent()
16+
);
17+
}
18+
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package com.back.domain.post.post.dto;
2+
3+
import io.swagger.v3.oas.annotations.media.Schema;
4+
import org.springframework.data.domain.Page;
5+
6+
import java.util.List;
7+
8+
public record PostPagingResponse(
9+
@Schema(description = "게시글 목록")
10+
List<PostDto> posts,
11+
@Schema(description = "현재 페이지 (0부터 시작)")
12+
int currentPage,
13+
@Schema(description = "총 페이지")
14+
int totalPage,
15+
@Schema(description = "총 개수")
16+
long totalElements,
17+
@Schema(description = "다음 페이지 존재 여부")
18+
boolean hasNext
19+
) {
20+
21+
public static PostPagingResponse from(Page<PostDto> page) {
22+
return new PostPagingResponse(
23+
page.getContent(),
24+
page.getNumber(),
25+
page.getTotalPages(),
26+
page.getTotalElements(),
27+
page.hasNext()
28+
);
29+
}
30+
31+
}
32+
Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
package com.back.domain.post.post.repository;
22

33
import com.back.domain.post.post.entity.Post;
4+
import org.springframework.data.domain.Page;
5+
import org.springframework.data.domain.Pageable;
46
import org.springframework.data.jpa.repository.JpaRepository;
57
import org.springframework.stereotype.Repository;
68

79
@Repository
8-
public interface PostRepository extends JpaRepository<Post, Long> {
10+
public interface PostRepository extends JpaRepository<Post, Long> , PostRepositoryCustom{
911

1012
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package com.back.domain.post.post.repository;
2+
3+
import com.back.domain.post.post.entity.Post;
4+
import org.springframework.data.domain.Page;
5+
import org.springframework.data.domain.Pageable;
6+
7+
public interface PostRepositoryCustom {
8+
Page<Post> searchPosts(String keyword, Pageable pageable);
9+
}
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
package com.back.domain.post.post.repository;
2+
3+
import com.back.domain.member.member.entity.QMember;
4+
import com.back.domain.post.post.entity.Post;
5+
import com.back.domain.post.post.entity.QPost;
6+
import com.querydsl.core.BooleanBuilder;
7+
import com.querydsl.jpa.impl.JPAQueryFactory;
8+
import lombok.RequiredArgsConstructor;
9+
import org.springframework.data.domain.Page;
10+
import org.springframework.data.domain.PageImpl;
11+
import org.springframework.data.domain.Pageable;
12+
13+
import java.util.List;
14+
15+
@RequiredArgsConstructor
16+
public class PostRepositoryImpl implements PostRepositoryCustom{
17+
private final JPAQueryFactory queryFactory;
18+
19+
@Override
20+
public Page<Post> searchPosts(String keyword, Pageable pageable) {
21+
QPost post = QPost.post;
22+
QMember member = QMember.member;
23+
24+
BooleanBuilder builder = new BooleanBuilder();
25+
26+
if(keyword != null && !keyword.isBlank()) {
27+
builder.and(
28+
post.title.containsIgnoreCase(keyword)
29+
.or(post.authorName.containsIgnoreCase(keyword))
30+
);
31+
}
32+
33+
List<Post> content = queryFactory
34+
.selectFrom(post)
35+
.where(builder)
36+
.orderBy(post.createDate.desc())
37+
.offset(pageable.getOffset())// 이거뭐임
38+
.limit(pageable.getPageSize())
39+
.fetch();
40+
41+
long total = getTotal(post, builder);
42+
43+
return new PageImpl<>(content,pageable,total);
44+
45+
}
46+
47+
private long getTotal(QPost post, BooleanBuilder builder) {
48+
Long totalCount = queryFactory
49+
.select(post.count())
50+
.from(post)
51+
.where(builder)
52+
.fetchOne();
53+
54+
return totalCount != null ? totalCount : 0L;
55+
}
56+
57+
}

back/src/main/java/com/back/domain/post/post/service/PostService.java

Lines changed: 26 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,20 @@
11
package com.back.domain.post.post.service;
22

33
import com.back.domain.member.member.entity.Member;
4+
import com.back.domain.mentoring.mentoring.dto.MentoringDto;
45
import com.back.domain.post.post.dto.PostAllResponse;
56
import com.back.domain.post.post.dto.PostCreateRequest;
7+
import com.back.domain.post.post.dto.PostDto;
68
import com.back.domain.post.post.entity.Post;
79
import com.back.domain.post.post.repository.PostRepository;
10+
import com.back.domain.post.post.repository.PostRepositoryCustom;
811
import com.back.global.exception.ServiceException;
12+
import jakarta.transaction.Transactional;
913
import jakarta.validation.Valid;
1014
import lombok.RequiredArgsConstructor;
15+
import org.springframework.data.domain.Page;
16+
import org.springframework.data.domain.PageRequest;
17+
import org.springframework.data.domain.Pageable;
1118
import org.springframework.stereotype.Service;
1219

1320
import java.util.List;
@@ -24,7 +31,7 @@ public List<Post> getAllPosts() {
2431
return posts;
2532
}
2633

27-
34+
@Transactional
2835
public Post createPost(PostCreateRequest postCreateRequest, Member member) {
2936
String postTypeStr = postCreateRequest.getPostType();
3037

@@ -47,16 +54,11 @@ public Post createPost(PostCreateRequest postCreateRequest, Member member) {
4754
}
4855

4956
private void validPostType(String postTypeStr) {
50-
boolean eq = false;
51-
52-
String[] validType = new String[3];
53-
validType[0] = "INFORMATIONPOST";
54-
validType[1] = "PRACTICEPOST";
55-
validType[2] = "QUESTIONPOST";
56-
57-
for(String x : validType) if(x.equals(postTypeStr)) eq = true;
58-
59-
if(!eq) throw new ServiceException("400-2", "유효하지 않은 PostType입니다.");
57+
try {
58+
Post.PostType.valueOf(postTypeStr);
59+
} catch (IllegalArgumentException e) {
60+
throw new ServiceException("400-2", "유효하지 않은 PostType입니다.");
61+
}
6062
}
6163

6264

@@ -70,15 +72,15 @@ public List<PostAllResponse> getAllPostResponse() {
7072
.map(PostAllResponse::new)
7173
.toList();
7274
}
73-
75+
@Transactional
7476
public void removePost(Long postId, Member member) {
7577
Post post = postRepository.findById(postId).orElseThrow(() -> new ServiceException("400", "해당 Id의 게시글이 없습니다."));
7678
Long authorId = post.getMember().getId();
7779
if(authorId != member.getId()) throw new ServiceException("400", "삭제 권한이 없습니다.");
7880

7981
postRepository.delete(post);
8082
}
81-
83+
@Transactional
8284
public void updatePost(long postId, Member member, @Valid PostCreateRequest postCreateRequest) {
8385
Post post = postRepository.findById(postId).orElseThrow(() -> new ServiceException("400", "해당 Id의 게시글이 없습니다."));
8486
Long authorId = post.getMember().getId();
@@ -89,23 +91,31 @@ public void updatePost(long postId, Member member, @Valid PostCreateRequest post
8991

9092
postRepository.save(post);
9193
}
92-
94+
@Transactional
9395
public void likePost(long postId) {
9496
Post post = postRepository.findById(postId).orElseThrow(() -> new ServiceException("400", "해당 Id의 게시글이 없습니다."));
9597

9698
post.setLiked(post.getLiked()+1);
9799
}
98-
100+
@Transactional
99101
public void disLikePost(long postId) {
100102
Post post = postRepository.findById(postId).orElseThrow(() -> new ServiceException("400", "해당 Id의 게시글이 없습니다."));
101103

102104
post.setLiked(post.getLiked()-1);
103105
}
104-
106+
@Transactional()
105107
public int showLikeCount(long postId) {
106108
Post post = postRepository.findById(postId).orElseThrow(() -> new ServiceException("400", "해당 Id의 게시글이 없습니다."));
107109

108110
int count = post.getLiked();
109111
return count;
110112
}
113+
114+
115+
public Page<PostDto> getPosts(String keyword, int page, int size) {
116+
Pageable pageable = PageRequest.of(page,size);
117+
118+
119+
return postRepository.searchPosts(keyword, pageable).map(PostDto::from);
120+
}
111121
}

0 commit comments

Comments
 (0)