프로필 페이지 2
이미지 파일 경로와 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프로젝트 - 포토그램 만들기"