๐ŸŽฎ Toy Project

Spring Batch๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์˜ค๋ผํด ํด๋ผ์šฐ๋“œ ๊ฐ€์ƒ๋จธ์‹  (์ธ์Šคํ„ด์Šค) ์ž๋™ ์ƒ์„ฑ ์Šค์ผ€์ฅด๋Ÿฌ๋ฅผ ๋งŒ๋“ค์–ด๋ณด์ž!

KR_DEV 2024. 6. 19. 01:05

๊ฐœ์š”

ํผ๋ธ”๋ฆญ ํด๋ผ์šฐ๋“œ์—์„œ ์ œ๊ณตํ•˜๋Š” ํ”„๋ฆฌํ‹ฐ์–ด ํ˜œํƒ์ด ๊ฐ€์žฅ ํฐ ๊ณณ์€ Oracle Cloud ์ž…๋‹ˆ๋‹ค!

 

๋‹ค๋งŒ, ํ”„๋ฆฌํ‹ฐ์–ด ํ˜œํƒ์ด ์ข‹์€ ๋งŒํผ ํ•ด๋‹น ๋ฆฌ์ „์— ๋Œ€ํ•œ ๊ฐ€์šฉ๋Ÿ‰์ด ๊ฝ‰ ์ฐจ๋ฉด ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ์ด ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

 

์–ธ์ œ ๊ฐ€์šฉ๋Ÿ‰์ด ํ™•๋ณด๋  ์ง€๋„ ๋ชจ๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ์ธ์Šคํ„ด์Šค๋ฅผ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•˜๋Š” ์Šค์ผ€์ฅด๋Ÿฌ๋ฅผ ๊ฐœ๋ฐœํ•˜์˜€๊ณ  ์ด๋ฅผ ๊ณต์œ ํ•˜๊ณ ์ž ํฌ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

 

์ด๋ฏธ ํด๋ฆฌ์•™์˜ theb1ue ๋‹˜์ด php๋กœ ๋งŒ๋“  ์ž๋™ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— php์— ์ต์ˆ™ํ•˜์‹  ๋ถ„์€ ์•„๋ž˜ ๋งํฌ๋ฅผ ์ฐธ๊ณ ํ•ด์ฃผ์„ธ์š”!
https://svrforum.com/cloud/319909

 


๊ฐœ๋ฐœ ํ™˜๊ฒฝ

  • Spring Boot 2.7.15
  • Spring Batch
  • JDK 11
  • IntelliJ Ulimate
  • FileZilla
  • Putty, Mobaxterm

๐Ÿ‘‰  Spring Boot 3 ๋ฒ„์ „์ด ์•„๋‹Œ 2 ๋ฒ„์ „์œผ๋กœ ์ง„ํ–‰ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

 

๐Ÿ‘‰  ์ด๋Š” Oracle Cloud SDK ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์ผ๋ถ€ ์˜์กด์„ฑ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์ด javax ํŒจํ‚ค์ง€๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

 


API Key ์ถ”๊ฐ€ ๋ฐ Key ๋‹ค์šด๋กœ๋“œ

๐Ÿ‘‰  ์˜ค๋ผํด ํด๋ผ์šฐ๋“œ ์ ‘์†ํ•˜์—ฌ ๋กœ๊ทธ์ธํ•œ ๋‹ค์Œ ์šฐ์ƒ๋‹จ์˜ ํ”„๋กœํ•„ ์ด๋ฏธ์ง€ ํด๋ฆญ ํ›„ ๋‚ด ํ”„๋กœํŒŒ์ผ ๋ฉ”๋‰ด๋กœ ๋“ค์–ด๊ฐ€์ฃผ์„ธ์š”!

 

https://www.oracle.com/kr/cloud/

 

 

๐Ÿ‘‰  ์ขŒํ•˜๋‹จ์˜ API ํ‚ค ๋ฉ”๋‰ด๋ฅผ ๋ˆ„๋ฅธ ๋‹ค์Œ API ํ‚ค ์ถ”๊ฐ€ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•ด์ฃผ์„ธ์š”.

 

