Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. Weโ€™ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

๐Ÿ’ณ ๊ฒฐ์ œ ์„œ๋น„์Šค #10

Open
wants to merge 9 commits into
base: develop
Choose a base branch
from

Conversation

AnneMayor
Copy link
Collaborator

@AnneMayor AnneMayor commented Jan 1, 2022

-- ๐Ÿ“ ์„œ๋น„์Šค ๋ชฉ๋ก --
๊ฒฝ๋งค ๊ฒฐ์ œ์ •๋ณด ํ™•์ธ
๊ฒฐ์ œํ•˜๊ธฐ

-- ๐Ÿ’ป ์‚ฌ์šฉ ๊ธฐ์ˆ  --
TossPay API
Redis Cache

@AnneMayor AnneMayor added the feature Develop new feature label Jan 1, 2022
@AnneMayor AnneMayor self-assigned this Jan 1, 2022
Copy link

@f-lab-hubert f-lab-hubert left a comment

Choose a reason for hiding this comment

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

์ˆ˜๊ณ  ๋งŽ์œผ์…จ์Šต๋‹ˆ๋‹ค. ์ข€ ๋” ์œ ์—ฐํ•œ ์ฝ”๋“œ๋ฅผ ์–ด๋–ป๊ฒŒ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์„๊นŒ๋ฅผ ์ƒ๊ฐํ•˜๋ฉด์„œ ๋ฆฌ๋ทฐ๋ฅผ ๋“œ๋ ค๋ดค์–ด์š” ใ…Žใ…Ž ์ œ๊ฐ€ ๋ฌด์กฐ๊ฑด ์˜ณ์€ ๊ฑด ์•„๋‹ˆ๋‹ˆ ๋™์˜ํ•˜์‹œ๋Š” ๋ถ€๋ถ„๋งŒ ์ˆ˜์ •ํ•ด๋ณด์‹œ๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์•„์š” :)

build.gradle Outdated
@@ -47,7 +48,7 @@ dependencies {
runtimeOnly 'io.jsonwebtoken:jjwt-impl:0.11.2', 'io.jsonwebtoken:jjwt-jackson:0.11.2'
compileOnly 'org.projectlombok:lombok'
developmentOnly 'org.springframework.boot:spring-boot-devtools'
implementation 'org.springframework.boot:spring-boot-starter-log4j2:2.6.0'
implementation 'org.springframework.boot:spring-boot-starter-log4j2:2.6.2'

Choose a reason for hiding this comment

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

logback๋„ ์žˆ๋Š”๋ฐ log4j2๋ฅผ ์‚ฌ์šฉ ํ•˜์‹  ์ด์œ ๊ฐ€ ์žˆ์œผ์‹ค๊นŒ์š”?? ์ตœ๊ทผ log4j2 ๋ณด์•ˆ ์ทจ์•ฝ์ ์ด ์žˆ์–ด์„œ ํ•ด๋‹น ๋‚ด์šฉ๋„ ํ•œ๋ฒˆ ์‚ดํŽด๋ณด์‹œ๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์•„์š” :)

ref:

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

์•„ ๊ทธ ๋ถ€๋ถ„์€ ์ œ๊ฐ€ ์‚ฌ์‹ค ํฌ๊ฒŒ ๊ณ ๋ฏผํ•˜๊ณ  ์“ด๊ฑด ์•„๋‹ˆ๋ผ์„œ ์ด๋ฒˆ์— ๊ณ ๋ฏผํ•ด๋ณผ๊ฒŒ์š” ์ฝ”๋ฉ˜ํŠธ ๊ฐ์†จํ•ฉ๋‹ˆ๋‹ค ๐Ÿ˜„

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

๊ทผ๋ฐ ์ด๊ฑฐ ์ €๋„ ๋ฒ„์ „ ์—…๊ทธ๋ ˆ์ด๋“œ ์‹œ์ผœ์ค˜์„œ ๋ณด์•ˆ ์ทจ์•ฝ์  ๋Œ€์‘ํ•œ๋‹ค๊ณ  ํ–ˆ๋Š”๋ฐ ๊ทธ๋Ÿผ์—๋„ ์ทจ์•ฝํ•˜๋‹ค๊ณ  Maven Repository์—๋Š” ๋œจ๋„ค์š”... ๐Ÿ™„ ์•„์˜ˆ ๋ฐ”๊ฟ”์•ผ๊ฒ ์–ด์š” ์ด์ฐธ์—


