Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[1, 2단계 - Spring 적용하기] 배럴(김나은) 미션 제출합니다. #245

Merged
merged 76 commits into from
Apr 27, 2021

Conversation

knae11
Copy link

@knae11 knae11 commented Apr 16, 2021

안녕하세요! 미립 :) 배럴입니다.

이번 스프링을 처음 접하게 되었습니다. 페어의 코드로 같이 스프링으로 옮기는 작업을 진행하였습니다 :) 페어가 조엘이었는데, 리뷰어가 미립이었다고 하더라구요 :) (미립에게 조금은 친숙한 코드나 UI일거라는 생각이 드네요..ㅎㅎ)

아직 레이어 구조나 Spring에 대한 이해가 많이 없어서ㅠㅠ 어떻게 공부해야하는지도 많이 모르는 상태입니다..ㅎㅎㅎ
많은 피드백을 줄수록 제가 학습할 수 있는 내용들이 많을 것 같아요!
잘 부탁드립니다! 😃

DB 테이블

CREATE DATABASE chess_db;
USE chess_db;
CREATE TABLE chess_game (
    current_turn_team VARCHAR(5) NOT NULL,
    is_playing boolean NOT NULL
);
CREATE TABLE team_info (
    team VARCHAR(5) NOT NULL,
    piece_info VARCHAR(400) NOT NULL,
    primary key (team)
);

Copy link

@seok-2-o seok-2-o left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

안녕하세요 배럴. 이번 미션을 함께할 미립입니다 :)

큰 변화 없이 스프링을 잘 적용해주신것 같아요.
다만, HTTP 메소드가 각각 어떤 상황에서 활용되는지 학습해보면 좋을 것 같아요.

미션 진행하면서 궁금하거나 어려운점 있으면 편하게 DM 주세요.

src/main/java/chess/SpringChessApplication.java Outdated Show resolved Hide resolved
this.springChessService = springChessService;
}

@GetMapping(value = "/startNewGame", produces = MediaType.APPLICATION_JSON_VALUE)

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

https://javaplant.tistory.com/18

각각 상황에 맞는 HTTP 메소드를 활용해보는 것은 어떤가요 ?

produces 가 하는 역할을 설명해주실 수 있나요 ?

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[Spring] GetMapping, PostMapping - 4

내용

  • @PostMapping(path="/home", consumes="application/json")
  • consumes 는 Content-Type 헤더에 기반한다.
  • @GetMapping(path = "/pets/{petId}", produces = "application/json")
  • produces 는 Accept 헤더에 기반한다.
  • Content-Type은 해당 바디의 타입이 무엇인지를 나타내며 Accept는 받을 수 있는 타입을 나타낸다.
  • 명시하지 않으면 기본적으로 json 타입이 적용되는 듯 하다.
  • MediaType 클래스의 상수인 APPLICATION_JSON_VALUE, APPLICATION_XML_VALUE를 많이 사용한다.

링크

Copy link
Author

@knae11 knae11 Apr 19, 2021

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

이렇게 이해하고 있는데 맞을까요?~!

http 관련해서는 DM으로 질문드릴게요 :)

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

consumes나 produces는 굳이 명시하진 않나요~~??

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

저는 개인적으로 명시할 이유가 없다면 생략하는 편입니다.

개발자마다 취향 차이가 있는것 같아요.

src/main/java/chess/controller/SpringChessController.java Outdated Show resolved Hide resolved
src/main/java/chess/webdao/PiecePositionDAOConverter.java Outdated Show resolved Hide resolved
src/main/java/chess/webdao/PiecePositionDAOConverter.java Outdated Show resolved Hide resolved

private ChessGame generateChessGame(final Team blackTeam, final Team whiteTeam) {
final String chessGameQuery = "SELECT * FROM chess_game";
final ChessGameTableDto chessGameTableDto = this.jdbcTemplate.queryForObject(chessGameQuery, actorRowMapper);

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

검색 되는 게임이 없으면 어떻게 동작하나요 ?

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

해당 내용은 status 코드를 통해서 클라이언트단에서 alert 창을 띄워주게 만들었어요! 자바로직이나 Dao 측에서 처리해줄 수 있는 방법이 떠오르지 않아서요ㅠㅠ 혹시 방법이 있나요..?🙏

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

아 컨트롤러에서 DAO 에서 발생하는 버그를 직접 컨트롤하고 있나요?

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

네 지금SQL exception을 잡아서 예외처리해서 INTERNAL_SERVER_EXCEPTION status code를 반환해주고 있어요!:) 혹시 다른데서 처리하는 방안이 있나요??

Comment on lines 6 to 9
private final Map<String, Map<String, String>> piecePositionByTeam;
private final String currentTurnTeam;
private final Map<String, Double> teamScore;
private final boolean isPlaying;

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

