[우아한테크코스 백엔드 4기] 레벨1 - "체스" STEP 2 회고

헌치·2022년 4월 18일
3

우아한테크코스

목록 보기
17/30

상여자는 커멘드로 간다!

🔗 관련 링크

깃허브 링크
작성한 코드


⚙️ 구현 추가 사항

(웹) 입력

  • 방 이름을 입력받고 시작버튼을 누른다
  • 이동하고 싶은 말과 칸을 커멘드로 입력한다
    • 예) move a2 a3
  • 종료 버튼을 누른다
  • 재시작 버튼을 누른다

DB

  • 각 방 이름별로 현재 진행 턴, 보드 상태를 저장한다.
    • 방이름과 턴은 board 테이블에 String으로, 보드 상태는 squares 테이블에 저장한다
  • 새로운 방을 생성한다.
  • 해당 방의 정보가 있는지 확인하고, 있을 시 게임 진행상태를 반환한다.
  • 방 이름을 인자로 받아, 해당 방의 상태를 저장한다.
  • 게임 종료 시, board 테이블``squares 테이블에서 해당 방 관련 정보를 삭제한다.

⛳ 피드백

@Docker

  • 애플리케이션 실행환경을 손쉽게 만들어주는 소프트웨어 플랫폼
  • 사용법

도커 실행법

  1. 도커 어플리케이션 실행 후 터미널-> cd docker
  2. fps
    • 도커 연결됐는지, 이름 등 확인
  3. docker exec -it chess-db-1 bash
  4. mysql -u root -proot
    • mysql 실행
  5. show databases;
    • 내부 데이터베이스 상태 확인
  6. use chess;
    • 기존에 만든 체스 데이터베이스 사용
  7. show tables;
    • 현재 생성된 테이블들 확인
  8. desc 테이블이름;
    • 해당 테이블 확인

@SQL

CREATE TABLE board (
name VARCHAR(100) NOT NULL primary key,
turn VARCHAR(10) NOT NULL
);

CREATE TABLE squares (
board_name VARCHAR(100) NOT NULL,
foreign key(board_name) references board(name),
position VARCHAR(5) NOT NULL,
piece VARCHAR(10) NOT NULL
);
  • 체스에 사용된 초기 DB 세팅
  • init.sql에 작성해야 함

값 추가

INSERT into board (name, turn) VALUES (?, ?);
INSERT into squares (board_name, position, piece) VALUES (?, ?, ?);

-테이블에서 VALUES 뒤의 데이터 차례로 추가

값 검색

SELECT * FROM board WHERE name = ?;
SELECT piece FROM squares WHERE board_name = ? AND position = ?;
  • 테이블에서 WHERE 뒤 조건에 맞는 데이터를 추출

값 변경

UPDATE board SET turn = ? WHERE name = ?;
UPDATE squares SET piece = ? WHERE board_name = ? AND position = ?;
  • 테이블에서 WHERE 뒤 조건에 맞는 데이터를 SET 뒤의 값으로 변경

값 제거

DELETE FROM squares WHERE board_name = ?;
DELETE FROM board WHERE name = ?;
  • 테이블에서 WHERE 뒤 조건에 맞는 데이터를 제거

복잡한 값 검색

    1. 많은 돈을 지출한 순으로 고객 리스트를 구해주세요.(SQL 강의 퀴즈)
      - 참고 사이트
SELECT c.CustomerID, c.CustomerName, SUM(od.Quantity*p.Price) AS TotalPrice 
FROM Customers as c
JOIN orders as o on o.CustomerID = c.CustomerID
JOIN orderdetails as od on o.OrderID = od.OrderID
JOIN products as p on od.ProductID = p.ProductID
GROUP BY c.CustomerID
ORDER BY TotalPrice DESC
  • JOIN : 여러 테이블 참조
  • SUM, GROUP BY : 값을 특정 방식(합계)로 묶어 추출
  • ORDER BY : 내림차순 정렬(DESC)

DB 연결 방법

    private static final String URL = "jdbc:mysql://localhost:3306/chess";
    private static final String USER = "user";
    private static final String PASSWORD = "password";
    
    public Connection getConnection() {
        loadDriver();
        Connection connection = null;
        try {
            connection = DriverManager.getConnection(URL, USER, PASSWORD);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return connection;
    }

    private void loadDriver() {
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
        } catch (final Exception e) {
            e.printStackTrace();
        }
    }
  • getConnection()을 통해 DB 연결 가능
  • USER, PASSWORD
    private PreparedStatement getStatement(Connection connection, String sql, List<String> data) throws SQLException {
        PreparedStatement statement = connection.prepareStatement(sql);
        for (int i = 0; i < data.size(); i++) {
            statement.setString(i + 1, data.get(i));
        }
        return statement;
    }
  • connectionSQL문, SQL문에 들어갈 데이터를 인자로 받음
  • 해당 데이터를 SQL문에 추가해 PreparedStatement를 제공

@DB에 값을 바로 저장하고 꺼내자

  • 처음엔 컨트롤러 내부에서 따로 도메인을 저장함
  • 그러나
    1. 여러 플레이어가 동시에 게임을 진행하지 못함
    2. 도중에 값이 저장되는데에 어려움을 겪음
    3. 컨트롤러 내부 메서드에서 인자값이 늘어남
  • 이에 DAO를 통해 DB에서 바로 값을 꺼내 쓰는 방식으로 변경

🖋 소감

막막했지만, 구동되는 웹을 보며 뿌듯했다

profile
🌱 함께 자라는 중입니다 🚀 rerub0831@gmail.com

0개의 댓글