Skip to content

[๐Ÿš€ ์‚ฌ์ดํด2 - ๋ฏธ์…˜ (๊ธฐ๋ฌผ ํ™•์žฅ + DB ์ ์šฉ)] ์—๋ฒ„ ๋ฏธ์…˜ ์ œ์ถœํ•ฉ๋‹ˆ๋‹ค.#344

Open
Chocoding1 wants to merge 25 commits intowoowacourse:chocoding1from
Chocoding1:step2

Conversation

@Chocoding1
Copy link
Copy Markdown

์ฒดํฌ ๋ฆฌ์ŠคํŠธ

  • ๋ฏธ์…˜์˜ ํ•„์ˆ˜ ์š”๊ตฌ์‚ฌํ•ญ์„ ๋ชจ๋‘ ๊ตฌํ˜„ํ–ˆ๋‚˜์š”?
  • Gradle test๋ฅผ ์‹คํ–‰ํ–ˆ์„ ๋•Œ, ๋ชจ๋“  ํ…Œ์ŠคํŠธ๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ํ†ต๊ณผํ–ˆ๋‚˜์š”?
  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ •์ƒ์ ์œผ๋กœ ์‹คํ–‰๋˜๋‚˜์š”?

์–ด๋–ค ๋ถ€๋ถ„์— ์ง‘์ค‘ํ•˜์—ฌ ๋ฆฌ๋ทฐํ•ด์•ผ ํ• ๊นŒ์š”?

์•ˆ๋…•ํ•˜์„ธ์š” ๋ฐฑํ˜ธ~
์‚ฌ์ดํด2๋„ ์ž˜ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค!

๊ฐ์ฒด์˜ ํ•„๋“œ๋กœ id๋ฅผ ๋‘” ๊ฒƒ

์ฒ˜์Œ์— dao๋ฅผ ๋„์ž…ํ•˜๋ฉด์„œ ์ €์žฅ ๊ฐ์ฒด๋กœ DTO๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.
DTO๋Š” ๋‹จ์ˆœํžˆ ์ €์žฅ์šฉ ๊ฐ์ฒด์ด๊ธฐ ๋•Œ๋ฌธ์— ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๋‘˜ ์ด์œ ๊ฐ€ ์—†์—ˆ์Šต๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์ด ์žˆ๋Š” ์ง„์งœ ๊ฐ์ฒด๋“ค์ด ํ”„๋กœ๊ทธ๋žจ์„ ๊ตฌ์„ฑํ•˜๋Š”๋ฐ, ๊ทธ ๊ณผ์ •์—์„œ DTO์˜ ํ•„๋“œ๋กœ ์žˆ๋Š” id(key)๊ฐ€ ํ•„์š”ํ–ˆ์Šต๋‹ˆ๋‹ค.
๊ทธ๋ž˜์„œ ์–ด์ฉ” ์ˆ˜ ์—†์ด ์ง„์งœ ๊ฐ์ฒด๋“ค์—๊ฒŒ๋„ id๋ฅผ ํ•„๋“œ๋กœ ์ฃผ์—ˆ๋Š”๋ฐ, ๊ทธ๋Ÿฌ๋‹ค ๋ณด๋‹ˆ db์— ์ €์žฅํ•˜๊ธฐ ์ „์— ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒฝ์šฐ id๋ฅผ null๋กœ ์„ค์ •ํ•˜์—ฌ ์ƒ์„ฑํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์ƒ๊ฒผ์Šต๋‹ˆ๋‹ค.
๊ทธ๋ž˜์„œ

id ์—†๋Š” ๊ฐ์ฒด(Turn) ์ƒ์„ฑ ๋ฐ ๋ฐ˜ํ™˜
-> DAO๋ฅผ ์˜์กดํ•˜๋Š” ์ƒ์œ„ ํด๋ž˜์Šค์—์„œ ํ•ด๋‹น ๊ฐ์ฒด๋ฅผ ๊ฐ€์ง€๊ณ  DB์— ์ €์žฅ ํ›„ id ํš๋“
-> ํš๋“ํ•œ id๋ฅผ ๊ฐ€์ง€๊ณ  ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ๋‹ค์‹œ ์ƒ์„ฑ ๋ฐ ๋ฐ˜ํ™˜

