6/5 ~ 6/9

2024. 6. 5. 13:27

6/5

  1. 기존에는 가입 시에, role 정한 대로 바로 환자 OR 간병인도 엔티티를 같이 생성했었는데, 그러면 환자 프로필 등록 후에 다른 환자로 변경해서 등록하고 싶을 때, 불가능해진다. (환자가 매치 리스트를 가지고 있음) 환자 엔티티 삭제 시 매치도 다 날라감.
    1. 새로 회원가입 해서 다른 환자 등록 하는 방법. -> 즉, 환자 프로필 전체 삭제가 안되고, 처음 등록한 환자로 쭉 간다. 세부정보 수정만 가능.  ->? 새로운 환자 등록 버튼. -> 등록 되면 기존 환자 엔티티 삭제후 멤버와 연결. 이러면 환자 엔티티가 새로 만들어지고 기존 환자 정보, 매치리스트 사라짐.
    2. Member가 매치리스트를 가지고 있고, 환자 등록, 변경, 삭제가 자유로움.
  2. 세부 작성아님 (아예 새로운 환자로 바꾸고 싶을 때) 새로운 환자 등록 => 기존 환자 존재 시, 새로운 환자가 가입할 수 있는 환자이면 기존 환자 엔티티 제거 후 새로 등록.
    1. 처음 가입할때 환자가 등록돼서, 기존 환자가 무조건 존재함.

 

 

 

  1. 프로필 작성 흐름
    1. 프로필 등록(작성) 
      1. 회원은 역할(User"이용자=환자", Caregiver"간병인") 중 하나를 골라 가입한다.
      2. 프로필 작성에는 본인 인증이 필요하다. (중복 가입 방지 위해) => 휴대폰 인증을 통해 진행한다.
        1. 각각 필수 입력 항목이 다르다. (ex. 환자 - 이름, 주민번호, 휴대폰 번호, 주소, 환자 특이사항 등...) 추후 논의 필요
      3. 프로필 작성 완료 후에는 isCompletedProfile = true로 설정한다.
      4. isCompletedProfile = true 라면
        1. 검색 허용(참고 2.1.1.1)을 할 수 있다. (= 매칭 신청을 받을 수 있다.)
        2. 상대방에게 매칭 신청을 할 수 있다.
    2. 프로필 수정
      1. 본인인증과 관련된 부분을 제외한 필드들(ex. 주소, 특이사항 등)을 수정할 수 있다.
    3. 프로필 삭제
      1. 프로필을 삭제할 수 있다. (ex. 환자 프로필 삭제 시, Patient 테이블에서 사라짐, 환자 본인이 속해있는 Match 모두 삭제 cacade.REMOVE)
      2. 삭제 후 다른 프로필로 등록할 수 있다. (ex. 이첫째 라는 이름으로 환자 프로필 등록 후, 삭제 후에 이둘째 라는 이름으로 본인인증 후 등록 가능) 
      3. but, 처음 가입 시 환자로 가입했다면, 프로필도 환자로만 등록 가능하다. (프로필 등록 양식이 다름)
  2. 매칭 시스템 동작 흐름
    1. 매칭 신청 
      1. 매칭 신청을 하려면 먼저 본인의 프로필 등록상대방(본인이 환자면 간병인, 본인이 간병인이면 환자)의 프로필 등록 & 검색 허용이 완료되어야 한다.
        1. 본인 프로필 검색 허용(=상대방의 탐색 리스트에 등록)은 본인의 세부 프로필(필수 항목 포함) 작성 완료 후에 허용할 수 있다.
      2. 신청 완료 시, 본인의 프로필 스냅샷과 MatchStatus = PENDING, ReadStatus = UNREAD, FirstRequest = 요청한 쪽 (ex. PATIENT_FIRST)로 매칭이 저장된다.
    2. 매칭 수락
      1. 상대방이 수락 완료 시, 상대방의 프로필 스냅샷이 저장되고 MatchStatus = ACCEPTED, ReadStatus = READ로 변경된다.
      2. 수락 이후 채팅 or 계약으로 연결할 수 있다.
    3. 매칭 취소
      1. 본인이 보낸 요청을 취소할 수 있다.
      2. 이미 수락된 요청은 취소할 수 없다.
      3. 취소 후 재신청이 가능하다. (새로 Match 생성)
    4. 매칭 단일 조회
      1. 본인이 속해있는 매칭만 조회할 수 있다.
      2. 취소된 매칭은 양쪽 다 조회할 수 없다.
      3. 상대방이 신청한 매칭 조회시 ReadStatus = READ로 변경된다.
    5. 매칭 전체 조회
      1. 본인이 포함된 취소 상태가 아닌 모든 매칭을 10개 단위로 조회한다.
        1. 이후 본인이 신청한 매칭, 신청받은 매칭을 따로 구분하여 조회할 필요가 있을 수 있다.

