have a good time 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프로젝트 - 포토그램 만들기"