티스토리 뷰


keyword : Spring, Thymeleaf, static
class : ERROR


에러내용

  • 타임리프를 이용해서 정적 게시판을 만들어보는 중에, 이미지 업로드 기능을 구현하고 있었다.
  • 이미지가 로컬에 저장은 되는데 해당 글에 들어가면 이미지 오류가 나고 직접 주소창에 localhost:8080/이미지경로 를 쳐봐도 이미지가 나오지 않았다.
  • Service쪽 관련 코드
    public ResponseEntity<PostDto.Response> createPost(PostDto.Request request, MultipartFile file) throws IOException {  
        String projectPath = System.getProperty("user.dir") + "\\src\\main\\resources\\static\\files";  

        UUID uuid = UUID.randomUUID();  
        String filename = uuid + "_" + file.getOriginalFilename();  

        File saveFile = new File(projectPath, filename);  
        file.transferTo(saveFile);  

        Post post = Post.builder()  
                .title(request.getTitle())  
                .content(request.getContent())  
                .category(request.getCategory())  
                .views(request.getViews())  
                .filename(filename)  
                .filepath("/files/" + filename)  
//                .imageList(request.getImageList())  
                .build();  

        postRepository.save(post);  
        return ResponseEntity.ok().body(new PostDto.Response());  
    }
  • View쪽 관련 코드
<div id="upload-group" class="form-group">  
    <label th:if="${post.filename != null}" for="upload">이미지</label>  
    <img th:if="${post.filename != null}" th:src="@{${post.filepath}}" id="upload"  
                aria-describedby="uploadHelp" alt="image">  
</div>
  • 처음에는 타임리프 문법을 잘못 적용했나 하고 th:src 관련 문법만 찾아보다가
  • "새로운 이미지를 업로드 했을 때 서버를 재시작하지 않으면 페이지에 적용되지 않는 것" 에 대해 물어보는 글을 보고 로컬에 저장되는 정적 리소스는 서버를 재시작해야 적용된다는 것을 알았다.

원인

  • 생각해보면 너무나 당연한 문제였다....
  • 서버를 시작하고 파일 업로드를 해서 내 로컬에 이미지 파일이 올라왔다.
  • 그러나 서버는 내 로컬에서 무슨 일이 일어났는지 알지 못한다. 예를 들어서 내가 프로젝트를 아무리 수정한다 한들 서버를 재시작하지 않으면 반영되지 않는 것과 같은 이치이다.
  • 서버를 내렸다가 다시 올리면 그제서야 프로젝트 소스가 서버 배포 경로에 복사가 되면서 이미지를 불러올 수 있는 것이다.

해결

@Slf4j  
@Configuration  
public class WebMvcConfig implements WebMvcConfigurer {  

    @Override  
    public void addResourceHandlers(ResourceHandlerRegistry registry) {  
        registry.addResourceHandler("/**")  
                .addResourceLocations("file:src/main/resources/static/");  
    }  
}
  • 서버를 자동으로 재시작하게 하거나, 정적 리소스 요청에 대해 기본 경로를 설정해주는 방법이 있는 것 같았다.
Spring-boot-devtools 라이브러리
  • 정적 리소스에 변화가 있으면 알아서 서버를 리로딩을 해주는 라이브러리이지만 빌드 속도가 느려지고 굳이 이 하나의 에러 때문에 의존성을 추가하는 것은 효율적이지 않다고 생각해서 사용하지 않았다
ResourceHandler란?
  • 정적인 리소스에 대한 요청을 처리하는 핸들러, 정적 파일들의 경로를 잡아주는 메서드이다!
  • 내가 설정한 내용은,
  • addResourceHandler에 정의한 루트로 들어오는 모든 정적 리소스 요청을
  • addResourceLocations에서 정의한 경로에서 찾는다는 의미이다.
반응형
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함