[java] DataBase 파트
Vagran tfile에서
New로 가면
vagrant init generic/centos8
vagrant up
이 부분들을 시작한다.
vagrant ssh
window10은 ssh 접속 디폴트로 제공 아마도.
제일 처음 들어오면 update 먼저
sudo yum update -y
로 업데이트 먼저 해주고
sudo yum list | grep mysql
로 mysql을 사용할 수 있는 패키지들을 본다.
sudo dnf search mysql
로 서치
그리고 맨 위 나오는 mysql을 설치할 것이고
sudo dnf install mysql-server.x86_64
그리고 y로 계속 설치해 주면 된다.
만약 위 과정 중 한번에 안 될떄가 있을 수 있는데 그냥 재시도 해서 설치해주자(나도 failed가 맨 처음 떴다.)
mysql을 입력해서 실행한다.
그리고 만약 mysql해서 에러나면
systemctl start mysqld
를 입력해서 실행해준다.(mysqld)
그 이후 mysql -u root 로 mysql 로 접속 그리고
alter user root identifeied by '1234';
로 시작하면 아마 권한이 없다고 나올 것.
sudo mysql -u root
로 실행한 후 위 명령어를 다시 수행하면
alter user root@localhost identifeied by 1234;
성공이 나오게 된다.
flush privileges
로 새로고침 한번 해주고
윈도우에서 계속 해줘야 하니까
alter user root@% identified by '1234';
해준다.
이제 mysql -u root 로 접속하면 접속 실패(패스워드 설정했으므로 패스워드 쳐야 접속 가능)
mysql -u root -p1234
근데 위 방식은 패스워드가 노출된다.(보안 문제)
sudo mysql -u root -p
를 입력하면 패스워드를 물어보게 되며 이건 타이핑 횟수 조차 안보이게 된다.
계정 하나 생성.
create user user01@localhost identified by '1234';
그리고 생성했으면 flush privileges로 저장해주자.
그리고 위는 localhost에서만 접근 가능한거고
create user user01@192.168.128.xxx identified by '1234';
이런식으로 다른 아이피에 허용하게 생성도 가능하다.
어디서든 접근하게하려면 wild 처리(@%) 뒤에 %기호 붙여서 처리.
create user 'user01@%'' identified by '1234';
로 하면 다른 ip에서도 접근 가능
mysql -u user01 -p
로 접속 하고 뭐라도 사용하려면 뭔가 안됨.(권한이 없으므로. 순수 깡통 계정) 권한을 부여해야 뭐라도 사용 가능.
sudo mysql -u root -p로 접속해서
grant all privileges on *.* to 'user01'@'localhost';
로 모든 것을 권한 부여 (참고로 user01’@’localhost’;)에 앞 뒤 싱글 쿼테이션을 줬다.)
grant all privileges on *.* to 'user01@%';
로 줘서 계정 준다.
select host, user from user;
https://www.heidisql.com/download.php?download=installer
이후 heidisql를 다운받아주자.
mysql 3306을 써서 3306 으로 매핑 근데 윈도우에도 설치 할거라 3306으로 하게 되면 겹치게 된다.
config.vm.network부분 주석 제거 후
그래서 host 부분을 33066으로 매핑
그리고 바뀐걸 적용해야 되는데,
vagrant reload
입력
그러면 cmd에서 확인 시 3306->33066으로 출력되는 것을 볼 수 있다.
근데 보면 하나를 더 생성.
리로드긴 한데. 리로드가 아니라 할수 있다. 이상한 소리지만 그냥 미리 config작업 다 해두고 작업하는게 제일 좋다.
vagrant는 사실 환경 날리고 하는게 빠르긴 하다.
위 리로드 작업후 다시
vagrant ssh부터
sudo systemctl start mysqld
로 쭉 실행해 주면 된다
그리고 포트가 열렸으므로 heidisql에서 설정을 한 후 실행.
근데 오류가 날 수 있다.
이 경우 방화벽 문제.
sudo firewall-cmd --permanent --zone=public --add-port=3306/tcp
sudo systemctl restart firewalld
입력
그럼 이제 접속은 된다.
앞서서는 계정 설정을 잘못 함.
sudo mysql -u root -p
만약 루트 계정이 위에서 안만들어져 있으면 다시 만들자.(싱글 쿼테이션을 뺴먹고 했을 수 있기 때문)
create user 'root'@'%' identified by 1234;
create user ‘root@%’ 이렇게 입력하게 되면 싱글쿼테이션 안의 전체가 아이디가 되는 것.
그리고 flsuh 해주고.
그냥 루트를 실행하면 권한이 없다 뜨는데 이걸 권한 주기 위해서
grant all privileges on *.* to 'root'@'%' identified by '1234';
로 권한을 준다.
그리고 heidisql에서 실행한 문장 아래를 복사해서 cmd에서 실행해보자
디비는 원칙적으로는 프로그래머 영역은 아니지만 활용 잘해야.
기존의 DB는 file db를 썼다.
하지만 파일 디비는 3가지 문제점이 있었다.
- 동시 접근성 문제
- 동기화(트랜잭션) 문제
- 힘들다.(IO 답답함)
이걸 해결하기 위해 나온 것이 데이터 베이스다.
데이터 베이스는 구두를 통해 질문하고 받기가 상당히 까다로움. 질문거리가 사실은 별로 없다.
면접에서 자주 DBMS와 MSBD의 차이를 물어본다.
3306은 로컬, 33066은 원격으로 사용하자.
이거 는 순간 내 컴퓨터는 서버가 됨.
3306으로 접속 가능
단 안전성은 떨어짐.
create user ‘user02’@’192.168.%’ identified by ‘1234’; grant select , craete, drop , insert, update on . to user02’@’192.168.%’;
flush privileges;
관계형 데이터베이스 시작은 오라클
값으로의 대소문자는 구별이 있다. 문법상 쿼리 구문은 대소문자 구분 없으나 값은 구분이 있음.
데이터베이스는 기본적으로 순서를 1부터 센다. mysql은 프로그래밍 적 요소 도입해서 0부터 세는 것도 존재하긴 함.
서버와 디비 연결시 주의할점
String url = "jdbc:mysql://localhost:3306/scott";
String user = "user01";
String password = "1234";
디비 설정시 이렇게 id,url, pw를 써주는 경우가 많은데 시중 책 코드가 다 이런 식으로 나오는데 이렇게 쓰게 되면 퍼블릭 환경에서 굉장히 보안에 취약해 지고 형상관리나 특히 AWS에 이렇게 올려서 서비스 할 경우 바로 해킹당해서 요금 폭탄을 맞을것.
java reflection
디비에서 기능 만든다는 건 이처럼
수정 삭제는 쿼리 문장만 바뀌는 정도(입력에 따라)
기능적으로 이거 만들고 저거 만들고 이거만 했지 기능만 집중하지 여러 테스트나 완성도 보안이나 이런 측면이런거
만약 sql 인젝션 막으려면 다 처리를 해야됨. 그대신 그렇게 되면 일이 어마어마하게 많아진다.
많약 하이픈 입력하라하는데 안하면?
대부분 기능 구현 하라면 검색해서 복붙하면 되지만 웹에선 아님. 인젝션 공격이 되기 떄문 문자열 치환을 통해 바꿔야 한다.
내용을 바꿔야한다.
그럼 어떤걸 바꿔야 하나? 쿼리문에서 사용하는 것들은 입력 못하게 한다던가. 아이디 패스워드 입력시 특수문자는 제한을 건다거나.
단 프런트에서 한다고 이런걸 안주면 안된다(백에서도 문자열 검사) 프론트는 회피가 굉장히 쉽기 때문
대신 이런걸 해봤자 티가 안난다.
그래서 일반적으로 무시하고 간다. 그리고 퍼포먼스에 집중하게 됨.
그러다 현업 가면 개망함.(농x이 매일 망하는게 걔들은 외주 주고 폭망하는 이유(농x사태)) 그리고 관공서 사이트가 욕먹는 이유도 일맥상통하다.
validation에 대해서 신경 되게 안 쓰는데 신경을 굉장히 써야한다.
primary key = not null && unique