Skip to content

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

Merged
syoun602 merged 34 commits intowoowacourse:e9ua1from
Woowa-8th-BE-IQ:step2
Apr 11, 2026

Conversation

@e9ua1
Copy link
Copy Markdown

@e9ua1 e9ua1 commented Apr 8, 2026

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

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

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

๊ถ์„ฑ ๊ทœ์น™ ์„ค๊ณ„์™€ ๋„๋ฉ”์ธ๊ณผ ์ธํ”„๋ผ์˜ ๊ฒฝ๊ณ„ ๋ฅผ ์ค‘์ ์ ์œผ๋กœ ํ”ผ๋“œ๋ฐฑํ•ด ์ฃผ์‹œ๋ฉด ์ข‹๊ฒ ์Šต๋‹ˆ๋‹ค.
๊ถ์„ฑ ๊ทœ์น™์„ ๋„์ž…ํ•˜๋ฉด์„œ ๊ธฐ๋ฌผ๊ณผ ๊ถ์„ฑ์˜ ์ฑ…์ž„์„ ์–ด๋–ป๊ฒŒ ๋‚˜๋ˆŒ์ง€,
DB๋ฅผ ์ฒ˜์Œ ์—ฐ๋™ํ•˜๋ฉด์„œ ๋„๋ฉ”์ธ์ด DB๋ฅผ ๋ชจ๋ฅด๊ฒŒ ํ•˜๋ ค๋ฉด ์–ด๋””์„œ ์–ด๋–ป๊ฒŒ ๊ฒฝ๊ณ„๋ฅผ ๊ทธ์–ด์•ผ ํ•˜๋Š”์ง€ ๊ณ„์† ๊ณ ๋ฏผํ–ˆ์Šต๋‹ˆ๋‹ค.


1. ๊ถ์„ฑ(Palace) ๋„๋ฉ”์ธ ๊ฐ์ฒด ์„ค๊ณ„

๊ถ์„ฑ ๊ทœ์น™์„ ๊ตฌํ˜„ํ•˜๋ฉด์„œ Palace๋ฅผ ๋ณ„๋„ ๋„๋ฉ”์ธ ๊ฐ์ฒด๋กœ ๋ถ„๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค.

public enum Palace {
    HAN(1, 3, 4, 6, 2, 5),
    CHO(8, 10, 4, 6, 9, 5);

    public boolean contains(Position position) { ... }
    public boolean isOnDiagonalLine(Position position) { ... }
    public boolean canMoveDiagonally(Position from, Position to) { ... }
    public static boolean isDiagonalMove(Position from, Position to) { ... }
    public static List<Position> getDiagonalPath(Position from, Position to) { ... }
}

General, Guard๋Š” AbstractPiece.ownPalace()๋ฅผ ํ†ตํ•ด ์ž์‹ ์˜ ํŒ€ ๊ถ์„ฑ์„ ์ฐธ์กฐํ•˜๊ณ ,
Chariot, Cannon, Soldier๋Š” Palace.isDiagonalMove()๋กœ ์–‘์ชฝ ๊ถ์„ฑ์„ ๋ชจ๋‘ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

๊ณ ๋ฏผํ–ˆ๋˜ ์ ์€ AbstractPiece๊ฐ€ Palace๋ฅผ ์•Œ์•„์•ผ ํ•˜๋Š”๊ฐ€ ์ž…๋‹ˆ๋‹ค.
๊ธฐ๋ฌผ์ด ์ž์‹ ์˜ ๊ถ์„ฑ์„ ์ง์ ‘ ์ฐธ์กฐํ•˜๋Š” ๊ฒŒ ์ž์—ฐ์Šค๋Ÿฌ์šด์ง€, ์•„๋‹ˆ๋ฉด Board๊ฐ€ ๊ถ์„ฑ ๊ทœ์น™์„ ํŒ๋‹จํ•ด์•ผ ํ•˜๋Š”์ง€ ์˜๊ฒฌ์„ ๋“ฃ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.


2. DB ์„ค๊ณ„ โ€” ํŠธ๋žœ์žญ์…˜ ๋‹จ์œ„ ๋ฐ ์—…๋ฐ์ดํŠธ ๋ฐฉ์‹

๊ฒŒ์ž„ ์ €์žฅ ์‹œ janggi_game INSERT์™€ piece INSERT(90๊ฐœ)๋ฅผ ํ•˜๋‚˜์˜ ํŠธ๋žœ์žญ์…˜์œผ๋กœ ๋ฌถ์—ˆ์Šต๋‹ˆ๋‹ค.

public long save(Board board, Team currentTeam) {
    try (Connection conn = DBConnector.getConnection()) {
        conn.setAutoCommit(false);
        long gameId = saveGame(conn, currentTeam);
        savePieces(conn, gameId, board.showBoard());
        conn.commit();
        return gameId;
    } catch (SQLException e) {
        throw new IllegalStateException("[ERROR] ๊ฒŒ์ž„ ์ €์žฅ ์‹คํŒจ", e);
    }
}

๋งค ํ„ด๋งˆ๋‹ค update() ์‹œ์—๋„ updateTurn + deletePieces + savePieces๋ฅผ ํ•˜๋‚˜์˜ ํŠธ๋žœ์žญ์…˜์œผ๋กœ ๋ฌถ์—ˆ์Šต๋‹ˆ๋‹ค.

๊ณ ๋ฏผํ–ˆ๋˜ ์ ์€ ๋งค ํ„ด๋งˆ๋‹ค 90๊ฐœ ๊ธฐ๋ฌผ์„ DELETE + INSERTํ•˜๋Š” ๋ฐฉ์‹์ด ์ ์ ˆํ•œ๊ฐ€์ž…๋‹ˆ๋‹ค.
ํ˜„์žฌ๋Š” ๊ตฌํ˜„ ๋‹จ์ˆœ์„ฑ์„ ์œ„ํ•ด ์ „์ฒด๋ฅผ ๊ต์ฒดํ•˜๋Š” ๋ฐฉ์‹์„ ํƒํ–ˆ๋Š”๋ฐ,
๊ฒŒ์ž„์ด ์—ฌ๋Ÿฌ ๊ฐœ ๋™์‹œ์— ๋Œ์•„๊ฐ€๋Š” ์ƒํ™ฉ์„ ๊ณ ๋ คํ•˜๋ฉด ๋ณ€๊ฒฝ๋œ ๊ธฐ๋ฌผ(from, to 2๊ฐœ)๋งŒ UPDATEํ•˜๋Š” ๋ฐฉ์‹์ด ๋‚˜์€์ง€
ํŠธ๋ ˆ์ด๋“œ์˜คํ”„์— ๋Œ€ํ•œ ์˜๊ฒฌ์„ ๋“ฃ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.


3. Repository ํŒจํ„ด โ€” DAO ์—†์ด ๊ตฌํ˜„์ฒด์—์„œ ์ง์ ‘ JDBC ์ฒ˜๋ฆฌ

GameRepository (interface, domain)
โ””โ”€โ”€ GameRepositoryImpl (JDBC ์ง์ ‘ ์ฒ˜๋ฆฌ, infrastructure)

DAO ๊ณ„์ธต ์—†์ด GameRepositoryImpl์ด JDBC ์ฒ˜๋ฆฌ๊นŒ์ง€ ๋‹ด๋‹นํ•˜๋„๋ก ํ–ˆ์Šต๋‹ˆ๋‹ค.
๋ฏธ์…˜ ๊ทœ๋ชจ์—์„œ๋Š” DAO๋ฅผ ๋ณ„๋„๋กœ ๋‘๋Š” ๊ฒŒ ๊ณผํ•˜๋‹ค๊ณ  ํŒ๋‹จํ–ˆ๋Š”๋ฐ, ์ด ํŒ๋‹จ์ด ํ•ฉ๋ฆฌ์ ์ธ์ง€ ์˜๊ฒฌ์„ ๋“ฃ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.


4. EmptyPiece์˜ ํŒ€ ์ €์žฅ ๋ฐฉ์‹

DB์— ๊ธฐ๋ฌผ์„ ์ €์žฅํ•  ๋•Œ EmptyPiece๋Š” ํŒ€์ด ์—†์–ด์„œ "EMPTY"๋ผ๋Š” ํŠน์ˆ˜๊ฐ’์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

public static String toTeamString(Piece piece) {
    if (piece.isEmptyPiece()) return "EMPTY";
    if (piece.isSame(Team.HAN)) return "HAN";
    return "CHO";
}

๋ณต์› ์‹œ์—๋Š” type์ด EMPTY๋ฉด team ๊ฐ’์„ ๋ฌด์‹œํ•˜๊ณ  EmptyPiece๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
์ด ๋ฐฉ์‹ ๋Œ€์‹  EmptyPiece๋ฅผ ์•„์˜ˆ ์ €์žฅํ•˜์ง€ ์•Š๊ณ  ์—†๋Š” ์นธ์€ ๋นˆ ์นธ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ํฌ์†Œ ํ‘œํ˜„ ๋ฐฉ์‹๋„ ๊ณ ๋ฏผํ–ˆ๋Š”๋ฐ,
ํ˜„์žฌ ๋ฐฉ์‹์˜ ์žฅ๋‹จ์ ์— ๋Œ€ํ•ด ์˜๊ฒฌ์„ ๋“ฃ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.


5. ์ ์ˆ˜ ๊ณ„์‚ฐ โ€” ๋ค(ํ•ธ๋””์บก) ์ ์šฉ ๋ฐฉ์‹

์ดˆ๋‚˜๋ผ๊ฐ€ ๋จผ์ € ๋‘๋Š” ๊ทœ์น™์— ๋”ฐ๋ผ ํ•œ๋‚˜๋ผ ์ ์ˆ˜์— 1.5์  ๋ค์„ ์ ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

public Score applyHanBonus() {
    return new Score(value + HAN_BONUS);
}

Board.calculateScore()์—์„œ ํŒ€์ด HAN์ด๋ฉด ์ž๋™์œผ๋กœ ๋ค์„ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.
๋ค ์ ์šฉ ์ฑ…์ž„์ด Score์— ์žˆ๋Š” ๊ฒŒ ๋งž๋Š”์ง€, ์•„๋‹ˆ๋ฉด ํ˜ธ์ถœ๋ถ€์—์„œ ๋ช…์‹œ์ ์œผ๋กœ ์ ์šฉํ•˜๋Š” ๊ฒŒ ๋‚˜์€์ง€ ์˜๊ฒฌ์„ ๋“ฃ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.


6. ๊ฒŒ์ž„ ์ด๋ ฅ ๊ด€๋ฆฌ โ€” ํ˜„์žฌ ์ƒํƒœ๋งŒ ์ €์žฅ vs ์ด๋™ ๊ธฐ๋ก ๋ˆ„์ 

ํ˜„์žฌ๋Š” ๋งค ํ„ด๋งˆ๋‹ค ๋ณด๋“œ์˜ ํ˜„์žฌ ์ƒํƒœ๋ฅผ ๋ฎ์–ด์”๋‹ˆ๋‹ค. ๋•Œ๋ฌธ์— ๊ฒŒ์ž„ ์ค‘ ๋น„์ •์ƒ ์ข…๋ฃŒ ์‹œ
๋งˆ์ง€๋ง‰ ์ €์žฅ ์ด์ „ ์ƒํƒœ๋กœ ๋Œ์•„๊ฐˆ ๋ฐฉ๋ฒ•์ด ์—†๊ณ , ๋ฌด๋ฅด๊ธฐ ๊ฐ™์€ ๊ธฐ๋Šฅ ์ถ”๊ฐ€๋„ ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

์ด๋™ ๊ธฐ๋ก์„ ๋ˆ„์ ํ•˜๋Š” movement ํ…Œ์ด๋ธ”์„ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ์‹๋„ ๊ณ ๋ฏผํ–ˆ์Šต๋‹ˆ๋‹ค.

CREATE TABLE movement (
    id             BIGINT NOT NULL AUTO_INCREMENT,
    janggi_game_id BIGINT NOT NULL,
    source         VARCHAR(8) NOT NULL,
    destination    VARCHAR(8) NOT NULL,
    PRIMARY KEY (id)
);

์ด ๊ฒฝ์šฐ ๋ณต์› ์‹œ ์ดˆ๊ธฐ ๋ฐฐ์น˜์—์„œ ์ด๋™ ๊ธฐ๋ก์„ ์ˆœ์„œ๋Œ€๋กœ ์žฌ์ƒํ•ด์•ผ ํ•˜๋Š”๋ฐ,
ํ˜„์žฌ ๋ฐฉ์‹(์Šค๋ƒ…์ƒท)๊ณผ ์ด๋™ ๊ธฐ๋ก ๋ˆ„์  ๋ฐฉ์‹์˜ ํŠธ๋ ˆ์ด๋“œ์˜คํ”„๊ฐ€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.


7. FakeGameRepository์™€ ์‹ค์ œ DB ํ…Œ์ŠคํŠธ์˜ ๊ดด๋ฆฌ

public class FakeGameRepository implements GameRepository {
    private final Map<Long, Board> boardStore = new HashMap<>();
}

FakeGameRepository๋Š” Board ๊ฐ์ฒด๋ฅผ ๊ทธ๋Œ€๋กœ ์ €์žฅํ•˜๋Š” ๋ฐ˜๋ฉด,
์‹ค์ œ GameRepositoryImpl์€ ์ง๋ ฌํ™”(๋„๋ฉ”์ธ โ†’ DB) + ์—ญ์ง๋ ฌํ™”(DB โ†’ ๋„๋ฉ”์ธ) ๊ณผ์ •์ด ์žˆ์Šต๋‹ˆ๋‹ค.
์ด ๊ณผ์ •์—์„œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๋ฒ„๊ทธ๋ฅผ FakeGameRepository๋กœ๋Š” ์žก์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์‹ค์ œ DB ์—ฐ๋™ ํ…Œ์ŠคํŠธ(ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ)์™€ Fake ํ…Œ์ŠคํŠธ์˜ ์ ์ ˆํ•œ ๊ท ํ˜•์„ ์–ด๋–ป๊ฒŒ ์žก์•„์•ผ ํ•˜๋Š”์ง€,
๊ทธ๋ฆฌ๊ณ  ํ˜„์žฌ ๋ฏธ์…˜ ์ˆ˜์ค€์—์„œ ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ๊นŒ์ง€ ์ž‘์„ฑํ•˜๋Š” ๊ฒŒ ์ ์ ˆํ•œ์ง€ ์˜๊ฒฌ์„ ๋“ฃ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.


8. DB ์—ฐ๊ฒฐ ๋ฐฉ์‹ โ€” ๋งค ํŠธ๋žœ์žญ์…˜๋งˆ๋‹ค ์ƒˆ Connection ์ƒ์„ฑ

ํ˜„์žฌ DBConnector.getConnection()์ด ๋งค ํŠธ๋žœ์žญ์…˜๋งˆ๋‹ค ์ƒˆ ์ปค๋„ฅ์…˜์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

public static Connection getConnection() {
    return DriverManager.getConnection(URL, USER, PASSWORD);
}

์‹ค์ œ ์„œ๋น„์Šค์—์„œ๋Š” ์ปค๋„ฅ์…˜ ์ƒ์„ฑ ๋น„์šฉ์ด ๋†’์•„ HikariCP ๊ฐ™์€ ์ปค๋„ฅ์…˜ ํ’€์„ ์‚ฌ์šฉํ•˜๋Š”๋ฐ,
ํ˜„์žฌ ๋ฏธ์…˜ ์ˆ˜์ค€์—์„œ ์ปค๋„ฅ์…˜ ํ’€ ๋„์ž…์ด ํ•„์š”ํ•œ์ง€, ์•„๋‹ˆ๋ฉด ํ˜„์žฌ ๋ฐฉ์‹์œผ๋กœ ์ถฉ๋ถ„ํ•œ์ง€ ์˜๊ฒฌ์„ ๋“ฃ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

Copy link
Copy Markdown

@syoun602 syoun602 left a comment

Choose a reason for hiding this comment

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

์•ˆ๋…•ํ•˜์„ธ์š” ์•„์ดํ~

์‚ฌ์ดํด2 ์•„์ฃผ ์ž˜ ๊ตฌํ˜„ํ•ด์ฃผ์…จ๋„ค์š” ๐Ÿ‘ ์งˆ๋ฌธ์— ๋Œ€ํ•œ ๋Œ€๋‹ต์€ ์ฝ”๋ฉ˜ํŠธ์— ๋‚จ๊ฒจ๋†“์•˜์œผ๋‹ˆ ํ™•์ธ ๋ถ€ํƒ๋“œ๋ ค์š”~

๋˜ํ•œ, ์›ํ™œํ•œ 2๋‹จ๊ณ„ ๋ฆฌ๋ทฐ๋ฅผ ์œ„ํ•ด step1์ด ๋จธ์ง€๋œ ๋ธŒ๋žœ์น˜๋ฅผ ๊ธฐ์ค€์œผ๋กœ rebaseํ•ด์„œ ์ œ์ถœํ•ด์ฃผ์„ธ์š”. ํ˜„์žฌ๋Š” 1๋‹จ๊ณ„ ๊ตฌํ˜„ ๋‚ด์šฉ๋„ ํ•จ๊ป˜ ๋ณด์—ฌ์„œ ์ด๋ฒˆ ๋‹จ๊ณ„์—์„œ ์‹ค์ œ๋กœ ์–ด๋–ค ๋ถ€๋ถ„์ด ํ™•์žฅ๋˜์—ˆ๋Š”์ง€ ๋ณด๋ ค๋ฉด ์ œ๊ฐ€ ์ง์ ‘ ์ปค๋ฐ‹์„ ์ œ์–ดํ•ด์•ผ ํ•˜๋Š”๋ฐ, rebase์˜ ์žฅ์ ์„ ํ•œ๋ฒˆ ์ฐพ์•„๋ด…์‹œ๋‹ค.

๋‹ค์Œ ์š”์ฒญ ์ „์— ์ ์šฉ ๋ถ€ํƒ๋“œ๋ ค์š” ๐Ÿ˜€

Comment on lines +19 to +25
private Board(Map<Position, Piece> pieces) {
this.pieces = pieces;
}

public static Board from(Map<Position, Piece> pieces) {
return new Board(pieces);
}
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

public ์ƒ์„ฑ์ž๋ฅผ ์—ด์–ด๋‘๋Š” ๊ฒƒ๊ณผ ์ •์  ํŒฉํ„ฐ๋ฆฌ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์–ด๋–ค ์ฐจ์ด๊ฐ€ ์žˆ๋‚˜์š”?

Copy link
Copy Markdown
Author

@e9ua1 e9ua1 Apr 10, 2026

Choose a reason for hiding this comment

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

public ์ƒ์„ฑ์ž๋ฅผ ์—ด์–ด๋‘๋Š” ๊ฒƒ๊ณผ ์ •์  ํŒฉํ„ฐ๋ฆฌ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์–ด๋–ค ์ฐจ์ด๊ฐ€ ์žˆ๋‚˜์š”?

public ์ƒ์„ฑ์ž๋Š” ๋ˆ„๊ตฌ๋‚˜ new Board(pieces)๋กœ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์–ด์„œ ์ƒ์„ฑ ๋ฐฉ์‹์„ ์ œ์–ดํ•˜๊ธฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค.
์ •์  ํŒฉํ† ๋ฆฌ ๋ฉ”์„œ๋“œ Board.from(pieces)๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ƒ์„ฑ ์˜๋„๋ฅผ ๋ช…ํ™•ํžˆ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๊ณ ,
์ดํ›„ ์บ์‹ฑ์ด๋‚˜ ๊ฒ€์ฆ ๋กœ์ง ์ถ”๊ฐ€ ์‹œ ํŒฉํ† ๋ฆฌ ๋ฉ”์„œ๋“œ ๋‚ด๋ถ€๋งŒ ์ˆ˜์ •ํ•˜๋ฉด ๋˜์–ด ๋ณ€๊ฒฝ์— ๋” ์œ ์—ฐํ•ฉ๋‹ˆ๋‹ค.
๋˜ํ•œ ์ƒ์„ฑ์ž๋ฅผ private์œผ๋กœ ์ œํ•œํ•ด ์ดˆ๊ธฐ ์ƒ์„ฑ(BoardFactory)๊ณผ ๋ณต์›(Repository) ๊ฒฝ๋กœ๋ฅผ ํ†ตํ•ด์„œ๋งŒ ์ƒ์„ฑ๋˜๋„๋ก ๊ฐ•์ œํ•  ์ˆ˜ ์žˆ์–ด, ์ƒ์„ฑ ๊ฒฝ๋กœ๋ฅผ ๋ช…ํ™•ํ•˜๊ฒŒ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์—์„œ ์„ ํƒํ–ˆ์Šต๋‹ˆ๋‹ค.