ํ•˜๋Š” ์ˆœ์„œ๋กœ ์ฝ”๋“œ๋ฅผ ์งฐ์Šต๋‹ˆ๋‹ค.
ํšจ์œจ์ ์ธ ์ฝ”๋“œ๋ผ๊ณ ๋Š” ์ƒ๊ฐ์ด ๋“ค์ง€ ์•Š์•„์„œ ์ด ๋ถ€๋ถ„์— ๋Œ€ํ•ด์„œ ํ”ผ๋“œ๋ฐฑํ•ด์ฃผ์‹œ๋ฉด ๊ฐ์‚ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค:)

Copy link
Copy Markdown
Member

@Arachneee Arachneee left a comment

Choose a reason for hiding this comment

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

์•ˆ๋…•ํ•˜์„ธ์š” ์—๋ฒ„!

์‚ฌ์ดํด2 ์ž˜ ์ž‘์„ฑํ•ด์ฃผ์…จ๋„ค์š”! ๊ณ ์ƒํ•˜์…จ์Šต๋‹ˆ๋‹ค!

์ฝ”๋ฉ˜ํŠธ ๋‚จ๊ฒผ์–ด์š” ํ™•์ธํ•ด์ฃผ์„ธ์š”!

๊ฐ์ฒด์˜ ํ•„๋“œ๋กœ id๋ฅผ ๋‘” ๊ฒƒ

๊ฐ์ฒด์˜ ํ•„๋“œ๋กœ id๋ฅผ ๋‘๋Š” ๊ฒƒ์€ ๊ฐ์ฒด๋ฅผ ์‹๋ณ„ํ•˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๋ ‡๋‹ค๋ฉด id๋Š” ํ•ด๋‹น ๊ฐ์ฒด์˜ ์‹๋ณ„์ž๋ฅผ ์˜๋ฏธํ•˜๋Š” ๊ฒƒ์ด๊ณ  ๋™๋“ฑ์„ฑ๋„ id๋กœ ๋ณด์žฅํ•ด์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

id ์—†๋Š” ๊ฐ์ฒด(Turn) ์ƒ์„ฑ ๋ฐ ๋ฐ˜ํ™˜ -> DAO๋ฅผ ์˜์กดํ•˜๋Š” ์ƒ์œ„ ํด๋ž˜์Šค์—์„œ ํ•ด๋‹น ๊ฐ์ฒด๋ฅผ ๊ฐ€์ง€๊ณ  DB์— ์ €์žฅ ํ›„ id ํš๋“ -> ํš๋“ํ•œ id๋ฅผ ๊ฐ€์ง€๊ณ  ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ๋‹ค์‹œ ์ƒ์„ฑ ๋ฐ ๋ฐ˜ํ™˜

id ์ƒ์„ฑ์„ DB์— ์˜์กดํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋‚˜์˜ค๋Š” ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ด์š”. DB์— ์˜์กดํ•˜์ง€ ์•Š๊ณ  id๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์€ ์–ด๋–ค ๊ฒƒ์ด ์žˆ์„๊นŒ์š”?


import static janggi.domain.game.GameStatus.IN_PROGRESS;

