Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
46 commits
Select commit Hold shift + click to select a range
5c9eeb3
feat: ํšŒ์›๊ฐ€์ž… ๊ธฐ๋Šฅ ๊ตฌํ˜„ (#7)
sat7312 Apr 13, 2026
5c5c204
feat: ๋กœ๊ทธ์ธ ๊ธฐ๋Šฅ ๊ตฌํ˜„ (#11)
sat7312 Apr 14, 2026
6963831
merge: dev ๋ธŒ๋žœ์น˜ ๋ณ‘ํ•ฉ ๋ฐ ์ถฉ๋Œ ํ•ด๊ฒฐ
hyhdb Apr 14, 2026
9236d60
feat: ํ† ํฐ ์žฌ๋ฐœ๊ธ‰ ์—”๋“œํฌ์ธํŠธ ๊ตฌํ˜„ (#14)
sat7312 Apr 15, 2026
6c66053
feat: ๋กœ๊ทธ์•„์›ƒ API ์ถ”๊ฐ€ (#17)
sat7312 Apr 15, 2026
683107a
refactor: DTO ๋„ค์ด๋ฐ ๋ฐ RestClient ์ ์šฉ, ๋ถˆํ•„์š” ํ•„๋“œ ์ œ๊ฑฐ
hyhdb Apr 15, 2026
20cb10b
Merge branch 'dev' into feature/st-01
hyhdb Apr 15, 2026
08a3b58
feat: ์ข…๋ชฉ ์ดˆ๊ธฐ ๋ฐ์ดํ„ฐ ๋กœ๋”ฉ ๊ธฐ๋Šฅ ์ถ”๊ฐ€ (StockInitData)
hyhdb Apr 15, 2026
290e3da
Feature/st 03 (#18)
zioJioh Apr 15, 2026
6fcfaad
feature:๋งค์ˆ˜ api ๊ตฌํ˜„
gmltmdu Apr 15, 2026
9baa7a5
feature:๋งค์ˆ˜ api ๊ตฌํ˜„
gmltmdu Apr 15, 2026
060da6f
feat: TR-01 ๋งค์ˆ˜ ํ•ต์‹ฌ ๋กœ์ง ๊ตฌํ˜„
davin11992 Apr 15, 2026
ef70cf1
feat: ๋ฉฑ๋“ฑ์„ฑ ํ‚ค๋กœ ์ค‘๋ณต ์š”์ฒญ ๋ฐฉ์–ด
davin11992 Apr 15, 2026
71f229d
chore: ์ž„์‹œ RealTimeStockPriceStore ์ถ”๊ฐ€ (ํŒ€์žฅ ์ฝ”๋“œ ๋Œ€๊ธฐ ์ค‘)
davin11992 Apr 15, 2026
9986aef
test: TR-01 ๋งค์ˆ˜ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ
davin11992 Apr 15, 2026
ab042eb
chore: H2 ๊ฐœ๋ฐœ ํ™˜๊ฒฝ seed ๋ฐ์ดํ„ฐ ์„ค์ •
davin11992 Apr 15, 2026
fdab242
fix: ๋ฉฑ๋“ฑ์„ฑ ํ‚ค ๋งŒ๋ฃŒ ๊ธฐ์ค€ 5๋ถ„ โ†’ 1์ผ๋กœ ์ˆ˜์ •
davin11992 Apr 15, 2026
ab525a6
refactor: ์‹œ๋“œ ๋ฐ์ดํ„ฐ๋ฅผ data.sql์—์„œ BaseInitData๋กœ ์ด๋™
davin11992 Apr 15, 2026
ef18951
style: TradeBuyProcessor ๋ณ€์ˆ˜ ํƒ€์ž… ๋ช…์‹œ (var โ†’ RealtimeStockPrice)
davin11992 Apr 15, 2026
24c2c13
refactor: dev ๋ธŒ๋žœ์น˜ rebase ํ›„ ํŒจํ‚ค์ง€ ๊ฒฝ๋กœ ๋ฐ ์ž„์‹œ ํŒŒ์ผ ์ •๋ฆฌ
davin11992 Apr 16, 2026
51be62f
chore: dev ๋ธŒ๋žœ์น˜ ์ถฉ๋Œ ํ•ด๊ฒฐ
hyhdb Apr 16, 2026
62fd0dd
chore: application-local.yaml gitignore ์ถ”๊ฐ€
davin11992 Apr 16, 2026
e7a0830
Merge pull request #13 from prgrms-be-devcourse/feature/st-01
hyhdb Apr 16, 2026
f08ab14
Merge branch 'dev' into feature/tr-01
davin11992 Apr 16, 2026
1868cc6
Merge pull request #16 from prgrms-be-devcourse/feature/tr-01
davin11992 Apr 16, 2026
a5b4e68
feature: ์‹ค์‹œ๊ฐ„ ๊ฐ€๊ฒฉ ๋ฐ์ดํ„ฐ ์ ์šฉ
gmltmdu Apr 16, 2026
1e80b72
feature: ์‹ค์‹œ๊ฐ„ ๊ฐ€๊ฒฉ ๋ฐ์ดํ„ฐ ์ ์šฉ
gmltmdu Apr 16, 2026
c718cba
refactor: TradeSellReq๋ฅผ ๋ณ„๋„ ํŒŒ์ผ๋กœ ๋ถ„๋ฆฌ
gmltmdu Apr 16, 2026
e2f33bf
refactor: TradeSellReq๋ฅผ ๋ณ„๋„ ํŒŒ์ผ๋กœ ๋ถ„๋ฆฌ
gmltmdu Apr 16, 2026
fb5d919
fix: transactional์„ค์ • ์ˆ˜์ • ๋ฐ entity ์˜คํƒ€ ์ˆ˜์ •
gmltmdu Apr 16, 2026
cbda084
fix: transactional์„ค์ • ์ˆ˜์ • ๋ฐ entity ์˜คํƒ€ ์ˆ˜์ •
gmltmdu Apr 16, 2026
7d18398
merge: dev๋ธŒ๋žœ์น˜ merge
gmltmdu Apr 16, 2026
d00275e
merge: dev๋ธŒ๋žœ์น˜ merge
gmltmdu Apr 16, 2026
7bdaf15
chore: ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•œ ์ž„์‹œ์ฝ”๋“œ ์ž‘์„ฑ
gmltmdu Apr 17, 2026
35a33af
chore: ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•œ ์ž„์‹œ์ฝ”๋“œ ์ž‘์„ฑ
gmltmdu Apr 17, 2026
1590fe6
feature: ๋ฉฑ๋“ฑ์„ฑ ์ถ”๊ฐ€
gmltmdu Apr 19, 2026
96cc571
feature: ๋ฉฑ๋“ฑ์„ฑ ์ถ”๊ฐ€
gmltmdu Apr 19, 2026
907abe8
fix: ๋น„๊ด€์  ๋ฝ ๋Œ€์‹  update์— ๋ฝ ๊ฑธ๊ธฐ
gmltmdu Apr 19, 2026
a92aed7
fix: ๋น„๊ด€์  ๋ฝ ๋Œ€์‹  update์— ๋ฝ ๊ฑธ๊ธฐ
gmltmdu Apr 19, 2026
d3b6e90
chore: testInitData ์‚ญ์ œ
gmltmdu Apr 20, 2026
2e071f1
chore: testInitData ์‚ญ์ œ
gmltmdu Apr 20, 2026
367b35c
feature: ์žฅ ๋งˆ๊ฐ์‹œ ๊ฑฐ๋ž˜ ๋ถˆ๊ฐ€ ๊ธฐ๋Šฅ ์ถ”๊ฐ€
gmltmdu Apr 21, 2026
95a8b24
feature: 2%๋กœ ๊ฐ€๊ฒฉ ๊ฒ€์ฆ ๊ธฐ๋Šฅ ์ถ”๊ฐ€
gmltmdu Apr 21, 2026
d1e4173
chore: ์ตœ์‹  ๋ฒ„์ „ ๋จธ์ง€
gmltmdu Apr 21, 2026
ca4b474
feature: 10์ดˆ ์ด์ƒ ์ง€์—ฐ์‹œ ์˜ˆ์™ธ์ฒ˜๋ฆฌ
gmltmdu Apr 21, 2026
b8dc38a
test: ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ถ”๊ฐ€
gmltmdu Apr 21, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
import org.gradle.kotlin.dsl.testImplementation

plugins {
java
id("org.springframework.boot") version "4.0.5"
Expand Down Expand Up @@ -34,6 +36,7 @@ dependencies {
testImplementation("org.springframework.boot:spring-boot-starter-data-jpa-test")
testImplementation("org.springframework.boot:spring-boot-starter-validation-test")
testImplementation("org.springframework.boot:spring-boot-starter-webmvc-test")
testImplementation ("org.springframework.boot:spring-boot-starter-test")
testCompileOnly("org.projectlombok:lombok")
testRuntimeOnly("org.junit.platform:junit-platform-launcher")
testAnnotationProcessor("org.projectlombok:lombok")
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,9 @@
package com.back.together02be.asset.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequiredArgsConstructor
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.back.together02be.asset.enitity;
package com.back.together02be.asset.entity;

import com.back.together02be.global.entity.BaseEntity;
import com.back.together02be.users.entity.Users;
Expand Down Expand Up @@ -40,4 +40,11 @@ public void increaseTotalPurchase(Long amount) {
this.totalPurchase += amount;
}

public void addDeposit(Long amount) {
this.deposit += amount; // ๋ˆ„์  ํ•ฉ์‚ฐ
}

public void subtractTotalPurchase(Long amount) {
this.totalPurchase = Math.max(0L, this.totalPurchase - amount);
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.back.together02be.asset.enitity;
package com.back.together02be.asset.entity;

import com.back.together02be.global.entity.BaseEntity;
import com.back.together02be.stock.entity.Stock;
Expand Down Expand Up @@ -48,4 +48,10 @@ public void updateOnBuy(Long buyQuantity, Long buyPrice) {
this.averagePrice = newTotalCost / this.quantity;
}

public void updateQuantity(Long newQuantity){
if(newQuantity<0){
throw new IllegalArgumentException("๋ณด์œ  ์ˆ˜๋Ÿ‰์€ 0๋ณด๋‹ค ์ž‘์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.");
}
this.quantity = newQuantity;
}
}
Original file line number Diff line number Diff line change
@@ -1,10 +1,9 @@
package com.back.together02be.asset.repository;

import java.util.Optional;

import com.back.together02be.asset.entity.UserAccount;
import org.springframework.data.jpa.repository.JpaRepository;

import com.back.together02be.asset.enitity.UserAccount;
import java.util.Optional;

public interface UserAccountRepository extends JpaRepository<UserAccount, Long> {
Optional<UserAccount> findByUsersId(Long usersId);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,27 @@
package com.back.together02be.asset.repository;

import java.util.Optional;

import com.back.together02be.asset.entity.UserStock;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;

import com.back.together02be.asset.enitity.UserStock;
import java.util.Optional;

public interface UserStockRepository extends JpaRepository<UserStock, Long> {
Optional<UserStock> findByUsersIdAndStockId(Long usersId, Long stockId);

// ๋”ํ‹ฐ ์ฒดํ‚น์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ, ์—ฐ์‚ฐ ํ›„ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๋ฅผ ๋น„์›Œ์ค˜์•ผ ์ตœ์‹  ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฐ˜์˜๋ฉ๋‹ˆ๋‹ค.
@Modifying(clearAutomatically = true)
@Query("UPDATE UserStock u SET u.quantity = u.quantity - :sellQuantity " +
"WHERE u.users.id = :userId AND u.stock.id = :stockId AND u.quantity >= :sellQuantity")
int updateQuantity(@Param("userId") Long userId,
@Param("stockId") Long stockId,
@Param("sellQuantity") Long sellQuantity);
//delete๋„ ๋™์‹œ์„ฑ ์ œ์–ด๋ฅผ ์œ„ํ•ด ์‚ฌ์šฉ
@Modifying(clearAutomatically = true)
@Query("DELETE FROM UserStock u WHERE u.users.id = :userId AND u.stock.id = :stockId AND u.quantity = 0")
void deleteByUserAndStock(@Param("userId") Long userId, @Param("stockId") Long stockId);

//void delete(UserStock userStock);
}
Original file line number Diff line number Diff line change
@@ -1,11 +1,8 @@
package com.back.together02be.global.initData;

import com.back.together02be.asset.enitity.UserAccount;
import com.back.together02be.asset.repository.UserAccountRepository;
import com.back.together02be.stock.entity.Stock;
import com.back.together02be.asset.repository.UserStockRepository;
import com.back.together02be.stock.repository.StockRepository;
import com.back.together02be.users.dto.request.SignupReq;
import com.back.together02be.users.entity.Users;
import com.back.together02be.users.repository.UsersRepository;
import com.back.together02be.users.service.UsersService;
import lombok.RequiredArgsConstructor;
Expand All @@ -26,6 +23,7 @@ public class BaseInitData {
private final UsersRepository usersRepository;
private final StockRepository stockRepository;
private final UserAccountRepository userAccountRepository;
private final UserStockRepository userStockRepository;

@Autowired
@Lazy
Expand All @@ -37,27 +35,11 @@ public class BaseInitData {
public ApplicationRunner initData() {
return args -> {
self.work1();
self.work2();
};
}

@Transactional
public void work1() {
// ํ…Œ์ŠคํŠธ์šฉ ์‹œ๋“œ ๋ฐ์ดํ„ฐ (H2 dev ํ™˜๊ฒฝ ์ „์šฉ)
Users user = usersRepository.save(new Users("testuser", "password", "ํ…Œ์ŠคํŠธ์œ ์ €"));
stockRepository.save(new Stock("005930", "์‚ผ์„ฑ์ „์ž", "KOSPI"));
userAccountRepository.save(new UserAccount(user, 0L, 50_000_000L));
}

@Transactional
public void work2() {
if (usersService.count() > 0) {
return;
}

usersService.signup(new SignupReq("user1", "1234", "1234", "์œ ์ €1"));
usersService.signup(new SignupReq("user2", "1234", "1234", "์œ ์ €2"));
usersService.signup(new SignupReq("user3", "1234", "1234", "์œ ์ €3"));
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package com.back.together02be.global.util;
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

trade ํด๋”๋กœ ์˜ฎ๊ธฐ๋Š”๊ฒŒ ์ข‹์„๊ฑฐ ๊ฐ™์Šต๋‹ˆ๋‹ค.


import java.time.DayOfWeek;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.ZoneId;

public class MarketTimeValidator {

public static void validateMarketOpen() {
LocalDateTime now = LocalDateTime.now(ZoneId.of("Asia/Seoul"));
DayOfWeek day = now.getDayOfWeek();
LocalTime time = now.toLocalTime();

// ์ฃผ๋ง ์ฒดํฌ
if (day == DayOfWeek.SATURDAY || day == DayOfWeek.SUNDAY) {
throw new IllegalStateException("์ฃผ๋ง์—๋Š” ๊ฑฐ๋ž˜ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.");
}

// ์‹œ๊ฐ„ ์ฒดํฌ (09:00 ~ 15:30)
if (time.isBefore(LocalTime.of(9, 0)) || time.isAfter(LocalTime.of(15, 30))) {
throw new IllegalStateException("์žฅ ์šด์˜ ์‹œ๊ฐ„(09:00 ~ 15:30) ์™ธ์—๋Š” ๊ฑฐ๋ž˜๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.");
}
}
}
Original file line number Diff line number Diff line change
@@ -1,16 +1,14 @@
package com.back.together02be.infra.kis;

import java.util.Map;

import com.back.together02be.infra.kis.config.KisProperties;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.core.ParameterizedTypeReference;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestClient;

import com.back.together02be.infra.kis.config.KisProperties;

import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import java.util.Map;

@Slf4j
@Service
Expand Down
Original file line number Diff line number Diff line change
@@ -1,16 +1,14 @@
package com.back.together02be.infra.kis;

import java.net.URI;

import org.java_websocket.client.WebSocketClient;
import org.java_websocket.handshake.ServerHandshake;
import org.springframework.stereotype.Component;

import com.back.together02be.infra.kis.config.KisProperties;

import jakarta.annotation.PostConstruct;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.java_websocket.client.WebSocketClient;
import org.java_websocket.handshake.ServerHandshake;
import org.springframework.stereotype.Component;

import java.net.URI;

@Slf4j
@Component
Expand Down
Original file line number Diff line number Diff line change
@@ -1,14 +1,12 @@
package com.back.together02be.infra.kis;

import org.java_websocket.WebSocket;
import org.springframework.stereotype.Component;

import com.back.together02be.infra.kis.constant.KisConstants;
import com.back.together02be.stock.dto.RealtimeStockPrice;
import com.back.together02be.stock.service.RealTimeStockPriceStore;

import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.java_websocket.WebSocket;
import org.springframework.stereotype.Component;

@Slf4j
@Component
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
import com.back.together02be.stock.dto.KisPriceRes;
import com.back.together02be.stock.dto.KisTokenRes;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestClient;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,12 @@
import lombok.Builder;
import lombok.Getter;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;

@Getter
@Builder
public class RealtimeStockPrice {
Expand All @@ -12,4 +18,18 @@ public class RealtimeStockPrice {
private String change; // ์ „์ผ ๋Œ€๋น„
private String changeRate; // ์ „์ผ ๋Œ€๋น„์œจ
private String tradeTime; // ์ฒด๊ฒฐ์‹œ๊ฐ„

// 10์ดˆ ์ด์ƒ ์ง€์—ฐ์‹œ ์˜ˆ์™ธ์ฒ˜๋ฆฌ
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

TradeSellProcessorํŒŒ์ผ๋กœ ์˜ฎ๊ธฐ๋Š”๊ฒŒ ์ข‹๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ฒฐํ•ฉ๋„๊ฐ€ ๋†’์•„์งˆ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

public boolean isStale(int limitSeconds) {
if (this.tradeTime == null) return true; // ๋ฐ์ดํ„ฐ๊ฐ€ ์—†์œผ๋ฉด ๋ฌด์กฐ๊ฑด ์ง€์—ฐ ๊ฐ„์ฃผ

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HHmmss");
LocalTime tradeTime = LocalTime.parse(this.tradeTime, formatter);

LocalDateTime tradeDateTime = LocalDateTime.of(LocalDate.now(), tradeTime);
LocalDateTime now = LocalDateTime.now();

// ํ˜„์žฌ ์‹œ๊ฐ„๊ณผ ์ฒด๊ฒฐ ์‹œ๊ฐ„์˜ ์ฐจ์ด๊ฐ€ limitSeconds๋ฅผ ๋„˜๋Š”์ง€ ํ™•์ธ
return ChronoUnit.SECONDS.between(tradeDateTime, now) > limitSeconds;
}
}
Original file line number Diff line number Diff line change
@@ -1,33 +1,28 @@
package com.back.together02be.stock.service;

import com.back.together02be.infra.kis.KisWebSocketClient;
import com.back.together02be.stock.cache.StockPriceCache;
import com.back.together02be.stock.client.KisPriceClient;
import com.back.together02be.stock.dto.KisPriceRes;
import com.back.together02be.stock.dto.RealtimeStockPrice;
import com.back.together02be.stock.dto.StockListRes;
import com.back.together02be.stock.entity.Stock;
import com.back.together02be.stock.repository.StockRepository;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;
import java.io.IOException;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

import org.springframework.stereotype.Service;
import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;

import com.back.together02be.infra.kis.KisWebSocketClient;
import com.back.together02be.stock.dto.RealtimeStockPrice;
import com.back.together02be.stock.repository.StockRepository;

import jakarta.persistence.EntityNotFoundException;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;
import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

@Service
@RequiredArgsConstructor
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,19 +3,16 @@
import com.back.together02be.global.apiRes.ApiRes;
import com.back.together02be.trade.dto.BuyReq;
import com.back.together02be.trade.dto.BuyRes;
import com.back.together02be.trade.dto.request.TradeSellReq;
import com.back.together02be.trade.dto.response.TradeSellRes;
import com.back.together02be.trade.service.TradeService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.*;

@RestController
@RequiredArgsConstructor
Expand All @@ -40,4 +37,17 @@ public ResponseEntity<ApiRes<BuyRes>> buy(
BuyRes response = tradeService.buy(userId, idempotencyKey, request);
return ResponseEntity.ok(new ApiRes<>("๋งค์ˆ˜๊ฐ€ ์™„๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.", response));
}

//์ฃผ์‹ ๋งค๋„
@Operation(summary = "์ฃผ์‹ ๋งค๋„", description = "์‹ค์‹œ๊ฐ„ ํ˜„์žฌ๊ฐ€ ๊ธฐ์ค€์œผ๋กœ ๋งค๋„๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. X-Idempotency-Key ํ—ค๋” ํ•„์ˆ˜.")
@PostMapping("/sell")
public ResponseEntity<ApiRes<TradeSellRes>> sell(
@Parameter(description = "์ค‘๋ณต ์š”์ฒญ ๋ฐฉ์ง€์šฉ UUID (๋ฒ„ํŠผ ํด๋ฆญ๋งˆ๋‹ค ์ƒˆ๋กœ ์ƒ์„ฑ)", required = true)
@RequestHeader("X-Idempotency-Key") String idempotencyKey,
@RequestParam Long userId, // TODO: Security ์ ์šฉ ํ›„ ์ œ๊ฑฐ
@RequestBody @Valid TradeSellReq req
){
TradeSellRes res = tradeService.sell(userId,idempotencyKey,req);
return ResponseEntity.ok(new ApiRes<>("๋งค์ˆ˜๊ฐ€ ์™„๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.", res));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.back.together02be.trade.dto.request;

import jakarta.validation.constraints.Min;

public record TradeSellReq(
Long userId,
Long stockId,
@Min(value = 1, message = "๋งค๋„ ์ˆ˜๋Ÿ‰์€ ์ตœ์†Œ 1๊ฐœ์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.")
Long quantity,
Long expectedPrice
){ }
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.back.together02be.trade.dto.response;

public record TradeSellRes(
Long tradeId,
String stockName,
Long quantity,
Long price,
Long amount,
Long remainingDeposit
) {
}

This file was deleted.

Loading