2021 03 27
2021-03-27¶
Database 기본 수업 복습 with 의식의 흐름¶
- Database에 연결하는 과정
- 자신의 로컬에 Docker로 사용할(?) 폴더를 만든다.
- Docker가 뭐야?
- docker-compose.yml 파일로, 필요한 SW를 명시한 yaml 파일을 생성한다..?
- yaml 파일이 뭐야?
- docker-compose up -d 라는 명령어를 git bash에 입력해준다..?
- git bash가 뭐야?
- 그러면 내 로컬 폴더에 db라는 폴더가 생기네...? (많아서 간략하게 구조만 보면!)
|-- db | `-- mysql | |-- data | | |-- auto.cnf | | |-- ibtmp1 | | |-- mysql | | | |-- columns_priv.MYD | | | `-- user.frm | | |-- performance_schema | | | |-- users.frm | | | `-- variables_by_thread.frm | | |-- private_key.pem | | |-- public_key.pem | | |-- server-cert.pem | | |-- server-key.pem | | `-- sys | | |-- db.opt | | |-- host_summary.frm | `-- init `-- docker-compose.yml- 이제 Docker를 깔았으니(?) MySQL을 펼쳐보자 - MySQL Workbench를 켜본다 - docker-compose.yml에 입력한 연결 정보를 입력해 연결(?)을 해본다 - localhost에 13306 포트를 docker가 listening하고 있는 것 같은데...? - 잠깐만 그러면 Docker를 통해 설치한 db 디렉토리가 SQL의 서버가 되는거고, - workbench로 SQL명령을 보내는게 SQL의 클라이언트가 되는건가? - workbench의 역할이 뭐야? - localhost:13306으로 연결이 되었다면 이제 SQL 구문들을 입력해 RDBMS인 MySQL과 소통을 시도해보자! 1) 유저 생성
- 무슨 유저인 것이여 이게...? 2) 생성한 유저에게 모든 db 및 테이블에 접근권한 부여 ``` sql grant all privileges on *.* to 'username'@'localhost'; ``` - 아 DB에 접근하려면 권한이 있는 유저가 필요한가봐? 3) 설정한 권한 적용 ``` sql flush privileges; ``` 4) 데이터베이스 생성 (utf8 설정을 해줘야 한글과 관련한 문제가 발생하지 않습니다.) ``` sql CREATE DATABASE joelDB DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci; ``` - 왜 utf8 문자 인코딩이 문제가 없는걸까? utf-16, euc-kr은? unicode는 또 뭐지? 5) user 테이블 생성/데이터 삽입/데이터 조회 ``` sql USE joelDB; CREATE TABLE user ( user_id VARCHAR(12) NOT NULL, name VARCHAR(64) NOT NULL, PRIMARY KEY (user_id) ); INSERT INTO user (user_id, name) VALUES ('eastjun', 'jun'), ('pobiconan', 'pobi'), ('sugarbrown', 'brwon'); SELECT * FROM user; ```- 오호 그랬더니만 joelDB라는 DB(?)가 생긴듯하네! user라는 아마 내가 넣은 테이블 정보들이 .frm? .ibd? 이런건가본데?
|-- db | `-- mysql | |-- data | | |-- auto.cnf | | |-- ibtmp1 | | |-- joelDB | | | |-- db.opt | | | |-- user.frm | | | `-- user.ibd | | |-- mysql | | | |-- columns_priv.MYD | | | `-- user.frm | | |-- performance_schema | | | |-- users.frm | | | `-- variables_by_thread.frm | | |-- private_key.pem | | |-- public_key.pem | | |-- server-cert.pem | | |-- server-key.pem | | `-- sys | | |-- db.opt | | |-- host_summary.frm | `-- init `-- docker-compose.yml- 이제 새로운 Java Gradle Project를 생성해 JDBC 드라이버를 통해 DB와 연결해보자 - 아니 JDBC는 또 뭐야? - implementation("mysql:mysql-connector-java:8.0.16") // 우선 의존성 주입해주고... - UserDAO 클래스에서 DB 커넥션 진행한다.
import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.SQLException; public class UserDAO { public Connection getConnection() { Connection con = null; String server = "localhost:13306"; // MySQL 서버 주소 String database = "joelDB"; // MySQL DATABASE 이름 String option = "?useSSL=false&serverTimezone=UTC"; String userName = "root"; // MySQL 서버 아이디 String password = "root"; // MySQL 서버 비밀번호 // 드라이버 로딩 try { Class.forName("com.mysql.cj.jdbc.Driver"); } catch (ClassNotFoundException e) { System.err.println(" !! JDBC Driver load 오류: " + e.getMessage()); e.printStackTrace(); } // 드라이버 연결 try { con = DriverManager.getConnection("jdbc:mysql://" + server + "/" + database + option, userName, password); System.out.println("정상적으로 연결되었습니다."); } catch (SQLException e) { System.err.println("연결 오류:" + e.getMessage()); e.printStackTrace(); } return con; } // 드라이버 연결해제 public void closeConnection(Connection con) { try { if (con != null) con.close(); } catch (SQLException e) { System.err.println("con 오류:" + e.getMessage()); } } public void addUser(User user) throws SQLException { String query = "INSERT INTO user VALUES (?, ?)"; PreparedStatement pstmt = getConnection().prepareStatement(query); pstmt.setString(1, user.getUserId()); pstmt.setString(2, user.getName()); pstmt.executeUpdate(); } }
수업 들으면서 몰랐던 용어¶
- Docker - 참고: https://ndb796.tistory.com/90 - 리눅스 컨테이너를 기반으로 한 서비스 패키징/배포에 유용한 오픈소스 SW - 서버 환경에 우리의 서비스를 배포할라니까 갖가지 설정 필요... 이거 불편하자나? - Docker는 Container에 Image를 담아서 구동시키는 방식으로 서비스 배포 - 그래서 yaml파일을 설정해서 Docker를 구동시키면 환경이 맞춰진다고 한 듯..?
- yaml 파일 - 참고: https://ko.wikipedia.org/wiki/YAML - '사람이 쉽게 읽을 수 있는' 데이터 직렬화 양식 - 데이터 교환 포맷
- git bash
- 참고: https://www.atlassian.com/git/tutorials/git-bash
- Git
- 오픈소스계의 영원한 아이돌 리누스 토발즈는 리눅스 커널을 관리하는 기존 툴이 엉망인 것에 너무 빡친 바람에 git이라는 소스관리 툴을 만든다.
리누스는 하도 빡친 나머지, 단 2주만에 완성하는 기염을 토했다.- 등장 배경 - Git은 Unix 스타일 command line 환경에서 set of command line utility program을 실행하게 해줌 - macOS, Linux에는 기본적으로 command line terminal이 탑재 - 따라서 자동적으로 Git 사용이 가능 - 하지만 윈도우는 기본적으로 Windows command prompt 사용 - 이는 unix-terminal이 아니라 자동 Git 사용X - 따라서 윈도우에서 git 쓸라면, GUI 앱을 썼어야함 - 근데 이게 한계가 있어서 git bash 등장 - 그래서 Git Bash란? - 윈도우에게 Git command line 경험을 모방한 어플리케이션 - Bash는 Bourne Again Shell의 줄임말로, Shell은 CLI를 통해 OS와 소통하는 역할을 하는 사용자가 OS와 소통할 수 있는 최밑단의 SW - 참고로 Bash는 리눅스의 기본 쉘이다.
- MySQL Workbench - 참고: https://ko.wikipedia.org/wiki/MySQL_%EC%9B%8C%ED%81%AC%EB%B2%A4%EC%B9%98 - SQL 개발과 관리, DB설계, 생성, 유지를 위한 "단일 개발 통합 환경"을 제공하는 visual DB 설계 도구
- JDBC - 참고: https://ko.wikipedia.org/wiki/JDBC - 참고: https://dyjung.tistory.com/50 - Java에서 DB에 접속할 수 있도록 하는 자바 API - 자료를 Query하거나, Update하는 방법을 제공 - Java SE의 일부로 포함 - JDBC를 활용한 프로그램의 흐름 - JDBC 드라이버 로드 - DB 연결 - DB에 데이터 읽거나 쓰기 - DB 연결 종료
DB 설계¶
- 어떻게 설계할 것인가? - 설계 Cycle 1. 테이블 설계 2. 테이블로 부터 객체 도출 3. 객체와 테이블 매핑 4. DB 접근 로직 구현 5. 비즈니스 로직 구현 6. 객체 속성 추가 및 테이블 칼럼 추가 - 테이블 주도 설계 - DB와 서버에 항상 의존관계 O - 객체 간의 관계 << DB 처리에 집중하게 됨 - 도메인 주도 설계 - DB 서버 없이 우선적으로 개발 가능! - 구현/피드백 사이클이 빨라 도메인에 최적화된 설계를 할 수 있다! - 요구 사항 변동에도 유연하게 대처 가능 - DB 설계시 주의사항 1. 필요한 데이터 + 자료형을 확실히 알 것 2. 중복으로 저장된 데이터 항목을 제거하자 3. 칼럼당 하나의 특성만 저장하자 4. DB에 종속적인 설계를 지양하자 5. 모든 테이블에 기본키가 있는지 확인하자