2021 04 05
2021-04-05¶
체스 웹 UI + DB 피드백¶
- response에 알맞은 HTTP 상태코드를 지정해서 넘겨주자 - 참고: https://ko.wikipedia.org/wiki/HTTP_%EC%83%81%ED%83%9C_%EC%BD%94%EB%93%9C - 의미에 맞는 상태코드를 찾아서 적용할 것 - 1xx: 조건부 응답 - 2xx: 성공 - 200: OK - 3xx: 리다이렉션 완료 - 4xx: 요청 오류 - 400: Bad Request - 404: Not Found - 5xx: 서버 오류 - 500: Internal Server Error
- JDBC의 자원들은 반환을 해줘야 한다 - 참고: https://javacan.tistory.com/entry/78 - Connection, Statement/PreparedStatement, ResultSet 들을 모두 close() 해줘야 한다! - 그렇지 않다면... - Statement가 제대로 안 닫히면, 생성된 Statement의 갯수가 증가하여, 더 이상 Statement를 생성할 수 없게 됨 - close() 하지 않으므로, 불필요한 자원을 낭비하게 됨 (네트워크/메모리) - 커넥션 풀을 사용하지 않는 상황에서 Connection 안 닫아주면 DBMS에 새로운 Connection을 만들 수 없음 - JDBC API를 보면... - Statement를 close()하면 Statement의 현재 ResultSet도 close()됨 - ResultSet은 해당 ResultSet을 생성한 Statement가 닫히거나, executeQuery 실행하면 close됨 - 해결책은... - 다 잘 닫거나, - Connection 생성/관리/해제하는 클래스를 만들어서 역할을 넘기자!
- GET vs POST - 참고: https://blog.outsider.ne.kr/312 - GET은 가져오는 것이고, POST는 수행하는 것! - GET은 select의 성향이 있다 - POST는 서버의 값이나 상태를 바꾸기 위해서 사용!
- 동시에 요청이 온다...?
private ChessGameDTO generateChessGameDTO() { final Map<String, Map<String, String>> piecePositionToString = generatePiecePositionToString(); final String currentTurnTeam = currentTurnTeamToString(); final double whiteTeamScore = chessGame.calculateWhiteTeamScore(); final double blackTeamScore = chessGame.calculateBlackTeamScore(); final boolean isPlaying = chessGame.isPlaying(); return new ChessGameDTO(piecePositionToString, currentTurnTeam, whiteTeamScore, blackTeamScore, isPlaying); }- 흐음... - 뭐 우선 generateChessGameDTO 메서드는 말그대로 ChessGameDTO를 만드는 메서드인데... - 사실 이건 ChessGameDTO를 만드는거라서 크게 문제가 되나 싶긴하네... - 물론 만드는 도중에 chessGame이 변한다면 문제긴 하지 - synchronized를 써야할까? - 그게 뭔데? 아래 참고 - 흐음 그러면 synchronized를 체스게임의 정보를 바꾸는 때에 사용하는게 좋을 것 같지...?
- 쓰레드의 동기화 - 참고: 자바의 정석 - 한 쓰레드가 진행 중인 작업을 다른 쓰레드가 간섭하지 못하도록 막는 것을 "쓰레드의 동기화"라고 한다 - lock을 통해 critical area 확보 - 메서드 앞에 synchronized 붙이면 메서드 전체를 임계 영역으로 지정할 수 있음 - 하지만 해당 함수는 한 번에 하나의 쓰레드만 접근/처리 가능하기에 성능이 떨어질 수 밖에 없음