Skip to content

๐Ÿš๐Ÿด ์ „๊ตญ ๊ต์œก์ฒญ ๊ธ‰์‹, ํ•™์‚ฌ์ผ์ • ํŒŒ์‹ฑ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

License

Notifications You must be signed in to change notification settings

leegeunhyeok/school-kr

Repository files navigation

node-school-kr

์ „๊ตญ ์ดˆ, ๋“ฑ, ๊ณ ๋“ฑํ•™๊ต ๋ฐ ๋ณ‘์„ค์œ ์น˜์› ๊ธ‰์‹, ํ•™์‚ฌ์ผ์ • ํŒŒ์‹ฑ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

npm version

๋ณธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” Node.js ํ™˜๊ฒฝ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ธ‰์‹ API + ํ•™์‚ฌ์ผ์ • API ํ†ตํ•ฉ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ž…๋‹ˆ๋‹ค.

์ „๊ตญ ๊ต์œก์ฒญ ํ•™์ƒ ์„œ๋น„์Šค ํŽ˜์ด์ง€(stu.xxx.go.kr)๋ฅผ ํŒŒ์‹ฑํ•˜์—ฌ ์ด๋ฒˆ ๋‹ฌ ํ•™์‚ฌ์ผ์ •๊ณผ ๊ธ‰์‹ ์ •๋ณด๋ฅผ JSON ๋ฐ์ดํ„ฐ๋กœ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

  • Promise๋ฅผ ์ ๊ทน ์ง€์›ํ•˜์—ฌ ๋น„๋™๊ธฐ ํ•จ์ˆ˜์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์„ค์น˜ํ•˜๊ธฐ

NPM ์ €์žฅ์†Œ๋ฅผ ํ†ตํ•ด ๋‹ค์šด๋กœ๋“œ ๋ฐ›์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋ณ„๋‹ค๋ฅธ ์ž‘์—… ์—†์ด ๋ฐ”๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

npm i node-school-kr

ํ…Œ์ŠคํŠธ

์•„๋ž˜ ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•˜์—ฌ ๋ฏธ๋ฆฌ ์ž‘์„ฑ๋œ ์˜ˆ์ œ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•ด๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
sample/sample.js ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜๋ฉฐ, ํ•™๊ต๋Š” ๊ด‘๋ช…๊ฒฝ์˜ํšŒ๊ณ„๊ณ ๋“ฑํ•™๊ต ๊ธฐ์ค€์œผ๋กœ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

npm test

์‚ฌ์šฉ ๋ฐฉ๋ฒ•

School ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ

node-school-kr ๋ชจ๋“ˆ์„ ๋ถˆ๋Ÿฌ์˜จ ํ›„ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
์ƒ์„ฑ ํ›„ ๋ฐ˜๋“œ์‹œ init()๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•  ํ•™๊ต๋กœ ์ดˆ๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค.

  • init() ํ˜ธ์ถœ ์—†์ด ๋ฐ์ดํ„ฐ๋ฅผ ๋ถˆ๋Ÿฌ์˜ฌ ๊ฒฝ์šฐ Error๊ฐ€ Throw ๋ฉ๋‹ˆ๋‹ค.
const School = require('node-school-kr')
const school = new School()

/* 
* @param type: ํ•™๊ต ์œ ํ˜•(์ดˆ, ์ค‘, ๊ณ , ๋ณ‘์„ค์œ ์น˜์›) 
* @param region: ๊ต์œก์ฒญ ๊ด€ํ•  ์ง€์—ญ
* @param schoolCode: ํ•™๊ต ๊ณ ์œ  ์ฝ”๋“œ
*/
school.init(/* Type */, /* Region */, /* SchoolCode */)

ํ•™๊ต ์ข…๋ฅ˜

ํ•™๊ต ์ข…๋ฅ˜๋Š” School.Type ์—์„œ ์„ ํƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

const School = require('node-school-kr')
const school = new School()

/* 4 */
console.log(School.Type.HIGH)

