컴포넌트 제작 중, 이미지의 내용물을 변경하는 과정에서 리랜더링을 기대하였으나 의도대로 변경되지 않았다
알기로는, 리엑트에서 리랜더링이 되기 위한 가장 큰 베이스조건은
- 부모 컴포넌트가 리랜더링 된다
- prop의 내용물이 변경된다
- 내부의 상태가 변경된다
현재 aws의 데이터베이스 부담을 줄이기 위해, 파일 이름을 특정 유저의 아이디로 고정하고, 매번 프로필을 업데이트 할 때마다 그 기존 사진을 삭제하고 다시 유저 아이디로 이미지를 저장하여 그 저장 url을 응답으로 받아 img 의 src에 담아두는 로직을 짜두었었다.
이미지가 변경되는 것을 확인하려면 새로고침을 해야만 했다...
거듭, 밑의 주소는 아무리 실제 내용물이 다르더라도 리엑트 입장에서는 똑같은 주소 string에 불과했었다.
이런 문제를 해결하기 위해, s3 버킷에 user id로 새로운 버킷폴더를 만들고, 그 안에 내용물을 프로필 사진의 변경 요청이 올 때마다 비우고 다시 채워넣고, 그 떄에는 파일 이름을 랜덤한 형태로 만들어 일치하지 않도록 로직을 짜두었다.
절차를 위해 필요했던 핵심적인 함수는 aws-sdk 패키지에서 제공하는 메소드인 s3.listObjects였다.
특이하게도, s3에 저장되는 것은 모조리 객체이고, 설령 폴더처럼 보일지라도 그건 그냥 객체에 연결되어 있는 또다른 객체라는 사실에 한번 놀랐다.
그래서 폴더마냥 보이고 있는 이 트리를 건드려면 일단 s3.listObjects를 이용하여 특정 객체와 연결된 객체들의 리스트를 받아 조건에 따라 지우는 방향으로 진행해야 했다