Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: 회원 상세 정보 저장 및 조회 구현 #9

Merged
merged 226 commits into from
Mar 5, 2024
Merged

Conversation

devholic22
Copy link
Collaborator

@devholic22 devholic22 commented Feb 13, 2024

📄 Summary

  • 회원가입 시 필요한 회원 정보 속성 정의
  • 회원 정보 저장
  • 회원 정보 조회
  • 회원 정보 수정 & 삭제

🙋🏻 More

회원 정보 - 구조

  • 회원 정보 (로그인에 필요한 정보를 제외한 모든 정보)의 시작 패키지는 info로 두었습니다.
  • 회원 정보를 크게 profile, option, hobby, style로 나누었습니다. (image도 있으나, 파일 업로드 과정이 포함되어 현재 개발에서는 클래스만 정의해두었습니다.)
    • profileBody (생년월일, 키, 성별), Location (사는 지역 - city는 시/도, sector는 구를 나타냅니다.), Position (latitude: 위도, longitude: 경도), Job (직업)을 가집니다.
    • optionSmoke (흡연), Religion (종교), Drink (음주), Mbti (MBTI), Graduate (최종학력)을 가집니다.
    • hobby는 회원 (Member)과 등록된 취미 이름 (HobbyName - enum) 간의 다대다 구조를 나타내기 위한 브릿지 테이블 엔티티입니다. style도 회원과 스타일 이름 (StyleName - enum) 간의 다대다 구조를 나타내기 위한 브릿지 테이블 엔티티입니다.

회원 정보 - 저장

  • 피그마를 봤을 때 각각 속성을 선택하고 최종 저장을 누르는 것으로 생각해서 처음 저장 시 profile, option, hobby, style을 모두 작성하도록 했습니다.
    • profile, option, hobby, style을 저장하는 행위는 각각의 이벤트 핸들러를 만들어 해결하였습니다. 그렇지 않을 경우 infoService에서 각 하위 서비스를 모두 알아야 할 수 밖에 없기 때문입니다.

회원 정보 - 조회

  • 조회는 이벤트로 이끌어낼 수 없기에, 컨트롤러를 세분화하여 보여주는 식으로 해결하였습니다. 예시로 profile을 조회한다면 /api/info/profile, 취미를 조회한다면 /api/info/hobby 이런 식으로 진행되도록 했습니다.

회원 정보 - 수정

  • 수정은 새롭게 API를 만들지 않고 처음 만든 저장 API를 그대로 활용하도록 했습니다. 각각의 속성만 (ex: 종교만 선택) 변경하도록 메서드를 만들면 속성이 10개가 넘어감에 따라 변경 API도 많아질 것이라 생각했습니다. 그래서 option과 profile의 경우에는 내용을 수정하고, hobby나 style 같은 경우에는 다대다 구조였기에 기존 내역을 입력받은 내역으로 완전히 교체하도록 구현했습니다. 다만 이 부분은 논의해야 할 부분인 것 같습니다.

close #7

- 취미 (Hobbies, Hobby) 정의
- 나의 스타일 (Styles, Style) 정의
- 프로필 사진 (Images, Image) 정의
- 나이 (Age) 정의
- 키 (Height) 정의
- 직업 (Job) 정의
- 지역 (Location) 정의
- 최종학력 (Graduate) 정의
- 성별 (Gender) 정의
- 흡연 (Smoke) 정의
- 음주 (Drink) 정의
- 종교 (Religion) 정의
- MBTI (Mbti) 정의
- 나이, 키, 성별을 MemberBody로 취합
- 선택 사항을 MemberOption으로 취합
- nullable false 조건 추가
- Member 생성 시 Hobbies, Styles, Images 기본 객체 생성되도록 정의
- MemberBody를 MembrProfile로 이름 수정 (로그인에 쓰이지 않는 프로필 정보)
- Location, Job을 MemberProfile로 이동
- TokenProvider의 extract를 이메일로 수정
- LoginValidCheckerInterceptor에서 TokenProvider의 이메일을 가진 회원의 id를 저장하도록 수정

Co-authored-by: eom-tae-in <eti0728@daum.net>
- 기존 도메인에 있던 클래스 파일의 패키지 변경
- Hobbies, Styles 엔티티화
- MemberOption, MemberProfile 대신 Option, Profile로 수정
- Option과 Profile을 담은 겉구조를 info로 변경
- Profile 안에 있는 나이, 키, 성별을 MemberBody에 담도록 수정
- Null 예외처리 추가
- 범위 예외처리 추가
- 속성값 조회 실패 예외처리 추가

Co-authored-by: eom-tae-in <eti0728@daum.net>
- Styles 리포지터리 정의
- Hobbies 리포지터리 정의
- Option 리포지터리 정의
- Profile 리포지터리 정의

Co-authored-by: eom-tae-in <eti0728@daum.net>
- Profile, Option, Hobbies, Styles가 포함된 요청을 가지는 InfoWriteRequest 정의
- 그 외 필요한 세부 DTO 정의