@Getter
@Setter
@RequiredArgsConstructor
Copy link

Choose a reason for hiding this comment

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

final์ธ ํ•„๋“œ๊ฐ€ ์—†์–ด์„œ ์›ํ•˜์‹œ๋Š”๋Œ€๋กœ ์ฝ”๋“œ๊ฐ€ generate๋˜์ง€ ์•Š๊ณ  ๊ธฐ๋ณธ์ƒ์„ฑ์ž๋กœ ์ƒ์„ฑ๋  ๊ฒƒ ๊ฐ™์•„์š”. dto๋Š” ๋ณดํ†ต ๋ถˆ๋ณ€๊ฐ์ฒด๋กœ ์‚ฌ์šฉํ•˜๊ธฐ์œ„ํ•ด final ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜์—ฌ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ framework์—์„œ setter๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ๋•Œ๋ฌธ์— ์–ด์ฉ”์ˆ˜ ์—†์ด setter๋ฅผ ์ •์˜ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋Š”๋ฐ์š”. ํ•ด๋‹น ๊ฒฝ์šฐ๋งŒ ์ œ์™ธํ•˜๊ณ  final ๋ณ€์ˆ˜๋กœ ์„ ์–ธํ•˜์—ฌ ๋ถˆ๋ณ€๊ฐ์ฒด๋กœ ์ด์šฉํ•˜์‹œ๋Š”๊ฒŒ ์ข‹์Šต๋‹ˆ๋‹ค.

immutable object ref:

spring framework setter ref:

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

์•„ ๋„ต๋„ต ํ•ด๋‹น ๋ถ€๋ถ„ ์ฐธ๊ณ ํ•ด์„œ ๋ฆฌํŒฉํ† ๋ง ์ง„ํ–‰ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค!

