<img th:src="@{${show.posterURI}}" class="card-img-top" alt="..." height="200">
원래는 show info에 포스터 이미지를 저장한 경로만 저장해두고 이미지를 찾을 때는 경로만 넘겨서 타임리프가 그 경로에서 이미지를 읽도록 구현했었는데,
그 이미지를 src 아래에 있는 img에 저장하다보니 웹서버가 돌아가고 있는 build 아래에 있는 img에는 저장된 파일이 업데이트가 안됐다.
서버를 내리고 다시 컴파일하면 업데이트가 되긴하는데
매번 재 컴파일하는건 무리라서 다른 방법을 찾아다녔다.
먼저 web 서버의 root를 찾아 거기에 저장을 하려고 했었다
근데 못찾음.
워크스페이스가 C:인데 여기가 root라는 글도 있고 tomcat아래에 webapp이라는 글도 있고
http sevlet request에서 context path를 받아와서 C:/users/user/appdata/temp/tomcat… 어쩌구 폴더까지 가서 거기에 저장해보기도하고
여기저기 패스란 패스는 다 뒤져봤지만 실패
다음으로 타임리프가 파일을 찾지 못하면 백엔드에서 직접 주면 되겠다 싶어서 파일을 절대경로로 직접 찾아 byte[] 로 반환하는 메소드를 만들고 get mapping 컨트롤러에 추가하여 보았지만 뭔 괴상한 에러만 발생하며 실패
다음으로 spring devtool에 auto reload라는 기능을 사용하면 static 파일들이 변할 때마다 자동으로 업데이트 해준다길래 시도해봤는데 intellij community 버전은 지원이 안되는 것 같았다. Intellij hot swap도 마찬가지.
정처없이 구글을 타고 인터넷을 떠돌다가 찾은 다음 방법이 response entity에 byte[]를 담고 헤더를 적어서 보내는 방법이었다.
바로 성공함
하지만 올바른 방법인지는 모르겠음
나중에 도커 연습용 프로젝트를 하면서 파일 서비스를 다시 만들어 보았는데
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("images/**")
.addResourceLocations("file://images");
}
}
리소스 핸들러로 절대 경로를 파일 시스템의 루트로 지정하고
그 파일 경로로 파일을 저장하면 프로젝트의 루트 폴더에 저장된다는 것을 배웠다.
이번 프로젝트에서는 Thymeleaf를 썼는데 script inlining이라는 기능이 있길래 사용해 봄
https://www.thymeleaf.org/doc/tutorials/2.1/usingthymeleaf.html#inlining
uri에 대한 권한 인가와 접근 제한은 걸렸는데
자원에 직접 접근하는 부분은(/어쩌구.html) spring websecurity에서 설정했어야 했는데 시간도 없고 내가 담당하던 부분이 아니라서 제대로 구현을 못함
비밀번호 암호화 부분도 내가 관여한 부분이 아니라 확인도 못했는데 그래서 bcrypted? 뭐 그런 암호화 라이브러리를 사용 못하고 그냥 임의로 변형해서 저장함
그리고 공연 등록 페이지에서 입력값에 null값이 없는지 validation을 했어야 했는데 이것도 시간 문제로 안하고 넘어감