전체 글 40

[SpringBoot] 로그인/세션 등 리액트 연동 문제 해결(1) - CORS, 리액트에서는 안 될 때, 스프링 부트와 AWS로 혼자 구현하는 웹 서비스

스프링 부트와 AWS로 혼자 구현하는 웹서비스라는 책을 따라하며 백엔드 서버를 혼자 잘 구현했다. 그러고 프론트엔드로 구현해놓은 리액트와 연결하려 했다. (프론트는 다른 사람이 했음) 역시나~ 잘 될리가..ㅎ 백엔드의 진짜 문제는 서버 구동하면서 같다. 코딩은 백엔드의 10프로 정도만 하지 않나... 싶음... 우선 생긴 문제는 크게 1. CORS 오류 2. 스프링 시큐리티의 로그인 문제 이렇게다. * 본 포스트는 제가 나름대로 이해하고 생각한 내용입니다. 실제 구동 방식과 다를 수도 있습니다. 실제 정확한 원리와 개념은 다른 포스트를 보세요... 부끄러워요... * 책에서 나온 코드를 기준으로 작성되었습니다. 책 GitHub 주소: https://github.com/jojoldu/freelec-spri..

SpringBoot 2023.01.22

[기타] 간단하게 Rancking Algorithm 구현하기 - Hacker News Algorithm

ML, AI 등이 필요 없이 그냥 단순하게 순위 알고리즘을 짜봤다. 애초에 적용할 기준이 하나만 있어서... 좋아요를 기준으로 순위를 짜보았고, 시간이 지남에 따라 매력도를 감소 시켰다. 유명한 Hacker News Algorithm을 이용해서 짜보았는데 자세한 설명은 참고 자료를 보면 된다. 내가 변형한 공식은 아래와 같다. score = (likeNum) / (timediff) ** GRAVITY 간략하게 설명하자면 likeNum은 좋아요 수이다. 기존 알고리즘과 다른 점은, 나의 경우 좋아요 취소에 대한 보정이 필요 없으므로 -1을 해주지 않았다. timediff는 업로드 날부터 오늘까지 지난 날이다. 기준은 day로 잡았다. 참고자료와 마찬가지로, 오늘 올라온 글은 인기순에 포함시켜주고 싶지 않아..

기타 2022.09.26

[Redis] AWS ElasticCache Redis 사용하기 - Node JS, EC2, RDS(mysql), Lambda

지금까지는 항상 DB에서 조회한 데이터를 사용했다. 하지만 캐싱을 적절히 사용한다면 실시간으로 데이터를 업데이트 해줄 수 있고 속도도 향상시킬 수 있기 때문에 캐시를 사용하려고 한다. 지금 AWS로 서비스를 하고 있기 때문에 Elastic Cache의 Redis를 처음 도입하고 사용하는 것까지 다뤄보려 한다. 1. Redis 나는 간단하게 '캐싱용 DB'라고 이해했다. 데이터베이스에 저장된 데이터를 메모리 캐시로 임시로 저장하는 것이다. 메모리로만 데이터를 처리하기 때문에 데이터 저장 및 검색 속도가 매우 빠르다는 장점이 있다. Redis를 왜 써야 하고, 무슨 이정이 있는지는 참고자료나 다른 블로그를 보는 게 더 좋을 것 같다. 2. 클러스터 생성 AWS 콘솔에서 Elastic Cache에 접속해주고 ..

AWS 2022.09.19

[Redis] 전송 중 데이터 암호화가 활성화된 레디스 연결 시 에러 - jemalloc/jemalloc.h, openssl/ssl.h

zmalloc.h:50:10: fatal error: jemalloc/jemalloc.h: No such file or directory sentinel.c:34:10: fatal error: openssl/ssl.h: no such file or directory 1. 독스를 제대로 따랐는지 확인하기 sudo yum -y install openssl-devel gcc wget http://download.redis.io/redis-stable.tar.gz tar xvzf redis-stable.tar.gz cd redis-stable make distclean make redis-cli BUILD_TLS=yes sudo install -m 755 src/redis-cli /usr/local/bin/ 출..

AWS 2022.09.19

[MySQL] 전문검색 FullText Search 기능 이용해 검색 구현하기 - AWS RDS innoDB 8.0.28

지금까지 검색 기능에서 LIKE %% 을 이요하고 있었다. 이유는 그냥.. 시간이 없어서...ㅋㅋㅋㅋ 검색 기능을 구현하긴 해야 하는데, 검색 엔진 도입하자니 시간이 없고 데이터 양도 많지 않아서 속도 면에서도 나쁘지 않았다. 엘라스틱 서치 도입하고 싶어서 강의까지 결제했는데 몰아치는 업무에 그냥 방치 중,, 그러다 MySQL에서 제공해주는 전문 검색 기능이 있다는 걸 알게 되었고, 외부 검색 엔진보다 쉽게 도입할 수 있을 것 같아서 스터디 겸 도전해보게 되었다. * 필자는 AWS의 RDS 서비스를 통해 MySQL을 서비스하고 있다. 1. 먼저 테스트 테이블을 만들어준다. 나는 이미 덤프 테이블이 하나 있어서 그걸 쓸 예정. 2. 원하는 칼럼에 인덱스를 만들어준다. MySQL Workbench를 기준으로..

