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] #21 팔로우 도메인 개발 #21

Merged
merged 23 commits into from
Nov 6, 2024

Conversation

hyxklee
Copy link
Member

@hyxklee hyxklee commented Nov 4, 2024

1. 무슨 이유로 코드를 변경했나요?

  • 팔로우 도메인 개발했습니다

2. 어떤 위험이나 장애를 발견했나요?

  • X

3. 관련 스크린샷을 첨부해주세요.

  • 팔로우
image - 팔로워 목록 조회 ( 형식은 팔로잉 조회도 동일) image image image

4. 완료 사항

  • 팔로우, 팔로워 목록 조회, 팔로잉 목록 조회, 언팔로우 총 4개 API 구현했습니다
  • 유저 탈퇴를 고려해 양방향 매핑을 사용하여 유저 삭제시 팔로우도 삭제될 수 있도록 구현했습니다. 하지만 이 방식이 좋은 방식인지는 고민이 필요할 것 같습니다

5. 추가 사항

  • 팔로우의 경우 "나" -> 다른유저로 이루어지기 때문에 토큰이 필요합니다. 언팔로우도 마찬가지 입니다
  • 팔로우 목록 조회, 팔로잉 목록 조회의 경우 나의 목록만 조회하는 것이 아니라 다른 사람의 목록도 조회할 수 있기 때문에 토큰은 검증용으로만 사용하고 실제 데이터를 사용하지는 않습니다
  • 팔로우의 경우 User와 양방향 매핑을 맺진 않았습니다. 현재 기능에서는 오히려 혼동을 주는 방식이라서 일단은 단방향으로만 구현을 했습니다
  • 테이블의 컬럼 명을 follower, following으로 하다 보니 혼동이 생겨 follower: 팔로우 하는 사람, followed: 팔로우 당하는 사람으로 구분을 하였습니다. 더 나은 네이밍이 있다면 언제나 환영입니다! 😁😁

@hyxklee hyxklee added the feat 기능 개발, 구현 label Nov 4, 2024
@hyxklee hyxklee requested review from koreaioi and seokjun01 November 4, 2024 07:43
@hyxklee hyxklee self-assigned this Nov 4, 2024
@koreaioi
Copy link
Member

koreaioi commented Nov 5, 2024

팔로잉 팔로우는 헷갈리는 구현이라고 생각하는데, 엔티티 관점 별로 구분하여 설명해주시니 이해하기 쉬웠습니다.
문제없이 구현하셨다고 생각합니다!

@seokjun01
Copy link
Collaborator

전반적으로 코드 구성이, 제게 해주신 PR리뷰와 비슷한 느낌을 받았습니다!
또한, 그림으로 올려주신 부분으로 코드를 이해하는데 도움이 되었습니다.
고생하셨습니다!

# Conflicts:
#	src/main/java/com/leets/X/domain/user/domain/User.java
@Transactional
public void follow(Long userId, String email){
User follower = userService.find(email);
User followed = userService.find(userId);
Copy link
Collaborator

Choose a reason for hiding this comment

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

follower와 followed에 각각 다른 매개변수를 넣는 것은 , 다른 사람임을 쉽게 구분하기 위함인가요!?
PR에 올려두신 설명으로 각 변수명의 역할은 이해했습니다!

Copy link
Member Author

Choose a reason for hiding this comment

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

"팔로우"의 경우 현재 서비스를 이용하는 "본인"이 다른 사람을 팔로우하기 때문에 현재 JWT 토큰을 이용해 인증된 사용자의 email을 가져와서 follower(나 자신)로 조회를 하고, 팔로우 하는 대상은 userId로 입력을 받아서 followed로 조회를 했습니당


@OneToMany(mappedBy = "follower", cascade = CascadeType.REMOVE, orphanRemoval = true)
private List<Follow> followingList = new ArrayList<>();

Copy link
Collaborator

Choose a reason for hiding this comment

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

다대다 관계를 1:N , N:1로 풀어서 구현하는 부분에 하나의 엔티티는 @manytoone으로 해야하는 것이 아닌가 궁금했는데! User입장에서, 하나의 유저는 다수의 팔로잉, 팔로워를 가질 수 있어서라고 생각하는 것이 맞을까요!?

Copy link
Member Author

Choose a reason for hiding this comment

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

유저 1 ㅣ N 팔로우 이기 때문에 "한 명의 유저는 여러 개의 팔로우를 할 수 있다" 로 이해하시면 될 것 같아용
따라서 유저 -> 팔로우는 OneToMany / 팔로우 -> 유저는 ManyToOne으로 이해하시면 될 것 같습니당

Copy link
Member Author

Choose a reason for hiding this comment

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

유저의 입장에서는 팔로워 / 팔로잉이 나눠져 있기 때문에 의미 적으로 나눠서 저장했다고 생각하시면 될 것 같아요!

@hyxklee hyxklee merged commit 1b334c6 into main Nov 6, 2024
2 checks passed
@hyxklee hyxklee deleted the feat/#20/팔로우-도메인-개발 branch November 6, 2024 05:00
import org.springframework.transaction.annotation.Transactional;

import java.util.List;
@Slf4j
Copy link
Member

Choose a reason for hiding this comment

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

FollowService내부에 log.info와 같은 코드는 보이지 않는데, @slf4j를 사용하신 이유가 궁금합니다

Comment on lines +38 to +57
public List<FollowResponse> getFollowers(Long userId){
User user = userService.find(userId);

List<Follow> followerList = user.getFollowerList();

return followerList.stream()
.map(follow -> {
return FollowResponse.from(follow.getFollower()); })
.toList();
}

public List<FollowResponse> getFollowings(Long userId){
User user = userService.find(userId);

List<Follow> followingList = user.getFollowingList();

return followingList.stream()
.map(follow -> {
return FollowResponse.from(follow.getFollowed()); })
.toList();
Copy link
Member

Choose a reason for hiding this comment

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

return에서 stream객체의 map을 사용하여 코드를 효율적으로 사용하려는 것 같습니다.
그렇다면 메서드 체이닝을 적극적으로 사용하고 return, {}을 제거하는 방식은 어떨까요?

return userService.find(userId).getFollowerList().stream()
        .map(follow -> FollowResponse.from(follow.getFollower()))
        .toList();
return userService.find(userId).getFollowingList().stream()
        .map(follow -> FollowResponse.from(follow.getFollowed()))
        .toList();

@hyxklee hyxklee changed the title [Feat] #21 팔로우 도메인 개발 [feat] #21 팔로우 도메인 개발 Nov 10, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
feat 기능 개발, 구현
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants