티스토리 뷰
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에서 정의한 경로에서 찾는다는 의미이다.
반응형
'개발냥이 > etc' 카테고리의 다른 글
[API 문서 자동화] Spring Rest Docs 기초 테스트 해보기! (0) | 2022.12.17 |
---|---|
[젠킨스] 젠킨스로 스프링부트 설정파일(applicaiton.properties, application.yml) 관리하기 (0) | 2022.11.09 |
[CI/CD] Docker & Jenkins를 이용해 Springboot CI/CD 구축해보기 (0) | 2022.11.05 |
[Docker] EC2 인스턴스 연결하기, Docker ubuntu에 설치하기 (1) | 2022.11.03 |
🐬돌고돌래🐋 여행 추천 서비스 OPEN! (0) | 2022.10.21 |
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- Comparator
- CS
- 스프링부트
- 타입스크립트
- 자바bfs
- 해시맵
- DP
- BFS
- 정렬
- 자바트리
- 알고리즘
- 백준
- 리액트
- 자바dp
- 자바스크립트
- dfs
- 스프링
- java
- Nest
- JavaScript
- 프로그래머스
- 형변환
- Spring
- 자바
- Queue
- JPA
- SQLD
- Algorithm
- 이분탐색
- SQL
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함