Backend ์๋ฐ ์คํ๋ง๋ถํธ๋ฅผ ์ค์ตํ๋ ์์ค ๋ฐ์ํ boolean ํ์ ์ JSON ๋ณํ์ ๋ํ ํธ๋ฌ๋ธ ์ํ ์ด๋ค.
1. ๋ฌธ์ ์ํฉ
dashboard.html ํ์ผ์ ๊ฐ๋จํ๊ฒ ์ฃผ์ ์์ฅ ๋์๋ณด๋๋ฅผ ๊ตฌํํ์๋ค.
์ด๋ ๊ฑฐ๋๋ด์ญ์ ๋ถ๋ฌ์ฌ ๊ฒฝ์ฐ ์ฃผ์์ ๊ตฌ๋งคํ์์๋ ํ๋งค๋ผ๊ณ ๋จ๋ ๋ฌธ์ ๋ฅผ ๋ฐ๊ฒฌํ๋ค.

2. ์์ธ ์ถ๋ก
๋ฌธ์ ์ ์์ธ์ 1) ๋ฐฑ์๋ ๊ตฌํ ๋ฌธ์ , 2) ๊ฐ ์ ๋ฌ ์ ์ค๋ฅ ๋ฌธ์ , 3) ํ๋ก ํธ์๋ ๊ตฌํ ๋ฌธ์
์ด๋ ๊ฒ 3๊ฐ์ง๋ก ๊ฐ์ ํ๊ณ ์ฐจ๊ทผ์ฐจ๊ทผ ๋ฌธ์ ์ ์์ธ์ ์ดํด๋ณด์๋ค.
1) ๋ฐฑ์๋ ๊ตฌํ ๋ฌธ์ ํ์ธ
๋จผ์ `StockMarketService.java` ํ์ผ์์ isPurchase ๊ฐ (๊ตฌ๋งค: true, ํ๋งค: false)์ด
์ ํํ ๋ค์ด๊ฐ๋์ง ํ์ธํ๊ณ ์ log๋ฅผ ์ฐ์ด๋ณด์๋ค.
// ๊ฑฐ๋ ๋ด์ญ ๊ธฐ๋ก
StockTransaction transaction = StockTransaction.builder()
.player(player)
.stock(stock)
.quantity(quantity)
.price(stock.getStockPrice())
.isPurchase(false)
.timestamp(LocalDateTime.now())
.balanceAfterTransaction(player.getPlayerMoney())
.build();
player.addTransaction(transaction);
// *** ์ค๋ฅ ํ์ธ์ ์ํ log ์ถ๊ฐ
log.info("ํ๋งค ์ค๋ฅ ํ์ธ: {}", transaction.isPurchase());


ํฐ๋ฏธ๋์์ ๊ฐ์ ํ์ธํด๋ณด์์๋, boolean ํํ๋ก ์ ์ ๋ฌ๋ ๊ฒ์ ๋ณผ ์ ์์๋ค.
2) ๊ฐ ์ ๋ฌ ์ ์ค๋ฅ ๋ฌธ์ ํ์ธ
๋ฐ๋ผ์ ๋๋ฉ์ธ ํด๋์ค๋ ์๋น์ค ํด๋์ค์์๋ ๋ฌธ์ ๊ฐ ์์์ ํ๋จํ์๊ณ ,
H2-console์ ํตํด ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๊ฐ์ด ์๋ชป ์ ๋ฌ๋๊ฑด์ง ํ์ธํ์๋ค.
url์ `localhost:8080/h2-console`์ ์ ๋ ฅํ๊ณ ,
๋ด๊ฐ ์ค์ ํ application.properties์ ๋ง์ถ์ h2 ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ๊ทผํ๋ค.

# ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ค์
spring.datasource.url=jdbc:h2:mem:stockmarketdb
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sonjiyeong
spring.datasource.password=
* ์ด๋๊น์ง password๋ฅผ ์ค์ ํด์ ๊ณ์ ๊ท์ฐฎ๊ฒ ๋ค์ด๊ฐ๋๋ฐ, ๋ด์ง๊ฟ ๋ฏผ์ฃผ๊ฐ ์ค์ ์ํด๋ ๋๋ค๊ณ ์๋ ค์คฌ๋ค~><
๊ฑฐ๋ ๋ด์ญ์ด ์ ์ฅ๋ STOCK_TRANSACTIONS๋ฅผ ํ์ธํ๋ฉด,
๋์๋ณด๋ (์์ ํ๋ก ํธ์๋ ์ด๋ฏธ์ง)์ ๋ฌ๋ผ TRUE (๊ตฌ๋งค)์ FALSE (ํ๋งค)๊ฐ ์ณ๊ฒ ๋ค์ด๊ฐ ๊ฒ์ ํ์ธํ ์ ์์๋ค.

