
[Snacks 개발 일기] #14 ec2 포트포워딩 하기
2023. 1. 20. 16:12
Project/Snacks
우리는 하나의 ec2안에서 docker compose를 통해 프론트엔드 + 백엔드 + redis가 연결되어있다 따라서 ec2의 ip주소로 접속하려면 먼저 프론트엔드의 포트로 접속을 해야하는데 (그렇지 않으면 ip주소:포트번호 로 접속), 이럴때 ec2에서 포트포워딩 설정을 해주면 된다 기본값인 80번 포트로 접속을 하면 내가 원하는 포트번호로 연결시켜주는 것이다 sudo su iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 80 -j REDIRECT --to-port [원하는 포트번호] 이 과정을 실행하면 더이상 ip주소 뒤에 포트번호를 붙이지 않아도, ip주소만 입력하면 내가 원하는 포트로 이동할 수 있다!

[Snacks 개발 일기] #13 ec2에서 빌드 안될 때, swap 메모리 설정하여 해결하기
2023. 1. 20. 16:05
Project/Snacks
프론트엔드 + 백엔드 + redis로 이루어진 docker compose를 드디어 ec2에서 실행하는 순간이 왔다 원래도 백엔드 파일이 커서 빌드되는데 시간이 많이 걸리긴 했는데, ec2에서 돌리니 더 안돌아가는 것이었다 이전에 동아리에서 스터디를 할 때, 간단한 파일임에도 불구하고 ec2에서 빌드를 했을 때 1시간 반이 걸리고, 그마저도 실패로 뜨는 경험을 무려 6번이나 했기 때문에 무엇이 문제인지 단번에 파악할 수 있었다 (이래서 경험이...중요....) swap 메모리를 설정해주면 된다 swap이란 시스템에 메모리가 부족할 경우에 하드 디스크의 일부 공간을 활용하여 계속 작업을 도와주는 영역이며, 하드 디스크의 일부를 RAM처럼 사용할 수 있게 만드는 것이라고 한다 sudo dd if=/dev/ze..

[Snacks 개발 일기] #12 docker compose 시 redis 연결 안될 때 해결하기
2023. 1. 20. 15:57
Project/Snacks
기존에 로컬에서 작업할 때는 로컬에서 redis를 설치하여 localhost로 백엔드 프로젝트와 연결을 하고있었다 하지만 docker를 사용하면서 redis를 직접 설치하는 것이 아닌, 이미지를 불러오는 방식을 채택했는데 연결이 안되는 현상이 발생했다 현재 프론트엔드 이미지 + 백엔드 이미지 + redis 이미지 모두 localhost를 통해 연결을 시키고 있었고, 실제로 프론트엔드 백엔드는 연결이 잘되고 있었다 redis만 연결이 안되고 있었다 찾아보니 docker에서 컨테이너를 띄우면 각 컨테이너와 localhost는 독립적이게 된다고 한다 docker를 실행 시킨 후 ip를 확인해보니, 백엔드와 redis의 주소가 달랐다 서로 연결이 안되었던 것이다 왜 프론트랑 백엔드는 연결이 된거지? 해결 방법으..

[Snacks 개발 일기] #11 Table doesn't exist 해결하기
2023. 1. 13. 23:26
Project/Snacks
당시 나의 상황은 local에서 db를 연결하여 개발 완료 -> local db를 aws rds로 변경 했던 상황이었다 회원가입 및 로그인은 잘 되는데, 갑자기 위젯 관련된 기능을 실행시키면 오류가 떴다 Table doesn't exist............. 바로 DB를 켜서 테이블을 확인해보니...? 멀쩡하게 있다 혹시 내가 오타를 썼나? 했는데 오타도 없다...... 해결법 SQL를 배울 때, SQL은 대소문자를 구분하지 않는다고 배웠다 하지만....구분한다...........linux에서는........... (window에서는 구분하지 않는다고 한다) 근데 mac에서 작업한 나는 왜 이제서야 알게되었나..? => 우선 이 설정은 lower_case_table_names 변수의 값부터 알아보는 ..

[Snacks 개발 일기] #10 incorrect string value..... 에러 해결하기
2023. 1. 3. 22:41
Project/Snacks
localhost의 테스트 db를 적용하면서 개발을 하고 있었는데 본격적인 배포 준비를 위해서 RDS를 적용하게 되었다 적용하는 과정에서 이전에는 보지 못한 오류들이 나왔는데 오류 내용이 "incorrect string value...." 라는 오류였다 구글링해보니 한글이 안들어가져서 그렇다는데... 이전에 rds를 몇번 생성한 경험이 있어 rds를 생성하면서 파라미터 그룹의 값도 한글이 들어가게끔 utf8mb4로 변경했는데 왜 안되지 싶었다 뭐가 문제인지 몰라서 utf8mb4대신 utf8로도 해보고, 직접 접속하여 값을 바꿔보았지만 바뀌는 것은 없었다 구글링하면서 한 가지 알아내었다 바로 파라미터 그룹을 설정한 뒤 재부팅을 안했다는 것! 재부팅을하니 이번에는 utf8이 아니라 utf8mb3가 설정이 된..