๐Ÿ‘‰  ๋‹ค์Œ์œผ๋กœ ํ”„๋ผ์ด๋น— ํ‚ค ๋ฐ ํผ๋ธ”๋ฆญ ํ‚ค ๋ชจ๋‘ ๋‹ค์šด๋กœ๋“œํ•œ ๋‹ค์Œ ์ถ”๊ฐ€ ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ์ฃผ์„ธ์š”!

 

Private ํ‚ค๋Š” API ํ˜ธ์ถœ์— ํ•„์š”ํ•œ ์ธ์ฆ ํ‚ค๋กœ ์‚ฌ์šฉ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์œ ์‹ค๋˜์ง€ ์•Š๋„๋ก ์œ ์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค!

 

 

๐Ÿ‘‰  ์ถ”๊ฐ€ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๊ฒŒ ๋˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฐฝ์ด ๋œจ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

 

๐Ÿ‘‰  ํ•ด๋‹น ๋‚ด์šฉ์„ ๋ชจ๋‘ ๋ณต์‚ฌํ•˜์—ฌ ๋ฉ”๋ชจ์žฅ or ๋…ธํŠธํŒจ๋“œ์— ๋ถ™์—ฌ๋„ฃ๊ธฐ ํ•ด์ค๋‹ˆ๋‹ค!

 


API ํ˜ธ์ถœ์— ํ•„์š”ํ•œ ํŒŒ๋ผ๋ฏธํ„ฐ ์ถ”์ถœ

์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๋Š” API๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ํ•ด๋‹น ์ธ์Šคํ„ด์Šค์˜ ์ด๋ฏธ์ง€, ์„œ๋ธŒ๋„ท ๋“ฑ์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค!

 

๋”ฐ๋ผ์„œ, F12 ๊ฐœ๋ฐœ์ž ๋„๊ตฌ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์˜ค๋ผํด ํด๋ผ์šฐ๋“œ์—์„œ ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ API ์š”์ฒญ์ด ์–ด๋– ํ•œ ํ˜•ํƒœ๋กœ ๋‚˜๊ฐ€๋Š” ์ง€ ํ™•์ธํ•ด๋ด…์‹œ๋‹ค!

 

 

 

๐Ÿ‘‰  SSH ํ‚ค ์ถ”๊ฐ€์—์„œ "๊ณต์šฉ ํ‚ค ์ €์žฅ"์€ ์ถ”ํ›„ API ํ˜ธ์ถœ์—์„œ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ๊ผญ ์ €์žฅํ•ด์ฃผ์„ธ์š”.

 

 

๐Ÿ‘‰  ์—ฌ๊ธฐ๊นŒ์ง€ ๋ชจ๋‘ ์„ค์ •ํ•˜์˜€๋‹ค๋ฉด F12 ๊ฐœ๋ฐœ์ž ๋„๊ตฌ๋ฅผ ์—ด๊ณ  ์ƒ์„ฑ ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ์ฃผ์„ธ์š”! 

 

 

๐Ÿ‘‰  ์œ„ ๊ทธ๋ฆผ์ฒ˜๋Ÿผ ๋นจ๊ฐ„์ƒ‰ instances ํ•ญ๋ชฉ์—์„œ ์šฐํด๋ฆญ ํ›„ Copy as cuRL (bash) ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ์ค๋‹ˆ๋‹ค!

 

