-
프로필 페이지 2Spring Boot/프로필 페이지 만들기 2021. 12. 15. 20:47
이미지 파일 경로와 caption 부분을 데이터베이스에 넣기
<ImageService.java> 파일
@RequiredArgsConstructor @Service public class ImageService { private final ImageRepository imageRepository; @Value("${file.path}") private String uploadFolder; @Transactional public void 사진업로드(ImageUploadDto imageUploadDto, PrincipalDetails principalDetails) { UUID uuid = UUID.randomUUID(); String imageFileName = uuid+"_"+imageUploadDto.getFile().getOriginalFilename(); System.out.println("이미지 파일이름 : "+imageFileName); Path imageFilePath = Paths.get(uploadFolder+imageFileName); try { Files.write(imageFilePath, imageUploadDto.getFile().getBytes()); } catch (Exception e) { e.printStackTrace(); } Image image = imageUploadDto.toEntity(imageFileName, principalDetails.getUser()); imageRepository.save(image); } }
프로필 페이지 1에서 첨부한 ImageService.java 파일에서
Image image = imageUploadDto.toEntity(imageFileName, principalDetails.getUser()); imageRepository.save(image);
이 부분 추가했다.
<ImageUploadDto.java> 파일
ImageService.java 에, 사용자로부터 받은 caption 을 전달하기 위해
public Image toEntity(String postImageUrl, User user) { return Image.builder() .caption(caption) .postImageUrl(postImageUrl) .user(user) .build(); }
위와 같은 메서드를 추가했다.
더보기최종 <ImageUploadDto.java> 파일
@Data public class ImageUploadDto { private MultipartFile file; private String caption; public Image toEntity(String postImageUrl, User user) { return Image.builder() .caption(caption) .postImageUrl(postImageUrl) .user(user) .build(); } }
우리가 Image 데이터베이스에 아래와 같은 데이터를 저장해야 하는데,
caption, postImageUrl, userId 값은
ImageService.java 파일과 ImageUploadDto.java 파일이 서로 상호작용하면서 ImageRepository.java 에 전달해줌
(userId 는, image테이블과 user 테이블이 연관관계를 맺으면서 FK 로 설정된 값
그래서 만약 1번 유저가 이미지를 업로드 했다면, image 데이터베이스에서 userId 에는 1이 입력됨)
자세히 보려면 아래 펼쳐서 보기
더보기먼저, ImageService.java 파일을 보면
Image image = imageUploadDto.toEntity(imageFileName, principalDetails.getUser());
이런식으로 ImageUploadDto.java 의 toEntity 메서드를 호출한다.
1. caption
그래서
ImageUploadDto.java 파일에서 toEntity 메서드를 보면 아래와 같다.
@Data public class ImageUploadDto { private MultipartFile file; private String caption; public Image toEntity(String postImageUrl, User user) { return Image.builder() .caption(caption) .postImageUrl(postImageUrl) .user(user) .build(); } }
즉, ImageUploadDto.java 파일에서 사용자로부터 받은 caption 값을 builder를 사용해서
ImageService.java 로 전달해준다. 그리고 이 값이 데이터베이스에 저장되게 함.
2. postImageUrl, userId
이 값은 ImageService.java 에서
@RequiredArgsConstructor @Service public class ImageService { private final ImageRepository imageRepository; @Value("${file.path}") private String uploadFolder; @Transactional public void 사진업로드(ImageUploadDto imageUploadDto, PrincipalDetails principalDetails) { UUID uuid = UUID.randomUUID(); String imageFileName = uuid+"_"+imageUploadDto.getFile().getOriginalFilename(); System.out.println("이미지 파일이름 : "+imageFileName); Path imageFilePath = Paths.get(uploadFolder+imageFileName); try { Files.write(imageFilePath, imageUploadDto.getFile().getBytes()); } catch (Exception e) { e.printStackTrace(); } Image image = imageUploadDto.toEntity(imageFileName, principalDetails.getUser()); imageRepository.save(image); } }
postImageUrl 값은 UUID 값을 같이 넣어서 imageFileName 변수로
userId 값은 사진업로드 메서드의 매개변수 PrincipalDetails 를 이용해서 아래와 같이
imageUploadDto를 호출할 떄
principalDetails.getUser() 값으로 ImageUploadDto.java 에 전달되었다가 다시 받아서 imageRepository 에 저장됨
Image image = imageUploadDto.toEntity(imageFileName, principalDetails.getUser()); imageRepository.save(image);
이렇게 하고 사이트에서 이미지 업로드하면 데이터베이스의 image 테이블에 아래와 같이 값이 잘 들어옴.
1번 유저가 이미지를 업로드 했기 때문에 userId 값이 1이 됨
참고 자료 : 이지업 강의 사이트 "스프링부트 SNS프로젝트 - 포토그램 만들기"
'Spring Boot > 프로필 페이지 만들기' 카테고리의 다른 글
프로필 페이지 7 - @JsonIgnoreProperties (0) 2021.12.18 프로필 페이지 5 (0) 2021.12.16 프로필 페이지 4 (0) 2021.12.16 프로필 페이지 3 (0) 2021.12.15 프로필 페이지 1 (0) 2021.12.14