실습
1.
Favorite 엔티티 생성
a.
번호(id), 제목(title), 주소(url), 이미지번호(image_id) 
2.
Repository 생성
3.
Service 생성
a.
FavoriteResponse insertFav(FavoriteRequest fav, MultipartFile file);
b.
List<FavoriteResponse> getAllFav();
c.
FavoriteResponse updateFav(FavoriteRequest fav, MultipartFile file);
d.
FavoriteResponse deleteFav(Long id);
4.
FavoriteController 생성
a.
/api/favorite (getAllFavList)
b.
/api/favorite (addFav)
c.
/api/favorite (modifyFav)
d.
/api/favorite (removeFav)
•
엔티티 생성
package com.kosta.entity;
import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Entity
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class Favorite {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(updatable = false)
    private Long id;
    @Column(nullable = false)
    private String title;
    @Column(nullable = false, length = 1000)
    private String url;
    @JoinColumn(name = "image_id", nullable = true)
    @ManyToOne
    private ImageFile image;
}
Java
복사
•
Repository 생성
package com.kosta.repository;
import com.kosta.entity.Favorite;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface FavoriteRepository extends JpaRepository<Favorite, Long> {
}
Java
복사
•
FavoriteController
package com.kosta.controller;
import com.kosta.domain.FavoriteRequest;
import com.kosta.domain.FavoriteResponse;
import com.kosta.service.FavoriteService;
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import java.util.ArrayList;
import java.util.List;
@RestController
@RequiredArgsConstructor
@RequestMapping("/api/favorite")
public class FavoriteController {
    private final FavoriteService favoriteService;
    // { "title" : "네이버", "url" : "http://www.naver.com", "image_id" : "450" }
    @PostMapping("")
    public ResponseEntity<FavoriteResponse> addFav(
            FavoriteRequest fav, @RequestParam(name = "image", required = false) MultipartFile file) {
        FavoriteResponse savedFavorite = favoriteService.insertFav(fav, file);
        return ResponseEntity.status(HttpStatus.CREATED).body(savedFavorite);
    }
    @GetMapping("")
    public ResponseEntity<List<FavoriteResponse>> getAllFavList(@RequestParam(name = "id", required = false) Long id) {
        List<FavoriteResponse> result = new ArrayList<>();
        if (id == null) {
            result = favoriteService.getAllFav();
        } else {
            FavoriteResponse favoriteResponse = favoriteService.getFavoriteById(id);
            result.add(favoriteResponse);
        }
        return ResponseEntity.ok(result);
    }
    @GetMapping("/{id}")
    public ResponseEntity<FavoriteResponse> getFav(@PathVariable("id") Long id) {
        FavoriteResponse favoriteResponse = favoriteService.getFavoriteById(id);
        return ResponseEntity.ok(favoriteResponse);
    }
    @DeleteMapping("/{id}")
    public ResponseEntity<FavoriteResponse> removeFav(@PathVariable("id") Long id) {
        FavoriteResponse deletedFav = favoriteService.deleteFav(id);
        return ResponseEntity.ok(deletedFav);
    }
    @PatchMapping("")
    public ResponseEntity<FavoriteResponse> modifyFav(
            FavoriteRequest fav, @RequestParam(name = "image", required = false) MultipartFile file) {
        FavoriteResponse updatedFav = favoriteService.updatedFav(fav, file);
        return ResponseEntity.ok(updatedFav);
    }
}
Java
복사
•
FavoriteService
package com.kosta.service;
import com.kosta.domain.FavoriteRequest;
import com.kosta.domain.FavoriteResponse;
import org.springframework.web.multipart.MultipartFile;
import java.util.List;
public interface FavoriteService {
    FavoriteResponse insertFav(FavoriteRequest fav, MultipartFile file);
    List<FavoriteResponse> getAllFav();
    FavoriteResponse getFavoriteById(Long id);
    FavoriteResponse deleteFav(Long id);
    FavoriteResponse updatedFav(FavoriteRequest fav, MultipartFile file);
}
Java
복사
•
FavoriteServiceImpl
package com.kosta.service;
import com.kosta.domain.FavoriteRequest;
import com.kosta.domain.FavoriteResponse;
import com.kosta.entity.Favorite;
import com.kosta.entity.ImageFile;
import com.kosta.repository.FavoriteRepository;
import com.kosta.repository.ImageFileRepository;
import com.kosta.repository.UserRepository;
import com.kosta.util.FileUtils;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import java.util.ArrayList;
import java.util.List;
@RequiredArgsConstructor
@Service
public class FavoriteServiceImpl implements FavoriteService {
    private final FavoriteRepository favoriteRepository;
    private final ImageFileRepository imageFileRepository;
    private final FileUtils fileUtils;
    private final UserRepository userRepository;
    private ImageFile saveImage(MultipartFile file) {
        if (file != null) {
            ImageFile imageFile = fileUtils.fileUpload(file);
            if (imageFile != null) {
                return imageFileRepository.save(imageFile);
            }
        }
        return null;
    }
    @Override
    public FavoriteResponse insertFav(FavoriteRequest favDTO, MultipartFile file) {
        ImageFile savedImage = saveImage(file);
        if (saveImage(file) != null) {
            favDTO.setImageFile(savedImage);
        }
        Favorite favorite = favDTO.toEntity();
        Favorite savedFavorite = favoriteRepository.save(favorite);
        return FavoriteResponse.toDTO(savedFavorite);
    }
    @Override
    public List<FavoriteResponse> getAllFav() {
        List<Favorite> favoriteList = favoriteRepository.findAll();
        if (!favoriteList.isEmpty()) {
            List<FavoriteResponse> favoriteResponseList = favoriteList.stream().map(FavoriteResponse::toDTO).toList();
            return favoriteResponseList;
        } else {
            return new ArrayList<>();
        }
    }
    @Override
    public FavoriteResponse getFavoriteById(Long id) {
        Favorite favorite = favoriteRepository.findById(id)
                .orElseThrow(() -> new IllegalArgumentException("찾을 수 없음"));
        return FavoriteResponse.toDTO(favorite);
    }
    @Override
    public FavoriteResponse deleteFav(Long id) {
        Favorite favorite = favoriteRepository.findById(id)
                .orElseThrow(() -> new IllegalArgumentException("찾을 수 없음"));
        favoriteRepository.delete(favorite);
        return FavoriteResponse.toDTO(favorite);
    }
    @Override
    public FavoriteResponse updatedFav(FavoriteRequest favDTO, MultipartFile file) {
        Favorite favorite = favoriteRepository.findById(favDTO.getId())
                .orElseThrow(() -> new IllegalArgumentException("찾을 수 없음"));
        ImageFile savedImage = saveImage(file);
        if (savedImage != null) {
            favorite.setImage(savedImage);
        }
        if (favDTO.getTitle() != null) {
            favorite.setTitle(favDTO.getTitle());
        }
        if (favDTO.getUrl() != null) {
            favorite.setUrl(favDTO.getUrl());
        }
        Favorite updatedFavorite = favoriteRepository.save(favorite);
        return FavoriteResponse.toDTO(updatedFavorite);
    }
}
Java
복사

