인프런 커뮤니티 질문&답변

유요한님의 프로필 이미지
유요한

작성한 질문수

스프링 MVC 2편 - 백엔드 웹 개발 활용 기술

예제로 구현하는 파일 업로드, 다운로드

이미지 불러오기 질문

해결된 질문

작성

·

1.1K

·

수정됨

0

학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.

1. 강의 내용과 관련된 질문을 남겨주세요.
2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.
(자주 하는 질문 링크: https://bit.ly/3fX6ygx)
3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.
(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)

질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.
=========================================
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)

[질문 내용]
지금 현재 강의에서 file.dir에서 경로를 업로드하면 경로로 적어준 로컬에 생기면서 서버 메모리에 저장되는 걸로 알 고 있습니다.

강의에서 Map으로 했던 것을 DB에 넣게 해서

H2 데이터베이스에 이런식으로 들어가게 해서 서버를 껐다가 켜도 DB를 보고 잘 찾아와지는 것을 볼 수 있었습니다. 근데 로컬 경로에 있는 이미지를 지우면 이미지가 안보이더군요. 근데 프로젝트에서 적용하려고 하니 두 가지의 문제점이 있었습니다.

 

  1. file.dir을 똑같이 맞춰줘야하는 단점이 있어서

    활성화 프로퍼티에 경로를 쓰고 file.dir=${file-dir} 이런식으로 하려고 하니

    18:17:20.605 [Thread-0] DEBUG org.springframework.boot.devtools.restart.classloader.RestartClassLoader - Created RestartClassLoader org.springframework.boot.devtools.restart.classloader.RestartClassLoader@585fb609

    18:17:20.790 [restartedMain] ERROR org.springframework.boot.SpringApplication - Application run failed

    java.lang.IllegalStateException: Location 'file:./config/*/application-file-dir=c:/upload/file/.yaml' must end with '*/'

    at org.springframework.util.Assert.state(Assert.java:97)

    at org.springframework.boot.context.config.LocationResourceLoader.validatePattern(LocationResourceLoader.java:134)

    at org.springframework.boot.context.config.LocationResourceLoader.getResources(LocationResourceLoader.java:95)

    at org.springframework.boot.context.config.StandardConfigDataLocationResolver.resolvePattern(StandardConfigDataLocationResolver.java:312)

    at org.springframework.boot.context.config.StandardConfigDataLocationResolver.resolve(StandardConfigDataLocationResolver.java:298)

    at org.springframework.boot.context.config.StandardConfigDataLocationResolver.resolve(StandardConfigDataLocationResolver.java:249)

    at org.springframework.boot.context.config.StandardConfigDataLocationResolver.resolveProfileSpecific(StandardConfigDataLocationResolver.java:148)

    at org.springframework.boot.context.config.ConfigDataLocationResolvers.lambda$resolve$2(ConfigDataLocationResolvers.java:120)

    at org.springframework.boot.context.config.ConfigDataLocationResolvers.resolve(ConfigDataLocationResolvers.java:126)

    at org.springframework.boot.context.config.ConfigDataLocationResolvers.resolve(ConfigDataLocationResolvers.java:119)

    at org.springframework.boot.context.config.ConfigDataLocationResolvers.resolve(ConfigDataLocationResolvers.java:107)

    at org.springframework.boot.context.config.ConfigDataImporter.resolve(ConfigDataImporter.java:106)

    at org.springframework.boot.context.config.ConfigDataImporter.resolve(ConfigDataImporter.java:98)

    at org.springframework.boot.context.config.ConfigDataImporter.resolveAndLoad(ConfigDataImporter.java:86)

    at org.springframework.boot.context.config.ConfigDataEnvironmentContributors.withProcessedImports(ConfigDataEnvironmentContributors.java:116)

    at org.springframework.boot.context.config.ConfigDataEnvironment.processWithProfiles(ConfigDataEnvironment.java:311)

    at org.springframework.boot.context.config.ConfigDataEnvironment.processAndApply(ConfigDataEnvironment.java:232)

    at org.springframework.boot.context.config.ConfigDataEnvironmentPostProcessor.postProcessEnvironment(ConfigDataEnvironmentPostProcessor.java:102)

    at org.springframework.boot.context.config.ConfigDataEnvironmentPostProcessor.postProcessEnvironment(ConfigDataEnvironmentPostProcessor.java:94)

    at org.springframework.boot.env.EnvironmentPostProcessorApplicationListener.onApplicationEnvironmentPreparedEvent(EnvironmentPostProcessorApplicationListener.java:102)

    at org.springframework.boot.env.EnvironmentPostProcessorApplicationListener.onApplicationEvent(EnvironmentPostProcessorApplicationListener.java:87)

    at org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:176)

    at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:169)

    at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:143)

    at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:131)

    at org.springframework.boot.context.event.EventPublishingRunListener.environmentPrepared(EventPublishingRunListener.java:85)

    at org.springframework.boot.SpringApplicationRunListeners.lambda$environmentPrepared$2(SpringApplicationRunListeners.java:66)

    at java.base/java.util.ArrayList.forEach(ArrayList.java:1541)

    at org.springframework.boot.SpringApplicationRunListeners.doWithListeners(SpringApplicationRunListeners.java:120)

    at org.springframework.boot.SpringApplicationRunListeners.doWithListeners(SpringApplicationRunListeners.java:114)

    at org.springframework.boot.SpringApplicationRunListeners.environmentPrepared(SpringApplicationRunListeners.java:65)

    at org.springframework.boot.SpringApplication.prepareEnvironment(SpringApplication.java:343)

    at org.springframework.boot.SpringApplication.run(SpringApplication.java:301)

    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1303)

    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1292)

    at com.example.fileupload2.Fileupload2Application.main(Fileupload2Application.java:10)

    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)

    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

    at java.base/java.lang.reflect.Method.invoke(Method.java:566)

    at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:49)

    이런 오류가 발생했습니다.

  2. 두 번째 문제는 로컬에 파일이 없으면 이미지를 보여줄 수 없는데

    저는 이미지를 db직접 넣어서 사용하는 것과 로컬에 이미지를 넣는것이 아니라 강의에서 나온 사용자가 올린 파일명, 실제 서버에서 관리되는 파일명을 서버에 넣어준 것을 db에 경로만 넣어서 가져오길 원하는데 근데 로컬에서 가져오는 것은 성공했는데 서버에서 db를 통해 가져오는 방법을 모르겠습니다.

