콘텐츠로 이동

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) 유저 생성

    create user 'username'@'localhost' identified by 'password';
    

          - 무슨 유저인 것이여 이게...?
      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를 구동시키면 환경이 맞춰진다고 한 듯..?
  • 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는 리눅스의 기본 쉘이다.

  • 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. 모든 테이블에 기본키가 있는지 확인하자