==============

 

6/6

** 팀원들 의견

그러면 매칭 신청건에 대해 유효기간을 설정하는 것도 좋지 않을까요? 만약 간병인이 열람은 했으나 수락은 안할시에 그 신청내역이 계속 남아있게 되는건가요?

 - 좋은 생각인것 같습니다

저는 진행중인 매칭, 신청 대기중인 매칭으로 나눠서 구분하려고만 했었는데 유효기간을 설정해서 신청 대기중인 매칭에서 유효기간이 끝났거나, 상대가 요청을 받지 않는 상태면 없애는게 좋을거같아요

 

프로필 스냅샷은 말그대로 이미지 파일 인가용??

 

유저가 매칭 중일때 프로필 삭제가 불가능하게 해야 할거 같아요

 -> 그렇다면 현재 '수락(-> 이후 '진행중'으로 변경하면 좋겠다)'에서 상태가 끝나는데, '완료'를 추가해서, 자신이 가진 매칭들 상태가 수락이 하나라도 존재하면 프로필 삭제가 불가능하고, 수락이 없다 = 즉, 진행중인 매칭이 없을때만 프로필 삭제가 가능하도록 하자.

 

도현님 소셜로그인 login?error 문제

 

 

 

 

 

 

 

===================

6/7

1. 본인인증을 환자 프로필 등록시 본인인증을 할건지 vs 가입시 보호자 인증을 할건지

 

- 다른분들 의견 : 보호자로 가입하며 인증을 하고 여러 프로필을 관리할 수 있게 하자.

   - 추가 : 환자 핸드폰이 없을 수도 있다. => 내 생각 : 주민등록증이나 건강보험으로 대체 증명 가능하다.

 - 내 반박 : 중복 프로필이 많이 등록된다. 매칭리스트에 중복환자가 많이 나타난다.

 

 

 

 

=================

6/8

1. PatientService 테스트 진행중임. BDDMockito 와 Mockito의 차이는? when then return, given will return차이? 뭐가 더 낫나.

 

2. 컨트롤러 테스트하고 있는데, 계속 jakarta.servlet.ServletException: Request processing failed: java.lang.IllegalStateException: No primary or single unique constructor found for class org.springframework.security.core.userdetails.User 이 에러 나온다. 

왜? 

@PostMapping
public ResponseEntity<PatientProfileResponse> createPatientProfile(@AuthenticationPrincipal User currentMember,
                                                 @RequestBody @Valid PatientProfileCreateRequest patientProfileCreateRequest) {
    PatientProfileResponse patientProfileResponse = patientService.savePatientProfile(currentMember.getUsername(), patientProfileCreateRequest);
    return ResponseEntity.status(CREATED).body(patientProfileResponse);
}

User 의 기본생성자가 없다는 거다. User는 UserDetails의 것이다. 수정할 수 없다. 즉, 커스텀 어노테이션을 만들어야 하나

 

