전에는 vscode에서 했는데 이번엔 intelliJ를 써봅시다. 아래 글을 참고하여 git과 github 연동까지 해둔다.
📌Ref) IntelliJ GitHub 연동
디비는 MySQL을 쓰므로 MySQL과 MySQL shell, workbench 등등을 설치한다.
📌Ref) MySQL 다운로드 및 설치 방법
PostgreSQL <=> MySQL
psql <=> MySQL shell
pgAdmin <=> MySQL Workbench
현재 프로젝트는 CI/CD 무중단 배포(배포 자동화)가 되어 있는 상태
intelliJ에서 깃허브 레포지토리를 git clone 받아온다.
📌Ref) [GIT] intelliJ에서 GitHub 저장소 복제 Git Clone하기
원래 application.properties
에 디비 정보 등을 적어두지만 여차저차한(?) 이유로 보안상 깃허브에 올리지 않고 관리할 정보들은 application-secret.properties
에 옮겨두기로 했다.
이 시크릿 파일도 같이 적용시키려면 intelliJ에서 run
- edit configurations
- modify options
- Add VM options
을 선택한 다음 VM option
에 -Dspring.profiles.active=secret
이라고 써주면 된다.
근데 이 modify options
메뉴가 꼭 프로젝트를 한번 run 시켜야 나오는 듯하다.. 🤔
다른 파일을 더 추가하고 싶으면
application-어쩌구.properties
파일 생성 후 내용을 입력하고,VM option
에-Dspring.profiles.active=어쩌구
를 쓰면 된다고 한다.
터미널을 열어서 ssh 접속을 한다. (pem키는 받아둔 상태)
> ssh -i <SSH key of EC2 instance> ec2-user@<instance-IP of EC2> -L 3306:<RDS DB endpoint>:3306
그리고 intelliJ에서 스프링 프로젝트를 application run 시키면 끝!
❗ssh 접속을 안하고 run 시키면 안돌아간다.
ssh 접속을 하려니까 3306
번 포트에 연결을 할 수 없다고 떠서 cmd
에서 확인해보니
> netstat -ano | findstr :3306
3306
번에서 이미 무언가가 돌아가고 있었다. (PID: 10044
)
죽이기 전에 무슨 프로세스인지 확인했더니
> tasklist /v | findstr 10044
아마 MySQL workbench에서 Local instance가 자꾸 생기던데 얘 때문인거 같다.
근데 지우려고 했더니 액세스가 거부되었다 그래서 그냥 작업관리자
>프로세스
에서 작업 끝내기
로 종료해줬다.
다시 확인해보니까 3306
번 포트는 비워짐 (아무것도 안떠야 정상)
이 상태에서 다시 ssh 접속을 하니까
오류 없이 접속됨!
처음엔 Workbench가 뭔가 했더니만 그냥 pgAdmin 같은거였다. 받은대로 내용 채워주고 Test Connection
누르면 디비랑 커넥션이 만들어진다. (여기도 포트는 3306
)
근데 신기한게 여기에 접속하려면 aws rds에 내 ip 주소가 등록이 되어있어야 한다고 한다. 공인 ip가 필요한지 사설 ip가 필요한지 모르겠어서 사설 ip(192.168.xxx.xxx
)를 보냈었는데 오류투성이였고 결과적으로는 얘가 아니라 공인 ip(124.xx.xx.xxx
)가 필요했다.
아무튼 그래서 만들어진 디비에 들어가면
이렇게 나오는데 이건 나중에 다뤄보도록 하자
궁금해서 찾아보고 싶은 점은
스프링부트에서 디비(mysql)를 연결할때 기본적으로 application.properties
에 아래와 같은 코드를 쓰는데
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://호스트명:3306/데이터베이스명
spring.datasource.username=유저명
spring.datasource.password=비밀번호
logging-module.version=0.2
지금은 서버에 올라가 있는 DB를 쓰는데 왜 spring.datasource.url
에서 호스트명에 rds
나 ec2
주소가 아닌 127.0.0.1
을 쓰냐는 것이다.
(실제로 이렇게 되어있어야 잘돌아가고 다른거 넣으면 안됨)
선생님 도와주세요
터미널로 ssh에 접속해서.. ㅇㅋ
127.0.0.1:3306
라는 요청을.. ㅇㅋ
원격 DB(서버에 올라가있는 DB 말하는거겠죠?)로 전달.. ㅇㅋ
그니까 내가 스프링부트에서 127.0.0.1:3306
이라고 요청을 보내면 ssh가 알아서 서버에 올라가있는 DB에 연결을 해준다는 뜻?
ssh가 뭔데 그런일을 해주지?
Aㅏ... 지금 스프링부트에서는 서버에 올라간 원격 DB에 직접 접근을 못해서 SSH 터널링을 통해 접근을 해야 하는 상황인건가..! 터미널에서 > ssh -i ..(생략).. 3306:<RDS DB endpoint>:3306
로 ssh에 접속해놓은 상태이니, 스프링부트에서는 그냥 127.0.0.1:3306
로 접속해도 ssh가 알아서 <RDS DB endpoint>:3306
로 요청을 전달해주는건가보다.
그래서 ssh에 접속을 안해두면 스프링부트를 그냥 run했을때 디비 관련 오류가 났던거구나! 오케이 납득👌
❗아 그리고 위에서 ssh 연결에서 포트 오류났을 때
spring.datasource.url
을127.0.0.1:3306
에서127.0.0.1:3307
로 바꾸고 터미널에서도> ssh -i ..(생략).. 3307:<RDS DB endpoint>:3306
으로 ssh 접속을 하면 오류가 해결되었었다. 그냥 내 로컬 컴퓨터에서3306
포트를 뭔가가 쓰고 있었던 거니까3307
을 써도 그냥 그 요청 자체를 ssh에서 받아서3306
포트로 전달하니까 괜찮은거였나보다.