return showBoard();
}

public Score calculateScore(Team team) {
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

๋กœ์ง์„ ๋„ˆ๋ฌด ํฉ์–ด์ ธ ์žˆ๋Š” ๊ฒƒ ๊ฐ™์•„์š”. ๊ธฐ๋ฌผ ์ ์ˆ˜๋Š” pieceType์ด, ํ•ฉ์‚ฐ์€ board๊ฐ€, ๋ค ์ ์šฉ์€ score๊ฐ€ ํ•˜๊ณ  ์ตœ์ข… ์ŠนํŒจ๋Š” game์ด ์ง„ํ–‰ํ•˜๊ณ  ์žˆ์–ด์š”. ๋ˆ„๊ตฌ์—๊ฒŒ ์–ด๋–ป๊ฒŒ ์ œ๊ณตํ•ด์„œ ์—ญํ• ์„ ์ข€ ๋” ๋ชจ์•„๋ณผ ์ˆ˜ ์žˆ์„์ง€ ๊ณ ๋ฏผํ•ด๋ด…์‹œ๋‹ค.

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.

๋กœ์ง์„ ๋„ˆ๋ฌด ํฉ์–ด์ ธ ์žˆ๋Š” ๊ฒƒ ๊ฐ™์•„์š”. ๊ธฐ๋ฌผ ์ ์ˆ˜๋Š” pieceType์ด, ํ•ฉ์‚ฐ์€ board๊ฐ€, ๋ค ์ ์šฉ์€ score๊ฐ€ ํ•˜๊ณ  ์ตœ์ข… ์ŠนํŒจ๋Š” game์ด ์ง„ํ–‰ํ•˜๊ณ  ์žˆ์–ด์š”. ๋ˆ„๊ตฌ์—๊ฒŒ ์–ด๋–ป๊ฒŒ ์ œ๊ณตํ•ด์„œ ์—ญํ• ์„ ์ข€ ๋” ๋ชจ์•„๋ณผ ์ˆ˜ ์žˆ์„์ง€ ๊ณ ๋ฏผํ•ด๋ด…์‹œ๋‹ค.

์ ์ˆ˜ ๊ณ„์‚ฐ ์ฑ…์ž„์ด PieceType, Board, Score, JanggiGame์— ๋ถ„์‚ฐ๋˜์–ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.
ScoreResult ๊ฐ์ฒด๋ฅผ ๋„์ž…ํ•ด ๋‘ ํŒ€์˜ ์ ์ˆ˜์™€ ์ŠนํŒจ ํŒ์ •(isHanWin, isChoWin, isDraw)์„ ํ•œ ๊ณณ์œผ๋กœ ์‘์ง‘ํ–ˆ์Šต๋‹ˆ๋‹ค. Board.calculateScoreResult()๊ฐ€ ์ตœ์ข… ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ , JanggiGame์€ ์ถœ๋ ฅ๋งŒ ๋‹ด๋‹นํ•˜๋„๋ก ๊ฐœ์„ ํ–ˆ์Šต๋‹ˆ๋‹ค.

.filter(piece -> piece.isSame(team))
.mapToInt(piece -> piece.getType().getScore())
.sum();
Score score = Score.of(sum);
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

์ด ๋ถ€๋ถ„๋„ ๊ทธ๋ ‡๊ณ  ์ „๋ฐ˜์ ์œผ๋กœ ์ •์  ํŒฉํ„ฐ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์‹œ๋Š” ์ด์œ ๊ฐ€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.
new Score(10) vs Score.from(10)

๋˜ํ•œ, from ๊ณผ of ์‚ฌ์šฉ์— ๊ธฐ์ค€์ด ์—†๋Š” ๊ฒƒ ๊ฐ™๋„ค์š”

Copy link
Copy Markdown
Author

@e9ua1 e9ua1 Apr 10, 2026

Choose a reason for hiding this comment

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

์ด ๋ถ€๋ถ„๋„ ๊ทธ๋ ‡๊ณ  ์ „๋ฐ˜์ ์œผ๋กœ ์ •์  ํŒฉํ„ฐ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์‹œ๋Š” ์ด์œ ๊ฐ€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. new Score(10) vs Score.from(10)

๋˜ํ•œ, from ๊ณผ of ์‚ฌ์šฉ์— ๊ธฐ์ค€์ด ์—†๋Š” ๊ฒƒ ๊ฐ™๋„ค์š”

์ •์  ํŒฉํ† ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•œ ์ด์œ ๋Š” ์ƒ์„ฑ์ž๋ฅผ private์œผ๋กœ ์ œํ•œํ•˜์—ฌ ์ƒ์„ฑ ๊ฒฝ๋กœ๋ฅผ ๋ช…ํ™•ํžˆ ํ•˜๊ณ ,
์ดํ›„ ๊ฒ€์ฆ์ด๋‚˜ ์บ์‹ฑ ๋กœ์ง ์ถ”๊ฐ€ ์‹œ ๋‚ด๋ถ€๋งŒ ์ˆ˜์ •ํ•˜๋ฉด ๋˜๋Š” ์œ ์—ฐํ•จ์„ ์–ป๊ธฐ ์œ„ํ•ด์„œ์ž…๋‹ˆ๋‹ค.
of์™€ from์˜ ์‚ฌ์šฉ ๊ธฐ์ค€์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
of๋Š” ์ธ์ž๋ฅผ ๊ทธ๋Œ€๋กœ ๊ฐ์Œ€ ๋•Œ (์˜ˆ: Score.of(72.5), Position.of(1, 5)),
from์€ ๋ณ€ํ™˜์ด ์ˆ˜๋ฐ˜๋  ๋•Œ (์˜ˆ: Position.from("25") โ†’ ๋ฌธ์ž์—ด ํŒŒ์‹ฑ, Board.from(map))๋กœ ๊ตฌ๋ถ„ํ•˜์—ฌ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

์šฐ์„  ๊ฒ€์ฆ์— ๋Œ€ํ•ด์„œ๋Š” ๋ง์”€ํ•˜์‹  ๊ฒƒ์ฒ˜๋Ÿผ ์ƒ์„ฑ ๊ฒฝ๋กœ๋ฅผ ํ†ต์ œํ•˜๊ณ  ์‹ถ๋”๋ผ๋„ ๊ฒฐ๊ตญ ์ฃผ์ƒ์„ฑ์ž์—์„œ ํ•ญ์ƒ ๊ฒ€์ฆํ•ด์•ผ ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•ด์š”. ์ฃผ์ƒ์„ฑ์ž๋Š” ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค๋”๋ผ๋„ ํ•ญ์ƒ ๊ฑฐ์น˜๊ฒŒ ๋˜๋Š” ๋งˆ์ง€๋ง‰ ๋ณดํ˜ธ ์žฅ์น˜๋‹ˆ๊นŒ์š”. ๊ทธ๋ฆฌ๊ณ  ์บ์‹ฑ์€ ์ง€๊ธˆ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์ง€ ์•Š์€๋ฐ, ๊ทธ๊ฑธ ๊ณ ๋ คํ•œ๋‹ค๋Š”๊ฒŒ ํฌ๊ฒŒ ์™€๋‹ฟ์ง€๋Š” ์•Š๋„ค์š”.

๋งˆ์ง€๋ง‰์œผ๋กœ of์™€ from์˜ ๊ธฐ์ค€ ์ž์ฒด๋Š” ์ถฉ๋ถ„ํžˆ ์ดํ•ด๋˜์ง€๋งŒ, ํ˜„์žฌ ์ฝ”๋“œ์—์„œ ์ด ์ด๋ฆ„๋“ค์ด ์ •๋ง ์ƒ์„ฑ ์˜๋„๋ฅผ ์ž˜ ๋“œ๋Ÿฌ๋‚ด๊ณ  ์žˆ๋Š”์ง€๋Š” ํ•œ ๋ฒˆ ๋” ์ƒ๊ฐํ•ด๋ณด๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์•„์š”. ์ €๋Š” ๊ฐœ์ธ์ ์œผ๋กœ ๋ฌด๋ถ„๋ณ„ํ•˜๊ฒŒ ์ •์  ํŒฉํ„ฐ๋ฆฌ ๋ฉ”์„œ๋“œ๋ฅผ ๋Š˜๋ฆฌ๊ธฐ๋ณด๋‹ค๋Š” ํ•˜๋‚˜์˜ ์•ˆ์ „ํ•œ ์ฃผ์ƒ์„ฑ์ž๋ฅผ ๋‘๊ณ  ํ•„์š”ํ•œ ๊ฒฝ์šฐ์—๋งŒ ์˜๋ฏธ ์žˆ๋Š” ๋ถ€์ƒ์„ฑ์ž๋‚˜ ์ •์  ํŒฉํ„ฐ๋ฆฌ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ์‹์„ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค. ์ง€๊ธˆ Score๋งŒ ๋ดค์„๋•Œ ์ •์  ํŒฉํ„ฐ๋ฆฌ์˜ ์–ด๋–ค ์žฅ์ ์ด ๋…น์•„๋“ค์—ˆ๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

๋‹จ์ˆœํžˆ ์ดํŽ™ํ‹ฐ๋ธŒ ์ž๋ฐ”์—์„œ ์ •์  ํŒฉํ„ฐ๋ฆฌ๋ฅผ ์„ ํ˜ธํ•œ๋‹ค๊ณ  ํ•ด์„œ ์ผ๊ด„์ ์œผ๋กœ ์ ์šฉํ•˜๊ธฐ๋ณด๋‹ค๋Š” ์™œ ์ด ๊ฒฝ์šฐ์— ์ƒ์„ฑ์ž๋ณด๋‹ค ์ •์  ํŒฉํ„ฐ๋ฆฌ๊ฐ€ ๋” ์ ์ ˆํ•œ์ง€๊นŒ์ง€ ํ•จ๊ป˜ ์„ค๋ช… ๊ฐ€๋Šฅํ•ด์•ผ ์˜๋ฏธ๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ด์š”. ์ดํŽ™ํ‹ฐ๋ธŒ ์ž๋ฐ”์—์„œ ๋งํ•˜๋Š” ์ •์  ํŒฉํ„ฐ๋ฆฌ๋„ ํ•ญ์ƒ ์ƒ์„ฑ์ž๋ณด๋‹ค ์šฐ์›”ํ•˜๋‹ค๋Š” ์ทจ์ง€๋ผ๊ธฐ๋ณด๋‹ค, ์ด๋ฆ„์„ ๋ถ€์—ฌํ•  ์ˆ˜ ์žˆ๊ณ  ์ƒ์„ฑ ๋ฐฉ์‹์„ ํ†ต์ œํ•  ์ˆ˜ ์žˆ๋Š” ๋“ฑ ๋ถ„๋ช…ํ•œ ์ด์ ์ด ์žˆ์„ ๋•Œ ์„ ํƒ์ง€๋กœ ๊ณ ๋ คํ•˜๋ผ๋Š” ์˜๋ฏธ๋ผ๊ณ  ์ƒ๊ฐํ•ด์š”.

}