๋ฐ๋ผ์ ๋ฐฑ์๋ ์ชฝ ๋ฌธ์ ๊ฐ ์๋ ํ๋ก ํธ์๋ ๋จ์ ๋ฌธ์ ๋ผ๊ณ ํ๋จํ ์ ์๋๋ฐ..
3) ํ๋ก ํธ์๋ ๊ตฌํ ๋ฌธ์ ํ์ธ
ํด๋น ํ์ด์ง๋ dashboar.html์์ ๊ฑฐ๋ ๋ด์ญ ๊ฐ์ ๋ถ๋ฌ์ค๋ ๊ฐ์ ์ฝ๋๋ ์๋์ด๋ค.
transactions.forEach(tx => {
const row = document.createElement('tr');
const timestamp = new Date(tx.timestamp).toLocaleString();
const type = tx.ispurchase ? '๊ตฌ๋งค' : 'ํ๋งค';
const totalAmount = tx.price * tx.quantity;
row.innerHTML = `
<td>${timestamp}</td>
<td>${type}</td>
<td>${tx.stockName}</td>
<td>${tx.quantity}์ฃผ</td>
<td>${tx.price.toLocaleString()}์</td>
<td>${totalAmount.toLocaleString()}์</td>
<td>${tx.balanceAfterTransaction.toLocaleString()}์</td>
`;
transactionList.appendChild(row);
});
์ฌ๊ธฐ์ ์ค๋ฅ๋ฅผ ํ์ธํ๊ณ ์ `const type = tx.ispurchase ? '๊ตฌ๋งค' : 'ํ๋งค';` ์ ์ฝ๋๋ฅผ
`const type = tx.ispurchase ? 'ํ๋งค' : '๊ตฌ๋งค';`๋ก ๋ฐ๊ฟ๋ณด์๋ค.
๊ทธ ๊ฒฐ๊ณผ ๋ฌด์กฐ๊ฑด ํ๋งค๋ก ํ์๋๋ค๊ฐ `๊ตฌ๋งค`๋ก๋ง ํ์๋๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
๋ฐ๋ผ์ html ํ์ผ์์ isPurchase ๊ฐ์ด ๋ฌด์กฐ๊ฑด false๋ก ์ธ์๋๋ ๋ฌธ์ ๊ฐ ํต์ฌ ์์ธ์์ ์ ์ ์์๋ค.

์ด ๋ฌธ์ ๋ฅผ ์ง๊ฟํํ ์๋ดํ๋ ์ค isPurchase์ ํ๋๋ช ์ด ๋ฌธ์ ์ธ ๊ฒ ๊ฐ๋ค๋ ์๊ฒฌ์ ๋ค์ ์ ์์๋ค.
3. ํด๊ฒฐ ๋ฐฉ์
isPurchase ๋ณ์๋ช ์ ์์ ํด์ ํ์ธํด๋ณธ ๊ฒฐ๊ณผ,
๋ฌธ์ ์ ์์ธ์ JSON์ boolean ํ๋๋ฅผ ์ง๋ ฌํํ ๋ ํ๋๋ช ์ `is` ์ ๋์ฌ๋ฅผ ์๋ชป ๋ถ์ธ ๋ฌธ์ ์๋ค.
ํ์ฌ ๋๋ Java ์ํฐํฐ ํด๋์ค์์ `isPurchase`๋ผ๋ ํ๋๋ฅผ ์ฌ์ฉํ๋๋ฐ,
์ด ๊ฐ์ฒด๊ฐ JSON์ผ๋ก ์ง๋ ฌํ๋ ๋, Jackson์ด ์ด๋ฅผ ์๋์ผ๋ก `purchase`๋ผ๋ ์ด๋ฆ์ JSON ์์ฑ์ผ๋ก ๋ณํํ๋ค.
๋ฐ๋ผ์ ํ๋ก ํธ์๋์์ `tx.isPurchase`๋ก ์ ๊ทผํ์ฌ ํ์ง๋ง,
์ค์ JSON ๊ฐ์ฒด์๋ purchase๋ผ๋ ์ด๋ฆ์ผ๋ก ์์๊ธฐ ๋๋ฌธ์ `undefined`๊ฐ ๋ฐํ๋ ๊ฒ์ด๋ค
4. ๊ฒฐ๊ณผ ํ์ธ
๋ฐ๋ผ์ ์ฝ๋๋ฅผ ์๋์ ๊ฐ์ด ์์ ํ๋ฉด,
const type = tx.purchase ? '๊ตฌ๋งค' : 'ํ๋งค';
๊ฒฐ๊ณผ๊ฐ ์ ๋๋ก ์ถ๋ ฅ๋๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.

๋ฌธ์ ์ ํต์ฌ ์์ธ์ ์๋ ค์ค ๋ด ์ง๊ฟ ๋ก๊พธ~!