Skip to content

Commit a47e77c

Browse files
authored
[Feature] 사용자 Request 유효성 검증 추가 및 Request, Response 구조 변경 (#28)
* refactor: Request, Response 구조 변경 (#25) * refactor: 컨벤션 적용 (#25) * refactor: PostRequest 유효성 검증 추가 (#25) * feat: UserResponse 추가 (#25) * refactor: refreshToken 관리 변경 (#25) * refactor: PostRequest 유효성 검사 업데이트 (#25)
1 parent b5e1262 commit a47e77c

38 files changed

+412
-388
lines changed

src/main/java/project/backend/business/auth/response/TokenServiceResponse.java

-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package project.backend.business.auth.response;
22

3-
import com.fasterxml.jackson.annotation.JsonIgnore;
43
import lombok.Getter;
54
import lombok.RequiredArgsConstructor;
65

@@ -9,7 +8,6 @@
98
public class TokenServiceResponse {
109

1110
private final String accessToken;
12-
@JsonIgnore
1311
private final String refreshToken;
1412

1513
public static TokenServiceResponse of(final String accessToken, final String refreshToken) {

src/main/java/project/backend/business/post/PostService.java

+19-18
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,22 @@
11
package project.backend.business.post;
22

3-
3+
import java.util.List;
4+
import java.util.Objects;
45
import lombok.RequiredArgsConstructor;
56
import lombok.extern.slf4j.Slf4j;
67
import org.springframework.stereotype.Service;
7-
import project.backend.business.post.dto.CreatePostDto;
8-
import project.backend.business.post.dto.PostDetailDto;
8+
import project.backend.business.post.request.CreatePostServiceRequest;
9+
import project.backend.business.post.request.PostDetailServiceRequest;
910
import project.backend.business.post.implement.SummaryAIManager;
1011
import project.backend.business.post.implement.PostManager;
1112
import project.backend.business.post.implement.PostReader;
1213
import project.backend.business.user.implement.UserReader;
13-
import project.backend.business.post.dto.PostListDto;
14+
import project.backend.business.post.request.PostListServiceRequest;
1415
import project.backend.common.error.CustomException;
1516
import project.backend.common.error.ErrorCode;
1617
import project.backend.entity.post.Post;
1718
import project.backend.entity.user.User;
1819

19-
import java.util.List;
20-
2120
@Slf4j
2221
@Service
2322
@RequiredArgsConstructor
@@ -28,38 +27,40 @@ public class PostService {
2827
private final PostManager postManager;
2928
private final SummaryAIManager summaryAIManager;
3029

31-
32-
public List<PostListDto> getPostList(Long userId) {
30+
public List<PostListServiceRequest> getPostList(Long userId) {
3331
User user = userReader.readUserById(userId);
3432
return postReader.readPostsWithTags(user);
3533
}
3634

37-
public PostDetailDto getPostDetail(Long userId, Long postId) {
35+
public PostDetailServiceRequest getPostDetail(Long userId, Long postId) {
3836
User user = userReader.readUserById(userId);
3937
return postReader.readPostDetailWithTags(user, postId);
4038
}
4139

42-
public Long createNewPostDetail(Long userId, CreatePostDto createPostDto) {
43-
String summary = summaryAIManager.getSummary(createPostDto);
40+
public Long createNewPostDetail(Long userId,
41+
CreatePostServiceRequest createPostServiceRequest) {
42+
String summary = summaryAIManager.getSummary(createPostServiceRequest);
4443
User user = userReader.findUserById(userId);
45-
return postManager.createTempPost(user, createPostDto.getUrl(), summary);
44+
return postManager.createTempPost(user, createPostServiceRequest.getUrl(), summary);
4645
}
4746

48-
public Long updatePostDetail(Long userId, Long postId, PostDetailDto postDetailDto) {
47+
public Long updatePostDetail(Long userId, Long postId,
48+
PostDetailServiceRequest postDetailServiceRequest) {
4949
Post post = postReader.read(userId, postId);
50-
postManager.updatePost(post, postDetailDto);
50+
postManager.updatePost(post, postDetailServiceRequest);
5151
return post.getId();
5252
}
5353

54-
public Long updateSummaryPost(Long userId, Long postId, CreatePostDto createPostDto) {
54+
public Long updateSummaryPost(Long userId, Long postId,
55+
CreatePostServiceRequest createPostServiceRequest) {
5556
Post post = postReader.readPostAndUser(postId);
5657

57-
if (post.getUser() != null && post.getUser().getId() != userId) {
58+
if (post.getUser() != null && !Objects.equals(post.getUser().getId(), userId)) {
5859
throw new CustomException(ErrorCode.BAD_REQUEST);
5960
}
6061

61-
String summary = summaryAIManager.getSummary(createPostDto);
62-
postManager.updateSummary(post, createPostDto.getUrl(), summary);
62+
String summary = summaryAIManager.getSummary(createPostServiceRequest);
63+
postManager.updateSummary(post, createPostServiceRequest.getUrl(), summary);
6364

6465
return post.getId();
6566
}

src/main/java/project/backend/business/post/dto/CreatePostDto.java

-14
This file was deleted.

src/main/java/project/backend/business/post/dto/PostDetailDto.java

-19
This file was deleted.

src/main/java/project/backend/business/post/dto/PostListDto.java

-15
This file was deleted.

src/main/java/project/backend/business/post/dto/PostTagDto.java

-13
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -1,54 +1,55 @@
11
package project.backend.business.post.implement;
22

33
import jakarta.transaction.Transactional;
4+
import java.time.LocalDateTime;
45
import lombok.RequiredArgsConstructor;
56
import org.springframework.stereotype.Component;
67
import project.backend.business.common.DateTimeManager;
7-
import project.backend.business.post.dto.PostDetailDto;
8+
import project.backend.business.post.request.PostDetailServiceRequest;
89
import project.backend.business.tag.implement.TagManager;
910
import project.backend.entity.post.Post;
1011
import project.backend.entity.post.PostStatus;
1112
import project.backend.repository.post.PostRepository;
1213
import project.backend.entity.user.User;
1314

14-
import java.time.LocalDateTime;
15-
1615
@Component
1716
@RequiredArgsConstructor
1817
public class PostManager {
19-
private final PostRepository postRepository;
20-
private final TagManager tagManager;
21-
22-
/**
23-
* 임시 Post는 생성 시간으로 시간 세팅
24-
*/
25-
@Transactional
26-
public Long createTempPost(User user, String url, String summary) {
27-
String tmpTitle = DateTimeManager.getCurrentDateTime();
28-
Post newTmpPost = Post.createPost(user, tmpTitle, summary, PostStatus.DRAFT, url);
29-
30-
return postRepository.save(newTmpPost).getId();
31-
}
3218

33-
@Transactional
34-
public void updatePost(Post post, PostDetailDto postDetailDto) {
35-
post.setTitle(postDetailDto.getTitle());
36-
post.setContent(postDetailDto.getContent());
37-
post.setStatus(PostStatus.PUBLISHED);
38-
39-
if (post.getMemo() == null || !post.getMemo().equals(postDetailDto.getMemoContent())) {
40-
post.setMemo(postDetailDto.getMemoContent());
41-
post.setMemoCreatedAt(LocalDateTime.now());
42-
}
43-
44-
tagManager.updateTag(post, postDetailDto.getTagList());
45-
postRepository.save(post);
19+
private final PostRepository postRepository;
20+
private final TagManager tagManager;
21+
22+
/**
23+
* 임시 Post는 생성 시간으로 시간 세팅
24+
*/
25+
@Transactional
26+
public Long createTempPost(User user, String url, String summary) {
27+
String tmpTitle = DateTimeManager.getCurrentDateTime();
28+
Post newTmpPost = Post.createPost(user, tmpTitle, summary, PostStatus.DRAFT, url);
29+
30+
return postRepository.save(newTmpPost).getId();
31+
}
32+
33+
@Transactional
34+
public void updatePost(Post post, PostDetailServiceRequest postDetailServiceRequest) {
35+
post.setTitle(postDetailServiceRequest.getTitle());
36+
post.setContent(postDetailServiceRequest.getContent());
37+
post.setStatus(PostStatus.PUBLISHED);
38+
39+
if (post.getMemo() == null || !post.getMemo()
40+
.equals(postDetailServiceRequest.getMemoContent())) {
41+
post.setMemo(postDetailServiceRequest.getMemoContent());
42+
post.setMemoCreatedAt(LocalDateTime.now());
4643
}
4744

48-
@Transactional
45+
tagManager.updateTag(post, postDetailServiceRequest.getTagList());
46+
postRepository.save(post);
47+
}
48+
49+
@Transactional
4950
public void updateSummary(Post post, String url, String summary) {
50-
post.setContent(summary);
51-
post.setUrl(url);
52-
postRepository.save(post);
53-
}
51+
post.setContent(summary);
52+
post.setUrl(url);
53+
postRepository.save(post);
54+
}
5455
}
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
package project.backend.business.post.implement;
22

3+
import java.util.List;
4+
import java.util.Map;
35
import lombok.AllArgsConstructor;
46
import lombok.extern.slf4j.Slf4j;
57
import org.springframework.stereotype.Component;
68
import project.backend.business.common.DateTimeManager;
7-
import project.backend.business.post.dto.PostDetailDto;
8-
import project.backend.business.post.dto.PostListDto;
9+
import project.backend.business.post.request.PostDetailServiceRequest;
10+
import project.backend.business.post.request.PostListServiceRequest;
911
import project.backend.business.tag.implement.TagReader;
1012
import project.backend.common.error.CustomException;
1113
import project.backend.common.error.ErrorCode;
@@ -14,10 +16,6 @@
1416
import project.backend.repository.post.PostRepository;
1517
import project.backend.entity.user.User;
1618

17-
import java.util.List;
18-
import java.util.Map;
19-
20-
2119
@Slf4j
2220
@Component
2321
@AllArgsConstructor
@@ -26,7 +24,6 @@ public class PostReader {
2624
private final PostRepository postRepository;
2725
private final TagReader tagReader;
2826

29-
3027
public Post readPostAndUser(Long postId) {
3128
Post post = postRepository.findPostAndUserById(postId);
3229

@@ -45,25 +42,25 @@ public Post read(Long userId, Long postId) {
4542
return post;
4643
}
4744

48-
public List<PostListDto> readPostsWithTags(User user) {
45+
public List<PostListServiceRequest> readPostsWithTags(User user) {
4946
List<Post> postList = postRepository.findAllByUserIdAndStatus(user.getId(),
5047
PostStatus.PUBLISHED);
5148
List<Long> postIdList = postList.stream().map(Post::getId).toList();
5249

5350
Map<Long, List<String>> postTagMap = tagReader.getPostTagMap(postIdList);
5451

5552
return postList.stream().map(
56-
post -> PostListDto.builder()
57-
.id(post.getId())
58-
.title(post.getTitle())
59-
.createdAt(DateTimeManager.convertToStringPattern(post.getCreatedAt(),
60-
"yyyy.MM.dd"))
61-
.tagList(postTagMap.get(post.getId()))
62-
.build()
53+
post -> PostListServiceRequest.builder()
54+
.id(post.getId())
55+
.title(post.getTitle())
56+
.createdAt(DateTimeManager.convertToStringPattern(
57+
post.getCreatedAt(), "yyyy.MM.dd"))
58+
.tagList(postTagMap.get(post.getId()))
59+
.build()
6360
).toList();
6461
}
6562

66-
public PostDetailDto readPostDetailWithTags(User user, Long postId) {
63+
public PostDetailServiceRequest readPostDetailWithTags(User user, Long postId) {
6764
Post postDetail = postRepository.findPostByIdAndUserAndStatus(postId, user,
6865
PostStatus.PUBLISHED);
6966

@@ -74,17 +71,19 @@ public PostDetailDto readPostDetailWithTags(User user, Long postId) {
7471

7572
List<String> tagList = tagReader.readTagNamesByPostId(postId);
7673

77-
return PostDetailDto.builder()
78-
.title(postDetail.getTitle())
79-
.content(postDetail.getContent())
80-
.url(postDetail.getUrl())
81-
.tagList(tagList)
82-
.createdAt(DateTimeManager.convertToStringPattern(postDetail.getCreatedAt(),
83-
"yyyy년 MM월 dd일"))
84-
.memoContent(postDetail.getMemo())
85-
.memoCreatedAt(
86-
DateTimeManager.convertToStringPattern(postDetail.getMemoCreatedAt(),
87-
"yy.MM.dd"))
88-
.build();
74+
return PostDetailServiceRequest.builder()
75+
.title(postDetail.getTitle())
76+
.content(postDetail.getContent())
77+
.url(postDetail.getUrl())
78+
.tagList(tagList)
79+
.createdAt(DateTimeManager.convertToStringPattern(
80+
postDetail.getCreatedAt(),
81+
"yyyy년 MM월 dd일"))
82+
.memoContent(postDetail.getMemo())
83+
.memoCreatedAt(
84+
DateTimeManager.convertToStringPattern(
85+
postDetail.getMemoCreatedAt(),
86+
"yy.MM.dd"))
87+
.build();
8988
}
9089
}

src/main/java/project/backend/business/post/implement/SummaryAIManager.java

+9-12
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
import org.springframework.ai.vertexai.gemini.VertexAiGeminiChatModel;
88
import org.springframework.ai.vertexai.gemini.VertexAiGeminiChatOptions;
99
import org.springframework.stereotype.Component;
10-
import project.backend.business.post.dto.CreatePostDto;
10+
import project.backend.business.post.request.CreatePostServiceRequest;
1111

1212
@Slf4j
1313
@Component
@@ -16,28 +16,25 @@ public class SummaryAIManager {
1616

1717
private final VertexAiGeminiChatModel chatModel;
1818

19-
20-
public String getSummary(CreatePostDto createPostDto) {
21-
Prompt prompt = getPrompt(createPostDto);
19+
public String getSummary(CreatePostServiceRequest createPostServiceRequest) {
20+
Prompt prompt = getPrompt(createPostServiceRequest);
2221
ChatResponse response = chatModel.call(prompt);
2322
String content = response.getResult().getOutput().getContent();
2423
log.info(content);
2524
return content;
2625
}
2726

28-
29-
private Prompt getPrompt(CreatePostDto createPostDto) {
30-
String requestMessage = "URL: " + createPostDto.getUrl() + "\n" +
31-
"위 웹사이트를 요약 조건에 맞춰서 블로그 형태로 요약해줘. 출처도 명시해줘!\n"+
27+
private Prompt getPrompt(CreatePostServiceRequest createPostServiceRequest) {
28+
String requestMessage = "URL: " + createPostServiceRequest.getUrl() + "\n" +
29+
"위 웹사이트를 요약 조건에 맞춰서 블로그 형태로 요약해줘. 출처도 명시해줘!\n" +
3230
"요약조건: \n" +
33-
"1. 요약 길이: " + createPostDto.getOption().getLevel().getLines() + "\n" +
34-
"2. 요약 말투: " + createPostDto.getOption().getTone().getValue() +
35-
"3. 요약 언어: " + createPostDto.getOption().getLanguage().getValue();
31+
"1. 요약 길이: " + createPostServiceRequest.getOption().getLevel().getLines() + "\n" +
32+
"2. 요약 말투: " + createPostServiceRequest.getOption().getTone().getValue() +
33+
"3. 요약 언어: " + createPostServiceRequest.getOption().getLanguage().getValue();
3634

3735
return new Prompt(requestMessage,
3836
VertexAiGeminiChatOptions.builder()
3937
.withModel(VertexAiGeminiChatModel.ChatModel.GEMINI_1_5_FLASH)
4038
.build());
4139
}
42-
4340
}

0 commit comments

Comments
 (0)