OpenFeign은 마이크로서비스 아키텍처에서 서비스 간 통신을 간단하게 만들어 주는 선언적 HTTP 클라이언트 라이브러리이다.
예외 처리: OpenFeign은 서비스 간 통신 중 발생하는 예외 상황에 대해 공통된 예외 처리 메커니즘을 제공한다.
➡️ openfeign은 eureka에서 통신을 편하게 하기 위해.
➡️ 원래는 gatway가 eureka 서버단에서 해당 서버로 로드벨런싱 해야한다면
openfeign은 바로 eureka 서버에서 로드벨런싱으로 서버를 찾아가기 때문에 더 효율적이다.
➡️ '좋아요' 및 '댓글' 기능을 OpenFeign의 사용으로 중앙화하여 구현하는 방법은 코드의 중복을 줄이고 서비스를 분리해서
보다 효율적이다. ( board와 album에서 모두 '좋아요','댓글'을 사용)
➡️ 확장성 및 재사용성 :
향후 새로운 서비스나 기능이 추가될 경우, 이미 구축된 '좋아요' 및 '댓글' 서비스를 활용하여 빠르게 통합이 가능하다.
( 개발 시간 단축, 유지 관리의 복잡성⬇️)
➡️ '좋아요'나 '댓글'에 관련하여 개선 사항이 발생할 경우, 중앙화된 서비스만 수정하면 모든 클라이언트 서비스에서 해당 개선 사항을 적용시킬 수 있다.
@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 클라이언트로 선언하는 것이다.
@FeignClient("BOARD-SERVICE")
public interface BoardClient {
@PutMapping("/api/v1/board/likeCountUpdate/{boardId}")
public void updateLikeCount(@PathVariable("boardId") UUID boardId,
@RequestBody Integer count);
}
@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로 연결이 되서 이어서 로직이 실행 된다.
@Transactional
public void likeCountUpdate(UUID boardId, Integer count) {
Board board = boardRepository.findById(boardId).get();
board.setLikeCount(board.getLikeCount() + count);
}
@PutMapping("/likeCountUpdate/{boardId}")
public void updateLikeCount(@PathVariable("boardId") UUID boardId,
@RequestBody Integer count) {
boardService.likeCountUpdate(boardId, count);
}
@Transactional
public void likeCountUpdate(UUID boardId, Integer count) {
Album album = albumRepository.findById(boardId).get();
album.setLikeCount(album.getLikeCount() + count);
}
@PutMapping("/likeCountUpdate/{albumId}")
public void updateLikeCount(@PathVariable("albumId") UUID albumId,
@RequestBody Integer count) {
albumService.likeCountUpdate(albumId, count);
}
우와 openfeign! MSA 환경에서 유용해 보이네요!
오늘도 덕분에 지식 +1 해갑니다~