MSA 프로젝트- 소모임 openfeign

박경희·2023년 9월 19일
1

프로젝트

목록 보기
12/16
post-thumbnail

openfeign

OpenFeign은 마이크로서비스 아키텍처에서 서비스 간 통신을 간단하게 만들어 주는 선언적 HTTP 클라이언트 라이브러리이다.

예외 처리: OpenFeign은 서비스 간 통신 중 발생하는 예외 상황에 대해 공통된 예외 처리 메커니즘을 제공한다.

✅ Like를 openfeign으로 사용한 이유는?

➡️ openfeign은 eureka에서 통신을 편하게 하기 위해.
➡️ 원래는 gatway가 eureka 서버단에서 해당 서버로 로드벨런싱 해야한다면
openfeign은 바로 eureka 서버에서 로드벨런싱으로 서버를 찾아가기 때문에 더 효율적이다.

✅ OpenFeign을 사용하며 갖게된 장점

➡️ '좋아요' 및 '댓글' 기능을 OpenFeign의 사용으로 중앙화하여 구현하는 방법은 코드의 중복을 줄이고 서비스를 분리해서
보다 효율적이다. ( board와 album에서 모두 '좋아요','댓글'을 사용)

➡️ 확장성 및 재사용성 :
향후 새로운 서비스나 기능이 추가될 경우, 이미 구축된 '좋아요' 및 '댓글' 서비스를 활용하여 빠르게 통합이 가능하다.
( 개발 시간 단축, 유지 관리의 복잡성⬇️)

➡️ '좋아요'나 '댓글'에 관련하여 개선 사항이 발생할 경우, 중앙화된 서비스만 수정하면 모든 클라이언트 서비스에서 해당 개선 사항을 적용시킬 수 있다.


Like Service

@Service
@RequiredArgsConstructor
public class LikeService {
    private final LikeRepository likeRepository;
    private final BoardClient boardClient;
    private final AlbumClient albumClient;

     /**
     * '좋아요' 버튼 클릭 시 좋아요 수를 증가 또는 감소시키는 메소드.
     * 사용자가 해당 아이템에 이미 좋아요를 누른 경우 좋아요를 취소하고, 그렇지 않은 경우 좋아요를 추가한다.
     * @param likeRequest 사용자의 좋아요 요청 정보를 담은 객체.
     */
    @Transactional
    public void likeCount(LikeRequest likeRequest) {
        // 해당 스케쥴에 사용자가 좋아요를 눌렀는지 확인.
        Optional<Like> like = likeRepository.findByTargetIdAndMemberId(likeRequest.getTargetId(), likeRequest.getMemberId());
        String target = likeRequest.getTarget();

        // 사용자가 이미 좋아요를 눌렀다면
        if (like.isPresent()) {
            // 좋아요 취소: DB에서 해당 좋아요 정보 삭제
            likeRepository.delete(like.get());

            // 'board'와 'album' 중 어느 대상에 대한 좋아요인지 확인하여 좋아요 수 감소
            if (target.equals("board")) {
                boardClient.updateLikeCount(likeRequest.getTargetId(), -1);
            } else {
                albumClient.updateLikeCount(likeRequest.getTargetId(), -1);
            }
        } 
        // 사용자가 아직 좋아요를 누르지 않았다면
        else {
            // 좋아요 추가: DB에 좋아요 정보 저장
            likeRepository.save(new Like(null,likeRequest.getTargetId(), likeRequest.getMemberId()));

            // 'board'와 'album' 중 어느 대상에 대한 좋아요인지 확인하여 좋아요 수 증가
            if (target.equals("board")) {
                boardClient.updateLikeCount(likeRequest.getTargetId(), 1);
            } else {
                albumClient.updateLikeCount(likeRequest.getTargetId(), 1);
            }
        }
    }
}

@FeignClient 어노테이션은 해당 인터페이스를 Feign 클라이언트로 선언하는 것이다.

api

board-client

@FeignClient("BOARD-SERVICE")
public interface BoardClient {
    @PutMapping("/api/v1/board/likeCountUpdate/{boardId}")
    public void updateLikeCount(@PathVariable("boardId") UUID boardId,
                                @RequestBody Integer count);
}

album-client

@FeignClient("ALBUM-SERVICE")
public interface AlbumClient {
    @PutMapping("/api/v1/album/likeCountUpdate/{albumId}")
    public void updateLikeCount(@PathVariable("albumId") UUID albumId,
                                @RequestBody Integer count);
}

위와 같이 클래스를 저장해놓고 service 로직에서 의존성 주입을 해서 사용하면 Eureka 에서 관리하고 있는 서비스 중에서 'BOARD-SERVICE', 'ALBUM-SERVICE'로 되어있는 board-service와 album_server 의 controller로 연결이 되서 이어서 로직이 실행 된다.


Board

service

@Transactional
    public void likeCountUpdate(UUID boardId, Integer count) {
        Board board = boardRepository.findById(boardId).get();
        board.setLikeCount(board.getLikeCount() + count);
    }

controller

@PutMapping("/likeCountUpdate/{boardId}")
    public void updateLikeCount(@PathVariable("boardId") UUID boardId,
                                @RequestBody Integer count) {
        boardService.likeCountUpdate(boardId, count);
    }

Album

service

@Transactional
    public void likeCountUpdate(UUID boardId, Integer count) {
        Album album = albumRepository.findById(boardId).get();
        album.setLikeCount(album.getLikeCount() + count);
    }

controller

@PutMapping("/likeCountUpdate/{albumId}")
    public void updateLikeCount(@PathVariable("albumId") UUID albumId,
                                @RequestBody Integer count) {
        albumService.likeCountUpdate(albumId, count);
    }

1개의 댓글

comment-user-thumbnail
2023년 9월 21일

우와 openfeign! MSA 환경에서 유용해 보이네요!
오늘도 덕분에 지식 +1 해갑니다~

답글 달기

관련 채용 정보