DB 2022.09.14

[Serverless] WARNING: Could not determine version of module ~ 문제

옛날부터 아래와 같은 경고문이 떴다. Serverless: WARNING: Could not determine version of module aws-sdk serverless로 deploy 할 때 나던 경고문이다. 딱히 크게 문제될 게 없어서 그냥 넘겼는데 갑자기 거슬려서 해결하기로 했다. 해결 방법: webpack과 serverless-webpack의 버전을 올려준다. 간단하게 버전 번호 앞에 '^' 만 붙여주고 다시 install 하면 끝!

AWS 2022.08.17

[Node js] JSON.parse(JSON.stringify()) 시 빈 문자열("")을 반환하는 문제

여느 때와 같이 MySQL과 Node를 쓰고 있었는데... 정말 갑자기 JSON에서 오류가 떴다. 값자기 value가 빈 문자열이 된 것. ..?????? 정말 갑자기. 5초 전까지만 해도 잘만 돌아가던 함수가 갑자기 이상하다. MySQL로 쿼리를 보내서, JSON 변환을 해서 아래와 같이 사용하고 있었다. const queryResult = await connection.query( `SELECT * FROM TABLE_A`); const query = JSON.parse(JSON.stringify(queryResult))[0][0]; 그러면 query라는 변수에 { "key": "value" } 이렇게 저장이 되어야 하는데, value가 그냥 ""으로 저장이 되는 것이었다. 진짜 당황스러운 경험이었다..

Express 2022.08.16

[AWS] ERROR LOG가 찍히지 않는데 502 Internal server error가 뜰 때 - CloudWatch, Lambda, APIGateway

서버로 request를 보내면 502 에러가 뜨는데 CloudWatch에서는 정상적으로 로그가 찍혀서 뭐가 문젤까 디버깅을 하는 중이었다. 우선 502 ERROR는 시간 초과 문제다. API Gateway 테스트로 찍어보면 request와 response의 헤더 전체를 볼 수 있으니 디버깅할 때 유용하게 쓸 수 있는데, 여기에서도 time out이 떴다. 이전까지만 해도 잘만 작동하던 함수가 이렇게 time out이 뜨는 이유가 뭘까... 며칠을 디버깅하며 보냈다. 동일한 API 스택에 있는 다른 함수는 잘 동작을 했고, 문제의 lambda 함수도 잘 동작을 했으니 각각이 문제는 아니라 생각했다. 그렇다면 API Gateway와 Lambda가 연결되는 과정에서 시간 초과가 난 건데. 이전까지는 시간 초과..

AWS 2022.08.12

[AWS] Lambda로 CloudFront 무효화 기록 - S3 트리거, 와일드카드

CF를 본격적으로 사용하기 시작하면서 문제가 생겼다. 바로 캐싱된 이미지가 24시간 동안 유지된다는 것이었다. 내가 개발하는 어플은, 유저가 이미지를 수정할 수 있다. 그래서 새로 이미지를 수정할 때엔 똑같은 key로 버킷에 업로드하며 overwrite하였다. (S3는 기본적은 동일한 key에 대해 overwrite 한다.) 하지만, 이렇게 하면 S3에서 원본 이미지는 바뀌었지만 CF의 캐시 이미지는 그대로 있다는 것이다. 이런 문제를 해결하기 위해 AWS가 방법 2가지를 제공해주고 있다. 1.key 자체에 버전을 명시해 관리하기 ex) image_20220804 등 key에 시간/uid 등을 붙여 관리 2. CF 무효화 기능 사용하기 AWS에서도 1번을 추천하고 있고, 나도 관리 면에서는 1번이 좋은 ..

AWS 2022.08.04

[AWS] 이미지 업로드/읽기 속도 향상기 - Signed URL, Lambda@Edge, Cloud Front

항상 어플의 속도에서 문제되던 것이 있다. 바로 이미지 로딩 속도. 이미지 로딩이 느리니 아무리 API가 빨리 돌아가도 그냥 느려보이는 것이었다. 항상 방법을 찾아야지 찾아야지 하다가 그냥 개발에 급급해 미뤄두던 문제를... 드디어 해결하려 한다. * 기존의 이미지 업로드/쓰기 방식 먼저 Client에서 서버로 form-data에 이미지 파일을 바이너리로 보낸다. 서버는 busboy module로 이미지를 받고 S3에 직접 PUT한다. 또 Jimp 모듈을 이용해 이미지를 리사이징해, 원본이미지와 썸네일 이미지를 모두 저장한다. 그리고 이 이미지 URL을 DB에 저장한다. 이때 S3 버킷을 퍼블릭으로 권한을 설정해 두어 이미지 URL로 바로 Client가 읽을 수 있도록 하는 게 기존의 방식이었다. 위의 ..

AWS 2022.07.26