ps) 설명을 들어보면 서버에 실제 서버에서 관리되는 파일명, 사용자가 올린 파일명 이렇게 넣어주는 거라고 이해했는데 로컬에 있는 경로로 이미지를 보여주고 업로드하면 이미지를 로컬에 넣어주니 이게 서버에 업로드하는 것이 맞나 헷갈리고 강의 코드에 db에 넣는거 추가만 했는데 강의방법이 경로를 db에 넣어서 사용하는게 아니라 이미지를 넣어준거 같아서 제가 알기론 db에 직접 넣지말고 경로로 가져와서 쓰는게 좋다는 걸로 알고 있거든요. 프로젝트로 협업할 때는 그냥 s3로 구현하는게 차라리 편하나요?

답변 1

1

안녕하세요. 유요한님, 공식 서포터즈 David입니다.

  1. 프로파일을 입력해야 하는 곳에 환경변수를 입력하신 것 같습니다. 프로파일 항목에는 프로파일 정보를 입력하셔야 합니다.

  2. 강의에서 알려드리고 있는 방법은 DB에 이미지를 직접 넣는(binary 형태)게 아니라, DB에는 파일명, 파일경로를 넣고, 서버의 특정 폴더 내에 이미지를 저장하는 것입니다. 아래 transferTo 메서드가 특정 경로로 MultipartFile을 저장하는 동작을 수행합니다.

    image

감사합니다.

유요한님의 프로필 이미지
유요한

작성한 질문수

질문하기