일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- Today
- Total
- Servlet Filter
- DI
- UsernamePasswordAuthenticationFilter
- 스프링 싱글톤
- Autowired 옵션
- 생성자 주입
- 스프링 컨테이너
- Spring
- 스프링 Configuration
- 객체지향
- HandlerMethodArgumentResolver
- 도커
- qualifier
- 스프링 빈 조회
- 의존관계 주입
- springsecurity
- 라즈베리파이4
- 빈 중복 오류
- ComponentScan
- 스프링 빈
- 싱글톤 컨테이너
- beandefinition
- RequiredArgsConstructor
- DI컨테이너
- docker
- 롬복 Qualifier
- 스프링
- autowired
- Spring interceptor
- 라즈베리파이
그날그날 공부기록
라즈베리파이4 DB서버 구축(MySQL) 본문
놀고 있는 라즈베리파이를 DB서버로 활용하고 싶었다.
마침 DB가 필요한 일이 생겼고, 이 기회에 사용해 보기로 했다.
환경
- raspberry pi 4 8GB
- ubuntu server 22.04.3 lts
- 3306 to 3306 포트포워딩
시작 전 저장소를 업데이트해준다.
sudo apt-get update
MySQL 설치
설치해야 하는 mysql 버전은 8.0.35이다.
사용 가능한 mysql 패키지 버전을 확인해 보자.
sudo apt-cache madison ${PACKAGE_NAME}
아래와 같이 패키지명=버전으로 설치하면 된다.
sudo apt-get install ${PACKAGE_NAME}=${VERSION}
설치가 완료된 뒤, mysql 서비스 유닛이 정상적으로 실행 중인지 확인해 보자.
잘 실행 중인 것을 볼 수 있다.
systemctl status ${SERVICE_NAME}
유저 생성
mysql 설치가 모두 끝났으니, 원격 접속지에서 사용할 유저를 생성해 보자.
유저를 생성하기 위해 localhost에서 root 계정으로 접속한 상태이다.
mysql -u root
* 이후의 사진에서도 유저명과 pw 등 필요한 정보는 모두 가려두었다.
해당 유저는 모든 IP에서 접근 가능하도록 설정하기 위해 host를 %로 설정해였다.
create user '${USER_NAME}'@'${HOST}' identified by '${PASSWD}';
유저가 잘 생성되었는지 확인해 보자.
생성한 유저에게 사용할 테이블에 대한 모든 권한을 부여했다.
* 데이터베이스와 테이블은 사전에 만들어두었다.
grant all on ${DATABASE_NAME}.${TABLE_NAME} to '${USER_NAME}'@'${HOST}';
우선, 테스트로 로컬에서 생성한 계정으로 로그인을 해보자.
mysql -u ${USER_NAME} -p
외부 접속 허용하기
우선 현재 mysql이 어느 포트를 listen 하고 있는지 확인해 봤다.
로컬에서의 접속만 받는 것을 확인할 수 있다.
sudo netstat -ntlp | grep mysqld
// n(주소나 포트 형식을 숫자로 표시), l(listen 상태), t(tcp 연결), p(프로세스 이름 표시)
외부에서의 접속을 허가하기 위해 mysql의 설정파일을 수정할 것이다.
/etc/mysql/mysql.conf.d 위치의 mysqld.cnf 파일을 vi 편집기로 연다.
cd /etc/mysql/mysql.conf.d
sudo vi mysqld.cnf
해당 사진은 이미 변경을 한 이후이다.
만약 따로 수정하지 않았다면, 변경 전 부분과 같이 구성이 되어있을 것이고, bind-address만 0.0.0.0으로 설정해 준 뒤 저장한다.
이제 변경한 설정파일을 저장하기 위해 mysql 서비스 유닛을 재실행한다.
재시작이 완료된 뒤 다시 상태를 확인해 보면 외부에서의 접속도 받는 것을 알 수 있다.
sudo systemctl restart ${SERVICE_NAME}
외부의 호스트에서 mysql 접속 테스트
라즈베리파이와 노트북은 모두 같은 스위치에 유선으로 물려있다.
접속을 시도하자, 접속권한이 없다는 에러가 출력하며 실패했다.
분명 유저를 생성할 때 호스트로 % 주었는데 왜 그럴까,,,
mysql -h ${HOST(pi-sub)} -P ${PORT} -u ${USER_NAME} -p
유저를 생성할 때 무언가 실수가 있었을지도 모르니 이 전의 유저는 drop 하고, 새롭게 유저를 생성했다.
이 전과 똑같지만 이번에는 pw 설정을 mysql_native_password로 미리 지정했다. (* 이전 유저는 생성 후, 해당 값을 변경해 주었다.)
그리고 권한도 똑같이 부여했다.
외부의 호스트에서 mysql 접속 테스트 - 찐막
다시 한번 테스트를 시도해 보았다.
외부 환경에서의 접속을 정확하게 보기 위해 노트북을 휴대폰의 데이터 테더링으로 연결한 뒤, 라즈베리파이에서 실행되고 있는 mysql에 접근을 시도해 보았다.
두 기기는 서로 다른 네트워크에 있기 때문에, iptime에서 설정한 도메인을 사용했다.
공유기에서 포트포워딩이 되어있는 상태이기 때문에, 공인 IP & 3306 포트로 들어온 요청을 라즈베리파이의 3306포트로 보낸다.
다행히 유저 문제가 맞았다.
mysql로 접속도 문제없었고, 유저에게 권한도 정상적으로 동작한다.
+ 워크벤치에서도 잘 접속된다 ㅎㅎ
물론 모든 IP에 대해서 접속을 열어둔 만큼 보안에 취약할 것이다.
해당 계정은 학습용으로 사용할 예정이기 때문에 일단 추가적인 설정 없이 이대로 사용하려고 한다.