protected void validatePalaceMove(Position from, Position to, String errorMessage) {
Palace palace = ownPalace();
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

์šฐ์„  ๋ฉ”์„œ๋“œ ์ด๋ฆ„์ด palace๋ฅผ ๋ฐ˜ํ™˜ํ•  ๊ฒƒ ๊ฐ™์€ ๋А๋‚Œ์€ ์•ˆ๋“ค์–ด์š” ๐Ÿค”

๊ณ ๋ฏผํ•ด๋ณผ ํฌ์ธํŠธ๋Š” AbstractPiece์— ownPalace()๊ฐ€ ๋“ค์–ด๊ฐ€๋ฉด์„œ, ์ƒ์œ„ ํƒ€์ž…์ด ํŒ€๋ฟ ์•„๋‹ˆ๋ผ ๊ถ์„ฑ์ด๋ผ๋Š” ๋น„๊ต์  ๊ตฌ์ฒด์ ์ธ ์žฅ๊ธฐ ๊ทœ์น™๊นŒ์ง€ ํ•จ๊ป˜ ์•Œ๊ณ  ์žˆ๋Š” ๊ตฌ์กฐ๊ฐ€ ๋์–ด์š”. ํ˜„์žฌ ๊ทœ๋ชจ์—์„œ๋Š” ๊ตฌํ˜„์„ ๋‹จ์ˆœํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ์žฅ์ ๋„ ์žˆ์ง€๋งŒ, ์ถ”์ƒ ๊ธฐ๋ฌผ์˜ ์ฑ…์ž„์„ ์–ด๋””๊นŒ์ง€๋กœ ๋ณผ์ง€์— ๋”ฐ๋ผ ์ด๋Ÿฐ ์ง€์‹์„ ๊ณ„์† ์ƒ์œ„ ํƒ€์ž…์— ๋‘˜์ง€ ํ•œ ๋ฒˆ ๋” ๊ณ ๋ฏผ ์ •๋„๋Š” ํ•ด๋ณด๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™๋„ค์š”.

์˜ˆ๋ฅผ ๋“ค์–ด ํŒ€๊ณผ ๊ถ์„ฑ์˜ ๋Œ€์‘ ์ฑ…์ž„์„ Palace ์ชฝ์œผ๋กœ ์˜ฎ๊ธฐ๋Š” ๋ฐฉํ–ฅ๋„ ์žˆ์„ ๊ฒƒ ๊ฐ™์•„์š”. ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด, palace์—๊ฒŒ team์„ ์ฃผ๊ณ  ์ง„์˜์„ ๋ฐ›๋Š” ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ๋Š”๊ฒŒ ๋” ์ฝ๊ธฐ ์ข‹์•„๋ณด์ž…๋‹ˆ๋‹ค.

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.

์šฐ์„  ๋ฉ”์„œ๋“œ ์ด๋ฆ„์ด palace๋ฅผ ๋ฐ˜ํ™˜ํ•  ๊ฒƒ ๊ฐ™์€ ๋А๋‚Œ์€ ์•ˆ๋“ค์–ด์š” ๐Ÿค”

๊ณ ๋ฏผํ•ด๋ณผ ํฌ์ธํŠธ๋Š” AbstractPiece์— ownPalace()๊ฐ€ ๋“ค์–ด๊ฐ€๋ฉด์„œ, ์ƒ์œ„ ํƒ€์ž…์ด ํŒ€๋ฟ ์•„๋‹ˆ๋ผ ๊ถ์„ฑ์ด๋ผ๋Š” ๋น„๊ต์  ๊ตฌ์ฒด์ ์ธ ์žฅ๊ธฐ ๊ทœ์น™๊นŒ์ง€ ํ•จ๊ป˜ ์•Œ๊ณ  ์žˆ๋Š” ๊ตฌ์กฐ๊ฐ€ ๋์–ด์š”. ํ˜„์žฌ ๊ทœ๋ชจ์—์„œ๋Š” ๊ตฌํ˜„์„ ๋‹จ์ˆœํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ์žฅ์ ๋„ ์žˆ์ง€๋งŒ, ์ถ”์ƒ ๊ธฐ๋ฌผ์˜ ์ฑ…์ž„์„ ์–ด๋””๊นŒ์ง€๋กœ ๋ณผ์ง€์— ๋”ฐ๋ผ ์ด๋Ÿฐ ์ง€์‹์„ ๊ณ„์† ์ƒ์œ„ ํƒ€์ž…์— ๋‘˜์ง€ ํ•œ ๋ฒˆ ๋” ๊ณ ๋ฏผ ์ •๋„๋Š” ํ•ด๋ณด๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™๋„ค์š”.

์˜ˆ๋ฅผ ๋“ค์–ด ํŒ€๊ณผ ๊ถ์„ฑ์˜ ๋Œ€์‘ ์ฑ…์ž„์„ Palace ์ชฝ์œผ๋กœ ์˜ฎ๊ธฐ๋Š” ๋ฐฉํ–ฅ๋„ ์žˆ์„ ๊ฒƒ ๊ฐ™์•„์š”. ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด, palace์—๊ฒŒ team์„ ์ฃผ๊ณ  ์ง„์˜์„ ๋ฐ›๋Š” ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ๋Š”๊ฒŒ ๋” ์ฝ๊ธฐ ์ข‹์•„๋ณด์ž…๋‹ˆ๋‹ค.

ํŒ€๊ณผ ๊ถ์„ฑ์˜ ๋งคํ•‘ ์ฑ…์ž„์„ Palace.of(Team)์œผ๋กœ ์ด๋™ํ–ˆ์Šต๋‹ˆ๋‹ค.
ownPalace()๋Š” Palace.of(team)์— ์œ„์ž„๋งŒ ํ•˜๋Š” ํ˜•ํƒœ๋กœ ๋‹จ์ˆœํ™”ํ•˜์—ฌ,
AbstractPiece๊ฐ€ ๊ถ์„ฑ ๊ทœ์น™์˜ ์„ธ๋ถ€์‚ฌํ•ญ์„ ์ง์ ‘ ์•Œ์ง€ ์•Š๋„๋ก ๊ฐœ์„ ํ–ˆ์Šต๋‹ˆ๋‹ค.

private final long gameId;

private JanggiGame(Board board) {
private JanggiGame(Board board, GameRepository gameRepository, long gameId) {
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

JanggiGame์€ ์•„์ดํ๊ฐ€ ์ƒ๊ฐํ–ˆ์„๋•Œ ๋„๋ฉ”์ธ์ธ๊ฐ€์š”? ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ณ„์ธต์ธ๊ฐ€์š”?

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์€ ์•„์ดํ๊ฐ€ ์ƒ๊ฐํ–ˆ์„๋•Œ ๋„๋ฉ”์ธ์ธ๊ฐ€์š”? ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ณ„์ธต์ธ๊ฐ€์š”?

JanggiGame์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ณ„์ธต์œผ๋กœ ๋ณด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
๊ฒŒ์ž„์˜ ํ๋ฆ„ ์ œ์–ด(play, progressTurn)์™€ ์ž…์ถœ๋ ฅ(InputView, OutputView) ์‚ฌ์ด๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ์—ญํ• ์„ ํ•˜๊ณ  ์žˆ์–ด,
์ˆœ์ˆ˜ํ•œ ๋„๋ฉ”์ธ ๋กœ์ง๋ณด๋‹ค๋Š” ์œ ์Šค์ผ€์ด์Šค๋ฅผ ์กฐ์œจํ•˜๋Š” ์ฑ…์ž„์— ๊ฐ€๊น๋‹ค๊ณ  ํŒ๋‹จํ–ˆ์Šต๋‹ˆ๋‹ค.
๋‹ค๋งŒ Board, GameRepository ๊ฐ™์€ ๋„๋ฉ”์ธ ๊ฐ์ฒด์— ์ง์ ‘ ์˜์กดํ•˜๊ณ  ์žˆ์–ด ๊ฒฝ๊ณ„๊ฐ€ ๋ช…ํ™•ํ•˜์ง€ ์•Š์€ ๋ถ€๋ถ„์ด ์žˆ๋Š”๋ฐ,
์ด ๋ถ€๋ถ„์— ๋Œ€ํ•ด ์–ด๋–ป๊ฒŒ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ์ข‹์„์ง€ ์˜๊ฒฌ์„ ๋“ฃ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

์ง€๊ธˆ์€ JanggiGame์€ InputView, OutputView, GameRepository๊นŒ์ง€ ํ•จ๊ป˜ ์•Œ๊ณ  ์žˆ์–ด์„œ ์ˆœ์ˆ˜ํ•œ ๋„๋ฉ”์ธ ๊ฐ์ฒด๋ผ๊ณ  ๋ณด๊ธฐ๋Š” ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ง€๊ธˆ ๊ตฌ์กฐ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐ์ฒด๋ผ๊ณ  ์ •๋ฆฌํ•  ์ˆ˜๋„ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๊ณ  ํฌ๊ฒŒ ์ด๊ฒฌ์€ ์—†์Šต๋‹ˆ๋‹ค~

๋‹ค๋งŒ ๊ฐœ์ธ์ ์œผ๋กœ๋Š” ๊ฒŒ์ž„ ์ž์ฒด๋Š” ๋„๋ฉ”์ธ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ด์š”. ํ„ด์ด ์–ด๋–ป๊ฒŒ ์ง„ํ–‰๋˜๋Š”์ง€, ์–ธ์ œ ๊ฒŒ์ž„์ด ์ข…๋ฃŒ๋˜๋Š”์ง€, ์ด๋™์ด ์„ฑ๊ณตํ–ˆ์„ ๋•Œ ์ƒํƒœ๊ฐ€ ์–ด๋–ป๊ฒŒ ๋ฐ”๋€Œ๋Š”์ง€ ๊ฐ™์€ ํ๋ฆ„ ์ž์ฒด๊ฐ€ ์žฅ๊ธฐ ๊ทœ์น™์˜ ์ผ๋ถ€๋‹ˆ๊นŒ์š”. ๋‹จ์ˆœํžˆ ํ™”๋ฉด๊ณผ ์ €์žฅ์†Œ๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ์ ˆ์ฐจ๋ผ๊ธฐ๋ณด๋‹ค ๊ฒŒ์ž„์ด๋ผ๋Š” ๋„๋ฉ”์ธ์ด ์Šค์Šค๋กœ ์„ค๋ช…ํ•ด์•ผ ํ•˜๋Š” ์ƒํƒœ ๋ณ€ํ™”์— ๋” ๊ฐ€๊น์ง€ ์•Š๋‚˜์š”?

์˜ˆ๋ฅผ ๋“ค์–ด ์ดํ›„ ์›น ๋ฒ„์ „๊นŒ์ง€ ํ•จ๊ป˜ ๊ณ ๋ คํ•œ๋‹ค๊ณ  ํ–ˆ์„ ๋•Œ, ์ž…๋ ฅ์„ ์–ด๋–ป๊ฒŒ ๋ฐ›๊ณ  ๊ฒฐ๊ณผ๋ฅผ ์–ด๋–ป๊ฒŒ ๋ณด์—ฌ์ค„์ง€๋Š” ๋ถ„๋ช… ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ณ„์ธต์ด ๋ฐ”๋€Œ๋Š” ๋ฌธ์ œ์ธ๋ฐ, ๊ฒŒ์ž„์˜ ํ๋ฆ„ ์ž์ฒด๋Š” ๊ทธ๋Œ€๋กœ ์œ ์ง€๋˜์–ด์•ผ ํ•˜์ž–์•„์š”. ๊ทธ๋Ÿฐ๋ฐ ์ง€๊ธˆ ๊ตฌ์กฐ๋Š” ๊ทธ ํ๋ฆ„๊นŒ์ง€ InputView, OutputView, Repository์™€ ํ•œ ๊ฐ์ฒด ์•ˆ์— ๋ฌถ์—ฌ ์žˆ์–ด์„œ, ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๋ฐ”๋€Œ๋ฉด ๊ฒฐ๊ตญ ์ƒˆ๋กœ์šด ๊ฒŒ์ž„ ํ๋ฆ„ ๊ฐ์ฒด๋ฅผ ๋‹ค์‹œ ๋งŒ๋“ค๊ฒŒ ๋  ๊ฐ€๋Šฅ์„ฑ์ด ์ปค ๋ณด์—ฌ์š”. ๊ทธ๋ž˜์„œ ์ œ ๊ธฐ์ค€์—์„œ๋Š” ์ฝ˜์†”์ด๋“  ์›น์ด๋“  ์ƒ๊ด€์—†์ด ๊ณตํ†ต์œผ๋กœ ์œ ์ง€๋˜์–ด์•ผ ํ•˜๋Š” ํ„ด ์ง„ํ–‰, ์ข…๋ฃŒ ํŒ๋‹จ, ์ƒํƒœ ๋ณ€ํ™” ๊ฐ™์€ ๊ฒŒ์ž„ ๊ทœ์น™์€ ๋„๋ฉ”์ธ์— ๋‚จ๊ณ , ์ž…์ถœ๋ ฅ๊ณผ ์ €์žฅ/๋ณต๊ตฌ orchestration๋งŒ ๋ฐ”๊นฅ ๊ณ„์ธต์ด ๋งก์•„์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.


@Override
public long save(Board board, Team currentTeam) {
try (Connection conn = DBConnector.getConnection()) {
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

jdbc์‚ฌ์šฉ๊ณผ ํ•˜๋‚˜์˜ transaction์„ ๋ณด์žฅํ•œ ์  ๐Ÿ‘

  1. DB ์„ค๊ณ„ โ€” ํŠธ๋žœ์žญ์…˜ ๋‹จ์œ„ ๋ฐ ์—…๋ฐ์ดํŠธ ๋ฐฉ์‹
  2. ๊ฒŒ์ž„ ์ด๋ ฅ ๊ด€๋ฆฌ โ€” ํ˜„์žฌ ์ƒํƒœ๋งŒ ์ €์žฅ vs ์ด๋™ ๊ธฐ๋ก ๋ˆ„์ 

ํ˜„์žฌ ๋ฏธ์…˜ ๊ทœ๋ชจ์—์„œ๋Š” delete + insert๋„ ์ถฉ๋ถ„ํžˆ ํ•ฉ๋ฆฌ์ ์ธ ์„ ํƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์„ฑ๋Šฅ๋ณด๋‹ค ๊ตฌํ˜„ ๋‹จ์ˆœ์„ฑ๊ณผ ์ƒํƒœ ์ผ๊ด€์„ฑ์ด ์ง€๊ธˆ์€ ๋” ์ค‘์š”ํ•ด๋ณด์ด๊ณ , ์‹ค์ œ๋กœ ๋ณ€๊ฒฝ๋œ ๋‘ ์นธ๋งŒ updateํ•˜๋Š” ๋ฐฉ์‹์€ ๋” ํšจ์œจ์ ์ผ ์ˆ˜๋Š” ์žˆ์–ด๋„ ์ด๋™, ์บก์ฒ˜, ๋นˆ์นธ ๋ณต๊ตฌ๊นŒ์ง€ ํ•จ๊ป˜ ์„ธ์‹ฌํ•˜๊ฒŒ ๊ด€๋ฆฌํ•ด์•ผ ํ•ด์„œ ๋ณต์žก๋„๊ฐ€ ์ปค์ง„๋‹ค๊ณ  ์ƒ๊ฐํ•ด์š”. ํ˜„์žฌ ๊ทœ๋ชจ์—์„œ๋Š” ์„ฑ๋Šฅ ๋น„์šฉ๋„ ํฌ์ง€ ์•Š์•„ ๋ณด์—ฌ์„œ, ์ง€๊ธˆ ์„ ํƒ์ด ๋” ์ ์ ˆํ•˜๋‹ค๊ณ  ๋ด…๋‹ˆ๋‹ค.

๋‹ค๋งŒ ์‹ค์ œ ์„œ๋น„์Šค๋ผ๊ณ  ๊ฐ€์ •ํ•˜๋ฉด ์„ฑ๋Šฅ๋„ ํ•จ๊ป˜ ๊ณ ๋ คํ•ด์•ผ ํ•ด์š”. ๋งค ํ„ด๋งˆ๋‹ค 90๊ฐœ ๊ธฐ๋ฌผ์„ ์ „๋ถ€ delete + insertํ•˜๋Š” ๋ฐฉ์‹์€ ๊ตฌํ˜„์€ ๋‹จ์ˆœํ•˜์ง€๋งŒ, ๊ฒŒ์ž„ ์ˆ˜๊ฐ€ ๋งŽ์•„์งˆ์ˆ˜๋ก ๋ถˆํ•„์š”ํ•œ ์“ฐ๊ธฐ ๋น„์šฉ์ด ์ปค์ง€๊ธฐ๋„ ํ•˜๊ณ , ์ด๋™ ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ๋‚จ๊ธฐ๊ฑฐ๋‚˜ ๋ฌด๋ฅด๊ธฐ ๊ฐ™์€ ๊ธฐ๋Šฅ๊นŒ์ง€ ๊ณ ๋ คํ•œ๋‹ค๋ฉด ์ „์ฒด ์ƒํƒœ๋ฅผ ๋งค๋ฒˆ ๊ต์ฒดํ•˜๊ธฐ๋ณด๋‹ค๋Š” ๋ณ€๊ฒฝ๋œ ์นธ๋งŒ ๊ฐฑ์‹ ํ•˜๊ฑฐ๋‚˜ ์ด๋™ ๊ธฐ๋ก์„ ๋ณ„๋„๋กœ ๊ด€๋ฆฌํ•˜๋Š” ๊ตฌ์กฐ๊ฐ€ ๋” ์ข‹์•„๋ณด์ž…๋‹ˆ๋‹ค.

๊ฒฐ๊ตญ ์ด๋Ÿฐ ๋ถ€๋ถ„์€ ํ•ญ์ƒ ํ˜„์žฌ ๊ทœ๋ชจ์™€ ์š”๊ตฌ์‚ฌํ•ญ์„ ํ•จ๊ป˜ ๊ณ ๋ คํ•ด์„œ ๋ณธ์ธ์ด ์„ ํƒํ•˜๋Š” ๋ถ€๋ถ„์ด๋ผ๊ณ  ์ƒ๊ฐํ•ด์š”

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.

jdbc์‚ฌ์šฉ๊ณผ ํ•˜๋‚˜์˜ transaction์„ ๋ณด์žฅํ•œ ์  ๐Ÿ‘

  1. DB ์„ค๊ณ„ โ€” ํŠธ๋žœ์žญ์…˜ ๋‹จ์œ„ ๋ฐ ์—…๋ฐ์ดํŠธ ๋ฐฉ์‹
  2. ๊ฒŒ์ž„ ์ด๋ ฅ ๊ด€๋ฆฌ โ€” ํ˜„์žฌ ์ƒํƒœ๋งŒ ์ €์žฅ vs ์ด๋™ ๊ธฐ๋ก ๋ˆ„์ 

ํ˜„์žฌ ๋ฏธ์…˜ ๊ทœ๋ชจ์—์„œ๋Š” delete + insert๋„ ์ถฉ๋ถ„ํžˆ ํ•ฉ๋ฆฌ์ ์ธ ์„ ํƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์„ฑ๋Šฅ๋ณด๋‹ค ๊ตฌํ˜„ ๋‹จ์ˆœ์„ฑ๊ณผ ์ƒํƒœ ์ผ๊ด€์„ฑ์ด ์ง€๊ธˆ์€ ๋” ์ค‘์š”ํ•ด๋ณด์ด๊ณ , ์‹ค์ œ๋กœ ๋ณ€๊ฒฝ๋œ ๋‘ ์นธ๋งŒ updateํ•˜๋Š” ๋ฐฉ์‹์€ ๋” ํšจ์œจ์ ์ผ ์ˆ˜๋Š” ์žˆ์–ด๋„ ์ด๋™, ์บก์ฒ˜, ๋นˆ์นธ ๋ณต๊ตฌ๊นŒ์ง€ ํ•จ๊ป˜ ์„ธ์‹ฌํ•˜๊ฒŒ ๊ด€๋ฆฌํ•ด์•ผ ํ•ด์„œ ๋ณต์žก๋„๊ฐ€ ์ปค์ง„๋‹ค๊ณ  ์ƒ๊ฐํ•ด์š”. ํ˜„์žฌ ๊ทœ๋ชจ์—์„œ๋Š” ์„ฑ๋Šฅ ๋น„์šฉ๋„ ํฌ์ง€ ์•Š์•„ ๋ณด์—ฌ์„œ, ์ง€๊ธˆ ์„ ํƒ์ด ๋” ์ ์ ˆํ•˜๋‹ค๊ณ  ๋ด…๋‹ˆ๋‹ค.

๋‹ค๋งŒ ์‹ค์ œ ์„œ๋น„์Šค๋ผ๊ณ  ๊ฐ€์ •ํ•˜๋ฉด ์„ฑ๋Šฅ๋„ ํ•จ๊ป˜ ๊ณ ๋ คํ•ด์•ผ ํ•ด์š”. ๋งค ํ„ด๋งˆ๋‹ค 90๊ฐœ ๊ธฐ๋ฌผ์„ ์ „๋ถ€ delete + insertํ•˜๋Š” ๋ฐฉ์‹์€ ๊ตฌํ˜„์€ ๋‹จ์ˆœํ•˜์ง€๋งŒ, ๊ฒŒ์ž„ ์ˆ˜๊ฐ€ ๋งŽ์•„์งˆ์ˆ˜๋ก ๋ถˆํ•„์š”ํ•œ ์“ฐ๊ธฐ ๋น„์šฉ์ด ์ปค์ง€๊ธฐ๋„ ํ•˜๊ณ , ์ด๋™ ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ๋‚จ๊ธฐ๊ฑฐ๋‚˜ ๋ฌด๋ฅด๊ธฐ ๊ฐ™์€ ๊ธฐ๋Šฅ๊นŒ์ง€ ๊ณ ๋ คํ•œ๋‹ค๋ฉด ์ „์ฒด ์ƒํƒœ๋ฅผ ๋งค๋ฒˆ ๊ต์ฒดํ•˜๊ธฐ๋ณด๋‹ค๋Š” ๋ณ€๊ฒฝ๋œ ์นธ๋งŒ ๊ฐฑ์‹ ํ•˜๊ฑฐ๋‚˜ ์ด๋™ ๊ธฐ๋ก์„ ๋ณ„๋„๋กœ ๊ด€๋ฆฌํ•˜๋Š” ๊ตฌ์กฐ๊ฐ€ ๋” ์ข‹์•„๋ณด์ž…๋‹ˆ๋‹ค.

๊ฒฐ๊ตญ ์ด๋Ÿฐ ๋ถ€๋ถ„์€ ํ•ญ์ƒ ํ˜„์žฌ ๊ทœ๋ชจ์™€ ์š”๊ตฌ์‚ฌํ•ญ์„ ํ•จ๊ป˜ ๊ณ ๋ คํ•ด์„œ ๋ณธ์ธ์ด ์„ ํƒํ•˜๋Š” ๋ถ€๋ถ„์ด๋ผ๊ณ  ์ƒ๊ฐํ•ด์š”

ํ˜„์žฌ ๊ทœ๋ชจ์—์„œ delete + insert ๋ฐฉ์‹์ด ์ ์ ˆํ•˜๋‹ค๋Š” ์  ๋™์˜ํ•ฉ๋‹ˆ๋‹ค.
์ดํ›„ ์ด๋™ ํžˆ์Šคํ† ๋ฆฌ๋‚˜ ๋ฌด๋ฅด๊ธฐ ๊ธฐ๋Šฅ์ด ํ•„์š”ํ•ด์ง€๋Š” ์‹œ์ ์— movement ํ…Œ์ด๋ธ” ๋„์ž…์„ ๊ณ ๋ คํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

import java.util.Map;
import java.util.Optional;

public class GameRepositoryImpl implements GameRepository {
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

  1. Repository ํŒจํ„ด โ€” DAO ์—†์ด ๊ตฌํ˜„์ฒด์—์„œ ์ง์ ‘ JDBC ์ฒ˜๋ฆฌ

Dao์™€ repository์˜ ์ฐจ์ด๊ฐ€ ๋ญ”๊ฐ€์š”? ์ฐจ์ด๋ฅผ ๋ช…ํ™•ํžˆ ์•Œ๊ณ  ์„ค๊ณ„ํ–ˆ๋‹ค๋ฉด ์ด๊ฒฌ ์—†์Šต๋‹ˆ๋‹ค ๐Ÿ˜€

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.

  1. Repository ํŒจํ„ด โ€” DAO ์—†์ด ๊ตฌํ˜„์ฒด์—์„œ ์ง์ ‘ JDBC ์ฒ˜๋ฆฌ

Dao์™€ repository์˜ ์ฐจ์ด๊ฐ€ ๋ญ”๊ฐ€์š”? ์ฐจ์ด๋ฅผ ๋ช…ํ™•ํžˆ ์•Œ๊ณ  ์„ค๊ณ„ํ–ˆ๋‹ค๋ฉด ์ด๊ฒฌ ์—†์Šต๋‹ˆ๋‹ค ๐Ÿ˜€

DAO๋Š” ํŠน์ • ํ…Œ์ด๋ธ” ๋‹จ์œ„์˜ CRUD์— ์ง‘์ค‘ํ•˜๋ฉฐ ResultSet ๊ฐ™์€ DB ๊ตฌํ˜„ ์„ธ๋ถ€์‚ฌํ•ญ์„ ์ง์ ‘ ๋‹ค๋ฃจ๋Š” ๋ฐ˜๋ฉด,
Repository๋Š” ๋„๋ฉ”์ธ ๊ฐ์ฒด ๋‹จ์œ„๋กœ ์ถ”์ƒํ™”ํ•˜์—ฌ ์ €์žฅ์†Œ์˜ ๊ตฌํ˜„ ๋ฐฉ์‹์„ ์ˆจ๊น๋‹ˆ๋‹ค.
ํ˜„์žฌ GameRepositoryImpl์€ ์ธํ„ฐํŽ˜์ด์Šค(GameRepository)๋กœ ๋„๋ฉ”์ธ๊ณผ ๊ฒฝ๊ณ„๋ฅผ ๋‚˜๋ˆ„๊ณ ,
๋‚ด๋ถ€์—์„œ JDBC๋ฅผ ์ง์ ‘ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค. DAO๋ฅผ ๋ณ„๋„๋กœ ๋‘๋ฉด ๊ณ„์ธต์ด ๋” ๋ช…ํ™•ํ•ด์ง€์ง€๋งŒ,
ํ˜„์žฌ ๋ฏธ์…˜ ๊ทœ๋ชจ์—์„œ๋Š” ๋‹จ์ผ ๊ตฌํ˜„์ฒด ์•ˆ์—์„œ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ๋ณต์žก๋„ ๋Œ€๋น„ ์‹ค์ต์ด ํฌ์ง€ ์•Š๋‹ค๊ณ  ํŒ๋‹จํ•ด
Repository ๊ตฌํ˜„์ฒด๊ฐ€ JDBC๊นŒ์ง€ ๋‹ด๋‹นํ•˜๋„๋ก ํ–ˆ์Šต๋‹ˆ๋‹ค.

throw new IllegalArgumentException("[ERROR] ์•Œ ์ˆ˜ ์—†๋Š” ๊ธฐ๋ฌผ ํƒ€์ž…์ž…๋‹ˆ๋‹ค: " + type);
}

public static String toTeamString(Piece piece) {
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

  1. EmptyPiece์˜ ํŒ€ ์ €์žฅ ๋ฐฉ์‹

๋‘ ๋ฐฉ์‹ ์ค‘์— ์•„์ดํ๊ฐ€ ์ƒ๊ฐํ•œ ์žฅ๋‹จ์ ์€ ๋ฌด์—‡์ด๊ณ  ์™œ ํ˜„์žฌ์˜ ์Šค๋ƒ…์ƒท ๋ฐฉ์‹์„ ์„ ํƒํ–ˆ๋Š”์ง€ ์•Œ๋ ค์ฃผ์„ธ์š”

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.

  1. EmptyPiece์˜ ํŒ€ ์ €์žฅ ๋ฐฉ์‹

๋‘ ๋ฐฉ์‹ ์ค‘์— ์•„์ดํ๊ฐ€ ์ƒ๊ฐํ•œ ์žฅ๋‹จ์ ์€ ๋ฌด์—‡์ด๊ณ  ์™œ ํ˜„์žฌ์˜ ์Šค๋ƒ…์ƒท ๋ฐฉ์‹์„ ์„ ํƒํ–ˆ๋Š”์ง€ ์•Œ๋ ค์ฃผ์„ธ์š”

๋‘ ๋ฐฉ์‹์˜ ์žฅ๋‹จ์ ์„ ๋น„๊ตํ–ˆ์„ ๋•Œ, ํฌ์†Œ ํ‘œํ˜„(์‹ค์ œ ๊ธฐ๋ฌผ๋งŒ ์ €์žฅ) ๋ฐฉ์‹์€ ์ €์žฅ ๊ณต๊ฐ„์„ ์ ˆ์•ฝํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋ณต์› ์‹œ ์—†๋Š” ์นธ์„ EmptyPiece๋กœ ์ฑ„์šฐ๋Š” ๋ณ„๋„ ๋กœ์ง์ด ํ•„์š”ํ•˜๊ณ ,
null ์ฒดํฌ๊ฐ€ ๊ณณ๊ณณ์— ์ƒ๊ธธ ์ˆ˜ ์žˆ์–ด EmptyPiece๋ผ๋Š” Null Object ํŒจํ„ด์˜ ์žฅ์ ์ด ํฌ์„๋œ๋‹ค๊ณ  ํŒ๋‹จํ–ˆ์Šต๋‹ˆ๋‹ค.
ํ˜„์žฌ ๋ฐฉ์‹(์ „์ฒด ์ €์žฅ)์€ 90์นธ์„ ๋ชจ๋‘ ์ €์žฅํ•˜๋Š” ๋น„์šฉ์ด ์žˆ์ง€๋งŒ,
๋ณต์› ์‹œ ํ•ญ์ƒ ์™„์ „ํ•œ ๋ณด๋“œ ์ƒํƒœ๋ฅผ ๋ณด์žฅํ•˜๊ณ  EmptyPiece์˜ ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์–ด
ํ˜„์žฌ ๊ทœ๋ชจ์—์„œ๋Š” ๋” ์ ํ•ฉํ•˜๋‹ค๊ณ  ํŒ๋‹จํ•ด ์„ ํƒํ–ˆ์Šต๋‹ˆ๋‹ค.

e9ua1 added 29 commits April 10, 2026 22:21
- canMoveOnDiagonalInAnyPalace โ†’ isDiagonalMove๋กœ ๋„ค์ด๋ฐ ๊ฐœ์„ 
- getDiagonalPathInAnyPalace โ†’ getDiagonalPath๋กœ ๋„ค์ด๋ฐ ๊ฐœ์„ 
- AbstractPiece์— validatePalaceMove() ์ถ”์ถœ
- General/Guard์˜ ์ค‘๋ณต๋œ ๊ถ์„ฑ ์ด๋™ ๊ฒ€์ฆ ๋กœ์ง ์ œ๊ฑฐ
e9ua1 added 2 commits April 10, 2026 22:23
- ScoreResult ๋„๋ฉ”์ธ ๊ฐ์ฒด ์ถ”๊ฐ€ (hanScore, choScore, ์ŠนํŒจ ํŒ์ •)
- Board.calculateScoreResult()๋กœ ๋‘ ํŒ€ ์ ์ˆ˜๋ฅผ ํ•œ๋ฒˆ์— ๋ฐ˜ํ™˜
- JanggiGame์˜ ์ŠนํŒจ ํŒ์ • ๋กœ์ง์„ ScoreResult์— ์œ„์ž„
@e9ua1
Copy link
Copy Markdown
Author

e9ua1 commented Apr 10, 2026

์•ˆ๋…•ํ•˜์„ธ์š” ์•„์ดํ~

์‚ฌ์ดํด2 ์•„์ฃผ ์ž˜ ๊ตฌํ˜„ํ•ด์ฃผ์…จ๋„ค์š” ๐Ÿ‘ ์งˆ๋ฌธ์— ๋Œ€ํ•œ ๋Œ€๋‹ต์€ ์ฝ”๋ฉ˜ํŠธ์— ๋‚จ๊ฒจ๋†“์•˜์œผ๋‹ˆ ํ™•์ธ ๋ถ€ํƒ๋“œ๋ ค์š”~

๋˜ํ•œ, ์›ํ™œํ•œ 2๋‹จ๊ณ„ ๋ฆฌ๋ทฐ๋ฅผ ์œ„ํ•ด step1์ด ๋จธ์ง€๋œ ๋ธŒ๋žœ์น˜๋ฅผ ๊ธฐ์ค€์œผ๋กœ rebaseํ•ด์„œ ์ œ์ถœํ•ด์ฃผ์„ธ์š”. ํ˜„์žฌ๋Š” 1๋‹จ๊ณ„ ๊ตฌํ˜„ ๋‚ด์šฉ๋„ ํ•จ๊ป˜ ๋ณด์—ฌ์„œ ์ด๋ฒˆ ๋‹จ๊ณ„์—์„œ ์‹ค์ œ๋กœ ์–ด๋–ค ๋ถ€๋ถ„์ด ํ™•์žฅ๋˜์—ˆ๋Š”์ง€ ๋ณด๋ ค๋ฉด ์ œ๊ฐ€ ์ง์ ‘ ์ปค๋ฐ‹์„ ์ œ์–ดํ•ด์•ผ ํ•˜๋Š”๋ฐ, rebase์˜ ์žฅ์ ์„ ํ•œ๋ฒˆ ์ฐพ์•„๋ด…์‹œ๋‹ค.

๋‹ค์Œ ์š”์ฒญ ์ „์— ์ ์šฉ ๋ถ€ํƒ๋“œ๋ ค์š” ๐Ÿ˜€

์•ˆ๋…•ํ•˜์„ธ์š” ์ฌ! ๊ผผ๊ผผํ•œ ๋ฆฌ๋ทฐ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค ๐Ÿ˜Š
step1 ๋จธ์ง€ ๋ธŒ๋žœ์น˜ ๊ธฐ์ค€์œผ๋กœ rebase ์™„๋ฃŒํ–ˆ์Šต๋‹ˆ๋‹ค.
์ด๋ฒˆ ๋‹จ๊ณ„์—์„œ ํ™•์žฅ๋œ ๋ถ€๋ถ„๋งŒ ๋ณด์ด๋„๋ก ์ •๋ฆฌํ–ˆ์œผ๋‹ˆ ํ™•์ธ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค!
๊ฐ ์ฝ”๋ฉ˜ํŠธ์— ๋‹ต๊ธ€๊ณผ ๋ฆฌํŒฉํ† ๋ง ๋ฐ˜์˜ํ–ˆ์œผ๋‹ˆ ํ™•์ธํ•ด์ฃผ์‹œ๊ณ , ์ถ”๊ฐ€ ํ”ผ๋“œ๋ฐฑ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค!

Copy link
Copy Markdown

@syoun602 syoun602 left a comment

Choose a reason for hiding this comment

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

์•ˆ๋…•ํ•˜์„ธ์š” ์•„์ดํ~
์ด๋ฒˆ ์‚ฌ์ดํด2๋Š” ์ถฉ๋ถ„ํžˆ ์ž˜ํ•ด์ฃผ์‹  ๊ฒƒ ๊ฐ™์•„์„œ ์ด๋งŒ ๋จธ์ง€ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค!
์–ด๋ ค์šด ์žฅ๊ธฐ ๋ฏธ์…˜ ํ•˜์‹œ๋А๋ผ ์ˆ˜๊ณ  ๋งŽ์œผ์…จ์–ด์š” ๐Ÿ‘
๋ช‡ ๊ฐ€์ง€ ๊ณ ๋ฏผํ•ด๋ณผ ๋ถ€๋ถ„์„ ๋‚จ๊ฒจ๋“œ๋ ธ๋Š”๋ฐ, ํ˜น์‹œ๋‚˜ ๋” ๊ถ๊ธˆํ•œ ๋ถ€๋ถ„์ด ์žˆ๋‹ค๋ฉด ์–ธ์ œ๋“  DM ์ฃผ์„ธ์š”
๋ ˆ๋ฒจ 1 ๊ณ ์ƒํ•˜์…จ๊ณ  ๋‹ค์Œ ์›น ๋ฏธ์…˜๋“ค๋„ ํ™”์ดํŒ…์ž…๋‹ˆ๋‹ค~

.filter(piece -> piece.isSame(team))
.mapToInt(piece -> piece.getType().getScore())
.sum();
Score score = Score.of(sum);
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

์šฐ์„  ๊ฒ€์ฆ์— ๋Œ€ํ•ด์„œ๋Š” ๋ง์”€ํ•˜์‹  ๊ฒƒ์ฒ˜๋Ÿผ ์ƒ์„ฑ ๊ฒฝ๋กœ๋ฅผ ํ†ต์ œํ•˜๊ณ  ์‹ถ๋”๋ผ๋„ ๊ฒฐ๊ตญ ์ฃผ์ƒ์„ฑ์ž์—์„œ ํ•ญ์ƒ ๊ฒ€์ฆํ•ด์•ผ ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•ด์š”. ์ฃผ์ƒ์„ฑ์ž๋Š” ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค๋”๋ผ๋„ ํ•ญ์ƒ ๊ฑฐ์น˜๊ฒŒ ๋˜๋Š” ๋งˆ์ง€๋ง‰ ๋ณดํ˜ธ ์žฅ์น˜๋‹ˆ๊นŒ์š”. ๊ทธ๋ฆฌ๊ณ  ์บ์‹ฑ์€ ์ง€๊ธˆ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์ง€ ์•Š์€๋ฐ, ๊ทธ๊ฑธ ๊ณ ๋ คํ•œ๋‹ค๋Š”๊ฒŒ ํฌ๊ฒŒ ์™€๋‹ฟ์ง€๋Š” ์•Š๋„ค์š”.

๋งˆ์ง€๋ง‰์œผ๋กœ of์™€ from์˜ ๊ธฐ์ค€ ์ž์ฒด๋Š” ์ถฉ๋ถ„ํžˆ ์ดํ•ด๋˜์ง€๋งŒ, ํ˜„์žฌ ์ฝ”๋“œ์—์„œ ์ด ์ด๋ฆ„๋“ค์ด ์ •๋ง ์ƒ์„ฑ ์˜๋„๋ฅผ ์ž˜ ๋“œ๋Ÿฌ๋‚ด๊ณ  ์žˆ๋Š”์ง€๋Š” ํ•œ ๋ฒˆ ๋” ์ƒ๊ฐํ•ด๋ณด๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์•„์š”. ์ €๋Š” ๊ฐœ์ธ์ ์œผ๋กœ ๋ฌด๋ถ„๋ณ„ํ•˜๊ฒŒ ์ •์  ํŒฉํ„ฐ๋ฆฌ ๋ฉ”์„œ๋“œ๋ฅผ ๋Š˜๋ฆฌ๊ธฐ๋ณด๋‹ค๋Š” ํ•˜๋‚˜์˜ ์•ˆ์ „ํ•œ ์ฃผ์ƒ์„ฑ์ž๋ฅผ ๋‘๊ณ  ํ•„์š”ํ•œ ๊ฒฝ์šฐ์—๋งŒ ์˜๋ฏธ ์žˆ๋Š” ๋ถ€์ƒ์„ฑ์ž๋‚˜ ์ •์  ํŒฉํ„ฐ๋ฆฌ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ์‹์„ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค. ์ง€๊ธˆ Score๋งŒ ๋ดค์„๋•Œ ์ •์  ํŒฉํ„ฐ๋ฆฌ์˜ ์–ด๋–ค ์žฅ์ ์ด ๋…น์•„๋“ค์—ˆ๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

๋‹จ์ˆœํžˆ ์ดํŽ™ํ‹ฐ๋ธŒ ์ž๋ฐ”์—์„œ ์ •์  ํŒฉํ„ฐ๋ฆฌ๋ฅผ ์„ ํ˜ธํ•œ๋‹ค๊ณ  ํ•ด์„œ ์ผ๊ด„์ ์œผ๋กœ ์ ์šฉํ•˜๊ธฐ๋ณด๋‹ค๋Š” ์™œ ์ด ๊ฒฝ์šฐ์— ์ƒ์„ฑ์ž๋ณด๋‹ค ์ •์  ํŒฉํ„ฐ๋ฆฌ๊ฐ€ ๋” ์ ์ ˆํ•œ์ง€๊นŒ์ง€ ํ•จ๊ป˜ ์„ค๋ช… ๊ฐ€๋Šฅํ•ด์•ผ ์˜๋ฏธ๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ด์š”. ์ดํŽ™ํ‹ฐ๋ธŒ ์ž๋ฐ”์—์„œ ๋งํ•˜๋Š” ์ •์  ํŒฉํ„ฐ๋ฆฌ๋„ ํ•ญ์ƒ ์ƒ์„ฑ์ž๋ณด๋‹ค ์šฐ์›”ํ•˜๋‹ค๋Š” ์ทจ์ง€๋ผ๊ธฐ๋ณด๋‹ค, ์ด๋ฆ„์„ ๋ถ€์—ฌํ•  ์ˆ˜ ์žˆ๊ณ  ์ƒ์„ฑ ๋ฐฉ์‹์„ ํ†ต์ œํ•  ์ˆ˜ ์žˆ๋Š” ๋“ฑ ๋ถ„๋ช…ํ•œ ์ด์ ์ด ์žˆ์„ ๋•Œ ์„ ํƒ์ง€๋กœ ๊ณ ๋ คํ•˜๋ผ๋Š” ์˜๋ฏธ๋ผ๊ณ  ์ƒ๊ฐํ•ด์š”.

private final long gameId;

private JanggiGame(Board board) {
private JanggiGame(Board board, GameRepository gameRepository, long gameId) {
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

์ง€๊ธˆ์€ JanggiGame์€ InputView, OutputView, GameRepository๊นŒ์ง€ ํ•จ๊ป˜ ์•Œ๊ณ  ์žˆ์–ด์„œ ์ˆœ์ˆ˜ํ•œ ๋„๋ฉ”์ธ ๊ฐ์ฒด๋ผ๊ณ  ๋ณด๊ธฐ๋Š” ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ง€๊ธˆ ๊ตฌ์กฐ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐ์ฒด๋ผ๊ณ  ์ •๋ฆฌํ•  ์ˆ˜๋„ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๊ณ  ํฌ๊ฒŒ ์ด๊ฒฌ์€ ์—†์Šต๋‹ˆ๋‹ค~

๋‹ค๋งŒ ๊ฐœ์ธ์ ์œผ๋กœ๋Š” ๊ฒŒ์ž„ ์ž์ฒด๋Š” ๋„๋ฉ”์ธ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ด์š”. ํ„ด์ด ์–ด๋–ป๊ฒŒ ์ง„ํ–‰๋˜๋Š”์ง€, ์–ธ์ œ ๊ฒŒ์ž„์ด ์ข…๋ฃŒ๋˜๋Š”์ง€, ์ด๋™์ด ์„ฑ๊ณตํ–ˆ์„ ๋•Œ ์ƒํƒœ๊ฐ€ ์–ด๋–ป๊ฒŒ ๋ฐ”๋€Œ๋Š”์ง€ ๊ฐ™์€ ํ๋ฆ„ ์ž์ฒด๊ฐ€ ์žฅ๊ธฐ ๊ทœ์น™์˜ ์ผ๋ถ€๋‹ˆ๊นŒ์š”. ๋‹จ์ˆœํžˆ ํ™”๋ฉด๊ณผ ์ €์žฅ์†Œ๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ์ ˆ์ฐจ๋ผ๊ธฐ๋ณด๋‹ค ๊ฒŒ์ž„์ด๋ผ๋Š” ๋„๋ฉ”์ธ์ด ์Šค์Šค๋กœ ์„ค๋ช…ํ•ด์•ผ ํ•˜๋Š” ์ƒํƒœ ๋ณ€ํ™”์— ๋” ๊ฐ€๊น์ง€ ์•Š๋‚˜์š”?

์˜ˆ๋ฅผ ๋“ค์–ด ์ดํ›„ ์›น ๋ฒ„์ „๊นŒ์ง€ ํ•จ๊ป˜ ๊ณ ๋ คํ•œ๋‹ค๊ณ  ํ–ˆ์„ ๋•Œ, ์ž…๋ ฅ์„ ์–ด๋–ป๊ฒŒ ๋ฐ›๊ณ  ๊ฒฐ๊ณผ๋ฅผ ์–ด๋–ป๊ฒŒ ๋ณด์—ฌ์ค„์ง€๋Š” ๋ถ„๋ช… ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ณ„์ธต์ด ๋ฐ”๋€Œ๋Š” ๋ฌธ์ œ์ธ๋ฐ, ๊ฒŒ์ž„์˜ ํ๋ฆ„ ์ž์ฒด๋Š” ๊ทธ๋Œ€๋กœ ์œ ์ง€๋˜์–ด์•ผ ํ•˜์ž–์•„์š”. ๊ทธ๋Ÿฐ๋ฐ ์ง€๊ธˆ ๊ตฌ์กฐ๋Š” ๊ทธ ํ๋ฆ„๊นŒ์ง€ InputView, OutputView, Repository์™€ ํ•œ ๊ฐ์ฒด ์•ˆ์— ๋ฌถ์—ฌ ์žˆ์–ด์„œ, ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๋ฐ”๋€Œ๋ฉด ๊ฒฐ๊ตญ ์ƒˆ๋กœ์šด ๊ฒŒ์ž„ ํ๋ฆ„ ๊ฐ์ฒด๋ฅผ ๋‹ค์‹œ ๋งŒ๋“ค๊ฒŒ ๋  ๊ฐ€๋Šฅ์„ฑ์ด ์ปค ๋ณด์—ฌ์š”. ๊ทธ๋ž˜์„œ ์ œ ๊ธฐ์ค€์—์„œ๋Š” ์ฝ˜์†”์ด๋“  ์›น์ด๋“  ์ƒ๊ด€์—†์ด ๊ณตํ†ต์œผ๋กœ ์œ ์ง€๋˜์–ด์•ผ ํ•˜๋Š” ํ„ด ์ง„ํ–‰, ์ข…๋ฃŒ ํŒ๋‹จ, ์ƒํƒœ ๋ณ€ํ™” ๊ฐ™์€ ๊ฒŒ์ž„ ๊ทœ์น™์€ ๋„๋ฉ”์ธ์— ๋‚จ๊ณ , ์ž…์ถœ๋ ฅ๊ณผ ์ €์žฅ/๋ณต๊ตฌ orchestration๋งŒ ๋ฐ”๊นฅ ๊ณ„์ธต์ด ๋งก์•„์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

private boolean isCornerPosition(Position position) {
int row = position.getRowValue();
int col = position.getColumnValue();
return (row == topLeft.getRowValue() || row == bottomRight.getRowValue())
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

hasSameRowValue ๋“ฑ์ฒ˜๋Ÿผ ๊ฐ์ฒด์—๊ฒŒ ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋ƒ…์‹œ๋‹ค

return List.of(center);
}

public static boolean isDiagonalMove(Position from, Position to) {
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

์ง€๊ธˆ ์ด๋Ÿฐ static ๋ฉ”์„œ๋“œ๋Š” isDiagonalMove()์ฒ˜๋Ÿผ ์–‘์ชฝ ๊ถ์„ฑ์„ ๋ชจ๋‘ ํ™•์ธํ•ด์•ผ ํ•˜๋Š”๋ฐ ๋จผ์ € ์ด๋™ ์‹œ์ž‘ ์œ„์น˜๊ฐ€ ์–ด๋А ๊ถ์„ฑ์— ์†ํ•˜๋Š”์ง€ ์ฐพ๊ณ  ํ•ด๋‹น ๊ถ์„ฑ ๊ฐ์ฒด์—๊ฒŒ ํŒ๋‹จ์„ ์œ„์ž„ํ•  ์ˆ˜๋„ ์žˆ๊ฒ ๋„ค์š”. ๊ฐ์ฒด๋กœ ๋งŒ๋“ ๋งŒํผ ์œ ํ‹ธ์„ฑ ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ฑฐํ•ด๋ณผ ์ˆ˜๋„ ์žˆ์„ ๊ฒƒ ๊ฐ™์•„์š”

@syoun602 syoun602 merged commit 54cb05d into woowacourse:e9ua1 Apr 11, 2026
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