[인스타그램 클론코딩] 07. 팔로우 기능 구현(Back-End)

2023. 2. 2. 17:50·Web/인스타 클론 코딩

3가지 기능을 구현해준다.

1. 유저 목록을 알맞게 반환해주는 기능

2. 유저가 following한 정보를 저장해주는 기능

3. 유저가 following 했던 정보를 삭제해주는 기능

 

1. UserDto, UserListResponseDto 작성

@Data
public class UserDto {

    private String email;
    private String nickname;
    private String profileUrl;
    private boolean isFollow;

    @Builder
    public UserDto(String email, String nickname, String profileUrl, boolean isFollow) {
        this.email = email;
        this.nickname = nickname;
        this.profileUrl = profileUrl;
        this.isFollow = isFollow;
    }
}

@Data
public class UserListResponseDto {

    private List<UserDto> userList;

    @Builder
    public UserListResponseDto(List<UserDto> userList) {
        this.userList = userList;
    }
}

 

- UserListResponseDto는 UserDto 목록을 리스트 형식으로 반환한다.

- UserDto는 유저의 email, nickname, profileUrl, 팔로우 상태를 반환한다.

 

2. FollowRepository 수정

public interface FollowRepository extends JpaRepository<Follow, Long> {
    boolean existsByFollowerAndFollowing(User follower, User following);
    Optional<Follow> findByFollowerAndFollowing(User follower, User following);
}

 

- 해당 유저를 팔로잉하고 있는지에 대한 결과를 bool로 반환해주는 exists 메서드와, find 메서드를 작성해준다.

 

3. FollowService 작성

@Service
@Slf4j
@RequiredArgsConstructor
public class FollowService {

    private final UserRepository userRepository;
    private final FollowRepository followRepository;

    @Transactional
    public UserListResponseDto getUserList(User user) {
        // DB에서 조회한 모든 유저 리스트
        List<User> userList = userRepository.findAll();

        // UserDto로 변환할 리스트
        List<UserDto> userDtoList = new ArrayList<>();

        // 유저리스트 중 본인을 뺀 나머지 유저들을 UserDto 형식에 맞게 변경
        userList.forEach((u) -> {
            if(!u.getEmail().equals(user.getEmail())) {
                userDtoList.add(UserDto.builder()
                        .email(u.getEmail())
                        .profileUrl(u.getProfileImgUrl())
                        .nickname(u.getNickname())
                        .isFollow(followRepository.existsByFollowerAndFollowing(user, u))
                        .build());
            }
        });

        return UserListResponseDto.builder().userList(userDtoList).build();
    }

    @Transactional
    public UserListResponseDto saveFollow(User user, String email) {
        // 팔로잉하는 유저 검색
        User following = userRepository.findByEmail(email).orElseThrow(() -> new UsernameNotFoundException("유저 정보를 찾을 수 없습니다."));

        // 팔로잉 유저에 대한 팔로잉 정보 저장
        followRepository.save(Follow.builder()
                        .following(following)
                        .follower(user)
                        .build());

        return this.getUserList(user);
    }

    @Transactional
    public UserListResponseDto deleteFollow(User user, String email) throws Exception {
        // 팔로잉하는 유저와 팔로잉 정보 검색
        User following = userRepository.findByEmail(email).orElseThrow(() -> new UsernameNotFoundException("유저 정보를 찾을 수 없습니다."));
        Follow follow = followRepository.findByFollowerAndFollowing(user, following).orElseThrow(() -> new Exception("팔로우 처리 중 에러가 발생하였습니다"));

        // 팔로잉 정보 삭제
        followRepository.delete(follow);

        return this.getUserList(user);
    }
}

 

- getUserList는 모든 유저리스트를 가져와 본인을 제외한 정보를 UserDto형식으로 변환하여 반환한다.

- saveFollow는 팔로잉 정보를 저장 후, getUserList 결과를 반환한다.

- deleteFollow는 팔로잉 정보를 삭제 후, getUserList 결과를 반환한다.

 