// School.Type.KEY
์œ ํ˜• Key Value
๋ณ‘์„ค์œ ์น˜์› KINDERGARTEN 1
์ดˆ๋“ฑํ•™๊ต ELEMENTARY 2
์ค‘ํ•™๊ต MIDDLE 3
๊ณ ๋“ฑํ•™๊ต HIGH 4

๊ต์œก์ฒญ ๊ด€ํ•  ์ง€์—ญ

์ง€์—ญ์€ ์ƒ์„ฑํ•œ School.Region ์—์„œ ์„ ํƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

const School = require('node-school-kr')
const school = new School()

/* stu.sen.go.kr */
console.log(School.Region.SEOUL)

// School.Region.KEY
์ง€์—ญ Key Value
์„œ์šธ SEOUL stu.sen.go.kr
์ธ์ฒœ INCHEON stu.ice.go.kr
๋ถ€์‚ฐ BUSAN stu.pen.go.kr
๊ด‘์ฃผ GWANGJU stu.gen.go.kr
๋Œ€์ „ DAEJEON stu.dge.go.kr
๋Œ€๊ตฌ DEAGU stu.dge.go.kr
์„ธ์ข… SEJONG stu.sje.go.kr
์šธ์‚ฐ ULSAN stu.use.go.kr
๊ฒฝ๊ธฐ GYEONGGI stu.goe.go.kr
๊ฐ•์› KANGWON stu.kwe.go.kr
์ถฉ๋ถ CHUNGBUK stu.cbe.go.kr
์ถฉ๋‚จ CHUNGNAM stu.cne.go.kr
๊ฒฝ๋ถ GYEONGBUK stu.gbe.go.kr
๊ฒฝ๋‚จ GYEONGNAM stu.gne.go.kr
์ „๋ถ JEONBUK stu.jbe.go.kr
์ „๋‚จ JEONNAM stu.jne.go.kr
์ œ์ฃผ JEJU stu.jje.go.kr

ํ•™๊ต ์ฝ”๋“œ

ํ•™๊ต ๊ณ ์œ  ์ฝ”๋“œ๋Š” ์—ฌ๊ธฐ์—์„œ ํ•™๊ต๋ช…์œผ๋กœ ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
ํ•™๊ต ์ฝ”๋“œ๋Š” X000000000 ํ˜•์‹์˜ 10์ž๋ฆฌ ๋ฌธ์ž์—ด์ž…๋‹ˆ๋‹ค.

์‚ฌ์šฉ ์˜ˆ์‹œ

โ€ป ์•„๋ž˜ ์˜ˆ์ œ๋Š” ๊ฒฝ๊ธฐ๋„์˜ ๊ด‘๋ช…๊ฒฝ์˜ํšŒ๊ณ„๊ณ ๋“ฑํ•™๊ต๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ง„ํ–‰๋ฉ๋‹ˆ๋‹ค.

  • Promise๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜์—ฌ ๋น„๋™๊ธฐ ํ•จ์ˆ˜(Async/Await)์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
  • ์ดˆ๊ธฐํ™”(init) ์ž‘์—… ์—†์ด ๋ฐ์ดํ„ฐ ๋ถˆ๋Ÿฌ์˜ฌ ๊ฒฝ์šฐ Error๊ฐ€ Throw ๋ฉ๋‹ˆ๋‹ค.
  • ํŒŒ์‹ฑ ๋„์ค‘ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ๊ฒฝ์šฐ ๋ฉ”์‹œ์ง€ ์ถœ๋ ฅ ๋ฐ ๋น„์–ด์žˆ๋Š” ๊ฐ์ฒด ๋ฐ˜ํ™˜ {}
  • init() ๋Š” ์ƒ์„ฑ๋œ ์ธ์Šคํ„ด์Šค๋‹น 1ํšŒ๋งŒ ๊ฐ€๋Šฅ
  • reset() ์„ ํ†ตํ•ด ๋‹ค๋ฅธ ํ•™๊ต ์ •๋ณด๋กœ ์žฌ์„ค์ • ๊ฐ€๋Šฅ

