토이 프로젝트를 하면서 사진을 많이 사용해야하는 일이 생겼는데 이 때 사진을 로컬 디렉토리 (배포 시에는 서버 디렉토리)에서 가져오기로 정했다.
이런 선택을 한 이유는 총 3가지 선택지 중 가장 효율, 효과적이라 생각했기 때문이다. AWS S3를 이용하는 방법은 지금 프로젝트에서 사용해도 괜찮지만 free tier가 끝난 계정만 남았기에 토이 프로젝트를 하면서 지출을 피하기 위해 선택하지 않았고, 스프링 프로젝트의 resources/static/images 에 모든 이미지를 저장기엔 이미지가 1200장이 넘어가서 선택하지 않았다.
// 기존 이미지 소스 코드
<img src="/images/image1.png"/>
// 변경할 이미지 소스 코드
<img src="/upload/i/image1.png"/>
// 경로 변경 "/image" >> "/upload/i"
기존의 방법대로 /images/ 경로를 사용하면 resources/static/image 안에 있는 파일로 자동 매핑 되었지만 이를 다른 로컬(PC) 디렉토리로 변경하는 것을 목표로 작업하였다.
우선 소스코드를 작성하기 전 로컬 디렉토리를 지정해준다. application.yml 파일에 해당 값을 선언하고 주입해서 사용할 예정이다. 개발 환경은 window 10 이기 때문에 아래 처럼 작성했지만 os에 맞춰서 알맞게 작성해주면 된다.
resource:
location: file:///C:/upload/i/
WebMvcConfig.java
@Configuration
@EnableWebMvc
public class WebMvcConfig implements WebMvcConfigurer {
@Value("${resource.location}")
private String RESOURCE_LOCATION;
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/images/**", "/upload/i/**")
.addResourceLocations("classpath:/static/images/", RESOURCE_LOCATION);
}
}
application.yml 에 선언했던 변수를 주입해준 뒤 addResourceHandlers 를 이용해서 정적 리소스 매핑을 변경해주면 된다. 추가로 이미지 1200장 외에 가벼운 이미지(oauth 아이콘 등)은 기존 방식 그대로 resources 하위에 두고 사용할 것이기 때문에 총 2가지 경로에 대한 매핑을 작성해주면된다.
- addResourceHandler - html 코드에서 사용되는 url 패턴
- addResourceLocations - 정적 리소스가 위치한 경로
이렇게 해주면 로컬 디렉토리에 위치한 정적 리소스도 html에서 사용할 수 있게된다.
추가로 springSecurity를 적용했다면 이미지 로드 시 권한 문제로 로드가 안되는 경우가 있는데 그 때는
@Bean
public WebSecurityCustomizer securityCustomizer() {
return web -> web.ignoring()
.requestMatchers(PathRequest.toStaticResources().atCommonLocations())
.requestMatchers("/upload/i/**");
}
SecurityConfig 와 관련된 소스코드에 ignore을 추가해주면 된다. 이 방법 외에 SecurityFilterChain에서 requestMatchers permitAll() 을 해주는 방법도 있는데 해당 방법을 적용했을 경우 필터를 거치면서 검사하는 것이기 때문에 ignore을 적용하는 것이 더 효율적이라고 한다.
'코딩 공부 > SpringBoot' 카테고리의 다른 글
스프링부트 다중서버 세션관리 구현해보기(spring security + redis) (0) | 2024.03.04 |
---|---|
spring data jpa 즉시로딩, 지연로딩 확인해보기 (3) | 2024.02.28 |
spring devtools livereload 기능 사용하기 (intellij) (0) | 2024.02.19 |
스프링 시큐리티 - 회원가입, 로그인, 권한별 페이지 접근 설정 (0) | 2024.01.20 |
Controller 에서 Form-data를 받는 방법들 (0) | 2024.01.15 |