맵을 활용하신 이유가 있으실까요 ?
ScoreDto 등을 활용하는것은 어떻게 생각하시나요 ?

Copy link
Author

@knae11 knae11 Apr 20, 2021

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

적용해 보았어요!ㅎㅎㅎ

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Map<String(Position),String(Piece)> 으로 여러개 들어가는 경우는 어떻게 해야하나요..? 2개만 있는 경우에는 하나씩 정의해주었는데.. 여러개가 들어가게 되면 List 형식으로 관리해야하는 건지 잘 모르겠습니다ㅠㅠ

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

설계자체가 너무 중복되게 설계되지 않았나 고민 해볼 필요가 있을 것 같아요
팀별 리스트로 각각가지고 있으면 어떤가요?
예를들어 List balckTeam
List whiteTeam 두가지를 가지는 경우요

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

수정해보려고 했는데.. 유지하면서 수정하는 방안은 잘 모르겠어요ㅠㅠㅠ 테이블 구조나 도메인과 연결하여 통신하는 방법에 대해서 다시 고민을 해볼게요!

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

몇시간 더 시도해보았는데.. 역시 안 되네요ㅠㅠ

@knae11
Copy link
Author

knae11 commented Apr 21, 2021

안녕하세요 미립!

테이블 구조를 변경해 보았어요ㅎㅎ 기존에 사용하던 테이블을 지우고 board 하나의 테이블로 관리하게 해보았는데 어떨까요? 이벤트소싱?! 방식이란걸 알게되서 적용해 보았습니다 😀

DDL

CREATE DATABASE chess_db;
USE chess_db;
CREATE TABLE board (
	board_id bigint NOT NULL AUTO_INCREMENT,
	room_id bigint NOT NULL,
	start char(2) NOT NULL,
	destination char(2) NOT NULL,
	date TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
	PRIMARY KEY(board_id)	
);

@knae11
Copy link
Author

knae11 commented Apr 22, 2021

학습로그 1-2

[Spring] @Transactional - 3

내용

  • 트랜잭션의 원자성을 유지시켜준다.
  • 기본은 (readOnly = false)로 셋팅되어 있다. (readOnly = true)의 경우, 읽기 이외의 경우 exception을 던진다.

[DB] 이벤트소싱 패턴 - 4

내용

  • 이벤트를 저장하는 방식이다.
  • 히스토리를 관리가 가능하며, 비즈니스 로직과 동기화할 필요가 없다.
  • 히스토리가 많으면 비즈니스로직을 수행해야하는 오버헤드가 크다. 단점을 스냅샷을 활용하여 보완할 수 있다고 한다.

링크

Copy link

@seok-2-o seok-2-o left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

피드백 반영 잘 해주셨네요 👍
저는 체스 미션에 이벤트소싱 방식이 잘 어울리는 구조인지 의문인데
배럴은 어떤 관점에서 이벤트소싱에 어울린다고 생각하는지 궁금해요.

해당 부분에 대한 답변을 다시 PR 혹은 DM 주시면, 해당 미션은 마무리 할 수 있도록 할께요.

@knae11
Copy link
Author

knae11 commented Apr 25, 2021

안녕하세요! 미립 드디어 다시 PR을 보내네요!
이번에도 DB 테이블을 변경해보았어요!ㅎㅎㅎ 아직 방만들기는 안해서 방만들기 고려해서 테이블을 다시 설계해 보았습니다. 일단 room_id = 1로 놓고 진행하였습니다!ㅎㅎㅎ

더불어 Dto도 정리한다고 정리해봤는데,,, 너무 어렵네요.ㅎㅎ dto 패키지 안에 converter 패키지를 만들고, 여기서 조립해주려고 해보았어요. Service 레이어에서는 만드는 역할이 아니라고 하는데..어디서 Dto를 만들어 줘야하는건지 잘 모르겠네요ㅠㅠ

Dto가 많아서 헷갈려서 Dto 안에 view, dao 등으로 패키지를 나눠서 관리해보았습니다.

피드백 부탁드릴게요. 🙏

DDL

CREATE TABLE room (
	room_id BIGINT NOT NULL,
	turn CHAR(5) NOT NULL,
	is_playing BOOLEAN NOT NULL,
	name VARCHAR(25) NOT NULL,
	password VARCHAR(16),
	create_at DATETIME DEFAULT CURRENT_TIMESTAMP,
	PRIMARY KEY(room_id)
)

CREATE TABLE board (
	board_id BIGINT NOT NULL AUTO_INCREMENT,
	team VARCHAR(10) NOT NULL,
	position VARCHAR(10) NOT NULL,
	piece VARCHAR(10) NOT NULL, 
	is_first_moved BOOLEAN NOT NULL,
	room_id BIGINT NOT NULL,
	PRIMARY KEY(board_id),
	FOREIGN KEY (room_id) REFERENCES room (room_id)
)