์ธ์Šคํ„ด์Šค ์ดˆ๊ธฐํ™”

const School = require('node-school-kr') 
const school = new School()

school.init(School.Type.HIGH, School.Region.GYEONGGI, 'J100000488')

์ธ์Šคํ„ด์Šค ์ •๋ณด ์žฌ์„ค์ •

const School = require('node-school-kr')
const school = new School()

/* ๊ฒฝ๊ธฐ๋„ ๊ด‘๋ช…์‹œ์˜ ๊ด‘๋ช…๊ณ ๋“ฑํ•™๊ต๋กœ init() */
school.init(School.Type.HIGH, School.Region.GYEONGGI,  'J100000482')

/* ๊ฒฝ๊ธฐ๋„ ๊ด‘๋ช…์‹œ์˜ ๊ด‘๋ช…๊ฒฝ์˜ํšŒ๊ณ„๊ณ ๋“ฑํ•™๊ต๋กœ ์žฌ์„ค์ •ํ•˜๋Š” ์ฝ”๋“œ */
school.reset(School.Type.HIGH, School.Region.GYEONGGI, 'J100000488')

ํƒ€๊ฒŸ URL ์กฐํšŒ

๊ธ‰์‹ / ํ•™์‚ฌ์ผ์ • ์ •๋ณด๋Š” ํƒ€๊ฒŸ URL์— ์ ‘์†ํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ํŒŒ์‹ฑํ•ฉ๋‹ˆ๋‹ค.

const School = require('node-school-kr') 
const school = new School()

school.init(School.Type.HIGH, School.Region.GYEONGGI, 'J100000488')

// ๊ธ‰์‹, ํ•™์‚ฌ์ผ์ • ๋ฐ์ดํ„ฐ ํŒŒ์‹ฑ ํƒ€๊ฒŸ ํŽ˜์ด์ง€ URL
console.log(school.getTargetURL('meal'))
console.log(school.getTargetURL('calendar'))

/*
https://stu.goe.go.kr/sts_sci_md00_001.do?schulCode=J100000488&schulCrseScCode=4&schulKndScCode=4
https://stu.goe.go.kr/sts_sci_sf01_001.do?schulCode=J100000488&schulCrseScCode=4&schulKndScCode=4
*/

๊ธ‰์‹ ๋ฐ ํ•™์‚ฌ์ผ์ • ์กฐํšŒ (๋น„๋™๊ธฐ ํ•จ์ˆ˜ ๋ฐฉ์‹)

const School = require('node-school-kr') 
const school = new School()

school.init(School.Type.HIGH, School.Region.GYEONGGI, 'J100000488')

const sampleAsync = async function() {
  const meal = await school.getMeal()
  const calendar = await school.getCalendar()

  // ์˜ค๋Š˜ ๋‚ ์งœ
  console.log(`${meal.month}์›” ${meal.day}์ผ`)

  // ์˜ค๋Š˜ ๊ธ‰์‹ ์ •๋ณด
  console.log(meal.today)

  // ์ด๋ฒˆ ๋‹ฌ ๊ธ‰์‹ ์ •๋ณด
  console.log(meal)

  // ์ด๋ฒˆ ๋‹ฌ ํ•™์‚ฌ์ผ์ •
  console.log(calendar)
}

sampleAsync()

๊ธ‰์‹ ๋ฐ ํ•™์‚ฌ์ผ์ • ์กฐํšŒ (ํ”„๋ผ๋ฏธ์Šค ๋ฐฉ์‹)

const School = require('node-school-kr') 
const school = new School()

school.init(School.Type.HIGH, School.Region.GYEONGGI, 'J100000488')

