-
Notifications
You must be signed in to change notification settings - Fork 0
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
Conversation
- 취미 (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 등록
There was a problem hiding this 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; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
역참조가 발생하는데 구조 변경이 필요해보입니다.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
InfoSearchResponse의 역참조를 없애기 위해 Infrastructure로 옮기는 방식으로 해결하였습니다!
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(); | ||
} |
There was a problem hiding this comment.
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를 넘기지 말고 값을 꺼내서 넘기도록 수정해주세요~
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
값을 한번 꺼내서 넘기면 불필요한 체이닝을 제거할 수 있겠군요..! 수정 완료하였습니다 :)
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(); | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
이것도 request 값 꺼내서 넘겨주세요~
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
수정하였습니다 :)
- InfoService 메서드 체이닝이 최소화되도록 수정
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
태인이가 말한 부분 고쳐주시면 될 것 같습니다.
작업하시느라 수고하셨습니다~
📄 Summary
🙋🏻 More
회원 정보 - 구조
info
로 두었습니다.profile
,option
,hobby
,style
로 나누었습니다. (image
도 있으나, 파일 업로드 과정이 포함되어 현재 개발에서는 클래스만 정의해두었습니다.)profile
은Body
(생년월일, 키, 성별),Location
(사는 지역 -city
는 시/도,sector
는 구를 나타냅니다.),Position
(latitude: 위도, longitude: 경도),Job
(직업)을 가집니다.option
은Smoke
(흡연),Religion
(종교),Drink
(음주),Mbti
(MBTI),Graduate
(최종학력)을 가집니다.hobby
는 회원 (Member
)과 등록된 취미 이름 (HobbyName
- enum) 간의 다대다 구조를 나타내기 위한 브릿지 테이블 엔티티입니다.style
도 회원과 스타일 이름 (StyleName
- enum) 간의 다대다 구조를 나타내기 위한 브릿지 테이블 엔티티입니다.회원 정보 - 저장
회원 정보 - 조회
profile
을 조회한다면/api/info/profile
, 취미를 조회한다면/api/info/hobby
이런 식으로 진행되도록 했습니다.회원 정보 - 수정