본문 바로가기
포스코x코딩온

[포스코x코딩온] 풀스택 부트캠프 4차 프로젝트 -2

by 김선지 2024. 3. 8.

아직도 db 구조를 짜고 있다.

일단 크롤링 데이터를 등록할 공간이 필요한데 아무래도 특성상 정해진 데이터가 아니라 데이터가 null값이 올 수도 있는 옷 데이터기 때문에 몽고 db를 활용하기로 했다.

그렇게 된다면 mysql과 mongodb를 같이 활용하게 되는데 이렇게 되면 실무에서는 거의 도커를 많이 써서 컨테이너로 담아버린다는 것 같았다. 그런데 어차피 ec2 서버 하나에서 mysql과 아틀라스를 쓰면 되는 것 아닌가? 하는 생각이 든다.

명확한 장점을 모르겠다.

(도커의 장점은 ec2서버가 만약 다운된다면 다같이 날아간다는 점과 하나의 컨테이너로 동작하고 있기 때문에 유지보수가 용이하다는 점에 있다.)

그래서 spring boot에서 그냥 두 개의 데이터베이스가 그냥 연동이 되기 때문에 이렇게 진행하게 될 듯 하다.

그렇게 되면 mongodb가 생겼으니까, mongodb를 사용하는 것이 효율적일 것 같은 테이블, collection의 경우에는 몽고에 넣는게 낫겠다는 생각이 들었다.

일단 몽고 db에는 CloseInfo라는 크롤링 데이터들이 들어가고 이를 유저가 옷을 등록할 때 이용할 수 있다.

 

처음에는 이렇게 생각했다.

 

옷장 테이블

*옷장은 몽고db, (write보다는 read가 많을 듯하여.),

closet like는 user와 관계를 맺어야 하기 때문에 mysql

(옷장 좋아요 같은 경우에는 한 유저가 옷장이 하나밖에 없기 때문에 유저, 옷장좋아요, 옷장 이렇게 N:M으로 연결하는데, foreign key를 두개 갖는 구조로 하면 될 것 같다.)
어차피 몽고db 옷장 컬렉션에는 유저 아이디 정보가 있고, 유저 아이디는 중복이 없을 거니까 내가 좋아요 한 옷장을 가져오려면 from_user가 내 user_id인 column의 to_user 정보에 해당하는 userid를 가져오고 그에 해당하는 옷장 정보를 가져오면 될 것 같다.


룩북 테이블

다만 룩북의 경우 내가 좋아요한 룩북은 유저가 여러개의 룩북을 등록하고 내가 그중 여러 개를 좋아요 했을 경우가 있기 때문에
mysql에 등록된 User 테이블의 정보로는 구분할 수가 없다. 그래서 user_id와 n:m을 할 포스트 인덱스를 나타낼 기본키가 필요하다.
만일 몽고디비의 경우라면 ObjectId 가 unique하지만 생성된 Object id가 아닌 정보가 insert될 확률이 있기 때문에 MYSQL로 넣었다.

 

처음에 생각한 대로 옷장을 mongodb로 구성한다면 다음과 같이 구성할 수 있을 것이다.
--------------------------------------------------------------------

1. mysql처럼 넣기


옷장
a(userid), 옷정보
------------
a(userid), 옷정보   
------------
b(userid), 옷정보   
-----------

 

이렇게 하면 유저 아이디에 해당하는 여러개 record를 가져와야 하지만 , write, update가 쉬움 
--------------------------------------------------------------------------------------------------

2. mongodb스럽게 넣기

옷장
a [{brandname: sfsfsf, size: sfsfsfs}, {brandname: another, size: m} ]; 하나만 가져오면 된다.
b;
c;
이렇게 하면 유저에 해당하는 하나의 record만 가져오면 되니까 read는 쉽다. 다만 write, update, 가 힘들다.


두 개를 고민한 가운데 옷장은 확실히 업데이트가 많기 때문에 1번이 더 낫다고 판단했다.

그렇게 된다면 한 가지 의문이 든다.

이 구조는 mysql구조와 다를 게 없다. 그럼 옷장을 mysql로 바꾸면 되지 않느냐는 의문에는 답할 수 없었다.

그래서 write, delete가 가능한 mysql쪽에 넣기로 했다.

 

그럼 mongodb에는 옷 데이터만 있다. 확실히 이건 write, delete를 거의 안하고 옷 등록할 때만 가져올 거니까 mongodb가 나을 것 같다.


그리고 mysql 로컬에서만 작업하다가 드디어 ec2에 mysql 서버가 생겼기 때문에 연결하기로 했다.

 

일단 설치하고 mysql 설정을 외부에서도 접근할 수 있게 설정하고, 아이디 비밀번호를 만들고 rsa 키를 생성하면 워크벤치의 연결이 끝난다. 

그래도 연결되지 않았다. 알고보니까 보안그룹에 3306 포트 정의를 안해뒀다고 한다.

또한 이참에 알게 되었는데 ppk는 window용이고 pem은 linux용이라고 한다. 그래서 mysql에서 ppk가 안먹었구나... 싶다

 

그러고 나니까 workbench에서는 접속되는데 spring boot에서는 접속이 안된다.

더 이상한건 내 ec2 mysql에서는 접속이 된다... 그래서 오타가 있는지 확인해봤는데 없다. 

혹시 몰라서 둘의 비밀번호가 숫자와 문자열이었기 때문에 이에 관련된 문제인가도 생각은 했지만 properties는 어차피 숫자여도 String이기 때문에 그럴 리가 없었다.

귀신이 곡할 노릇이다. 내 나름대로 포트번호와 보안 문제, 모두 고려해봤는데도 안나온다.

그래서 gpt한테 물어봤다.

 

 

이런 대답을 주었다.

차례로 반박하자면

1. 네트워크 연결이 되어있지 않았다면 workbench와 putty로 접속한 서버에서 mysql이 실행되지 않았을 ㄳ이다.

2. 1과 마찬가지다

3. 사용자 권한의 경우 다시 한번 workbench에 만들어서 새로운 유저를 만들고 권한을 줘도 실행되지 않았다.

4. 서버 구성 또한 이전에 설정하였다.

5. 버전 드라이버의 경우 되지 않는다면 내 서버의 mysql과 프로젝트 서버의 mysql 버전이 달랐을 것이다 하지만 8.0.36으로 동일했다.

6. 방화벽의 경우일 수도 있겠지만, 어차피 workbench도 외부에서 접속하는거고 내 spring boot도 외부에서 접속하는 건데 하나는 거른다는 게 논리적으로 말이 안됐다.

 

 

이러다가... 최후의 수단으로 재부팅을 시도하자고 해서 재부팅을 수행하니 됐다.

난 하루종일 누구와 싸운건지 모르겠다.