Co-authored-by: eom-tae-in <eti0728@daum.net>
- 새로운 엔티티를 받아서 자신의 도메인 로직에서 수정하도록 변경
- Option에서 생성/수정을 할 때 도메인 전용 DTO를 이용하도록 수정
- 요구하는 곳이 도메인이므로 도메인 내부에 DTO 패키지 정의
- 테스트 코드 수정
- Profile에서 생성/수정을 할 때 도메인 전용 DTO를 이용하도록 수정
- 요구하는 곳이 도메인이므로 도메인 내부에 DTO 패키지 정의
- 테스트 코드 수정
- Fixture 구조 수정
- DTO 패키지 분리
- BodySearchResponseFixture 클래스화
- Profile, Option 조회 시 한 번에 조회되도록 조인
- ProfileAndOptionSearchResponse 정의
- 이벤트 패키지 구조 수정 (도메인 중심으로 수정)
- DTO들이 각 도메인, 애플리케이션 하위 패키지로 들어가도록 수정
- 각 서비스 단위로 이벤트가 관리되도록 패키지 위치 조정
- 응답 DTO 위치를 인프라로 수정 (만드는 곳에서 관리되도록 수정)
- Fixture 내부에서도 계층을 나누도록 수정
- 프로덕션 구조와 테스트 구조가 동일하게 관리되도록 수정
- InnerProfile DTO를 도메인 단에 두도록 수정
- 서비스 테스트 패키지 구조 수정
- MemberHobbyService 예외 검증 추가
- MemberStyleService 예외 검증 추가
- 도메인 패키지 구조 수정
- JPA 리포지터리 메서드들이 명시되도록 수정
- findAll 메서드는 기존 부모 메서드를 사용하도록 복구
- Fixture 사용 시 이름이 충돌되지 않을 경우 static import 되도록 수정
- InfoQueryRepository 테스트 추가
- 예외를 방지하기 위해 JPAQueryFactory 수동 빈 등록 환경 추가
- Job 예외 패키지 구조 수정 (job 패키지 안에 들어가도록 수정)
- 정적 팩터리 메서드 사용 시 변수를 밖으로 이끌어내지 않도록 수정
- InnerOptionUpdateRequest 정적 팩터리 메서드 공백 추가
- updateContents를 다른 곳에서 사용하지 않으므로 삭제
- 관련 테스트 수정
- InnerProfileUpdateRequest Fixture 등록
Copy link
Owner

@eom-tae-in eom-tae-in left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

고생하셨습니다

import com.atwoz.member.application.info.dto.StyleUpdateRequest;
import com.atwoz.member.application.info.dto.StyleWriteRequest;
import com.atwoz.member.domain.info.InfoRepository;
import com.atwoz.member.ui.info.dto.InfoSearchResponse;
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

역참조가 발생하는데 구조 변경이 필요해보입니다.

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

InfoSearchResponse의 역참조를 없애기 위해 Infrastructure로 옮기는 방식으로 해결하였습니다!

Comment on lines 44 to 56
private List<String> extractHobbyNamesFromInfoWriteRequest(final InfoWriteRequest request) {
return request.hobbies()
.stream()
.map(HobbyWriteRequest::hobby)
.toList();
}

private List<String> extractStyleNamesFromInfoWriteRequest(final InfoWriteRequest request) {
return request.styles()
.stream()
.map(StyleWriteRequest::style)
.toList();
}
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

request.styles().stream(), request.hobbies().stream()이 한 맥락인데 매개변수를 InfoWriteRequest로 받는 이유가 있나요?
한 줄에 체이닝을 한번 사용하기 위해 일부러 분리한 것 처럼 보이네요
request를 넘기지 말고 값을 꺼내서 넘기도록 수정해주세요~

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

값을 한번 꺼내서 넘기면 불필요한 체이닝을 제거할 수 있겠군요..! 수정 완료하였습니다 :)

Comment on lines 70 to 82
private List<String> extractHobbyNamesFromInfoUpdateRequest(final InfoUpdateRequest request) {
return request.hobbies()
.stream()
.map(HobbyUpdateRequest::hobby)
.toList();
}

private List<String> extractStyleNamesFromInfoUpdateRequest(final InfoUpdateRequest request) {
return request.styles()
.stream()
.map(StyleUpdateRequest::style)
.toList();
}
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

이것도 request 값 꺼내서 넘겨주세요~

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

수정하였습니다 :)

- InfoService 메서드 체이닝이 최소화되도록 수정
Copy link
Collaborator

@sosow0212 sosow0212 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

태인이가 말한 부분 고쳐주시면 될 것 같습니다.
작업하시느라 수고하셨습니다~

@devholic22 devholic22 merged commit 38270fc into develop Mar 5, 2024
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

회원 상세 정보 저장 및 조회를 구현한다.
3 participants