https://velog.io/@gun_123/java-%ED%8C%8C%EC%9D%BC-%EC%97%85%EB%A1%9C%EB%93%9C-%EC%B2%98%EB%A6%AC
참고해서 파일업로드 코드를 작성했다.

@Value("${file.upload/path}") private String uploadPath; : 파일 업로드 경로를 설정하기 위해 application.properties 에서 file.upload/path=C:\Users\admin\Desktop\sparta\week1\create-schedule\src\main\resources\static 프로퍼터 값을 가져와 'uploadPath' 변수에 주입했다.
업로드가 이미지인지 확인을 하고 객체에서 원본파일 이름을 가져온다.
assert orginalName != null; 는 원본 파일 이름이 null이 아닌지 확인한다.
String fileName = orginalName.substring(orginalName.lastIndexOf("\") + 1); 는
경로가 포함된 원본 파일 이름에서 마지막 디렉토리 구분자인 역슬래시('')를 기준으로 파일 이름을 추출한다. 마지막 역슬래시의 인덱스를 반환하고 그 위치부터 문자열을 잘라내어 파일 이름만 가져온다.

날짜 기반으로 새로운 폴더를 생성하는 기능을 수행한다.

UUID.randomUUID().toString() 메서드를 사용하여 고유한 식별자인 UUID를 생성하고 문자열로 변환한다.
tring saveName = uploadPath + File.separator + folderPath + File.separator + uuid + "_" + fileName;
파일을 저장할 경로와 파일 이름을 결합하여 전체 저장 경로를 만든다.
예를 들어 uploadPath가 "C:\uploads", folderPath가 "2024\05\20", uuid가 "123e4567-e89b-12d3-a456-426614174000", 그리고 fileName이 "example.jpg"라면, saveName은 "C:\uploads\2024\05\20\123e4567-e89b-12d3-a456-426614174000_example.jpg"가 됩니다.
Path savePath = Paths.get(saveName); 는 문자열로 경로를 'Path'객체로 변환한다.
uploadFile.transferTo(savePath); 는 uploadFile 객체의 transferTo() 메서드를 사용하여 파일을 지정된 savePath에 저장한다.
업로드된 파일을 고유한 이름으로 서버에 저장하고 저장된 파일의 정보를 클라이언트 반환한다.
오늘 과제에 대해서 피드백을 주신 부분에 대해서 수정하면서 새로 배웠다.
단일 책임 원칙(Single Responsibility Principle): 각 레이어는 하나의 역할에만 집중해야 한다. Service 레이어는 비즈니스 로직을 처리하고, Controller 레이어는 요청과 응답을 처리해야 한다. Schedule 객체를 Service에서 Response DTO로 변환하는 것은 이 원칙을 위반하는 것으로 간주될 수 있다.
파일 업로드의 코드를 짜면서 안되다보니 쉬다가 다시 하고 그러면서 휴식을 많이 취한 것 같다.
과제 제재출을 위해 시간을 할애하여 성과를 내기 위해 노력했다. 과제를 위해 새로운 것을 많이 배운 것 같다.