Copy link

@seok-2-o seok-2-o left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

이전 구조에 비해 다소 코드를 이해하기 어려워 진 것 같아요.
개인적인 생각이지만 소프트웨어는 멋진 구조를 가지기보단 쉬운 구조를 먼저 생각하는게 좋다고 생각해요.
불필요한 클래스가 없는지 살펴보고 해당 클래스들을 삭제해보면 좋을 것 같네요.

src/main/java/chess/webdao/MysqlChessDao.java Outdated Show resolved Hide resolved
src/main/java/chess/webdao/MysqlChessDao.java Outdated Show resolved Hide resolved
src/main/java/chess/webdto/converter/DaoToChessGame.java Outdated Show resolved Hide resolved
src/main/java/chess/webdto/converter/DaoToChessGame.java Outdated Show resolved Hide resolved
src/main/java/chess/webdto/converter/DaoToChessGame.java Outdated Show resolved Hide resolved
@knae11
Copy link
Author

knae11 commented Apr 26, 2021

학습로그 1-3

[DB] 데이터 모델링 - 5

내용

태그

  • DB

[Architecture] Layered Architecture, Dto - 4

내용

  • layered architecture는 관심사를 분리하여 레이어로 구분한 것을 의미한다.
  • presentation layer: UI에 관련된 내용
  • application layer: 서비스들을 관리한다. 도메인에 포함되지 않지만 기능 요구사항들을 관리
  • domain layer: 핵심 비지니스 로직이 존재
  • infrastructure layer(persistence layer): DB나 자료를 영구저장하는 것과 관련된 레이어
  • 관심사를 가지고 구분하였기 때문에 관심사별로 응집되어 있다. 레이어간 교체가능할 수 있기 때문에 유지보수에 좋을 수 있다.
  • 레이어 간에 소통을 하므로 소통하기 위해서는 각 모든 레이어를 거쳐야 한다. 적당한 규모로 나누는 것이 어렵다.
  • 레이어간 소통하기 위해 dto를 사용하기도 한다.

링크

태그

  • LayeredArchitecture, Dto

학습로그 1-4

[Architecture] 추상화 - 4

내용

  • 과한 추상화는 코드의 가독성을 해친다.
  • 지나친 추상화 프로젝트 깃허브 참고자료 링크
  • 현재 단계에서 굳이 interface를 사용하여 의존관계를 분리해주는 것은 지나칠 수 있다.
  • 현재 단계의 프로젝트 규모에서 dto 조립기 까지 만들 필요 없이 dto에서 도메인 정보를 받아 만들어주는 로직정도는 가져도 괜찮다.
  • dto의 비즈니스 로직이 들어가면 안 된다는 것은 도메인의 로직을 의미하는 것이다.
  • 도메인은 dto 정보를 모르게, dto는 일부 도메인 정보를 알고 적절한 값으로 사용가능하게 만드는 방식을 사용할 수 있다.

태그

  • 추상화

@knae11
Copy link
Author

knae11 commented Apr 26, 2021

한글 저장이 안되는 부분이 있어서 데이터베이스 만들때 DDL 수정하였습니다.

피드백 주신 내용 반영해보았어요~ 혹시 더 부족한 부분이 있다면 언제든지 알려주세요~~!!😁
스프링에서 DB관련 테스트 코드는 작성해본적이 없는데 테스트코드도 곧 공부해서 적용해보도록 하겠습니다! 😀

DDL

DROP DATABASE if exists chess_db;
CREATE DATABASE chess_db DEFAULT character set utf8 collate utf8_general_ci;

USE chess_db;

CREATE TABLE room (
	room_id BIGINT NOT NULL,
	turn VARCHAR(16) NOT NULL,
	is_playing BOOLEAN NOT NULL,
	name VARCHAR(16) NOT NULL,
	password VARCHAR(16),
	create_at DATETIME DEFAULT CURRENT_TIMESTAMP,
	PRIMARY KEY(room_id)
);

CREATE TABLE board (
	board_id BIGINT NOT NULL AUTO_INCREMENT,
	team VARCHAR(16) NOT NULL,
	position VARCHAR(16) NOT NULL,
	piece VARCHAR(16) NOT NULL, 
	is_first_moved BOOLEAN NOT NULL,
	room_id BIGINT NOT NULL,
	PRIMARY KEY(board_id),
	FOREIGN KEY (room_id) REFERENCES room (room_id)
);

Copy link

@seok-2-o seok-2-o left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

제가 다소 많은 피드백는데 잘 반영해주셨네요 ;-;
이번 미션은 여기서 마무리하도록 할게요.
이어서 다음 미션 진행해주세요.

@seok-2-o seok-2-o merged commit 088d0af into woowacourse:knae11 Apr 27, 2021
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants