[Spring] 수숙관 프로젝트 실행하기(Spring Boot, IntelliJ, MySQL, ssh)

김재연·2023년 2월 27일
0

수숙관

목록 보기
1/17
post-thumbnail

사전설치

  1. IntelliJ

전에는 vscode에서 했는데 이번엔 intelliJ를 써봅시다. 아래 글을 참고하여 git과 github 연동까지 해둔다.

📌Ref) IntelliJ GitHub 연동

  1. MySQL

디비는 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 접속 : 포트 연결 오류

ssh 접속을 하려니까 3306번 포트에 연결을 할 수 없다고 떠서 cmd에서 확인해보니

> netstat -ano | findstr :3306

3306번에서 이미 무언가가 돌아가고 있었다. (PID: 10044)

죽이기 전에 무슨 프로세스인지 확인했더니

> tasklist /v | findstr 10044

아마 MySQL workbench에서 Local instance가 자꾸 생기던데 얘 때문인거 같다.

근데 지우려고 했더니 액세스가 거부되었다 그래서 그냥 작업관리자>프로세스 에서 작업 끝내기로 종료해줬다.

다시 확인해보니까 3306번 포트는 비워짐 (아무것도 안떠야 정상)

이 상태에서 다시 ssh 접속을 하니까

오류 없이 접속됨!


DB 접속

처음엔 Workbench가 뭔가 했더니만 그냥 pgAdmin 같은거였다. 받은대로 내용 채워주고 Test Connection 누르면 디비랑 커넥션이 만들어진다. (여기도 포트는 3306)

근데 신기한게 여기에 접속하려면 aws rds에 내 ip 주소가 등록이 되어있어야 한다고 한다. 공인 ip가 필요한지 사설 ip가 필요한지 모르겠어서 사설 ip(192.168.xxx.xxx)를 보냈었는데 오류투성이였고 결과적으로는 얘가 아니라 공인 ip(124.xx.xx.xxx)가 필요했다.

아무튼 그래서 만들어진 디비에 들어가면

이렇게 나오는데 이건 나중에 다뤄보도록 하자


🤔 localhost로 SSH를 통해서 원격DB에 연결한다❓

궁금해서 찾아보고 싶은 점은

스프링부트에서 디비(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에서 호스트명에 rdsec2 주소가 아닌 127.0.0.1을 쓰냐는 것이다.

(실제로 이렇게 되어있어야 잘돌아가고 다른거 넣으면 안됨)

선생님 도와주세요

터미널로 ssh에 접속해서.. ㅇㅋ
127.0.0.1:3306 라는 요청을.. ㅇㅋ
원격 DB(서버에 올라가있는 DB 말하는거겠죠?)로 전달.. ㅇㅋ

그니까 내가 스프링부트에서 127.0.0.1:3306이라고 요청을 보내면 ssh가 알아서 서버에 올라가있는 DB에 연결을 해준다는 뜻?

ssh가 뭔데 그런일을 해주지?

SSH(Secure Shell)

  • 원격 호스트에 접속하기 위해 사용되는 보안 프로토콜
  • SSH 터널링을 이용해서 원격 서버에서 서비스 중인 private 서비스(ex. 원격 DB)를 로컬 서버에서 바로 접근할 수 있다.

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.url127.0.0.1:3306에서 127.0.0.1:3307로 바꾸고 터미널에서도 > ssh -i ..(생략).. 3307:<RDS DB endpoint>:3306으로 ssh 접속을 하면 오류가 해결되었었다. 그냥 내 로컬 컴퓨터에서 3306 포트를 뭔가가 쓰고 있었던 거니까 3307을 써도 그냥 그 요청 자체를 ssh에서 받아서 3306포트로 전달하니까 괜찮은거였나보다.

profile
일기장같은 공부기록📝

0개의 댓글