const samplePromise = function() {
  school.getMeal().then(meal => {
    // ์˜ค๋Š˜ ๋‚ ์งœ
    console.log(`${meal.month}์›” ${meal.day}์ผ`)

    // ์˜ค๋Š˜ ๊ธ‰์‹ ์ •๋ณด 
    console.log(meal.today)

    // ์ด๋ฒˆ ๋‹ฌ ๊ธ‰์‹ ์ •๋ณด 
    console.log(meal)

    return school.getCalendar()
  }).then(calendar) => {
    // ์ด๋ฒˆ ๋‹ฌ ํ•™์‚ฌ์ผ์ •
    console.log(calendar)
  })
}

samplePromise()

๊ธ‰์‹ ๋ฐ์ดํ„ฐ ํ˜•์‹

getMeal ๋ฐ˜ํ™˜ ๋ฐ์ดํ„ฐ ํ˜•์‹์€ ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

Key Value ๋น„๊ณ 
1 ~ 31 ํ•ด๋‹น ๋‚ ์งœ์˜ ๊ธ‰์‹ ๊ธ‰์‹์ด ์—†๋Š” ๊ฒฝ์šฐ ๋นˆ ๋ฌธ์ž์—ด
month ์ด๋ฒˆ ๋‹ฌ
day ์˜ค๋Š˜ ๋‚ ์งœ
today ์˜ค๋Š˜ ๊ธ‰์‹
{
  '1': '[์ค‘์‹]\n๋ฐœ์•„ํ˜„๋ฏธ๋ฐฅ\n๋ฏธ์—ญ๊ตญ5.6.9....', // ์ด๋ฒˆ๋‹ฌ 1์ผ ๋ฉ”๋‰ด
  '2': '[์ค‘์‹]\n์–ผ๊ฐˆ์ด๋œ์žฅ๋ฌด์นจ5.6.\n์นผ์Š˜์ฐน์Œ€....', // ์ด๋ฒˆ๋‹ฌ 2์ผ ๋ฉ”๋‰ด 
  '3': '[์ค‘์‹]\nํˆฌ์›€๋ฐ”ํŒŒ์Šคํƒ€(์ฃผ์‹)1.2.5.6.9.13.15.\n....', // ์ด๋ฒˆ๋‹ฌ 3์ผ ๋ฉ”๋‰ด
  '4': '', // ๊ธ‰์‹์ด ์—†์„ ๊ฒฝ์šฐ ๋นˆ ๋ฌธ์ž์—ด
  '5': '',
  ...
  'month': 5, // ์ด๋ฒˆ ๋‹ฌ
  'day': 3,   // ์˜ค๋Š˜ ๋‚ ์งœ 
  'today': '[์ค‘์‹]\nํˆฌ์›€๋ฐ”ํŒŒ์Šคํƒ€(์ฃผ์‹)1.2.5.6.9.13.15.\n....' // ์˜ค๋Š˜ ๋ฉ”๋‰ด
}

ํ•™์‚ฌ์ผ์ • ๋ฐ์ดํ„ฐ ํ˜•์‹

getCalendar ๋ฐ˜ํ™˜ ๋ฐ์ดํ„ฐ ํ˜•์‹์€ ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

Key Value ๋น„๊ณ 
1 ~ 31 ํ•ด๋‹น ๋‚ ์งœ์˜ ์ผ์ • ์ผ์ •์ด ์—†๋Š” ๊ฒฝ์šฐ ๋นˆ ๋ฌธ์ž์—ด
month ์ด๋ฒˆ ๋‹ฌ
{
  '1': '', // ์ด๋ฒˆ ๋‹ฌ 1์ผ์˜ ์ผ์ •
  '2': '', // ์ผ์ •์ด ์—†์„ ๊ฒฝ์šฐ ๋นˆ ๋ฌธ์ž์—ด
  '3': '',
  '4': '๊ฐœ๊ต๊ธฐ๋…์ผ', // 4์ผ ์ผ์ •
  '5': '',
  '6': '',
  '7': '๋Œ€์ฒด๊ณตํœด์ผ',
  ...
  'month': 5 // ์ด๋ฒˆ ๋‹ฌ
}

๋ฌธ์ œ ์‹ ๊ณ 