컨트롤러 테스트 진행 시, 단위 테스트 적용 위해 mockMvc를 해당 컨트롤러만 받아서 진행했더니 User 기본 생성자가 없다는 에러가 나와서 스프링 빈 전체를 올리고 진행하는 통합테스트로 변경하였습니다.
- 추후 원인 분석 후 적용 or 수정 or 원본 유지 예정입니다.

 

 

this.mockMvc = MockMvcBuilders.webAppContextSetup(context).build();

이렇게 하니까 해결됨.

기존에는 

<this.mockMvc = MockMvcBuilders.standaloneSetup(patientController).build();> 였었음.

왜???

 

 

==========================

6/9

CaregiverControllerTest 중,

@Test
@DisplayName("간병인 프로필을 성공적으로 생성한다.")
@WithMockUser
void successCreateCaregiverProfile() throws Exception {
    // given
    Member member = setUpMemberForCaregiver();
    CaregiverProfileCreateRequest request = setUpCaregiverProfileCreateRequest();
    CaregiverProfileResponse response = setUpCaregiverProfileResponseForCreate();
    given(caregiverService.saveCaregiverProfile(eq(member.getUsername()), eq(request))).willReturn(response);

    // when & then
    mockMvc.perform(post("/api/v1/caregiver")
                    .contentType(MediaType.APPLICATION_JSON)
                    .content(objectMapper.writeValueAsString(request))
                    .characterEncoding("UTF-8")
            )
            .andDo(print())
            .andExpect(status().isCreated())
            .andExpect(jsonPath("$.name").value(response.getName()))
            .andExpect(jsonPath("$.residentRegistrationNumber").value(response.getResidentRegistrationNumber()))
            .andExpect(jsonPath("$.phoneNumber").value(response.getPhoneNumber()))
            .andExpect(jsonPath("$.address.street").value(response.getAddress().getStreet()))
            .andExpect(jsonPath("$.address.city").value(response.getAddress().getCity()))
            .andExpect(jsonPath("$.address.zipCode").value(response.getAddress().getZipCode()))
            .andExpect(jsonPath("$.rating").value(response.getRating()))
            .andExpect(jsonPath("$.experienceYears").value(response.getExperienceYears()))
            .andExpect(jsonPath("$.specialization").value(response.getSpecialization()))
            .andExpect(jsonPath("$.caregiverSignificant").value(response.getCaregiverSignificant()));

이렇게 진행중인데, 
java.lang.AssertionError: No value at JSON path "$.name"

at org.springframework.test.util.JsonPathExpectationsHelper.evaluateJsonPath(JsonPathExpectationsHelper.java:302)
at org.springframework.test.util.JsonPathExpectationsHelper.assertValue(JsonPathExpectationsHelper.java:99)
at org.springframework.test.web.servlet.result.JsonPathResultMatchers.lambda$value$2(JsonPathResultMatchers.java:111)
at org.springframework.test.web.servlet.MockMvc$1.andExpect(MockMvc.java:214)
at com.patientpal.backend.caregiver.controller.CaregiverControllerV1Test.successCreateCaregiverProfile(CaregiverControllerV1Test.java:88)
at java.base/java.lang.reflect.Method.invoke(Method.java:568)
at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
Caused by: java.lang.IllegalArgumentException: json can not be null or empty
at cohttp://m.jayway.jsonpath.internal.Utils.notEmpty(Utils.java:401)
at cohttp://m.jayway.jsonpath.JsonPath.read(JsonPath.java:390)
at cohttp://m.jayway.jsonpath.JsonPath.read(JsonPath.java:377)
at org.springframework.test.util.JsonPathExpectationsHelper.evaluateJsonPath(JsonPathExpectationsHelper.java:299)

 

'PatientPal' 카테고리의 다른 글

6/24 ~ 6/30  (0) 2024.06.24
6/17 ~ 6/23  (0) 2024.06.16
6/10 ~ 6/16  (0) 2024.06.11
5/27 ~ 5/28  (0) 2024.05.27
5/24 ~ 5/26  (0) 2024.05.24

BELATED ARTICLES

more