Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,22 @@ public ResponseEntity<ApiResponse<PostIdResponseDTO>> 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<ApiResponse<String>> writingGuide() {

String response = postService.writingGuide();
return ApiResponse.success(SuccessStatus.GET_WRITING_GUIDE, response);
}

@Operation(
summary = "기록(게시글) 전체 조회 API",
description = "메인페이지(홈화면)에서 사용되는 기록(게시글)의 전체 조회 API 입니다." +
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -51,6 +52,7 @@ public class PostService {
private final BookshelfCalculator bookshelfCalculator;

private final NotificationTriggerService notificationTriggerService;
private final WritingGuideGenerator writingGuideGenerator;


/*
Expand Down Expand Up @@ -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){
Expand Down
Original file line number Diff line number Diff line change
@@ -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<String> GUIDES = List.of(
// 1. 감정 및 공감 중심
"주인공의 가장 이해되지 않았던 행동은 무엇인가요?",
"내가 만약 주인공이었다면 그 상황에서 어떤 선택을 했을까요?",
"책 속 인물 중 한 명에게 편지를 쓴다면 누구에게 어떤 말을 전하고 싶나요?",
"작별 인사를 건네고 싶은 캐릭터와 그 이유는?",
"주인공이 현실 세계에서 내 친구라면 우리는 잘 지냈을까요?",
"책을 읽으며 가장 화가 났거나 억울했던 순간은 언제인가요?",
"악역이라고 생각했던 인물에게 연민을 느낀 지점이 있었나요?",
"주인공의 성격 중 닮고 싶은 부분과 버리고 싶은 부분은?",
"등장인물 중 한 명의 '비밀 일기'를 훔쳐본다면 누구의 일기를 보고 싶나요?",
"이야기의 결말 이후, 인물들은 지금 어떻게 살고 있을 것 같나요?",
"주인공이 가장 행복해 보였던 순간, 당신은 어떤 표정을 짓고 있었나요?",
"책 속 인물 중 한 명과 딱 하루만 몸이 바뀐다면 무엇을 먼저 하고 싶나요?",
"이야기 속 갈등이 해결되지 않고 끝났다면, 주인공은 지금 어떤 감정일까요?",

// 2. 감각 및 장면 묘사
"이 책을 한 줄의 '향기'로 표현한다면 어떤 냄새가 날까요?",
"책 전체의 분위기를 색깔로 칠한다면 어떤 색일까요?",
"이 책의 배경이 된 장소 중 가장 가보고 싶은 곳은 어디인가요?",
"읽는 내내 머릿속에 가장 선명하게 그려졌던 풍경은?",
"특정 장면을 영화로 만든다면 어떤 음악(BGM)이 어울릴까요?",
"책에서 묘사된 음식 중 가장 먹어보고 싶었던 것은?",
"이 책을 읽을 때 날씨는 어떠했나요? 그 날씨가 감상에 영향을 주었나요?",
"책의 내용을 사진 한 장으로 찍는다면 무엇을 담고 싶나요?",
"주인공의 집 구조를 상상해본다면 어떤 모습인가요?",
"이 책의 표지를 다시 디자인한다면 꼭 넣고 싶은 오브제는?",
"이 책의 전체적인 질감을 손으로 만져본다면 거칠까요, 부드러울까요?",
"책의 클라이맥스 장면을 하나의 '소리'로 표현한다면?",

// 3. 지적 호기심 및 비판적 시각
"작가가 이 책을 통해 세상에 던지고 싶었던 핵심 질문은 무엇일까요?",
"이야기의 전개 중 가장 '반전'이라고 느꼈던 지점은 어디인가요?",
"제목이 '이것'이 아니라면, 내가 지어주고 싶은 새로운 제목은?",
"작가의 가치관 중 동의하기 어려웠던 부분이 있었나요?",
"이 책에서 가장 논쟁의 여지가 많을 것 같은 주제는 무엇인가요?",
"만약 이야기의 시점이 다른 인물로 바뀌었다면 어땠을까요?",
"이 책이 출간된 시대적 배경이 현대라면 무엇이 달라졌을까요?",
"책의 중간에서 이야기를 끊고 내 마음대로 결말을 바꾼다면?",
"작가가 독자에게 숨겨놓은 '복선'을 찾아냈나요?",
"이 책의 내용 중 과학적/논리적으로 납득되지 않았던 부분이 있나요?",
"작가가 독자에게 절대 알려주지 않고 숨겨놓은 '비하인드 스토리'는 무엇일까요?",
"책 속의 갈등 상황을 현대의 법정에 세운다면 판사는 누구의 손을 들어줄까요?",

// 4. 개인적 성찰 및 변화
"이 책을 읽기 전의 나와 읽은 후의 나는 무엇이 달라졌나요?",
"내 인생의 한 조각과 닮아있는 에피소드가 있었나요?",
"지금 당장 누군가에게 이 책을 추천한다면, 그 이유는 무엇인가요?",
"책 속에서 얻은 가장 값진 문장 하나를 필사해 본다면?",
"이 책을 10년 뒤에 다시 읽는다면 내 기분이 어떨까요?",
"삶의 태도를 바꾸게 만든 결정적인 문구가 있었나요?",
"내가 이 책의 저자라면, 서문에 어떤 말을 적었을까요?",
"이 책이 나에게 준 '위로' 혹은 '경고'는 무엇인가요?",
"평소에 고민하던 문제에 대한 해답을 이 책에서 찾았나요?",
"책을 다 덮고 나서 가장 먼저 떠오른 생각은 무엇이었나요?",
"이 책을 읽기 전의 나에게 '스포일러' 없이 딱 한 문장만 조언한다면?",
"책의 교훈을 어린아이에게 동화처럼 설명해준다면?",
"첫 페이지를 넘기기 전의 기대감과 마지막 페이지를 덮은 후의 만족도 차이는?"
);

public String getRandomGuide(){
int index = random.nextInt(GUIDES.size());
return GUIDES.get(index);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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, "카테고리 전체 조회 성공"),
Expand Down