curl 'https://iaas.ap-singapore-1.oraclecloud.com/20160918/instances/' \
  -H 'Accept: */*' \
  -H 'Connection: keep-alive' \
  -H 'Content-Type: application/json' \
  -H 'Origin: https://cloud.oracle.com' \
  -H 'Referer: https://cloud.oracle.com/' \
  -H 'Sec-Fetch-Dest: empty' \
  -H 'Sec-Fetch-Mode: cors' \
  -H 'Sec-Fetch-Site: cross-site' \
  -H 'User-Agent: xxxxxx' \
  -H 'accept-language: ko' \
  -H 'authorization: Signature keyId="xxxxxxxxxxxxxxxxxx"' \
  -H 'opc-request-id: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' \
  -H 'sec-ch-ua: "Google Chrome";v="125", "Chromium";v="125", "Not.A/Brand";v="24"' \
  -H 'sec-ch-ua-mobile: ?0' \
  -H 'sec-ch-ua-platform: "Windows"' \
  -H 'x-content-sha256: /xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' \
  -H 'x-date: Tue, 18 Jun 2024 17:17:43 GMT' \
  --data-raw 
  {
  "metadata": {
    "ssh_authorized_keys": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
  },
  "shape": "VM.Standard.A1.Flex",
  "compartmentId": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
  "displayName": "SRV1",
  "availabilityDomain": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
  "sourceDetails": {
    "sourceType": "image",
    "imageId": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
    "bootVolumeSizeInGBs": 50,
    "bootVolumeVpusPerGB": 10
  },
  "isPvEncryptionInTransitEnabled": true,
  "createVnicDetails": {
    "assignPublicIp": true,
    "subnetId": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
    "assignPrivateDnsRecord": true,
    "assignIpv6Ip": false
  },
  "agentConfig": {
    "pluginsConfig": [
      { "name": "Vulnerability Scanning", "desiredState": "DISABLED" },
      { "name": "Oracle Java Management Service", "desiredState": "DISABLED" },
      { "name": "OS Management Service Agent", "desiredState": "DISABLED" },
      { "name": "OS Management Hub Agent", "desiredState": "DISABLED" },
      { "name": "Management Agent", "desiredState": "DISABLED" },
      { "name": "Custom Logs Monitoring", "desiredState": "ENABLED" },
      { "name": "Compute RDMA GPU Monitoring", "desiredState": "DISABLED" },
      { "name": "Compute Instance Run Command", "desiredState": "ENABLED" },
      { "name": "Compute Instance Monitoring", "desiredState": "ENABLED" },
      { "name": "Compute HPC RDMA Auto-Configuration", "desiredState": "DISABLED" },
      { "name": "Compute HPC RDMA Authentication", "desiredState": "DISABLED" },
      { "name": "Cloud Guard Workload Protection", "desiredState": "ENABLED" },
      { "name": "Block Volume Management", "desiredState": "DISABLED" },
      { "name": "Bastion", "desiredState": "DISABLED" }
    ],
    "isMonitoringDisabled": false,
    "isManagementDisabled": false
  },
  "definedTags": {},
  "freeformTags": {},
  "instanceOptions": {
    "areLegacyImdsEndpointsDisabled": false
  },
  "availabilityConfig": {
    "recoveryAction": "RESTORE_INSTANCE"
  },
  "shapeConfig": {
    "ocpus": 4,
    "memoryInGBs": 24
  }
}

 

๐Ÿ‘‰  ๋ถ™์—ฌ๋„ฃ๊ธฐ ํ•˜๊ฒŒ ๋˜๋ฉด ์œ„์™€ ๊ฐ™์€ ๋‚ด์šฉ์ด ๋ณด์ผํ…๋ฐ ์—ฌ๊ธฐ์„œ ํ•„์š”ํ•œ ํŒŒ๋ผ๋ฏธํ„ฐ๋งŒ์„ ์ถ”์ถœํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค!

 

๐Ÿ‘‰  imageId, compartmentId, subnetId, availabilityDomain ์ด 4๊ฐ€์ง€ ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ๊ฐ’์„ ๋ฝ‘์•„์„œ ๋ฉ”๋ชจ์žฅ์— ๋ณต์‚ฌํ•ด์ฃผ์„ธ์š”!

 


GitHub ํ”„๋กœ์ ํŠธ Clone

์•„๋ž˜ URL๋กœ ๋“ค์–ด๊ฐ€ ํ”„๋กœ์ ํŠธ๋ฅผ Clone ํ•ด์ฃผ์„ธ์š”!

 

https://github.com/dev-toyproject/oracle-cloud-auto-create-vm

 


Application.yml ์ˆ˜์ •

 