4. FollowController 작성

@RestController
@Slf4j
@RequiredArgsConstructor
public class FollowController {

    private final FollowService followService;
    @GetMapping("/user-list")
    public ResponseEntity getUserList(@CurrentUser User user) {
        try {
            return ResponseEntity.ok().body(followService.getUserList(user));
        } catch (Exception e) {
            return ResponseEntity.badRequest().body(e.getMessage());
        }
    }

    @GetMapping("/follow")
    public ResponseEntity follow(@CurrentUser User user, @RequestParam(value = "followingEmail") String followingEmail) {
        try {
            return ResponseEntity.ok().body(followService.saveFollow(user, followingEmail));
        } catch (Exception e) {
            return ResponseEntity.badRequest().body(e.getMessage());
        }
    }

    @DeleteMapping("/follow")
    public ResponseEntity unFollow(@CurrentUser User user, @RequestParam(value = "followingEmail") String followingEmail) {
        try {
            return ResponseEntity.ok().body(followService.deleteFollow(user, followingEmail));
        } catch (Exception e) {
            return ResponseEntity.badRequest().body(e.getMessage());
        }
    }
}

 

- 유저 정보 조회는 '/api/user-list' URL로 GET으로 요청받아 처리한다.

- 팔로우, 언팔로우 기능은 각각 Get, Delete 메서드로 요청받고 팔로잉 유저 정보는 파라미터 followingEmail 로 받아 처리한다.

 

5. 동작 모습

 

팔로우 기능 동작 모습

 

저작자표시 비영리 변경금지 (새창열림)

'Web > 인스타 클론 코딩' 카테고리의 다른 글

[인스타그램 클론코딩] 08. 홈 화면 구현(Front-End)  (0) 2023.02.03
[인스타그램 클론코딩] 08. 홈 화면 구현(Back-End)  (0) 2023.02.03
[인스타그램 클론코딩] 07. 팔로우 기능 구현(Front-End)  (0) 2023.02.02
[인스타그램 클론코딩] 06. 게시글 Posting 구현(Back-End)  (0) 2023.02.02
[인스타그램 클론코딩] 06. 게시글 Posting 구현(Front-End)  (0) 2023.02.02
'Web/인스타 클론 코딩' 카테고리의 다른 글
  • [인스타그램 클론코딩] 08. 홈 화면 구현(Front-End)
  • [인스타그램 클론코딩] 08. 홈 화면 구현(Back-End)
  • [인스타그램 클론코딩] 07. 팔로우 기능 구현(Front-End)
  • [인스타그램 클론코딩] 06. 게시글 Posting 구현(Back-End)
뚝딱뚝딱2
뚝딱뚝딱2
  • 뚝딱뚝딱2
    개발도상국
    뚝딱뚝딱2
  • 전체
    오늘
    어제
    • 분류 전체보기
      • 공부
        • Java
        • Spring Boot
        • LORA
      • Web
        • 인스타 클론 코딩
        • GPT 응답 API 서버
        • Spring Boot 예외 처리
        • 코테 준비용 서비스 만들기
      • DevOps
        • 쿠버네티스
        • 서버 만들기
      • 코딩테스트
        • 알고리즘
      • 교육
        • 스파르타코딩클럽 - 내일배움단
        • 혼자 공부하는 컴퓨터 구조 운영체제
      • 잡다한것
  • 블로그 메뉴

    • 홈
  • 링크

    • GITHUB
  • 공지사항

  • 인기 글

  • 태그

    스프링부트
    쿠버네티스
    spring boot
    chat GPT
    mapstruct
    백준
    REST API
    예외
    Java
    티스토리챌린지
    리액트
    스프링 부트
    Entity
    오블완
    OpenAI API
    react
    클러스터
    인스타그램
    클론코딩
    MSA
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.1
뚝딱뚝딱2
[인스타그램 클론코딩] 07. 팔로우 기능 구현(Back-End)
상단으로

티스토리툴바