웹 코딩 처음 배운지 3년 가까이 됐으니까
슬슬 가벼운 마음으로 도전해봐야지라고 했던건데
고전적인 웹서버 구조가 아니라
최근에 가장 주로 쓰이는 웹 서비스 환경 구조는
1. 백엔드의 인프라와 DB조작과 API제공을 해주는 백엔드 서버가 있고
2. 프론트엔드에서 react나 vue로 웹페이지를 띄워주는 주체(?)가 있는데
3. 그거를 사용자는 웹브라우저로 url 입력하고 접속해서 보는건데
근데 여기서 모순이랄까 희한한 한계점이 있더라고요
프론트엔드에서 html과 JS 코드로
사용자가 원하는 파일을 사용자 본인의 컴퓨터로 "다운로드" 받게 하는게 가능하고요(3에서 다운로드)
사용자가 웹브라우저에 올린 파일을 "백엔드" 서버에 저장하는 것도 가능합니다(1에 저장)
여기까지는 당연한건데 이제 뜻밖의 문제가 생기더군요.
중간에 있는 2번
프론트엔드 환경을 구동하는 주체의 내부 경로에는
사용자가 올리려는 파일을 저장하는 것이 불가능하다는 것을 알게 되었는데
이게 받아들이기가 너무 힘들더라고요
정말 이게 말이 되는가?
사용자가 업로드 하고싶어서 직접 선택한 파일은
html의 <input type="file">과 같은 인터페이스에 첨부되고
그거를 new formData();에 append 하고 서버로 요청 날리면 1번의 백엔드에서 서버 내부 경로에 저장하잖아요
그런데 예를 들어서
vue나 react에
/public이라는 폴더 경로가 있다면,
만약에 그 /public이라는 폴더에
사용자가 올리려는 이미지 파일을 저장할수있다면
프론트엔드에서는 어디에서나
src에 "@/public/이미지파일.png"를 넣으면
그 파일을 간단하게 보여줄수있는데
그렇게 할수있는 방법을 최대한 찾아봤는데도 없더라고요.
근데 파일을 백엔드 서버에 저장하거나
사용자가 본인 컴퓨터에 다운로드 받는건 가능한데
왜 중간에 프론트엔드쪽 경로에는
사용자가 올린 파일을 저장하지 못하는걸까요?
이게 잘 납득이 되지않는데
그냥 그러려니 하고 받아들이고는 있습니다만
아직도 이게 왜 안되는것인지가 굉장히 궁금하네요
그리고 진짜 실제로 이게 불가능한건 맞는지도 여전히 의심되는데
아무튼 이게 어떻게 된건지 설명 좀 해주시면 고맙겠습니다.
이게 뭔 개소리야 퍼블릭에ㅜ사용자 파일을 왜처넣어 시발
public은 프론트엔드쪽 서버에서 서빙하는 영역으로 주로 쓰이기 때문에, 업로드를 받는 백엔드랑은 다루는 디렉토리가 겹칠 수 있어서 피하는 편임. 강제로 할려면 심볼릭 링크 같은걸로 서브 폴더를 만들어서 하기도 하지만 잘 쓰이진 않음. 유저가 업로드하는 데이터는 어떤게 업로드 될지 모르고, 2차 가공이 필요한 경우가 많고 이를 거쳐서 다른 서브도메인으로 제공하는 경우가 많음. 실무적으로는 트래픽비용 때문에 WAS보다는 CDN 으로 보내버리는 경우가 많음.
유저는 폰에 있는 이미지를 그대로 업로드하는 경우가 많은데 해상도가 애미디진 8K 막 이런거 올리기 때문에 리사이징해주고, 회전 잡아주고, 작은 썸네일을 만드는 2차 작업을 보통 큐를 이용해서 처리한다음 S3 혹은 CDN으로 보내서 거기서 파일을 서빙함. 그러므로 서버가 다르기에 URL 자체가 좀 달라짐. 사이즈가 작으면 모놀 식으로 uploads 라는 폴더에다가 업로드하고 get 을 핸들링해서 직접적으로 파일을 보내주는 res.download('../uploads/yourupload.jpg') 이런식으로 보내주기도 함. 그런데 직접 보내면 경로 조작해서 보안문제를 일으켜서 피하는 편.
프론트엔드에 파일을 저장한다는 게 뭔 소린지도 모르겠음
이론상 안될건 없는데 윗댓들 말대로 의도적으로 안되게 설계하는거임 - dc App
모르는걸 모르는대 뭘모르는지 모르는 느낌 - dc App
일단 프론트에서 어디까지 처리할 수 있는지 범위를 아는게 좋을듯.
그게 가능하려면 프론트 영역에 대한 독자적인 서버가 있거나, 서버에서 프론트 영역을 포함시켜야겠지.