๊ต์œก์ฒญ ํ™ˆํŽ˜์ด์ง€์˜ ๋ฆฌ๋‰ด์–ผ ๋“ฑ์˜ ๋ฌธ์ œ๋กœ ํŒŒ์‹ฑ์ด ๋ถˆ๊ฐ€๋Šฅ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์Šˆ๋ฅผ ๋‚จ๊ฒจ์ฃผ์‹œ๋ฉด ์ตœ๋Œ€ํ•œ ๋น ๋ฅด๊ฒŒ ์ˆ˜์ •ํ•˜์—ฌ ๋ฐ˜์˜ํ•˜๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

๋ณ€๊ฒฝ์‚ฌํ•ญ

  • 2.0.0
    • โ€ป ๊ธฐ์กด ๋ฒ„์ „๊ณผ ํ˜ธํ™˜๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. (์•„๋ž˜ ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ํ™•์ธ ํ•ด์ฃผ์„ธ์š”)
    • Type, Region ํ”„๋กœํผํ‹ฐ ๊ฐ’์„ Symbol ๊ธฐ๋ฐ˜์œผ๋กœ ๊ตฌํ˜„
    • ์—๋Ÿฌ ๋ฐœ์ƒ ์ƒํ™ฉ ์ถ”๊ฐ€ ๋ฐ ๊ธฐ์กด ์—๋Ÿฌ ๋ฉ”์‹œ์ง€ ์ˆ˜์ •
    • getNotice ๋ฉ”์†Œ๋“œ๋ช… ๋ณ€๊ฒฝ -> getCalendar
    • getTargetURL ๋ฉ”์†Œ๋“œ ์ถ”๊ฐ€ (ํŒŒ์‹ฑํ•  ํƒ€๊ฒŸ URL์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค, ์ฐธ๊ณ )
    • ์˜ˆ์ œ ๋ฐ README ๋‚ด์šฉ ์ˆ˜์ •์‚ฌํ•ญ์— ๋งž๊ฒŒ ์—…๋ฐ์ดํŠธ / ๋‚ด์šฉ ์ถ”๊ฐ€
    • ์ฝ”๋“œ ์ฃผ์„ ์—…๋ฐ์ดํŠธ
  • 1.0.1
    • NPM ์ €์žฅ์†Œ์™€ ์ด๋ฆ„ ๋™์ผํ•˜๊ฒŒ Git ์ €์žฅ์†Œ ์ด๋ฆ„ ๋ณ€๊ฒฝ (์ด๋ฏธ ์‚ฌ์šฉ์ค‘์ธ ์ด๋ฆ„)
      • node-school -> node-school-kr
    • README ๋ฌธ์„œ ๋‚ด์šฉ ์ˆ˜์ •
    • ์—๋Ÿฌ ๋ฉ”์‹œ์ง€ ๊ตฌ๋ถ„ ๋ฌธ์ž ์ถ”๊ฐ€ (๊ธ‰์‹ ํŒŒ์‹ฑ ์—๋Ÿฌ์ธ์ง€ ํ•™์‚ฌ์ผ์ • ํŒŒ์‹ฑ ์—๋Ÿฌ์ธ์ง€ ๊ตฌ๋ถ„)
  • 1.0.0 - ์ฒซ ๋ฒˆ์งธ ๋ฆด๋ฆฌ์ฆˆ!

๋ผ์ด์„ผ์Šค

MIT

์ •๋ณด

๋ณธ ํ”„๋กœ์ ํŠธ๋Š” School API๋ฅผ ์ฐธ๊ณ ํ•˜์—ฌ Node.js ํ™˜๊ฒฝ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์ƒˆ๋กœ ํฌํŒ…ํ•œ ํ”„๋กœ์ ํŠธ์ž…๋‹ˆ๋‹ค.

About

๐Ÿš๐Ÿด ์ „๊ตญ ๊ต์œก์ฒญ ๊ธ‰์‹, ํ•™์‚ฌ์ผ์ • ํŒŒ์‹ฑ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

Topics

Resources

License

Stars

Watchers

Forks