2일차에 만들었던 프로필 조회 기능에 아직 친구추가,조회 기능들이 구현되지 않아서 만들지 못했던 프로필 조회시 친구 수 가 나오는 기능을 추가로 프로젝트 3일차에 구현하게 되었다.
이번에 구현해야 했던 건 유저 정보를 조회할 때 친구 수를 함께 반환하는 기능이었는데, User 엔티티에 @OneToMany 같은 양방향 관계를 설정하지 않고도 이걸 처리하고 싶었다. 왜냐하면 팀원들이 친구테이블과 유저테이블에 양방향 관계 말고 단방향으로 구현하고 싶어했고 최대한 안 복잡하게 구현하고 싶은게 이유였다.
그냥 단순하게 친구 목록의 크기를 계산해서 응답 객체에 포함시키면 충분할 것 같았다.
유저 조회 시 친구 수를 계산해서 UserResponse에 포함시키는 것. 복잡하게 엔티티에 직접 매핑하는 방식이 아니라, 서비스 계층에서 처리하고 싶었다. 결국에는 FriendService에서 친구 목록을 가져와서 그 크기를 followers로 설정하는 방식으로 구현하면 될 것 같았다.
원래는 유저 정보를 조회할 때 친구 수를 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으로 고정됨
}
}
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로 친구 수를 전달하면 됨
);
}
}
그래서 생각한 방법은 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);
}
}
결국 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
로 나누어져 있으니 보기에 너무 불편하여 패키지 구조를 개선하였다
프로그램에 흐름도를 보기 좋게 하기 위해 팀원들과 각자 기능의 시퀀스 다이어그램을 만들어 보았다.