The Cat API를 활용하여 고양이 이미지를 조회하고, 이미지를 저장하는 Spring Boot Web Application 구현

Danny·2023년 10월 24일
0

ASAC

목록 보기
4/8

스프링부트 핵심 가이드의 내용을 참고 했습니다.

외부 API CRUD


  • Spec
    • os : mac
    • IDE : IntelliJ
    • JAVA : Version_17
    • MySql : Version_8

1.프로젝트 세팅 및 절차 가이드

Spring Boot Initializer 를 통해 Spring 프로젝트 초기 세팅

Dependencies

  • Lombok , Spring Web , Thymeleaf

Project , Language

  • 자신의 환경에 맞는 언어

Spring Boot

  • 3.1.5

Project Metadata

  • 자신의 환경에 맞는 이름 - 하고싶은 이름으로 작성

2.Cat Photo Collection

The Cat API를 활용하여 고양이 이미지를 조회하고, 이미지를 저장하는 Spring Boot Web Application 구현

미리보기

목표

  • Spring Boot Application의 기본 구조에 대한 이해
  • Template Engine(Thymeleaf)의 활용
  • 외부 API의 활용

준비사항

  • Spring Boot >= 2.4
  • The Cat API의 API Key
    • 회원 가입을 진행하고, 가입한 이메일로 API Key 발급
  • API로부터 고양이 이미지에 대한 데이터를 받아와 해당 이미지를 조회
    • 사용자로부터 숫자를 입력 받아, 해당 숫자 만큼의 이미지를 조회
    • 입력된 숫자가 없더라도 적어도 1개 이상의 이미지를 조회

Build Gradle 설정

  • 기본구조 + 테스트
  • src - main - resources - static
    • static : content들을 두는 곳입니다. 보통 css나 js
    • index.html : 테스트용 html (hello world)
  • src - main - resources - templates
    • templates : 우리가 작성할 html (thymeleaf)


CatApi - ApiKey , ApiUrl

  • appliction.yml
external-api:
  url: "https://api.thecatapi.com/v1/images/search"
  apiKey: "Your Api Key"

-- thymeleaf를 사용하기위한 설정 --
spring:
  thymeleaf:
    enabled: true
    prefix: classpath:/templates/
    suffix: .html

CatService - Interface

@Service
public interface CatService {
    public List<CatImage> getCatImages(Long imageNumber);

    public FavouriteResDto postCatFavourite(FavouriteDto favouriteDto);

    public List<FavouriteImageDto> getCatFavouriteImages(FavouriteImageReqDto favouriteImageReqDto);

    public String deleteFavourite(String favourteId);

}

CatPhotoService

@Service
@RequiredArgsConstructor
public class CatPhotoService implements CatService {
    private final RestTemplate restTemplate;

    @Value("${external-api.url}")
    private String apiUrl;

    @Value("${external-api.apiKey}")
    private String apiKey;

    @Override
    public List<CatImage> getCatImages(Long imageNumber) {
        URI uri = UriComponentsBuilder
                .fromUriString(apiUrl)
                .path("/images/search")
                .queryParam("limit",imageNumber)
                .encode()
                .build()
                .toUri();
        HttpHeaders headers = new HttpHeaders();
        headers.set("x-api-key",apiKey);
        HttpEntity entity = new HttpEntity(headers);
        ResponseEntity<List<CatImage>> responseEntity = restTemplate.exchange(uri,
                HttpMethod.GET, entity, new ParameterizedTypeReference<List<CatImage>>() {
                });
        System.out.println(responseEntity);
        return responseEntity.getBody();
    }

    @Override
    public FavouriteResDto postCatFavourite(FavouriteDto favouriteDto) {
        URI uri = UriComponentsBuilder
                .fromUriString(apiUrl)
                .path("/favourites")
                .encode()
                .build()
                .toUri();
        RequestEntity<FavouriteDto> requestEntity = RequestEntity
                .post(uri)
                .header("x-api-key",apiKey)
                .body(favouriteDto);
        ResponseEntity<FavouriteResDto> responseEntity = restTemplate.exchange(
                requestEntity,
                FavouriteResDto.class
        );
        return responseEntity.getBody();
    }
    @Override
    public List<FavouriteImageDto> getCatFavouriteImages(FavouriteImageReqDto favouriteImageReqDto) {
        URI uri = UriComponentsBuilder
                .fromUriString(apiUrl)
                .path("/favourites")
                .queryParam("sub_id",favouriteImageReqDto.getSub_id())
                .queryParam("page",favouriteImageReqDto.getPage())
                .queryParam("limit",favouriteImageReqDto.getLimit())
                .encode()
                .build()
                .toUri();

        HttpHeaders headers = new HttpHeaders();
        headers.set("x-api-key",apiKey);
        HttpEntity entity = new HttpEntity(headers);

        ResponseEntity<List<FavouriteImageDto>> responseEntity = restTemplate.exchange(uri,
                HttpMethod.GET, entity, new ParameterizedTypeReference<List<FavouriteImageDto>>() {
                });

//        System.out.println(responseEntity);
        return responseEntity.getBody();
    }

    @Override
    public String deleteFavourite(String favourteId) {
        URI uri = UriComponentsBuilder
                .fromUriString(apiUrl)
                .path("/favourites/"+favourteId)
                .encode()
                .build()
                .toUri();
        HttpHeaders headers = new HttpHeaders();
        headers.set("x-api-key",apiKey);
        HttpEntity entity = new HttpEntity(headers);

        ResponseEntity<Object> responseEntity = restTemplate.exchange(uri,
                HttpMethod.DELETE, entity, new ParameterizedTypeReference<Object>() {
                });

        if(responseEntity.getStatusCode().equals(HttpStatus.OK)){
            return "delete";
        }
        else{
            return "prodlem";
        }
    }




}

CatController

@RestController
@RequiredArgsConstructor
public class CatController {

    private final CatPhotoService catPhotoService;

    @GetMapping("/api/v1/images")
    public List<CatImage> getImages(@RequestParam Long imageNumber){
        return catPhotoService.getCatImages(imageNumber);
    }
    @PostMapping("/api/v1/favourite")
    public FavouriteResDto postFavourite(@RequestBody FavouriteDto favouriteDto){
        return catPhotoService.postCatFavourite(favouriteDto);
    }
    @GetMapping("/api/v1/favourite")
    public List<FavouriteImageDto> getFavouriteImages(@RequestParam Long page, @RequestParam String limit, @RequestParam String sub_id){
        FavouriteImageReqDto favouriteImageReqDto = FavouriteImageReqDto.builder()
                .page(0L)
                .limit("100")
                .sub_id("user-1").build();
        return catPhotoService.getCatFavouriteImages(favouriteImageReqDto);
    }
    @DeleteMapping("/api/v1/favourite")
    public String deleteFavourite(@RequestParam String favouriteId){
        return catPhotoService.deleteFavourite(favouriteId);
    }
}

API 테스트

POSTMAN

  • GETMAPPING
    • Key : IntNumber Value : 2 (사진 갯수)

  • POSTMAPPING

공식문서에 따르면
" 즐겨찾기에 추가하려면 너가 POST 요청을 통해 './favourites' 엔드포인트로 다음과 같은 정보를 전달해, 그러면 우리가 id 값을 줄게"

GET으로 받은 image_id 2개를 적어보자


API CRUD 가능

0개의 댓글