프로젝트 3일차 : 유저 조회 시 친구 수 포함하기

이상민·2024년 9월 5일
0

2일차에 만들었던 프로필 조회 기능에 아직 친구추가,조회 기능들이 구현되지 않아서 만들지 못했던 프로필 조회시 친구 수 가 나오는 기능을 추가로 프로젝트 3일차에 구현하게 되었다.

문제 상황

이번에 구현해야 했던 건 유저 정보를 조회할 때 친구 수를 함께 반환하는 기능이었는데, User 엔티티에 @OneToMany 같은 양방향 관계를 설정하지 않고도 이걸 처리하고 싶었다. 왜냐하면 팀원들이 친구테이블과 유저테이블에 양방향 관계 말고 단방향으로 구현하고 싶어했고 최대한 안 복잡하게 구현하고 싶은게 이유였다.
그냥 단순하게 친구 목록의 크기를 계산해서 응답 객체에 포함시키면 충분할 것 같았다.

구현 전 고민

유저 조회 시 친구 수를 계산해서 UserResponse에 포함시키는 것. 복잡하게 엔티티에 직접 매핑하는 방식이 아니라, 서비스 계층에서 처리하고 싶었다. 결국에는 FriendService에서 친구 목록을 가져와서 그 크기를 followers로 설정하는 방식으로 구현하면 될 것 같았다.

구현 과정

1) 기존의 UserService 코드

원래는 유저 정보를 조회할 때 친구 수를 0으로 고정해서 반환하고 있었다. 이 코드를 보면서, 단순히 여기에 친구 수를 추가하면 해결되지 않을까 생각했다.

@Service
@RequiredArgsConstructor
public class UserService {

    private final UserRepository userRepository;

    public UserResponse getUser(long userId) {
        User user = userRepository.findById(userId)
                .orElseThrow(() -> new NullPointerException("해당 사용자를 찾을 수 없습니다."));
        return UserResponse.userResponse(user, 0);  // 친구 수가 0으로 고정됨
    }
}

2) UserResponse 클래스

UserResponse 클래스에는 이미 친구 수를 담을 followers 필드가 있었다. 여기서 중요한 건 followers에 실제 친구 수를 넣는 것뿐이었다.

@Getter
@RequiredArgsConstructor
public class UserResponse {
    private final String userName;
    private final String email;
    private final String intro;
    private final Integer followers;

    public static UserResponse userResponse(User user, int followerCount) {
        return new UserResponse(
            user.getUserName(),
            user.getEmail(),
            user.getIntro(),
            followerCount  // 여기서 followerCount로 친구 수를 전달하면 됨
        );
    }
}

3) UserService에서 친구 수 포함하기

그래서 생각한 방법은 UserService에서 친구 목록을 가져오는 FriendService를 활용하는 것. 결국 친구 목록의 크기를 followers로 설정해서 반환하면 될 것 같았다.

@Service
@RequiredArgsConstructor
public class UserService {

    private final UserRepository userRepository;
    private final FriendService friendService;  // FriendService 추가

    public UserResponse getUser(long userId) {
        // 유저 정보 조회
        User user = userRepository.findById(userId)
                .orElseThrow(() -> new NullPointerException("해당 사용자를 찾을 수 없습니다."));

        // FriendService를 이용해 친구 목록을 가져옴
        List<FriendResponse> friendList = friendService.getFriendList(userId);

        // 친구 목록 크기로 followers 설정
        int followersCount = friendList.size();

        // UserResponse 생성 및 반환
        return UserResponse.userResponse(user, followersCount);
    }
}

4) 최종 구현

결국 UserService에서 친구 목록을 가져오고, 그 크기를 followers로 설정하는 방식으로 구현했다. 이렇게 하면 @OneToMany 같은 복잡한 관계를 설정하지 않아도 유저 정보를 조회할 때 친구 수를 쉽게 계산해서 포함할 수 있었다.

@Service
@RequiredArgsConstructor
public class UserService {

    private final UserRepository userRepository;
    private final FriendService friendService;

    public UserResponse getUser(long userId) {
        User user = userRepository.findById(userId)
                .orElseThrow(() -> new NullPointerException("해당 사용자를 찾을 수 없습니다."));

        List<FriendResponse> friendList = friendService.getFriendList(userId);
        int followersCount = friendList.size();

        return UserResponse.userResponse(user, followersCount);
    }
}

느낀 점

이렇게 구현하면서 느낀 건, 꼭 엔티티에 복잡한 관계를 설정하지 않아도 서비스 계층에서 필요한 데이터를 충분히 처리할 수 있다는 거였다. 친구 목록 같은 경우는 굳이 @OneToMany로 매핑하지 않고도 FriendService를 활용하면 쉽게 가져와서 사용할 수 있었다. 데이터베이스 설계를 복잡하게 하지 않으면서도 필요한 데이터를 제공할 수 있는 방법을 찾은 것 같다. 앞으로도 이런 식으로 복잡성을 줄이면서 기능을 구현하는 방식을 더 고민해봐야겠다.

패키지 구조 개선

패키지 구조가 controller,service,repository,dto,entity로 나누어져 있으니 보기에 너무 불편하여 패키지 구조를 개선하였다

시퀀스 다이어그램

프로그램에 흐름도를 보기 좋게 하기 위해 팀원들과 각자 기능의 시퀀스 다이어그램을 만들어 보았다.

회원가입

로그인

로그아웃

git hub
https://github.com/doolchong/Maeng9-news-feed

profile
안녕하세요

0개의 댓글