oracle:
  cloud:
    apiKey:
      profile: DEFAULT
      user: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
      fingerprint: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
      tenancy: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
      region: ap-singapore-1
      privKey:
        path: /root/test123@gmail.com_2024-05-24T13_12_12.293Z.pem
      pubKey:
        path: /root/ssh-key-2024-05-24.key.pub

    instance:
      x86:
        # x86 ์ธ์Šคํ„ด์Šค ์ƒ์„ฑํ•˜์ง€ ์•Š์Œ      --> displayName : null
        # x86 ์ธ์Šคํ„ด์Šค 1๊ฐœ ์ƒ์„ฑ          --> displayName : srv1
        # x86 ์ธ์Šคํ„ด์Šค 2๊ฐœ ์ƒ์„ฑ          --> displayName : srv1,srv2     (์ฝค๋งˆ๋กœ ๊ตฌ๋ถ„)
        displayName: null
        imageId: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
        shape: VM.Standard.E2.1.Micro
        volume: 50
        availabilityDomain: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
        compartmentId: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
        subnetId: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

      arm:
        # arm ์ธ์Šคํ„ด์Šค ์ƒ์„ฑํ•˜์ง€ ์•Š์Œ      --> displayName : null
        # arm ์ธ์Šคํ„ด์Šค 1๊ฐœ ์ƒ์„ฑ          --> displayName : srv1
        # arm ์ธ์Šคํ„ด์Šค 2๊ฐœ ์ƒ์„ฑ          --> displayName : srv1,srv2     (์ฝค๋งˆ๋กœ ๊ตฌ๋ถ„)
        # ์ถ”๊ฐ€์ ์œผ๋กœ arm ์ธ์Šคํ„ด์Šค๋Š” 1๊ฐœ ์ƒ์„ฑํ•  ๋•Œ๋Š” vcpu: 4, memory: 24, volume: 100 (ํ”„๋ฆฌํ‹ฐ์–ด ์ตœ๋Œ€ ํ•œ๋„) ๋กœ ๋ณ€๊ฒฝํ•ด์ฃผ์„ธ์š”.
        displayName: srv3,srv4
        imageId: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
        shape: VM.Standard.A1.Flex
        vcpu: 2
        memory: 12
        volume: 50
        availabilityDomain: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
        compartmentId: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
        subnetId: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

 

๐Ÿ‘‰  oracle.cloud.apiKey ํ•˜์œ„ ํ•ญ๋ชฉ๋“ค ์ค‘ user, fingerprint, tenancy ํ•ญ๋ชฉ์€ "API ํ‚ค ์ถ”๊ฐ€ ๋ฐ Key ๋‹ค์šด๋กœ๋“œ" ๋ถ€๋ถ„์—์„œ ๋ณต์‚ฌํ•ด๋’€๋˜ ๊ฐ’์œผ๋กœ ๋ฐ”๊ฟ”์ค๋‹ˆ๋‹ค!

 

๐Ÿ‘‰  oracle.cloud.apiKey.privKey.path ํ•ญ๋ชฉ์€ "API ํ‚ค ์ถ”๊ฐ€ ๋ฐ Key ๋‹ค์šด๋กœ๋“œ" ๋ถ€๋ถ„์—์„œ ์ €์žฅํ–ˆ๋˜ Private Key ํŒŒ์ผ์˜ ์ ˆ๋Œ€ ๊ฒฝ๋กœ๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”!

 

๐Ÿ‘‰  oracle.cloud.apiKey.pubKey.path ํ•ญ๋ชฉ์€ ์ธ์Šคํ„ด์Šค ์ƒ์„ฑํ•  ๋•Œ SSH ํ‚ค ์ถ”๊ฐ€ ๋ถ€๋ถ„์—์„œ ์ €์žฅํ–ˆ๋˜ ๊ณต์šฉ ํ‚ค ํŒŒ์ผ์˜ ์ ˆ๋Œ€ ๊ฒฝ๋กœ๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”!

 

๐Ÿ‘‰  oracle.cloud.instance ํ•˜์œ„ ํ•ญ๋ชฉ๋“ค ์ค‘ imageId, subnetId, .. ๋“ฑ์€ "API ํ˜ธ์ถœ์— ํ•„์š”ํ•œ ํŒŒ๋ผ๋ฏธํ„ฐ ๋ถ€๋ถ„"์—์„œ ์ถ”์ถœํ–ˆ๋˜ ๊ฐ’๋“ค๋กœ ๋ฐ”๊ฟ”์ค๋‹ˆ๋‹ค!

 

๐Ÿ‘‰  oracle.cloud.instance.x86 or arm.displayName ํ•ญ๋ชฉ ๊ฐ’์ด "null" ๋ฌธ์ž์—ด์ด๋ฉด ์ƒ์„ฑํ•˜์ง€ ์•Š๊ณ  ์˜ˆ์‹œ๋Š” ์ฃผ์„์— ๋‹ฌ์•„๋†จ์œผ๋‹ˆ ์ฐธ๊ณ ํ•ด์ฃผ์„ธ์š”!

 