public class GameDao {
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

DAO๊ฐ€ ๋ญ”๊ฐ€์š”?

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

DAO๋Š” Data Access Object๋กœ ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•˜๋Š” ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค.
ํ…Œ์ด๋ธ”๊ณผ ์ง์ ‘ ์†Œํ†ตํ•˜๋ฉฐ SQL ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  JDBC๋ฅผ ์ง์ ‘ ๋‹ค๋ฃฌ๋‹ค๋Š” ์ , ๊ฐ์ฒด๋ฅผ ์ง์ ‘ ๋‹ค๋ฃจ์ง€ ์•Š๊ณ  ํŠน์ • ํ•„๋“œ๋งŒ ํฌํ•จํ•˜๋Š” DTO๋ฅผ ๋‹ค๋ฃฌ๋‹ค๋Š” ์ ์—์„œ DAO๋ผ๋Š” ์—ญํ• ์„ ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.

Comment on lines +3 to +8
public enum GameResult {

RUNNING,
WIN,
LOSE,
}
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

RUNNING๋„ ๊ฒŒ์ž„ ๊ฒฐ๊ณผ์ธ๊ฐ€์š”? ๊ฒŒ์ž„์˜ ์ƒํƒœ์™€ ๊ฒŒ์ž„์˜ ๊ฒฐ๊ณผ๋ฅผ ๊ตฌ๋ถ„ํ•˜๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์•„์š”. GameStatus๋ผ๋Š”๊ฒŒ ์ด๋ฏธ ์žˆ๋„ค์š”. ๊ทธ๋Ÿผ RUNNING์€ ๊ผญ ํ•„์š”ํ•œ ๊ฑธ๊นŒ์š”?

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

์ฒ˜์Œ์— Team ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ๋•Œ GameResult๋„ ์ดˆ๊ธฐํ™”๋ฅผ ํ•ด์ค˜์•ผ ํ•˜๋Š”๋ฐ, WIN์ด๋‚˜ LOSE๊ฐ€ ์•„๋‹Œ '์•„์ง ์ŠนํŒจ๊ฐ€ ์ •ํ•ด์ง€์ง€ ์•Š์Œ'์„ ํ‘œํ˜„ํ•˜๊ณ ์ž RUNNING์ด๋ผ๊ณ  ์ด๋ฆ„์„ ์ง€์—ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋งŒ RUNNING์ด๋ผ๋Š” ์ด๋ฆ„์ด ์ด๋ฏธ GameStatus์—์„œ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ๊ณ , ์ด๋ฆ„์ด ์ค‘๋ณต๋  ๊ฒฝ์šฐ ํ—ท๊ฐˆ๋ฆด ์ˆ˜๋„ ์žˆ์œผ๋‹ˆ ์•„์ง ๊ฒฐ๊ณผ๊ฐ€ ์—†์Œ์„ ๋‚˜ํƒ€๋‚ด๋Š” NONE์œผ๋กœ ์ˆ˜์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

ํ˜น์‹œ ์ œ๊ฐ€ ์ž˜๋ชป ์ ‘๊ทผํ•œ ๊ฒƒ์ด๋ฉด ์ถ”๊ฐ€์ ์ธ ์กฐ์–ธ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค!


public Long save() {
return gameDao.save(GameDto.forSave());
}
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

์•„๋ฌด๊ฒƒ๋„ ์—†์ด save๋ฅผ ํ•˜๋Š” ๊ฑด๊ฐ€์š”?? ์•„๋‹ˆ๋ฉด ์ฒ˜์Œ ๊ฒŒ์ž„์„ ์„ธํŒ…ํ•˜๋Š” ๊ฒƒ์ผ๊นŒ์š”? init์ด๋‚˜ start๊ฐ™์€ ๋ฉ”์†Œ๋“œ๋ช…์ด ๋” ์–ด์šธ๋ฆฌ๋Š” ๊ฒƒ ๊ฐ™์•„์š”.

GameDto.forSave()๋„ init์ด๋‚˜ start๊ฐ€ ๋” ์–ด์šธ๋ฆฌ๋Š” ๊ฒƒ ๊ฐ™์•„์š”.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

์ดˆ๊ธฐ JanggiGame ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋ฉด์„œ ์ €์žฅํ•˜๋Š” GameDto์ด๊ธฐ ๋•Œ๋ฌธ์— init์ด๋ผ๋Š” ๋ฉ”์„œ๋“œ๋ช…์ด ๋” ์ ํ•ฉํ•œ ๊ฒƒ ๊ฐ™์•„ ์ˆ˜์ •ํ–ˆ์Šต๋‹ˆ๋‹ค!


import java.util.List;

public class GameService {
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

JanggiGameService์™€ GameService๋Š” ์–ด๋–ค ๋‹ค๋ฅธ ์—ญํ• ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‚˜์š”?

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

JanggiGameService๋Š” JanggiGame ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  JanggiGame ๊ฐ์ฒด์™€ ๊ทธ ํ•˜์œ„์— ์žˆ๋Š” Turn, Piece ๊ฐ์ฒด๋“ค์„ ์˜์†ํ™”ํ•˜๋Š” ๋กœ์ง๋“ค์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
๋•Œ๋ฌธ์— JanggiGameService์—์„œ ๋ชจ๋“  Service๋ฅผ ์˜์กดํ•˜๋„๋ก ์„ค๊ณ„ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰ ๋ชจ๋“  ๊ฐ์ฒด์˜ DB๋ฅผ ์˜์กดํ•˜๋Š” TotalService ์—ญํ• ์ด๋ผ๊ณ  ๋ณด์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

TurnService์˜ ๊ฒฝ์šฐ ๋‹จ์ˆœํžˆ DAO๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์ด ํฌํ•จ๋˜์–ด ์žˆ์–ด ํ•„์š”ํ•œ ๊ฐ์ฒด๋ผ๊ณ  ์ƒ๊ฐ์ด ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ GameService, PieceService๋Š” ๋‹จ์ˆœํžˆ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋ฐ›์•„ DAO ๊ฐ์ฒด์— ์š”์ฒญํ•˜๋Š” ์—ญํ• ์ด๊ธฐ ๋•Œ๋ฌธ์— GameService์™€ PieceService๋Š” ๊ตณ์ด Service ๊ณ„์ธต์„ ๋งŒ๋“ค ํ•„์š”๋Š” ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ JanggiGameService์—์„œ Turn๋งŒ Service๋ฅผ ์˜์กดํ•˜๊ณ  Game๊ณผ Piece๋Š” Dao๋ฅผ ์˜์กดํ•œ๋‹ค๋ฉด ๊ณ„์ธต์ด ํ†ต์ผ๋˜์ง€ ์•Š๊ณ  ํ˜ผ์žกํ•ด๋ณด์—ฌ Game๊ณผ Piece๋„ Service ๊ณ„์ธต์„ ๋งŒ๋“ค์–ด ํ†ต์ผ์‹œ์ผฐ์Šต๋‹ˆ๋‹ค.

ํ˜น์‹œ ์ถ”๊ฐ€์ ์ธ ์กฐ์–ธ์ด ์žˆ๋‹ค๋ฉด ๋ง์”€ํ•ด์ฃผ์‹œ๋ฉด ๊ฐ์‚ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค!

Comment on lines +38 to +46
if (dxDelta.getDy() < 0) {
throw new IllegalArgumentException("์ด๋™ํ•  ์ˆ˜ ์—†๋Š” ์œ„์น˜์ž…๋‹ˆ๋‹ค.");
}
return;
}

if (dxDelta.getDy() > 0) {
throw new IllegalArgumentException("์ด๋™ํ•  ์ˆ˜ ์—†๋Š” ์œ„์น˜์ž…๋‹ˆ๋‹ค.");
}
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Delta์—๊ฒŒ ์œ„ ๋ฐฉํ–ฅ์ธ์ง€ ์•„๋ž˜ ๋ฐฉํ–ฅ์ธ์ง€ ๋ฌผ์–ด๋ด๋„ ์ข‹์„ ๊ฒƒ ๊ฐ™์•„์š”.

public static Piece create(PieceType pieceType, TeamType teamType) {
return pieceType.create(teamType);
}
}
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