@@ -65,4 +68,12 @@ public void enterChatRoom(String roomId) {
public ChannelTopic getTopic(String roomId) {
return topics.get(roomId);
}

public UserDto infoAuctionWinner(BigInteger id) {

Choose a reason for hiding this comment

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

method naming์— ์ผ๊ด€์„ฑ์ด ์žˆ์œผ๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์•„์š”. ์–ด๋–ค ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ฌ ๋•Œ๋Š” getXX์ด๊ณ  ์–ด๋–ค ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ฌ๋•Œ๋Š” infoXX์ธ ๊ฒƒ ์ฒ˜๋Ÿผ ๋ณด์—ฌ์„œ์š”. ์ฝ”๋“œ์˜ ์ผ๊ด€์„ฑ๋„ ์ฝ”๋“œ ๊ฐ€๋…์„ฑ์— ์ค‘์š”ํ•œ ๋ถ€๋ถ„์ด๋ผ์„œ์š” ใ…Žใ…Ž

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

์•„ ๋„ต๋„ต ์ผ๊ด€์„ฑ ์žˆ๋Š” ๋„ค์ด๋ฐ ๊ฐ€์ ธ๊ฐ€๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค...ใ…Žใ…Žใ…Ž โ˜บ๏ธ


@Bean
public RestTemplate restTemplate(RestTemplateBuilder restTemplateBuilder) {
return restTemplateBuilder.build();

Choose a reason for hiding this comment

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

์ง€๊ธˆ์€ restTemplate ์ƒ์„ฑ์‹œ default๊ฐ’์œผ๋กœ ์„ค์ •์„ ์ดˆ๊ธฐํ™” ํ•˜์ง€๋งŒ ์‹ค์ œ ์šด์˜์— ์‚ฌ์šฉ๋ ๋•Œ๋Š” ์ค‘์š” ์„ค์ •๊ฐ’์„ ์ž˜ ์‚ดํŽด๋ณด๊ณ  ์„ค์ •ํ•ด์ฃผ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ๋“ค์–ด connectionPoolSize, connectionTimeout, readTimeout ๊ฐ™์€ ๊ฐ’๋“ค์ด ๊ทธ ์ค‘ ํ•˜๋‚˜ ์ผ ๊ฒƒ ๊ฐ™์•„์š” :)

ref: https://e2e2e2.tistory.com/15

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

์•„ ๋„ต๋„ต ์•Œ๊ฒ ์Šต๋‹ˆ๋‹ค ์ผ๋‹จ ์ด ๋ถ€๋ถ„์€ ์ œ๊ฐ€ ์ด์Šˆ๋กœ ๋“ฑ๋กํ•ด๋†“๊ณ  ์šด์˜์—์„œ ๋Œ๋ฆด ์ ์— ์ˆ˜์ •ํ•˜๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ๊ฐ€์ ธ๊ฐ€๋ณผ๊ฒŒ์š”

public class PaymentController {

private final PaymentService paymentService;
@Value("${redirect.url}")

Choose a reason for hiding this comment

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

lombok config ํŒŒ์ผ์„ ์ด์šฉํ•˜๋ฉด final ๋ณ€์ˆ˜๋กœ ์„ ์–ธํ›„์—๋„ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. lombok์ด ํ•ด๋‹น ์• ๋„ˆํ…Œ์ด์…˜์„ ์ƒ์„ฑ์ž์—๋„ ์ ์šฉํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์ธ๋ฐ์š”. lombok.config ํŒŒ์ผ์„ ํ•œ๋ฒˆ ์‚ดํŽด๋ณด์‹œ๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์•„์š”.

ref: https://stackoverflow.com/questions/52321988/best-practice-for-value-fields-lombok-and-constructor-injection

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

์•„ ๋„ต๋„ต ํ•ด๋‹น ๋งํฌ ์ฐธ๊ณ ํ•ด์„œ ๋‹ค๋ฅธ ๋ถ€๋ถ„๋“ค๋„ ์ˆ˜์ •ํ•˜๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ๊ฐ€๊ฒ ์Šต๋‹ˆ๋‹ค!

@Value("${redirect.url}")
private String serverUrl;

@GetMapping("")

Choose a reason for hiding this comment

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

empty string์„ ๊ผญ ์„ค์ •ํ•ด์ฃผ์–ด์•ผํ•˜๋‚˜์š”~?

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

์ด๊ฑธ ์™œ ๋„ฃ์–ด์คฌ์„๊นŒ์š”...ใ…‡ใ……ใ…‡์ œ๊ฐ€ ๋ดค์„ ๋• ๊ฑ ๋‹ค๋ฅธ ํ˜ธ์ถœ ๋ฉ”์„œ๋“œ๋Š” ๋‹ค ์žˆ๋Š”๋ฐ ์ €๊ฑฐ๋งŒ ์—†์–ด์„œ ์•„์‰ฌ์šด(?) ๋งˆ์Œ์— ์ถ”๊ฐ€ํ–ˆ๋˜๊ฑฐ ๊ฐ™์€๋ฐ...๊ฑ ์ง€์šฐ๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ๊ฐ€์ ธ๊ฐ€๊ฒ ์Šต๋‹ˆ๋‹ค;;

Copy link
Collaborator Author

@AnneMayor AnneMayor Feb 5, 2022

Choose a reason for hiding this comment

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

@GetMapping("request") ์ด๋ ‡๊ฒŒ ๊ฐ€์ ธ๊ฐˆ๊ฒŒ์š”!

return new ResponseEntity<>(payResult, httpHeaders, HttpStatus.OK);
}

@GetMapping("fail")

Choose a reason for hiding this comment

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

fail์‹œ์—๋Š” ๋ณ„๋„์˜ ๋กœ์ง ์ฒ˜๋ฆฌ๊ฐ€ ํ•„์š”์—†๋Š”๊ฑธ๊นŒ์š”?? ๊ฒฐ์ œ์ƒํƒœ๋ฅผ ์‹คํŒจ๋กœ ๋ณ€๊ฒฝํ•œ๋‹ค๋˜์ง€ ๋“ฑ์˜ ๋กœ์ง์ด์š” ์•„๋ฌด์ฒ˜๋ฆฌ๋„ ์•ˆํ•˜๊ณ  ์‘๋‹ต๋งŒ ๋‚ด๋ ค์ฃผ๋Š” api๊ฐ€ ํ•„์š”ํ•œ๊ฑด๊ฐ€ ๊ถ๊ธˆํ•ด์„œ์š” :)

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

์•„ ์ œ๊ฐ€ ๋กœ์ง ์ˆ˜์ •ํ•˜๋ฉด์„œ ์ € fail ์ฒ˜๋ฆฌ๋‚ฌ์„ ์ ์— ํ•ด์ค˜์•ผ ํ•˜๋Š” ์ž‘์—…์ด ์ƒˆ๋กœ ์ƒ๊ธฐ๊ธด ํ–ˆ์Šต๋‹ˆ๋‹ค ํ•ด๋‹น ๋ถ€๋ถ„ ์ˆ˜์ •ํ•ด์„œ ๊ฐ€์ ธ๊ฐ€๋ณด๋„๋ก ํ• ๊ฒŒ์š”!


HttpEntity<String> request = new HttpEntity<>(objectMapper.writeValueAsString(payloadMap), headers);

ResponseEntity<JsonNode> responseEntity = restTemplate.postForEntity(

Choose a reason for hiding this comment

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

์ „์— ๋ง์”€๋“œ๋ ธ๋“ฏ์ด ์™ธ๋ถ€ ์—ฐ๋™์€ ๋ณ„๋„์˜ adapter๋‚˜ ํด๋ผ์ด์–ธํŠธ๋ฅผ ๋งŒ๋“ค์–ด์„œ ์ฒ˜๋ฆฌํ•˜๋Š”๊ฒŒ ์ข‹์„ ๊ฒƒ ๊ฐ™์•„์š”. ์ง์ ‘ ์ฒ˜๋ฆฌํ•˜๋‹ค๋ณด๋‹ˆ PaymentService๋Š” Toss ๊ฒฐ์ œ๋งŒ์„ ์œ„ํ•œ ๊ฐ์ฒด๊ฐ€ ๋˜์–ด๋ฒ„๋ ธ๋Š”๋ฐ์š”. PaymentService ์š”๊ตฌ์กฐ๊ฑด์— ์นด์นด์˜คํŽ˜์ด ๊ฒฐ์ œ, ์นด๋“œ ๊ฒฐ์ œ๋“ฑ์˜ ๋‹ค์–‘ํ•œ ์ˆ˜๋‹จ์ด ์ถ”๊ฐ€๋˜๋Š” ์š”๊ตฌ ์‚ฌํ•ญ์ด ์ถ”๊ฐ€๋˜๋ฉด ์ฝ”๋“œ๋ฅผ ๋‹ค ๋œฏ์–ด๊ณ ์ณ์•ผํ•  ๊ฒƒ ๊ฐ™์•„์„œ์š”. TossPaymentClient, KakaoPaymentClient ๊ฐ™์€ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์–ด์„œ ์™ธ๋ถ€์—ฐ๋™์„ ํ•˜๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์•„์š”. ๊ฒฐ์ œ๋ผ๋Š” ๊ฐœ๋…์„ ์ถ”์ƒํ™”ํ•˜์—ฌ ์ฝ”๋“œ์— ๋…น์—ฌ๋‚ด๋ฉด ๋” ์ข‹์€ ์ฝ”๋“œ๊ฐ€ ๋  ๊ฒƒ ๊ฐ™์•„์š”

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

์•„ ๋„ต๋„ต ํ•ด๋‹น ๋ถ€๋ถ„ ์•ˆ๊ทธ๋ž˜๋„ ์ž‘์—…ํ–ˆ๋Š”๋ฐ ์—ฌ๊ธฐ ๋ถ€๋ถ„์—๋‹ค ๊ฐ™์ด ๋จธ์ง€ํ•ด์„œ ์˜ฌ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค~


JsonNode body = responseEntity.getBody();

TossPayDto payResult = TossPayDto.builder()

Choose a reason for hiding this comment

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

ํ•˜๋‚˜์˜ ๋ฉ”์„œ๋“œ๊ฐ€ ๋„ˆ๋ฌด ๋งŽ์€ ์ฑ…์ž„์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฒƒ ๊ฐ™์•„์š”.

  1. header setting
  2. payload๋ฅผ json serialize
  3. toss ๊ฒฐ์ œ ์—ฐ๋™
  4. response๋ฅผ dto๋กœ parsing

ํ•ด๋‹น ๋ฉ”์„œ๋“œ๋ฅผ ํ…Œ์ŠคํŠธํ•˜๋ ค๋ฉด ์œ„์˜ ๋‚ด์šฉ๋“ค์ด ๋‹ค ํ…Œ์ŠคํŠธํ•ด์•ผํ•˜๋Š”๋ฐ ํ…Œ์ŠคํŠธํ•˜๊ธฐ๊ฐ€ ์‰ฌ์›Œ๋ณด์ด์ง„ ์•Š์•„์„œ์š”. 2๋ฒˆ์€ JsonUtils ๊ฐ™์€ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด์„œ json handling์˜ ์ฑ…์ž„์„ ์˜ฎ๊ฒจ์ค„์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์•„์š”. json handling์„ jackson์˜ ObjectMapper๊ฐ€ ์•„๋‹ˆ๋ผ Gson์œผ๋กœ๋„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ json handling์ด ํ•˜๋‚˜์˜ ๊ตฌํ˜„์ฒด์™€ ๋„ˆ๋ฌด ๊ฐ•๊ฒฐํ•ฉ ๋˜์–ด์žˆ๋Š” ๊ฒƒ ๊ฐ™์•„์š”. json๋„ ๊ตฌํ˜„์ฒด๊ฐ€ ์•„๋‹ˆ๋ผ ๋ฐ์ดํ„ฐ ํฌ๋งท์˜ ๊ฐœ๋…์ž…๋‹ˆ๋‹ค. ๊ตฌํ˜„์ฒด๋Š” ์—ฌ๋Ÿฌ๊ฐ€์ง€๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์š” jackson์— ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ObjectMapper๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋“  ์ฝ”๋“œ๋ฅผ ๋‹ค ๋ฐ”๊ฟ”์ค˜์•ผํ•˜๋Š”๋ฐ ๊ฐ€๋Šฅํ• ๊นŒ์š”?? JsonUtils ์—์„œ json์„ handlingํ•ด์ค€๋‹ค๋ฉด JsonUtils๋งŒ ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•ด ์ฃผ๋ฉด ๋˜์–ด์„œ ์ฝ”๋“œ๊ฐ€ ์ข€ ๋” ์œ ์—ฐํ•ด์งˆ ์ˆ˜ ์žˆ์–ด์š”. ์ด์™€๊ฐ™์ด Toss ์—ฐ๋™๋„ PaymentClient๋ฅผ interface๋กœ ๋งŒ๋“ค์–ด๋‘๊ณ  ๊ฒฐ์ œ ๊ฐœ๋…์„ ์ถ”์ƒํ™”ํ•˜๊ณ  ๊ตฌํ˜„์ฒด๋Š” ์—ฌ๋Ÿฌ๊ฐœ๋ฅผ ์œ ์—ฐํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋ฉด ๋” ์ข‹์„ ๊ฒƒ ๊ฐ™์•„์š”

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

์•„ ๋„ต๋„ต!์•ˆ๊ทธ๋ž˜๋„ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑํ•˜๋Š”๋ฐ ๋ฆฌํŒฉํ† ๋ง ํ•ด์•ผํ•  ๊ฒƒ์œผ๋กœ ํŒ๋‹จ์ด ๋˜๋”๋ผ๊ตฌ์š” ์ฐธ๊ณ ํ•ด์„œ ์ž‘์—…ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค~!

@@ -63,9 +63,11 @@ protected void configure(HttpSecurity http) throws Exception {
.antMatchers("/users/isAlreadyUsed").permitAll()
.antMatchers("/css/**", "/js/**", "/webjars/**").permitAll()
// TODO: Spring Security + JWT ์ธ์ฆ ๋กœ์ง ์ถ”๊ฐ€
.antMatchers("/**").permitAll()

Choose a reason for hiding this comment

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

์ด ์„ค์ •์€ ์ „์ฒด api๋ฅผ permit์‹œ์ผœ์ฃผ๊ฒŒ ๋˜๋Š” ๊ฒƒ ์•„๋‹Œ๊ฐ€์š”??

Copy link
Collaborator Author

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
feature Develop new feature
Projects
No open projects
Development

Successfully merging this pull request may close these issues.

None yet

2 participants