From be318b21f3b93ce14e0fab0f2633f2c70096e46c Mon Sep 17 00:00:00 2001
From: sung-silver <jinna0319@gmail.com>
Date: Thu, 21 Mar 2024 22:32:18 +0900
Subject: [PATCH 1/5] =?UTF-8?q?[FEAT]=20=EC=84=9C=EB=B9=84=EC=8A=A4=20?=
 =?UTF-8?q?=EB=8B=A8=EC=97=90=EC=84=9C=20=EB=8F=84=EB=A9=94=EC=9D=B8=20?=
 =?UTF-8?q?=EB=A1=9C=EC=A7=81=20=EB=B6=84=EB=A6=AC?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../java/com/sopt/Server/common/AgeEnum.java  | 13 +++++++++
 .../java/com/sopt/Server/domain/Result.java   |  4 +++
 .../sopt/Server/service/ResultService.java    | 27 +++----------------
 3 files changed, 21 insertions(+), 23 deletions(-)

diff --git a/howoldareu_clone/src/main/java/com/sopt/Server/common/AgeEnum.java b/howoldareu_clone/src/main/java/com/sopt/Server/common/AgeEnum.java
index c48727c..7b0f2d5 100644
--- a/howoldareu_clone/src/main/java/com/sopt/Server/common/AgeEnum.java
+++ b/howoldareu_clone/src/main/java/com/sopt/Server/common/AgeEnum.java
@@ -18,5 +18,18 @@ public enum AgeEnum {
     private final String imageUrl1;
     private final String imageUrl2;
 
+    public static AgeEnum getAgeEnum(int age){
+        if(age < 20)
+            return AgeEnum.TEENAGER;
+        else if(age < 30)
+            return AgeEnum.TWENTIES;
+        else if(age < 40)
+            return AgeEnum.THIRTIES;
+        else if(age < 50)
+            return AgeEnum.FORTIES;
+        else
+            return AgeEnum.FIFTIES;
+    }
+
 }
 
diff --git a/howoldareu_clone/src/main/java/com/sopt/Server/domain/Result.java b/howoldareu_clone/src/main/java/com/sopt/Server/domain/Result.java
index 42752a5..a21a1c4 100644
--- a/howoldareu_clone/src/main/java/com/sopt/Server/domain/Result.java
+++ b/howoldareu_clone/src/main/java/com/sopt/Server/domain/Result.java
@@ -34,4 +34,8 @@ public Result(Long id, Member member, int resultAge, LocalDateTime testedDate) {
         this.resultAge = resultAge;
         this.testedDate = testedDate;
     }
+
+    public String getTestedDateToString(){
+        return testedDate.getMonthValue() + "월 " + testedDate.getDayOfMonth() + "일";
+    }
 }
diff --git a/howoldareu_clone/src/main/java/com/sopt/Server/service/ResultService.java b/howoldareu_clone/src/main/java/com/sopt/Server/service/ResultService.java
index 5a24a8d..765e3e9 100644
--- a/howoldareu_clone/src/main/java/com/sopt/Server/service/ResultService.java
+++ b/howoldareu_clone/src/main/java/com/sopt/Server/service/ResultService.java
@@ -19,7 +19,6 @@
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
-import java.time.LocalDateTime;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -41,7 +40,7 @@ public ResultResponseDTO saveResult(AnswerListRequestDTO request) {
             Answer answer = answerJpaRepository.findByQuestionAndAnswerType(question, result.answerType()).orElseThrow(()->new CustomException(Error.NOT_FOUND_ANSWER_EXCEPTION,Error.NOT_FOUND_ANSWER_EXCEPTION.getMessage()));
             memberAge += answer.getAnswerScore();
         }
-        AgeEnum ageEnum = getAgeEnum(memberAge);
+        AgeEnum ageEnum = AgeEnum.getAgeEnum(memberAge);
         resultJpaRepository.save(Result.builder().member(member).resultAge(memberAge).build());
         return ResultResponseDTO.of(request.nickname(),memberAge,ageEnum.getTitle(),ageEnum.getContent(),ageEnum.getImageUrl1(), ageEnum.getImageUrl2());
     }
