한동안 번아웃이라 개발도 취업준비도 뭣도 안했다. 뭔가 의욕이 너무 안나는 느낌이라
지난주 헬스장도 옮길겸 운동도 쉬고 공부도 잠시 내려놓았던 것 같다.
주말동안 서울도 다녀왔고, 헬스장도 새로운 곳으로 옮겼으니 새로운 마음으로!
이젠 이 글부터 시작해서 매주 기록을 해볼까 한다.
내가 어떤 생각을 가지고 개발을 했고, 어떤 기술을 공부하기 시작했을 때 왜 그 기술을 필요로 했는지 등 기록을 남기고 싶어졌다.


ER_LOCK_WAIT_TIMEOUT 발생 아무래도 귀찮았던 AWS 도입을 시작해야 할 것 같다.
일단 생활코딩 AWS 영상들을 좀 보고 블로그 서버를 이번주 내로 호스팅 해보는 것이 목표.
AWS는 학부 1학년때 클라우드 컴퓨팅 교양수업때 EDU버전으로 한번 써보긴 했는데
등록만 하고 수업을 잘 안들어서 기억이 안난다.. ㅎ
AWS 계정을 찾아서 EC2 인스턴스를 하나 만들고 express.js 서버를 하나 올려서 테스트를 해봤다.
까진 했고, public DNS:8080으로 접속하면 index.html 페이지까지 나오는걸 확인은 했지만
80번 포트(http)를 8080으로 포트포워딩 하는데 애를 먹고 있다.
sudo iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8080
명령을 이용해서 80번 포트로 접속하면 8080 포트로 전달되도록 했고,

적용도 잘 된것 같은데 왜 안될까..
어차피 AWS linux에서 우분투로 바꿀 생각이였어서 인스턴스를 새로 만들어서 서버를 열었더니 포트포워딩이 문제없이 되었다!
더 찾아보고 aws linux에서 왜 정상작동하지 않았는지 생각해봐야겠다.
원래는 집에 있는 데스크탑에서 Mysql로 DB를 사용하고 있었는데 웹 서버를 돌리는 주체가 바뀌었으니 DB도 클라우드로 올렸다.
aws db 클라우드 서비스를 이용할까 하다가 내 프로젝트 규모가 크지도 않고 지금 상황에서 AWS DB까지 공부하기에는 너무 과한것 같아서 그냥 웹 서버를 돌리는 EC2 안에 MySql도 같이 넣어줬다.
// /programFile/mysql/mysql server 8.0/bin
mysqldump -h [DB서버IP] -u root -p --no-data [대상DB] > [추출파일명]
mysqldump를 이용해서 DB 스키마를 추출해서 EC2 서버의 Mysql에 옮겼다.
근데 어디서 옵션을 빼먹었는지 난 스키마만 옮길랬는데 데이터도 옮겨졌다.. 의외의 이득인가?
mysql을 외부에서 접속할수 있게 설정하는 것을 이번에 처음 해봤다.
우선 mysqld.cnf 파일을 수정해서 bind-adress를 0.0.0.0 으로 수정하고,
EC2 보안 인바운드 규칙에도 Mysql 포트번호인 3306을 열어줬다.
이렇게하고 내 데스크탑에서 EC2의 mysql로 접속을 해봤는데

내 IP가 해당 mysql 서버에 접속할 권한이 없다고 나와서 찾아보니
외부 접속에 대한 유저 추가를 해줘야 한다고 해서
create user 'root'@'%' identified by 'PW'
위 명령어로 외부 접속에서도 root 계정으로 로그인할 수 있게 설정했고,
보안에는 좋지 않은 방식이지만 개발공부용이라 그냥 열어버렸다
다시 접속을 해봤는데

해당 데이터베이스에 접근 권한이 허가되지 않았다고 해서
grant all privileges on *.* to user@localhost identified by '비밀번호'
grant 명령을 통해서 접근 권한을 수정하니 외부에서도 문제없이 접속이 되었다!
보안 전공으로 졸업해서 프론트엔드 개발을 하고 있지만, 보안 전공때 Linux를 다뤄보고 서버도 열어본 기억이 많이 도움이 된 것 같다.
어제 하던 AWS로 호스팅하는 작업을 이어하던 중 mysql이 linux로 옮겨지면서 window 에서는 정상적으로 작동하던 sql 쿼리가 linux에선 에러가 났다.
이름이 loginview인 테이블이 있으면
windows 에서는 쿼리문에 loginView처럼 카멜케이스로 중간에 대문자가 들어가도 정상적으로 쿼리가 실행되지만
linux 환경에서는 대소문자 구분이 엄격하기 때문에 발생하는 오류인것 같았다.

그래서 구글링을 통해 my.cnf 설정 파일을 수정하여
[mysqld]
lower_case_table_name = 1
대소문자 구분을 하지 않도록 설정해 주려 했는데
설정 파일 수정 후 mysql 재시작 시 재시작이 안된다
찾아보니 이미 생성된 DB들이 대소문자를 구분하는 기능이 활성화된 상태이기 때문에 오류가 발생한다는 것 같다.
db를 초기화하고 해당 설정을 변경해야 한다 해서 그냥 sql문들을 다 고치기로 했다..
DB 대소문자 작업을 다 하고 사이트 기능 테스트를 하고 있었는데
유저의 프로필을 보여주는 페이지에서 문제가 생겼다.
// profile 불러오기
export default function RecordSubscriptionBlock({ userId }) {
const [order, setOrder] = useState(0);
const { data, isLoading } = useQuery(
["getProfileImg", userId],
async () => {
const response = await fetch(`/setting/userProfile?userId=${userId}`);
return await response.json();
},
{
staleTime: 60000,
}
);
...
}
유저의 프로필을 /setting/userProfile 으로 요청하면서 query string으로 불러오고 싶은 유저의 아이디를 넘겨주는 부분인데

서버 로그를 보면 undefined값이 전달된다.
일단 AWS에서 서버를 열었을 때랑 로컬에서 했을 때 둘다 이러는 것 보면 클라우드 적용 과정에서 생긴 문제는 아닌것 같았다.
AWS 이식 전에 작업하던 부분도 아니었고 전에 개발 완료한 부분이였는데..
혹시 모르니까 postman으로 서버에 query string을 전달해 보자

POSTMAN을 사용했을 때는 정상적으로 전달이 된다..! 🤬


reduxDevTools를 이용해서 redux 값을 읽어보니 정상적으로 할당되어 있었고,

query value를 하드코딩 해서 전달해 보니 전달이 된다..?
로그를 따라서 살펴보니
역시 DB 쿼리문 table 이름을 소문자로 변경하는 과정에서 문제가 생겼었다..
테이블 명만 변경했어야 했는데 찾기 => 바꾸기 를 하는 과정에서 필드 명까지 바꿔버려서 발생한 해프닝이였다..
몇주 전에 express서버에 요청이 들어오면 해당 요청의 uri와 메소드, 쿼리 스트링 등을 콘솔에 입력해주는 로그 미들웨어를 하나 만들었는데 생각보다 큰 도움이 되었다.
나중에 서드파티 로그 미들웨어를 찾아서 적용하면 디버깅 하는데 큰 도움이 될 것 같다.