๋„ˆ๋ฌด ๊ฐ„๋‹จํ•œ ๋กœ์ง๊ฐ™์€๋ฐ Factory ๊ฐ์ฒด๊ฐ€ ๊ผญ ํ•„์š”ํ•œ๊ฐ€์š”? ์ €๋Š” Piece์˜ ์ •์  ํŒฉํ† ๋ฆฌ ๋ฉ”์†Œ๋“œ๋กœ ๊ตฌํ˜„ํ•ด๋„ ์ถฉ๋ถ„ํ•ด๋ณด์ด๋Š”๋ฐ ์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•˜์„ธ์š”?

Copy link
Copy Markdown
Author

@Chocoding1 Chocoding1 Apr 10, 2026

Choose a reason for hiding this comment

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

์ €๋„ ํŒฉํ† ๋ฆฌ ํด๋ž˜์Šค๋ฅผ ์ƒ์„ฑํ•˜๋ฉด์„œ ์ฐ์ฐํ•œ ๊ฐ์ด ์žˆ์—ˆ๋Š”๋ฐ, ์ •์  ํŒฉํ† ๋ฆฌ ๋ฉ”์„œ๋“œ๋ฅผ ์ƒ๊ฐํ•˜์ง€ ๋ชป ํ–ˆ๋„ค์š”..
Piece ์ƒ์„ฑ ์ฑ…์ž„์„ Piece์— ๋‘๋Š” ๊ฒƒ์ด ๋” ๊ฐ์ฒด์ง€ํ–ฅ์ ์ด๋ผ๋Š” ์ƒ๊ฐ์ด ๋“ญ๋‹ˆ๋‹ค!