@@ -50,10 +49,10 @@ public List<AllResultsResponseDTO> getAllResults(Long memberId) {
 
         List<Result> resultList  = resultJpaRepository.findAllByMemberIdOrderByIdDesc(memberId);
         List<AllResultsResponseDTO> answer = new ArrayList<>();
-        //멤버의 result 모두 갖고옴 이것을 각각의 result마다 allresultsresponsedto만들어야 해
+
         for(Result result : resultList) {
-            AgeEnum ageEnum = getAgeEnum(result.getResultAge());
-            String time = getStringDate(result.getTestedDate());
+            AgeEnum ageEnum = AgeEnum.getAgeEnum(result.getResultAge());
+            String time = result.getTestedDateToString();
             AllResultsResponseDTO dto = AllResultsResponseDTO.of(result, ageEnum.getTitle(), ageEnum.getContent(), time, ageEnum.getImageUrl1(), ageEnum.getImageUrl2());
             answer.add(dto);
         }
@@ -62,22 +61,4 @@ public List<AllResultsResponseDTO> getAllResults(Long memberId) {
 
     }
 
-    private String getStringDate(LocalDateTime time) {
-        String answer = time.getMonthValue() + "월 " + time.getDayOfMonth() + "일";
-        return answer;
-    }
-
-    private AgeEnum getAgeEnum(int age){
-        if(age < 20)
-            return AgeEnum.TEENAGER;
-        else if(age < 30)
-            return AgeEnum.TWENTIES;
-        else if(age < 40)
-            return AgeEnum.THIRTIES;
-        else if(age < 50)
-            return AgeEnum.FORTIES;
-        else
-            return AgeEnum.FIFTIES;
-    }
-
 }

From 6e2ec209822506d98d360f5359286234d2bf86e1 Mon Sep 17 00:00:00 2001
From: sung-silver <jinna0319@gmail.com>
Date: Thu, 21 Mar 2024 22:33:06 +0900
Subject: [PATCH 2/5] =?UTF-8?q?[STYLE]=20enum=20=EC=9C=84=EC=B9=98=20?=
 =?UTF-8?q?=EB=8F=84=EB=A9=94=EC=9D=B8=20=EC=95=84=EB=9E=98=EB=A1=9C=20?=
 =?UTF-8?q?=EB=B3=80=EA=B2=BD?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../java/com/sopt/Server/{common => domain/enums}/AgeEnum.java  | 2 +-
 .../src/main/java/com/sopt/Server/service/ResultService.java    | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)
 rename howoldareu_clone/src/main/java/com/sopt/Server/{common => domain/enums}/AgeEnum.java (98%)

diff --git a/howoldareu_clone/src/main/java/com/sopt/Server/common/AgeEnum.java b/howoldareu_clone/src/main/java/com/sopt/Server/domain/enums/AgeEnum.java
similarity index 98%
rename from howoldareu_clone/src/main/java/com/sopt/Server/common/AgeEnum.java
rename to howoldareu_clone/src/main/java/com/sopt/Server/domain/enums/AgeEnum.java
index 7b0f2d5..3d62a69 100644
--- a/howoldareu_clone/src/main/java/com/sopt/Server/common/AgeEnum.java
+++ b/howoldareu_clone/src/main/java/com/sopt/Server/domain/enums/AgeEnum.java
@@ -1,4 +1,4 @@
-package com.sopt.Server.common;
+package com.sopt.Server.domain.enums;
 
 import lombok.AccessLevel;
 import lombok.AllArgsConstructor;
diff --git a/howoldareu_clone/src/main/java/com/sopt/Server/service/ResultService.java b/howoldareu_clone/src/main/java/com/sopt/Server/service/ResultService.java
index 765e3e9..5f076d3 100644
--- a/howoldareu_clone/src/main/java/com/sopt/Server/service/ResultService.java
+++ b/howoldareu_clone/src/main/java/com/sopt/Server/service/ResultService.java
@@ -1,6 +1,6 @@
 package com.sopt.Server.service;
 
-import com.sopt.Server.common.AgeEnum;
+import com.sopt.Server.domain.enums.AgeEnum;
 import com.sopt.Server.controller.request.AnswerListRequestDTO;
 import com.sopt.Server.controller.request.AnswerRequestDTO;
 import com.sopt.Server.controller.response.AllResultsResponseDTO;

From ad8387c5ba81d852f9e0f99e3d9bb16df438a1fa Mon Sep 17 00:00:00 2001
From: sung-silver <jinna0319@gmail.com>
Date: Thu, 21 Mar 2024 22:51:25 +0900
Subject: [PATCH 3/5] =?UTF-8?q?[DOMAIN]=20AgeEnumTest=20=EC=9E=91=EC=84=B1?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../sopt/Server/domain/enums/AgeEnumTest.java | 45 +++++++++++++++++++
 1 file changed, 45 insertions(+)
 create mode 100644 howoldareu_clone/src/test/java/com/sopt/Server/domain/enums/AgeEnumTest.java

diff --git a/howoldareu_clone/src/test/java/com/sopt/Server/domain/enums/AgeEnumTest.java b/howoldareu_clone/src/test/java/com/sopt/Server/domain/enums/AgeEnumTest.java
new file mode 100644
index 0000000..606fb1e
--- /dev/null
+++ b/howoldareu_clone/src/test/java/com/sopt/Server/domain/enums/AgeEnumTest.java
@@ -0,0 +1,45 @@
+package com.sopt.Server.domain.enums;
+
+import org.junit.jupiter.api.DisplayName;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+public class AgeEnumTest {
+    private static final int eighteen = 18;
+    private static final int twentyFive = 25;
+    private static final int thirtyOne = 31;
+    private static final int fortyThree = 43;
+    private static final int fiftyFive = 55;
+
+    @Test
+    @DisplayName("18세는 10대이다")
+    void getAgeEnumTeenager() {
+        assertEquals(AgeEnum.TEENAGER, AgeEnum.getAgeEnum(eighteen));
+    }
+
+    @Test
+    @DisplayName("25세는 20대이다")
+    void getAgeEnumTwenties() {
+        assertEquals(AgeEnum.TWENTIES, AgeEnum.getAgeEnum(twentyFive));
+    }
+
+    @Test
+    @DisplayName("31세는 30대이다")
+    void getAgeEnumThirties() {
+        assertEquals(AgeEnum.THIRTIES, AgeEnum.getAgeEnum(thirtyOne));
+    }
+
+    @Test
+    @DisplayName("43세는 40대이다")
+    void getAgeEnumForties() {
+        assertEquals(AgeEnum.FORTIES, AgeEnum.getAgeEnum(fortyThree));
+    }
+
+    @Test
+    @DisplayName("55세는 50대이다")
+    void getAgeEnumFifties() {
+        assertEquals(AgeEnum.FIFTIES, AgeEnum.getAgeEnum(fiftyFive));
+    }
+
+}
\ No newline at end of file

From 6154145cbfbf49e8d3fbf609c9f9392b01f8cd85 Mon Sep 17 00:00:00 2001
From: sung-silver <jinna0319@gmail.com>
Date: Thu, 21 Mar 2024 22:57:12 +0900
Subject: [PATCH 4/5] =?UTF-8?q?[DOMAIN]=20Result=20=EC=97=94=ED=8B=B0?=
 =?UTF-8?q?=ED=8B=B0=EC=97=90=EC=84=9C=20getTestDateToString=20=ED=95=A8?=
 =?UTF-8?q?=EC=88=98=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=9E=91=EC=84=B1?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../com/sopt/Server/domain/ResultTest.java    | 27 +++++++++++++++++++
 1 file changed, 27 insertions(+)
 create mode 100644 howoldareu_clone/src/test/java/com/sopt/Server/domain/ResultTest.java

diff --git a/howoldareu_clone/src/test/java/com/sopt/Server/domain/ResultTest.java b/howoldareu_clone/src/test/java/com/sopt/Server/domain/ResultTest.java
new file mode 100644
index 0000000..68d2591
--- /dev/null
+++ b/howoldareu_clone/src/test/java/com/sopt/Server/domain/ResultTest.java
@@ -0,0 +1,27 @@
+package com.sopt.Server.domain;
+
+import org.junit.jupiter.api.DisplayName;
+import org.junit.jupiter.api.Test;
+
+import java.time.LocalDateTime;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+public class ResultTest {
+    @Test
+    @DisplayName("결과가 생성된 일자 정보를 반환한다")
+    void getTestDateToString() {
+        // given
+        LocalDateTime testedDate = LocalDateTime.of(2023, 3, 21, 12, 30);
+        Result result = Result.builder()
+                .testedDate(testedDate)
+                .build();
+        String expected = "3월 21일";
+
+        // when
+        String resultString = result.getTestedDateToString();
+
+        // then
+        assertEquals(expected, resultString);
+    }
+}
\ No newline at end of file

From 86e90bf4060e423aa83fbc1f720220dc244f9d4e Mon Sep 17 00:00:00 2001
From: sung-silver <jinna0319@gmail.com>
Date: Tue, 26 Mar 2024 09:11:21 +0900
Subject: [PATCH 5/5] =?UTF-8?q?[REFACTOR]=20saveMember=20=EB=A6=AC?=
 =?UTF-8?q?=ED=8C=A9=ED=84=B0=EB=A7=81,=20repository=EC=97=90=EC=84=9C=20?=
 =?UTF-8?q?=EB=AA=85=EC=8B=9C=ED=95=98=EC=A7=80=20=EC=95=8A=EC=95=84?=
 =?UTF-8?q?=EB=8F=84=20=EB=90=98=EB=8A=94=20=EB=A9=94=EC=84=9C=EB=93=9C=20?=
 =?UTF-8?q?=EC=82=AD=EC=A0=9C?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 howoldareu_clone/build.gradle                 |  2 ++
 .../Server/controller/MemberController.java   |  8 +++----
 .../java/com/sopt/Server/domain/Answer.java   |  2 +-
 .../repository/MemberJpaRepository.java       |  6 +++++
 .../repository/QuestionJpaRepository.java     |  2 --
 .../repository/ResultJpaRepository.java       |  2 --
 .../sopt/Server/service/MemberService.java    | 23 ++++++++++---------
 7 files changed, 25 insertions(+), 20 deletions(-)

