diff --git a/src/main/java/com/moongeul/backend/api/post/controller/PostController.java b/src/main/java/com/moongeul/backend/api/post/controller/PostController.java index bac020e..71bc44a 100644 --- a/src/main/java/com/moongeul/backend/api/post/controller/PostController.java +++ b/src/main/java/com/moongeul/backend/api/post/controller/PostController.java @@ -44,6 +44,22 @@ public ResponseEntity> createPost(@Authentication return ApiResponse.success(SuccessStatus.CREATE_POST_SUCCESS, response); } + @Operation( + summary = "글쓰기 도움 받기 API", + description = "글쓰기 페이지에서 '글쓰기 도움 받기' 버튼 클릭 시 질문을 생성하는 API 입니다." + ) + @ApiResponses({ + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "글쓰기 성공"), + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "400", description = "ISBN은 필수입니다. (isbn)"), + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "404", description = "해당 도서를 찾을 수 없습니다.") + }) + @GetMapping("/writing-guide") + public ResponseEntity> writingGuide() { + + String response = postService.writingGuide(); + return ApiResponse.success(SuccessStatus.GET_WRITING_GUIDE, response); + } + @Operation( summary = "기록(게시글) 전체 조회 API", description = "메인페이지(홈화면)에서 사용되는 기록(게시글)의 전체 조회 API 입니다." + diff --git a/src/main/java/com/moongeul/backend/api/post/service/PostService.java b/src/main/java/com/moongeul/backend/api/post/service/PostService.java index 09f3a25..c4250b4 100644 --- a/src/main/java/com/moongeul/backend/api/post/service/PostService.java +++ b/src/main/java/com/moongeul/backend/api/post/service/PostService.java @@ -15,6 +15,7 @@ import com.moongeul.backend.api.post.repository.LikeRepository; import com.moongeul.backend.api.post.repository.PostRepository; import com.moongeul.backend.api.post.repository.QuoteRepository; +import com.moongeul.backend.api.post.util.WritingGuideGenerator; import com.moongeul.backend.common.exception.NotFoundException; import com.moongeul.backend.common.exception.UnauthorizedException; import com.moongeul.backend.common.response.ErrorStatus; @@ -51,6 +52,7 @@ public class PostService { private final BookshelfCalculator bookshelfCalculator; private final NotificationTriggerService notificationTriggerService; + private final WritingGuideGenerator writingGuideGenerator; /* @@ -108,6 +110,11 @@ public PostIdResponseDTO createPost(PostRequestDTO postRequestDTO, String email) .build(); } + /* 글쓰기 도움 받기 */ + public String writingGuide(){ + return writingGuideGenerator.getRandomGuide(); + } + /* 기록(게시글) 전체 조회 */ @Transactional public PostAllResponseDTO getPostAll(PostAllRequestDTO postAllRequestDTO, String email){ diff --git a/src/main/java/com/moongeul/backend/api/post/util/WritingGuideGenerator.java b/src/main/java/com/moongeul/backend/api/post/util/WritingGuideGenerator.java new file mode 100644 index 0000000..51d51bd --- /dev/null +++ b/src/main/java/com/moongeul/backend/api/post/util/WritingGuideGenerator.java @@ -0,0 +1,80 @@ +package com.moongeul.backend.api.post.util; + +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Random; + +@Service +@RequiredArgsConstructor +public class WritingGuideGenerator { + + private final Random random = new Random(); + + // 50가지 질문 리스트 + private static final List GUIDES = List.of( + // 1. 감정 및 공감 중심 + "주인공의 가장 이해되지 않았던 행동은 무엇인가요?", + "내가 만약 주인공이었다면 그 상황에서 어떤 선택을 했을까요?", + "책 속 인물 중 한 명에게 편지를 쓴다면 누구에게 어떤 말을 전하고 싶나요?", + "작별 인사를 건네고 싶은 캐릭터와 그 이유는?", + "주인공이 현실 세계에서 내 친구라면 우리는 잘 지냈을까요?", + "책을 읽으며 가장 화가 났거나 억울했던 순간은 언제인가요?", + "악역이라고 생각했던 인물에게 연민을 느낀 지점이 있었나요?", + "주인공의 성격 중 닮고 싶은 부분과 버리고 싶은 부분은?", + "등장인물 중 한 명의 '비밀 일기'를 훔쳐본다면 누구의 일기를 보고 싶나요?", + "이야기의 결말 이후, 인물들은 지금 어떻게 살고 있을 것 같나요?", + "주인공이 가장 행복해 보였던 순간, 당신은 어떤 표정을 짓고 있었나요?", + "책 속 인물 중 한 명과 딱 하루만 몸이 바뀐다면 무엇을 먼저 하고 싶나요?", + "이야기 속 갈등이 해결되지 않고 끝났다면, 주인공은 지금 어떤 감정일까요?", + + // 2. 감각 및 장면 묘사 + "이 책을 한 줄의 '향기'로 표현한다면 어떤 냄새가 날까요?", + "책 전체의 분위기를 색깔로 칠한다면 어떤 색일까요?", + "이 책의 배경이 된 장소 중 가장 가보고 싶은 곳은 어디인가요?", + "읽는 내내 머릿속에 가장 선명하게 그려졌던 풍경은?", + "특정 장면을 영화로 만든다면 어떤 음악(BGM)이 어울릴까요?", + "책에서 묘사된 음식 중 가장 먹어보고 싶었던 것은?", + "이 책을 읽을 때 날씨는 어떠했나요? 그 날씨가 감상에 영향을 주었나요?", + "책의 내용을 사진 한 장으로 찍는다면 무엇을 담고 싶나요?", + "주인공의 집 구조를 상상해본다면 어떤 모습인가요?", + "이 책의 표지를 다시 디자인한다면 꼭 넣고 싶은 오브제는?", + "이 책의 전체적인 질감을 손으로 만져본다면 거칠까요, 부드러울까요?", + "책의 클라이맥스 장면을 하나의 '소리'로 표현한다면?", + + // 3. 지적 호기심 및 비판적 시각 + "작가가 이 책을 통해 세상에 던지고 싶었던 핵심 질문은 무엇일까요?", + "이야기의 전개 중 가장 '반전'이라고 느꼈던 지점은 어디인가요?", + "제목이 '이것'이 아니라면, 내가 지어주고 싶은 새로운 제목은?", + "작가의 가치관 중 동의하기 어려웠던 부분이 있었나요?", + "이 책에서 가장 논쟁의 여지가 많을 것 같은 주제는 무엇인가요?", + "만약 이야기의 시점이 다른 인물로 바뀌었다면 어땠을까요?", + "이 책이 출간된 시대적 배경이 현대라면 무엇이 달라졌을까요?", + "책의 중간에서 이야기를 끊고 내 마음대로 결말을 바꾼다면?", + "작가가 독자에게 숨겨놓은 '복선'을 찾아냈나요?", + "이 책의 내용 중 과학적/논리적으로 납득되지 않았던 부분이 있나요?", + "작가가 독자에게 절대 알려주지 않고 숨겨놓은 '비하인드 스토리'는 무엇일까요?", + "책 속의 갈등 상황을 현대의 법정에 세운다면 판사는 누구의 손을 들어줄까요?", + + // 4. 개인적 성찰 및 변화 + "이 책을 읽기 전의 나와 읽은 후의 나는 무엇이 달라졌나요?", + "내 인생의 한 조각과 닮아있는 에피소드가 있었나요?", + "지금 당장 누군가에게 이 책을 추천한다면, 그 이유는 무엇인가요?", + "책 속에서 얻은 가장 값진 문장 하나를 필사해 본다면?", + "이 책을 10년 뒤에 다시 읽는다면 내 기분이 어떨까요?", + "삶의 태도를 바꾸게 만든 결정적인 문구가 있었나요?", + "내가 이 책의 저자라면, 서문에 어떤 말을 적었을까요?", + "이 책이 나에게 준 '위로' 혹은 '경고'는 무엇인가요?", + "평소에 고민하던 문제에 대한 해답을 이 책에서 찾았나요?", + "책을 다 덮고 나서 가장 먼저 떠오른 생각은 무엇이었나요?", + "이 책을 읽기 전의 나에게 '스포일러' 없이 딱 한 문장만 조언한다면?", + "책의 교훈을 어린아이에게 동화처럼 설명해준다면?", + "첫 페이지를 넘기기 전의 기대감과 마지막 페이지를 덮은 후의 만족도 차이는?" + ); + + public String getRandomGuide(){ + int index = random.nextInt(GUIDES.size()); + return GUIDES.get(index); + } +} diff --git a/src/main/java/com/moongeul/backend/common/response/SuccessStatus.java b/src/main/java/com/moongeul/backend/common/response/SuccessStatus.java index c000e1f..88ea67e 100644 --- a/src/main/java/com/moongeul/backend/common/response/SuccessStatus.java +++ b/src/main/java/com/moongeul/backend/common/response/SuccessStatus.java @@ -53,6 +53,7 @@ public enum SuccessStatus { DELETE_POST_SUCCESS(HttpStatus.OK, "기록(게시글) 삭제 성공"), POST_LIKE_SUCCESS(HttpStatus.OK, "기록(게시글) 공감 버튼 등록 성공"), GET_WEEKLY_RECOMMENDATION_SUCCESS(HttpStatus.OK, "주간 추천 기록 조회 성공"), + GET_WRITING_GUIDE(HttpStatus.OK, "글쓰기 도움 받기 조회 성공"), /* CATEGORY */ GET_CATEGORY_SUCCESS(HttpStatus.OK, "카테고리 전체 조회 성공"),