[Snacks 개발 일기] #9 Spring Security에서 cors 에러 해결하기
2022. 12. 23. 15:25
Project/Snacks
프론트엔드와 연결하는 작업을 시작하면서 드디어 만나게 되었다 cors..... 사실 본 프로젝트를 시작하기 전에 기본 기능만 닌자처럼 빠르게 구현해보고 부족한 점을 찾아서 본 프로젝트에서 보완하자는 의미의 '닌자 프로젝트' 를 진행하면서 cors 설정을 해두었기때문에 크게 걱정하지는 않았다 하지만 닌자 프로젝트는 spring security를 사용하지 않았지...... 닌자 프로젝트에서 다음과 같이 cors을 적용했다 하지만 spring security는 이와 같이 해서는 안되고 filter에 적용을 시켜야 한다는 것을 모르고 있었다 몰랐기에 이것 저것 정말 많이 시도해보았고 결국은 해냈다 스프링부트 2.4.0부터 AllowCredentials가 true일때는 AllowdOrigin에 *를 추가할 수 없..

[Snacks 개발 일기] #8 구글 로그인과 같은 이메일로 자체 로그인할 때 안되는 현상 해결하기
2022. 12. 23. 13:05
Project/Snacks
이전에 자체 로그인시 사용되는 이메일이, oauth2를 통해 로그인하는 구글 이메일과 같을때 다른 유저라고 생각하고 구현을 했었다 각각 테스트를 했을때는 정상적으로 작동이 되었지만, oauth2로 로그인된 이메일이 이미 db에 저장되어 있을때 회원가입은 정상적으로 되지만 로그인이 안되는 현상을 발견했다 oauth2 로그인과 자체 로그인은 provider로 구분하게 해놓았는데, 이부분에서는 구분이 안되니 여기서 문제가 생겼을 것이라 생각했다 하지만 UsernamePasswordAuthenticationToken은 이름에서도 알 수 있듯이 유저 아이디와, 비밀번호로만 생성이 가능했고, provider를 사용하기 위해서는 새롭게 custom을 해야하나? 아니면 이미 구현된 CustomUserDetails에서 ..

[Snacks 개발 일기] #7 자체 로그인과 구글 로그인 충돌 방지
2022. 12. 12. 17:58
Project/Snacks
구현을 계속 하다보니 이런 경우도 있지 않을까 싶었다 구글 로그인을 통해 회원가입을 했는데, 구글 이메일을 가지고 자체 회원가입을 하는 경우.....! ....대대적인 수정에 들어갔다 우선 AuthRepository에 findByEmailAndProvider을 구현하여, email과 provider을 통해 유저의 정보를 찾을 수 있게끔했다 1. 자체 회원가입을 할 때 DB의 provider컬럼에 local이 추가되도록 하였다 (구글 로그인은 이미 추가됨) 2. JWT에 넣어져 있는 유저의 이메일을 가지고 유저를 구분하려 했으나, 이제는 provider와 함께 구분해야하기에 claim에 provider를 추가하였다 3. accessToken을 재발급하는 /refresh에도 유저의 refresh 토큰에 있는..

[Snacks 개발 일기] #6 구글 로그인정보를 통해 JWT 토큰 발급하기
2022. 12. 12. 17:31
Project/Snacks
2022.12.02 - [Project/Snacks] - [Snacks 개발 일기] #4 구글 로그인 적용하기 [Snacks 개발 일기] #4 구글 로그인 적용하기 자체 로그인 및 회원가입 기능 구현을 완료하고 구글 로그인을 적용하게 되었다 들어가기 전에 변명부터 하자면.... 우리 서비스는 JWT를 통해 로그인이 필요한 페이지(각 유저의 대시보드 페이 dev-juelee.tistory.com 이어서 작성하자면 Oauth2로그인을 한 정보를 가지고 JWT 토큰을 만드는데 성공했다 하지만 이것이 맞는 로직인지는 모르겠다 SecurityConfig에 successHandler를 추가해주니, customOAuth2UserService에서 사용하던 사용자 정보인 Authentication 객체를 받아올 수 있었..

[Snacks 개발 일기] #5 테스트코드 MockMvc에 JWT 필터 적용하기
2022. 12. 8. 16:17
Project/Snacks
제목이 이게 맞는지 모르겠다 나도 어떻게 해결했는지 모르기 때문이다 우선 문제상황은 /auth관련하여 구현을 로컬 로그인 및 회원가입 기능 구현 -> 로컬 로그인 및 회원가입 테스트 코드 작성 -> JWT 발급 및 검증 기능 구현 -> OAuth2 로그인 기능 구현 이 순으로 하였다 OAuth2를 적용하는 과정에서 정말 많은 것이 바뀌게 되었고, 다 구현하고 나서 기존의 로컬 로그인 및 회원가입이 정상적으로 작동을 할 지 의문이었다 그래서 회원가입 테스트 코드를 돌려보니 기존에 잘 되었던 테스트코드가 400에러에 "JWT 토큰이 존재하지 않습니다." 이 로그를 내뿜고 있었다 이상해서 postman으로 회원가입을 테스트해보니 잘된다....? MockMvc가 필터가 적용이 안되는 것을 깨닫고 불꽃 구글링을 ..