[우아한테크코스 4기] 220803 F12 개발일지

Jihoon Oh·2022년 8월 3일
0

우아한테크코스 4기

목록 보기
33/43
post-thumbnail

오늘 진행한 일

EC2 + MySQL 연결

이전까지는 백엔드 WAS가 띄워져 있는 EC2에 로컬로 h2 데이터베이스를 띄워놓고 사용중이었다. 인바운드 규칙에 보통 DB 포트로 사용하는 3306 포트가 제대로 열려있지 않기도 했었고, 데이터베이스 스키마가 계속 바뀌고 있는 상황이어서 MySQL을 올리고 나면 계속 스키마를 바꾸는 기회 비용이 컸기 때문이다. 하지만 어느샌가 인바운드 규칙에 3306 포트가 제대로 열려 있는 것을 확인 했고, 제품 카테고리도 다 추가한 상태여서 스키마가 이제 크게 바뀔 일이 없겠다는 생각이 들어 MySQL을 연결하기로 했다. MySQL을 연결하는데 우선 필요한 것은 MySQL를 띄울 EC2였다.

데이터베이스가 올라갈 EC2에는 public IP를 할당하지 않기

데이터베이스가 올라가는 EC2는 private 접속만 허용하도록 해서 보안을 강화해서 사용하는 경우가 많다. 그렇게 하기 위해서는 public IP를 할당하지 않아야 한다. EC2에 public IP를 설정하면 public IP를 바꿀 수는 있지만 다시 없애기는 어려우므로, 애초에 public IP 할당 자체를 하지 않았다.

그런데 문제는, public IP를 할당하지 않아서 인터넷과 연결하지 못해 mysql을 설치할 수 없었다는 점이다. 그렇다고 public IP를 한 번 할당해주면 다시 없앨 수가 없으니 진퇴양난의 상황이었는데, 다행히도 정말 간단하게 해결할 수 있었다. 바로 Elastic IP를 활용하는 방법이었다. 데이터베이스 EC2에 남는 탄력적 IP를 달아놓고 apt-get 업데이트와 데이터베이스 설치를 한 뒤, 탄력적 IP를 다시 수거해주면 private IP만 남게 된다.

MySQL 연결 정보는 서브모듈로 관리

MySQL을 연결하게 되면서 서브모듈과 YAML 파일을 아예 뜯어고쳤다. 우선 main, release, local의 세 개의 프로필을 만들고, application.yml에는 이 세 개의 프로필을 group으로 묶어주었다.

spring:
  config:
    import: submodules/security-common.yml
  profiles:
    group:
      main:
      release:
      local:
    default: local
  jpa:
    hibernate:
      ddl-auto: none
    show-sql: true
    properties:
      hibernate:
        format_sql: true

server:
  port: 8080

그 뒤에 각각 main 서버와 test 서버에서 WAS를 실행할 때 프로필을 선택해서 실행하도록 했다.

nohup java -jar -Duser.timezone=KST -Dspring.profiles.active=main f12-0.0.1-SNAPSHOT.jar &

(-Duser.timezone=KST는 로그를 위한 타임존 설정 스크립트다.)

또한 각각의 프로필 YAML 파일은 각 프로필 별 필요한 데이터베이스 설정 정보와 GitHub OAuth 설정 정보, 그리고 로그 설정 정보를 서브모듈 파일로부터 가져오도록 설정해주었다.

spring:
  config:
    import: submodules/security-main.yml
logging:
  config: classpath:log4j2/log4j2-main.xml

서브모듈에는 기존에 프로필로 application-auth.yml과 같이 관리하던 방식을 버리고, 그냥 설정 정보가 담겨서 import만 해주는 security-main.yml, security-release.yml, security-local.yml, 그리고 노출되어서는 안되지만 모든 프로필에 공통적으로 들어가는 정보인 security-common.yml로 개편했다.

오늘 발생한 이슈

스프링부트에서 MySQL 접속 이슈

MySQL로 데이터베이스를 바꾸는 설정을 하고 빌드를 해보니 웬걸, 서버가 죄다 터져나갔다. 로그를 확인해보니 스프링부트가 MySQL에 연결을 시도하는데 MySQL에서 연결을 전부 거절해버리는 문제였다. (로컬에서 할 때는 문제 없었는데…) 이는 MySQL이 로컬에서 연결되는 것이 아니라 private IP로 원격 연결이 되어서 생기는 문제였다. 원격 연결을 하기 때문에 서버의 private IP에 해당하는 계정을 만들어주어야 하는데, 계정을 만들어주지 않았기 때문에 연결을 거부하고 있었다.

$ sudo mysql -u root -p

mysql> use f12;

mysql> create user '사용자'@'web_server_private_ip' identified by '비밀번호';

mysql> grant all privileges on f12.* to '사용자'@'web_server_private_ip';

이렇게 '사용자'@'private_ip'에 해당하는 계정을 만들어주고, 스프링부트의 MySQL 접속 정보를 생성한 계정과 비밀번호로 바꿔주고 다시 빌드하니 정상적으로 연결되었다. 참고

내일 목표

금요일이 데모데이고, 나는 이번 데모데이에 발표를 맡았다. 그래서 아마 하루 종일 발표 준비를 할 것 같다.

profile
Backend Developeer

1개의 댓글

comment-user-thumbnail
2022년 8월 3일

오늘도 고생 많으셨습니다!

답글 달기