diff --git a/howoldareu_clone/build.gradle b/howoldareu_clone/build.gradle
index 7248b5c..8ac9063 100644
--- a/howoldareu_clone/build.gradle
+++ b/howoldareu_clone/build.gradle
@@ -28,6 +28,8 @@ dependencies {
 	runtimeOnly 'com.mysql:mysql-connector-j'
 	annotationProcessor 'org.projectlombok:lombok'
 	testImplementation 'org.springframework.boot:spring-boot-starter-test'
+    testImplementation 'org.springframework.restdocs:spring-restdocs-mockmvc'
+    testImplementation 'org.springframework.restdocs:spring-restdocs-asciidoctor'
 }
 
 tasks.named('test') {
diff --git a/howoldareu_clone/src/main/java/com/sopt/Server/controller/MemberController.java b/howoldareu_clone/src/main/java/com/sopt/Server/controller/MemberController.java
index 35d6709..e00d374 100644
--- a/howoldareu_clone/src/main/java/com/sopt/Server/controller/MemberController.java
+++ b/howoldareu_clone/src/main/java/com/sopt/Server/controller/MemberController.java
@@ -9,16 +9,16 @@
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RestController;
 
+import static com.sopt.Server.exception.Success.CREATE_MEMBER_SUCCESS;
+
 @RestController
 @RequiredArgsConstructor
 public class MemberController {
-
+    
     private final MemberService memberService;
 
     @PostMapping("/member")
     public ApiResponse<MemberGetResponse> saveMember(@RequestBody MemberPostRequest request) {
-
-        ApiResponse<MemberGetResponse> response = memberService.saveMember(request.nickName(), request.age());
-        return response;
+        return ApiResponse.success(CREATE_MEMBER_SUCCESS, memberService.saveMember(request));
     }
 }
diff --git a/howoldareu_clone/src/main/java/com/sopt/Server/domain/Answer.java b/howoldareu_clone/src/main/java/com/sopt/Server/domain/Answer.java
index 4efbc45..84a2be4 100644
--- a/howoldareu_clone/src/main/java/com/sopt/Server/domain/Answer.java
+++ b/howoldareu_clone/src/main/java/com/sopt/Server/domain/Answer.java
@@ -14,7 +14,7 @@ public class Answer {
     @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
     private Long answerId;
 
-    @ManyToOne
+    @ManyToOne(fetch = FetchType.LAZY)
     private Question question;
 
     private boolean answerType;
diff --git a/howoldareu_clone/src/main/java/com/sopt/Server/repository/MemberJpaRepository.java b/howoldareu_clone/src/main/java/com/sopt/Server/repository/MemberJpaRepository.java
index e9259dd..2e1a48d 100644
--- a/howoldareu_clone/src/main/java/com/sopt/Server/repository/MemberJpaRepository.java
+++ b/howoldareu_clone/src/main/java/com/sopt/Server/repository/MemberJpaRepository.java
@@ -1,10 +1,16 @@
 package com.sopt.Server.repository;
 
 import com.sopt.Server.domain.Member;
+import jakarta.persistence.EntityNotFoundException;
 import org.springframework.data.jpa.repository.JpaRepository;
 
 import java.util.Optional;
 
 public interface MemberJpaRepository extends JpaRepository<Member, Long> {
     Optional<Member> findByName(String name);
+    default Member findByNameOrThrow(String name) {
+        return findByName(name)
+                .orElseThrow(() ->
+                        new EntityNotFoundException("해당 이름의 회원이 존재하지 않습니다."));
+    }
 }
diff --git a/howoldareu_clone/src/main/java/com/sopt/Server/repository/QuestionJpaRepository.java b/howoldareu_clone/src/main/java/com/sopt/Server/repository/QuestionJpaRepository.java
index 56d6621..e70cdb2 100644
--- a/howoldareu_clone/src/main/java/com/sopt/Server/repository/QuestionJpaRepository.java
+++ b/howoldareu_clone/src/main/java/com/sopt/Server/repository/QuestionJpaRepository.java
@@ -7,6 +7,4 @@
 import java.util.Optional;
 
 public interface QuestionJpaRepository extends JpaRepository<Question, Long>{
-    List<Question> findAll();
-    Optional<Question> findById(Long id);
 }
diff --git a/howoldareu_clone/src/main/java/com/sopt/Server/repository/ResultJpaRepository.java b/howoldareu_clone/src/main/java/com/sopt/Server/repository/ResultJpaRepository.java
index e9cb02b..67d7279 100644
--- a/howoldareu_clone/src/main/java/com/sopt/Server/repository/ResultJpaRepository.java
+++ b/howoldareu_clone/src/main/java/com/sopt/Server/repository/ResultJpaRepository.java
@@ -6,7 +6,5 @@
 import java.util.List;
 
 public interface ResultJpaRepository extends JpaRepository<Result, Long>{
-    Result save(Result result);
-
     List<Result> findAllByMemberIdOrderByIdDesc(Long memberId);
 }
diff --git a/howoldareu_clone/src/main/java/com/sopt/Server/service/MemberService.java b/howoldareu_clone/src/main/java/com/sopt/Server/service/MemberService.java
index b61f781..b6c954a 100644
--- a/howoldareu_clone/src/main/java/com/sopt/Server/service/MemberService.java
+++ b/howoldareu_clone/src/main/java/com/sopt/Server/service/MemberService.java
@@ -1,16 +1,14 @@
 package com.sopt.Server.service;
 
-import com.sopt.Server.common.ApiResponse;
+import com.sopt.Server.controller.request.MemberPostRequest;
 import com.sopt.Server.controller.response.MemberGetResponse;
 import com.sopt.Server.domain.Member;
-import com.sopt.Server.exception.Success;
 import com.sopt.Server.repository.MemberJpaRepository;
+import jakarta.persistence.EntityNotFoundException;
 import lombok.RequiredArgsConstructor;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
-import java.util.Optional;
-
 @Service
 @RequiredArgsConstructor
 @Transactional(readOnly = true)
@@ -19,14 +17,17 @@ public class MemberService {
     private final MemberJpaRepository memberJpaRepository;
 
     @Transactional
-    public ApiResponse<MemberGetResponse> saveMember(String nickName, int age) {
-        Member newMember = Member.builder().name(nickName).realAge(age).build();
-        Member member = memberJpaRepository.findByName(nickName).orElse(null);//null이면
-        if(member != null)//있다면
-            return ApiResponse.success(Success.GET_MEMBER_SUCCESS, MemberGetResponse.of(member));
-        else {
+    public MemberGetResponse saveMember(MemberPostRequest request) {
+        try {
+            Member member = memberJpaRepository.findByNameOrThrow(request.nickName());
+            return MemberGetResponse.of(member);
+        } catch (EntityNotFoundException e) {
+            Member newMember = Member.builder()
+                    .name(request.nickName())
+                    .realAge(request.age())
+                    .build();
             memberJpaRepository.save(newMember);
+            return MemberGetResponse.of(newMember);
         }
-        return ApiResponse.success(Success.CREATE_MEMBER_SUCCESS, MemberGetResponse.of(newMember));
     }
 }