오랫만에 서버 이전을 하고 DB 타겟을 바꾸고 서비스를 실행하는데 DB 연결이 안되는 문제가 나타났다.
Cannot create PoolableConnectionFactory (Could not connect to address=
(host=xxx.xxx.xxx.xxx)(port=3306)(type=master) : Connection refused: connect)
당시 로그는 위처럼 찍혔다. Could not get JDBC Connection 어쩌구..DB 커넥션을 맺은 JDBC 객체를 정상적으로 리턴받지 못한 모양이다. 왜지!? 전이랑 똑같이 했는데 왜 안돼!
telnet 목적지IP 포트
회사에서 IF 서비스들을 많이 다뤄서 그런지 내 기계적으로 내 PC에서 텔넷부터 찍어봤다. 오잉..? DB 포트 안열려 있네? 방화벽 문제일까? 서비스가 안올라갔나? 생각했지만, 둘다 잘 올라갔을텐데?.. 생각했다.
먼저 라이트세일 서버 방화벽부터 확인하니 3306 포트가 잘 있다. 혹시 마리아 DB 서비스가 실행중이 아닌건가?
라고 생각했지만..서비스도 정상적으로 Run 되어있었다..
netstat -ntlp | grep 3306
그럼...혹시 마리아 DB 디폴트 포트가 3306이 아니었나? 생각이 들어 찍어봤다. 하지만 역시 3306... 하지만..! 오우 shit 이상한 점을 발견했다.
3306 포트는 열려있는데 source IP가 127.0.0.1로 서버 로컬에서만 접속할 수 있도록 되어있다. 즉..! 이 마리아 DB 서버는 서버에서 직접 접근만 가능하고 외부에서 접속되지 않도록 되어있는 것이었다.
해결 방법 : bind-address 변경
vi /etc/mysql/mariadb.conf.d/50-server.cnf
위 명령어를 입력해 50-server.cnf 파일을 열어주자
내리다보면 bind-address = 127.0.0.1 이라고 되어있는 부분이 있다. 이부분을 바꿔줄 것이다. bind-address는 이 DB에 접속할 수 있는 IP를 의미한다. 지금은 127.0.0.1 즉 localhost IP가 입력되어있으니, 이 서버 자체에서만 접속가능하다.
원격지에서 접속할 수 있도록 전체 대역을 의미하는 0.0.0.0 으로 바꿀 것이다. 뭐!? 전체 공개라고!? 안돼!! 할 수도 있지만, 그건 서버 인스턴스 방화벽 설정에서 막으면 되니 신경쓰지 않아도 된다.
bind-address = 0.0.0.0
자 기존 소스는 #을 붙혀 주석처리해주고 아래에 소스를 추가하자. 혹시 vi 편집기를 사용하지 못하는 분은 구글검색을 추천한다. 위 화면에서 i를 누르면 문자 삽입상태가 된다. 그상태에서 #을 붙힌후 방향키로 아래칸으로가 0.0.0.0 소스를 추가하면 된다.
다 썻으면 ESC를 한번 누르고 그 상태에서 Shift+: 버튼을 눌러주고 wq(write+quit) 입력 후 엔터를 입력하자, 저장하고 끄겠다는거다.
service mysql restart
자 이제 위 명령어를 입력해 DB를 재부팅해주자!
netstat -ntlp | grep 3306
다시 위 명령어를 이용해서 확인해보면 0.0.0.0 전체 IP대역에서 3306 포트 접속이 가능하게끔 변경된 것을 볼 수 있다.
짜잔 다시 telnet을 찍어보니 정상적으로 접속 가능한 것이 확인되었다. 내 PC에서 DB까지 구간은 이제 정상화되었으니 다시 스프링 서비스를 Run 해보면 정상적으로 DB 커넥션 되는 것을 확인할 수 있다.
자 저번시간까지 했던걸 보면, 만들었던 스프링 프로젝트가 AWS EC2 인스턴스에 올라갔다. 이후 페이지를 요청했지만, 원격 서버에 마리아 DB만 설치해놓고 DB에 테이블과 데이터를 생성해놓지 않았기 때문에 오류를 뱉어냈다. 오늘은 HeidiSql을 이용해 원격 DB에 데이터를 넣어보자!
자 저번시간에 우리가 만든 DB에 접속을 했으니 이제 데이터 통을 생성해 줘야한다. DB 용어로는 스키마 라고하는데 우리가 알아들어먹을 수준으로 말하면 보통 DB통이라고 한다..ㅋㅋ DB통 새로 만들어!~ ㅋㅋㅋ ... 보통 이랬던거 같은데 뭐 프로젝트단위라고 보면 된다.
내 DB 서버가 있고, 꼭 1개의 DB서버에서 1개의 프로젝트를 돌리란 법은 없다. 여러가지 DB통을 만들어 놓을 수가 있어서, 만약에 내가 유튜브 서비스와, 쿠팡 서비스를 돌리고싶다! 하지만 하나의 DB서버에 돌리고 싶다! 라고 하면 DB통을 2개 만들어 주면 된다. 다시 전문용어로 YOUTUBE 스키마와, COUPANG 스키마를 만들어 주면된다. 이제 좀 이해가 됐나..!? 그냥 프로젝트 단위라고 생각하면 된다.
그럼 우리는 프로젝트 CP SERVICE이기 때문에 CP_SERVICE_DB 스키마(DB통)을 만들어보자!
1. 데이터베이스 (Database) 생성
만들 세션선택후 오른쪽마우스 클릭하여 새로생성(2) 버튼을 클릭! 그리고 데이터베이스(3)을 눌러주자! 마리아 DB에선 스키마 보단 걍 데이터베이스라고 부르나보다.
CREATE DATABASE `cp_service_DB`
자 데이터 베이스 이름을 지정하자! 보니까 대문자로 써도 어차피 다 소문자로 치환된다. 정했으면 확인!
오웅 씌엣! 만들어졌당! 이제 프로젝트 단위의 데이터베이스(DB통)을 생성했으니 이제 이 프로젝트에서 사용할 테이블들을 추가해보자 방법은 비슷하다.
2. 테이블 Table 생성
테이블을 만들 데이터베이스를 오른쪽클릭하고(1) 새로생성(2)버튼을 누른뒤 테이블(3)버튼을 눌러주자!
일단 우리는 이 프로젝트 기준으로 DB를 만들 것이기 때문에 아래와 같은 테이블을 생성할 것이다.
자 PRD_MST 테이블부터 생성해보자!
3. PRD_ MST
1. 테이블 이름을 지정해주자
2. 추가버튼을 눌러서 4개의 속성을 다 추가해준다.
3. 추가한 속성들의 이름을 지정하고
4. 데이터 유형을 지정한다.
5. 길이를 정해준다! URL_STR에는 URL이 길게 들어갈 것임으로 넉넉히 300자를 두고, DISC_STR은 설명이니 50정도. 그리고 USE_YN은 Y혹은 N값만 다룰테니 2정도를 준다
6. NULL허용을 체크하면 저기 속성은 안넣어도 되는 속성이 된다. DISC_STR은 해당 값에대한 설명인데 꼭 없어도 되니 NULL허용을 해주자, 나머지 3개 속성값은 꼭 NULL이 아닌 실제 값을 필요로 하게 된다. 만약 NULL을 넣으려고 시도하면 제약조건에 위배되서 삽입이 되지 않게 된다.
7. SEQ_NO는 데이터를 추가할때마다 1~쭈르륵 올라가면 되니 더블클릭을 눌러서 AUTO_INCREMENT를 선택해주고 DISC_STR은 NULL허용을 해놨기 때문에 설정에서 최초값을 NULL로 주도록 하자
다 됐으면 저장 버튼을 눌러주자!!!
CREATE TABLE `PRD_MST` (
`SEQ_NO` INT NOT NULL AUTO_INCREMENT COMMENT '고유 번호',
`URL_STR` VARCHAR(300) NOT NULL COMMENT '목적지 URL',
`DISC_STR` VARCHAR(50) NULL DEFAULT NULL COMMENT '목적지 설명',
`USE_YN` VARCHAR(2) NOT NULL COMMENT '사용 유무',
PRIMARY KEY (`SEQ_NO`)
)
COLLATE='utf8_general_ci'
;
4. REQ_MST
CREATE TABLE `REQ_MST` (
`SEQ_NO` INT NOT NULL COMMENT '고유 번호',
`REQ_DATE` DATETIME NOT NULL COMMENT '날짜'
)
COLLATE='utf8_general_ci'
;
REQ_MAT 테이블도 대충~ 만들어 준다~ 좀 다른게 있다면 REQ_DATE의 형은 DATETIME형으로 해주자!
그리고 저장을 해주자
짜잔 ~ 테이블 생성이 완료 됐다. 그럼 이제 값을 하나 예시로 넣어보자!
5. PRD_MST 데이터 삽입
자 데이터 삽입은 어려운거 없다. 탭들 뒤져보면 무슨 +모양처럼 생긴친구(1) 있는데 눌러주면 새창이 생기면서 저기다 작성할 수 있다. 작성해보자.
INSERT INTO prd_mst (URL_STR, DISC_STR, USE_YN) VALUES
('www.naver.com','네이버','Y'),
('www.daum.net','다음','Y'),
('www.google.com','구글','Y'),
('www.youtube.com','유튜브','Y');
SELECT * FROM PRD_MST
위 쿼리를 복사해서 복붙하자! 그리고 F9를 누르면 전체 실행이 된다.
-START TRANSACTION
보통 SELECT를 제외한 INSERT, DELETE, UPDATE 같은 DML을 사용할때는 MSSQL의 경우에는 begin tran을 걸고 쿼리를 돌린후 데이터가 제대로 됐는지 보고 정상이면 commit 명령어를 입력시켜 완전히 반영하고, 문제가 있으면 rollback 명령어를쳐 복구시키는데 마리아DB에도 역시 있다.
BEGIN TRAN 명령어 대신 START TRANSACTION; 을 선언해주고 나머지 commit/rollback 방법은 같다. 일단 저건 내가 테스트해보고 그냥 넣는 데이터지만, START TRANSACTION하는 습관을 들이는게 미래를 생각하면 좋다. 잘못하다가 데이터가 다 지워지거나 이상하게 바뀌거나 할 수 있기때문에 연습이라도 꼭 해보자!