x86 ์ธ์Šคํ„ด์Šค์˜ ๊ฒฝ์šฐ์— vcpu, memory ๊ฐ’์„ ์„ค์ •ํ•˜์ง€ ์•Š์€ ์ด์œ ๋Š” ํ”„๋ฆฌํ‹ฐ์–ด ์ธ์Šคํ„ด์Šค๋Š” vcpu, memory๊ฐ€ ๊ณ ์ •๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

 


ํ”„๋กœ์ ํŠธ ๋นŒ๋“œ ๋ฐ ๋ฐฐํฌ

ํ”„๋กœ์ ํŠธ ๋นŒ๋“œํ•˜๊ธฐ์— ์•ž์„œ, ๋ฐฐํฌํ•˜๊ณ ์ž ํ•˜๋Š” ์„œ๋ฒ„์— ๋ฏธ๋ฆฌ PrivKey, PubKey๋ฅผ ์—…๋กœ๋“œํ•œ ๋‹ค์Œ ํ•ด๋‹น Key ํŒŒ์ผ๋“ค์˜ ์ ˆ๋Œ€ ๊ฒฝ๋กœ๋ฅผ ๋ณต์‚ฌํ•œ ๋‹ค์Œ ๊ผญ application.yml์— ๋ฐ˜์˜ํ•ด์ฃผ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค!!

 

๋˜ํ•œ, ํ—ท๊ฐˆ๋ฆด ์†Œ์ง€๊ฐ€ ์žˆ์–ด ๋ง์”€๋“œ๋ฆฌ์ง€๋งŒ PrivKey๋Š” "API ํ‚ค ์ถ”๊ฐ€ ๋ฐ ๋‹ค์šด๋กœ๋“œ" ๋ถ€๋ถ„์—์„œ ๋‹ค์šด๋กœ๋“œ ํ–ˆ๋˜ ํ”„๋ผ์ด๋น— ํ‚ค์ด๊ณ  PubKey๋Š” ์ธ์Šคํ„ด์Šค ์ƒ์„ฑํ•  ๋•Œ, ๋‹ค์šด๋กœ๋“œ ํ–ˆ๋˜ ๊ณต์šฉ ํ‚ค ์ž…๋‹ˆ๋‹ค!

 

"API ํ‚ค ์ถ”๊ฐ€ ๋ฐ ๋‹ค์šด๋กœ๋“œ" ๋ถ€๋ถ„์—์„œ ๋‹ค์šด๋กœ๋“œ ํ–ˆ๋˜ ํผ๋ธ”๋ฆญ ํ‚ค๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค!!

 

# [๋กœ์ปฌ] ํ”„๋กœ์ ํŠธ ๋นŒ๋“œ
./gradlew build -x test

# [์„œ๋ฒ„] ํŒจํ‚ค์ง€ ์„ค์น˜
dnf install -y java-11-openjdk

# [์„œ๋ฒ„] ๋ฐฐํฌ
nohup java -jar oci-vm-0.0.1-SNAPSHOT.jar

 

๐Ÿ‘‰  ์ฝ˜์†” ๋กœ๊ทธ๋Š” ๋ณ„๋„์˜ ๋กœ๊น… ํŒŒ์ผ๋กœ ์ƒ์„ฑ๋˜๋ฉฐ ๋‚ ์งœ๋ณ„๋กœ ๋ถ„๋ฆฌ๋˜๋„๋ก ์„ค์ •ํ•ด๋†“์•˜์Šต๋‹ˆ๋‹ค!

 


 

์ถ”๊ฐ€์ ์œผ๋กœ ๊ถ๊ธˆํ•˜์‹  ์‚ฌํ•ญ์ด๋‚˜ ์ž˜๋ชป๋œ ๋ถ€๋ถ„์ด ์žˆ๋‹ค๋ฉด ๋Œ“๊ธ€๋กœ ๋‚จ๊ฒจ์ฃผ์‹œ๋ฉด ๊ฐ์‚ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค!

๋ฐ˜์‘ํ˜•