public abstract class Team {

private final Map<Position, Piece> pieces;
private final GameResult gameResult;
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

GameResult๋ฅผ Team์ด ๊ฐ€์ง€๊ณ  ๊ด€๋ฆฌํ•ด์•ผํ• ๊นŒ์š”? ๊ฒŒ์ž„ ๊ฒฐ๊ณผ๋Š” ๋‘ ํŒ€์ด ๊ฒŒ์ž„์„ ํ•ด์•ผ๋งŒ ๋‚˜์˜ค๋Š” ๊ฐ’์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋Š”๋ฐ ํŒ€์ด ์˜จ์ „ํžˆ ์ž์‹ ์˜ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์„ ์ˆ˜ ์žˆ์„๊นŒ์š”?

๋‘ ํŒ€ ์‚ฌ์ด์˜ ๊ฒŒ์ž„ ๊ฒฐ๊ณผ์— ๋Œ€ํ•œ ์ •ํ•ฉ์„ฑ์€ ๋ˆ„๊ฐ€ ๊ด€๋ฆฌํ•ด์•ผํ• ๊นŒ์š”?

Comment on lines +56 to +58
public static Delta scaleDown(Delta delta) {
return new Delta(Integer.signum(delta.dx), Integer.signum(delta.dy));
}
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

์ด๊ฑด ์ œ๊ฐ€ ์ €๋ฒˆ์— ๋†“์ณค๊ตฐ์š”. static ๋ฉ”์†Œ๋“œ๊ฐ€ ์•„๋‹ˆ๋ผ non-static ๋ฉ”์†Œ๋“œ๋กœ ๋งŒ๋“ค๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์•„์š”.

Delta unitDelta = delta.scaleDown()

Comment on lines +14 to +18
public boolean matches(Delta delta) {
return totalDelta().equals(delta);
}

public boolean matchesDirection(int dx, int dy) {
public boolean matchesDirection(Delta dxDelta) {
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

๐Ÿ‘

import janggi.domain.turn.Turn;
import janggi.domain.team.TeamType;

public record TurnDto(Long id, Long gameId, TeamType currentTurnTeam) {
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

์ €์žฅ์„ ์œ„ํ•œ ๊ฐ์ฒด์™€ ๋„๋ฉ”์ธ ๊ฐ์ฒด๋ฅผ ๋ถ„๋ฆฌํ•œ ์ด์œ ๊ฐ€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

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.

2 participants