IT/Java

[ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ…] "is"๋กœ ์‹œ์ž‘ํ•˜๋Š” boolean ํƒ€์ž…์˜ JSON ๋ณ€ํ™˜

zi0_0 2025. 4. 1. 11:30

 

 

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 ? '๊ตฌ๋งค' : 'ํŒ๋งค';

 

๊ฒฐ๊ณผ๊ฐ€ ์ œ๋Œ€๋กœ ์ถœ๋ ฅ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

 

๋ฌธ์ œ์˜ ํ•ต์‹ฌ ์›์ธ์„ ์•Œ๋ ค์ค€ ๋‚ด ์ง๊ฟ ๋•ก๊พธ~!

Copy