Skip to content

Latest commit

ย 

History

280 Commits

Folders and files

NameName
Last commit message
Last commit date
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

OffWay core

์—ฐ์ฐจ๋กœ ๋– ๋‚˜๋Š” ๋กœ์ปฌ ์—ฌํ–‰ ํ”Œ๋ž˜๋„ˆ โ€” "๋ฉฐ์น  ์‰ด ์ˆ˜ ์žˆ๋‚˜"๋ผ๋Š” ์งˆ๋ฌธ ํ•˜๋‚˜๋กœ, ์ง์žฅ์ธ์˜ ์—ฐ์ฐจ๋ฅผ ์ตœ๋Œ€๋กœ ์‚ด๋ ค ์ผ์ •ยท์ธ๊ตฌ๊ฐ์†Œ์ง€์—ญ ๋กœ์ปฌ ์—ฌํ–‰์ง€ยท์ •๋ถ€ ์ง€์› ์ •์ฑ…์ด ๊ฒฐํ•ฉ๋œ ๊ตญ๋‚ด ์—ฌํ–‰ ๊ณ„ํš์„ ์ž๋™ ์ƒ์„ฑํ•œ๋‹ค.

OffWay ๋ฐฑ์—”๋“œ(Spring Boot 4.1 ยท Java 25). ๊ณตํœด์ผยท๊ด€๊ด‘ยท๊ตํ†ตยท์ •์ฑ… ๊ณต๊ณต๋ฐ์ดํ„ฐ๋ฅผ ์กฐํ•ฉํ•ด "์—ฐ์ฐจ ์ž์› ์ตœ์ ํ™” + ๋กœ์ปฌ ์—ฌํ–‰ ์ถ”์ฒœ + ์ •์ฑ… ํ๋ ˆ์ด์…˜"์„ ํ•˜๋‚˜์˜ ํ”Œ๋กœ์šฐ๋กœ ์ œ๊ณตํ•œ๋‹ค.


์™œ ๋งŒ๋“œ๋Š”๊ฐ€

์—ฐ์ฐจ๋Š” ๋‚จ๋Š”๋ฐ ์–ด๋””๋กœ ๊ฐˆ์ง€ ๋ชจ๋ฅธ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ฒ€์ƒ‰ํ•˜๋ฉด ๋‚˜์˜ค๋Š” ๊ณณ์€ ๋Š˜ ๊ฐ™์€ ๋ช‡ ๊ตฐ๋ฐ๋‹ค.

ํ•œํŽธ ํ–‰์ •์•ˆ์ „๋ถ€๋Š” ์ธ๊ตฌ๊ฐ์†Œ์ง€์—ญ 89๊ณณ์„ ๊ณ ์‹œํ–ˆ๋‹ค. ์‚ฌ๋žŒ์ด ์ค„์–ด ์†Œ๋ฉธ์„ ๊ฑฑ์ •ํ•˜๋Š” ์ง€์—ญ๋“ค์ด๊ณ , ๊ด€๊ด‘ ๋ฐ์ดํ„ฐ๋„ ์–‡์•„ ํ”ํ•œ ์—ฌํ–‰ ์„œ๋น„์Šค๊ฐ€ ์ž˜ ๋‹ค๋ฃจ์ง€ ๋ชปํ•œ๋‹ค. ์ •๋ถ€๋Š” ์ด ์ง€์—ญ๋“ค์„ ์œ„ํ•ด ๋””์ง€ํ„ธ๊ด€๊ด‘์ฃผ๋ฏผ์ฆยท์ˆ™๋ฐ•์„ธ์ผํŽ˜์Šคํƒ€ ๊ฐ™์€ ํ˜œํƒ์„ ๋‚ด๋†“์ง€๋งŒ, ํ˜œํƒ์ด ์žˆ๋Š”์ง€์กฐ์ฐจ ๋ชจ๋ฅด๋Š” ์ฑ„๋กœ ์ง€๋‚˜๊ฐ€๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค.

OffWay๋Š” ์ด ๋‘˜์„ ์ž‡๋Š”๋‹ค.

์ง์žฅ์ธ์˜ ๋‚จ์€ ์—ฐ์ฐจ๋ฅผ ์ตœ๋Œ€๋กœ ์‚ด๋ ค์„œ, ์ธ๊ตฌ๊ฐ์†Œ์ง€์—ญ์œผ๋กœ ๋– ๋‚˜๋Š” ์ผ์ •์„ ์งœ๊ณ , ๊ทธ ์—ฌํ–‰์— ์“ธ ์ˆ˜ ์žˆ๋Š” ์ •๋ถ€ ํ˜œํƒ์„ ํ•จ๊ป˜ ๋ถ™์ธ๋‹ค.

๋ฌด์—‡์„ ์ง€์›ํ•˜๋Š”๊ฐ€

ํ•˜๋Š” ์ผ
์—ฐ์ฐจ๋ฅผ ์ตœ๋Œ€๋กœ ๊ณตํœด์ผยท์ฃผ๋ง์„ ์—ฎ์–ด ์‹ค์ œ ์—ฌํ–‰ ๊ฐ€๋Šฅ ์‹œ๊ฐ„(LNT)์„ ๊ณ„์‚ฐํ•œ๋‹ค. ์—ฐ์ฐจ 1~2์ผ๋กœ ์ตœ๋Œ€ ํœด์‹์ด ๋‚˜์˜ค๋Š” ์ƒŒ๋“œ์œ„์น˜ ์—ฐํœด๋ฅผ ์ฐพ์•„์ค€๋‹ค
๊ฐˆ ๋งŒํ•œ ๊ณณ์„ ๊ณ ๋ฅธ๋‹ค ์ถœ๋ฐœ์ง€์—์„œ ๋‹ฟ๋Š” ์‹œ๊ฐ„ยท์ƒํ™œ์ธ๊ตฌยท์ฝ˜ํ…์ธ  ์–‘์„ ๋”ฐ์ ธ 89๊ณณ ์ค‘ ํ›„๋ณด๋ฅผ ์ถ”๋ฆฐ๋‹ค
์ฝ”์Šค๋ฅผ ์งœ์ค€๋‹ค Day๋ณ„ ํƒ€์ž„๋ผ์ธ์œผ๋กœ ๋ณผ๊ฑฐ๋ฆฌยท๋ผ๋‹ˆยท์ˆ™์†Œ๋ฅผ ๋ฐฐ์น˜ํ•œ๋‹ค. ์ด๋™ ์‹œ๊ฐ„๊ณผ ๋„์ฐฉ ์‹œ๊ฐ๊นŒ์ง€ ๋ฐ˜์˜ํ•œ๋‹ค
ํ˜œํƒ์„ ๋ถ™์ธ๋‹ค ์ˆ™๋ฐ•์„ธ์ผํŽ˜์Šคํƒ€ ยท ๋””์ง€ํ„ธ๊ด€๊ด‘์ฃผ๋ฏผ์ฆ ยท ๊ทผ๋กœ์žํœด๊ฐ€์ง€์› ยท ์ง€์ž์ฒด๋ฐ”์šฐ์ฒ˜ ยท KTX/SRT ํ• ์ธ ยท ๋กœ์ปฌ100/๊ด€๊ด‘๋‘๋ ˆ ยท ๋†์ดŒ์ฒดํ—˜/์น˜์œ ๊ด€๊ด‘ (๋ถ„๋ฅ˜๋Š” ๋ฐฑ์˜คํ”ผ์Šค์—์„œ ๋Š˜๊ณ  ์ค€๋‹ค)
์—ฐ์ฐจ๋ฅผ ์ฐจ๊ฐํ•œ๋‹ค ์ฝ”์Šค๋ฅผ ํ™•์ •ํ•˜๋ฉด ์‹ค์ œ ์—ฌํ–‰ ๋‚ ์งœ๋กœ ์—ฐ์ฐจ๋ฅผ ๊นŽ๋Š”๋‹ค. ์ทจ์†Œํ•˜๋ฉด ๋˜๋Œ๋ฆฐ๋‹ค
์—ฐ์ฐจ ๋ช‡ ๊ฐœ ์“ธ ์ˆ˜ ์žˆ๋‚˜  โ†’  ์–ธ์ œ ๊ฐ€๋ฉด ๊ฐ€์žฅ ์ด๋“์ธ๊ฐ€  โ†’  ์–ด๋””๋กœ ๊ฐˆ๊นŒ  โ†’  ์ฝ”์Šค ์งœ๊ธฐ  โ†’  ์—ฐ์ฐจ ์ฐจ๊ฐ
   LNT ์‚ฐ์ถœ              ์ƒŒ๋“œ์œ„์น˜ ์—ฐํœด              89๊ณณ ์ถ”์ฒœ        Day ํƒ€์ž„๋ผ์ธ      ํ™•์ •

์˜์˜

๊ด€๊ด‘ ๋ฐ์ดํ„ฐ๊ฐ€ ์–‡์€ ์ง€์—ญ์ผ์ˆ˜๋ก "๋ณผ ๊ฒŒ ์—†๋‹ค"๋กœ ์ฝํžˆ๊ธฐ ์‰ฝ๋‹ค. ๊ทธ๊ฑด ๋ฐ์ดํ„ฐ๊ฐ€ ์—†๋Š” ๊ฒƒ์ด์ง€ ๊ฐˆ ๊ณณ์ด ์—†๋Š” ๊ฒŒ ์•„๋‹ˆ๋‹ค.

์˜์„ฑ๊ตฐ์„ ์˜ˆ๋กœ ๋“ค๋ฉด, ๊ด€๊ด‘ API์—๋Š” ์ˆ™์†Œ๊ฐ€ 1๊ณณ๋ฟ์ด๋‹ค(๊ณ ํƒ ํ•˜๋‚˜). ์‹ค์ œ๋กœ๋Š” ์๋‚ด์— 50๊ณณ ๋„˜๊ฒŒ ์žˆ๋‹ค. ๊ทธ ์ฐจ์ด๋ฅผ ๋ฉ”์šฐ์ง€ ์•Š์œผ๋ฉด "์ž˜ ๊ณณ์ด ์—†๋Š” 2๋ฐ•3์ผ"์ด ์‚ฌ์šฉ์ž์—๊ฒŒ ๊ทธ๋Œ€๋กœ ๋‚˜๊ฐ„๋‹ค. ์•„๋ž˜ ๋ฐ์ดํ„ฐ ํ’€์€ ๊ทธ๋ž˜์„œ ๋งŒ๋“ค์—ˆ๋‹ค.


๋ฐ์ดํ„ฐ ํ’€

89๊ณณ ์ „๋ถ€์— ๋Œ€ํ•ด ๋ฏธ๋ฆฌ ํ™•๋ณดํ•ด ๋‘” ์žฅ์†Œ๋‹ค. ์กฐํšŒ์— ์™ธ๋ถ€ API๋ฅผ ์“ฐ์ง€ ์•Š๋Š”๋‹ค.

์ข…๋ฅ˜ ๊ฑด์ˆ˜ ์ถœ์ฒ˜
๋ง›์ง‘ 75,565 ์ง€๋ฐฉํ–‰์ •์ธํ—ˆ๊ฐ€(์ผ๋ฐ˜์Œ์‹์ ยท๊ด€๊ด‘์‹๋‹นยท์ œ๊ณผ์ )
์ˆ™์†Œ 26,365 ์ˆ™๋ฐ•์—…ยท๋†์–ด์ดŒ๋ฏผ๋ฐ•ยทํ•œ์˜ฅ์ฒดํ—˜ยท๊ด€๊ด‘์ˆ™๋ฐ•ยท๊ด€๊ด‘ํŽœ์…˜
์นดํŽ˜ 15,619 ํœด๊ฒŒ์Œ์‹์ (์ปคํ”ผ์ˆยท์ „ํ†ต์ฐป์ง‘ยท๋””์ €ํŠธ)
๊ด€๊ด‘๋ช…์†Œ 3,844 ์ „ํ†ต์‚ฌ์ฐฐยท๋ฐ•๋ฌผ๊ด€/๋ฏธ์ˆ ๊ด€ยทํ…Œ๋งˆํŒŒํฌยท์•ผ์˜์žฅยทํœด์–‘์‹œ์„ค
๊ตญ๊ฐ€์œ ์‚ฐ 3,437 ๊ตญ๊ฐ€์œ ์‚ฐ์ฒญ(์œ ์ ๊ฑด์กฐ๋ฌผยท์ž์—ฐ์œ ์‚ฐยท๋“ฑ๋ก๋ฌธํ™”์œ ์‚ฐ)
์•ผ์˜์žฅ 1,698 ๊ณ ์บ ํ•‘(ํ•œ๊ตญ๊ด€๊ด‘๊ณต์‚ฌ)
์ถ•์ œ 345 ์ „๊ตญ๋ฌธํ™”์ถ•์ œํ‘œ์ค€๋ฐ์ดํ„ฐ(์ง€์ž์ฒด 229๊ณณ โ†’ ํฌํ„ธ ๋ณ‘ํ•ฉ)
ํ•ฉ๊ณ„ 126,873 ์ง€์—ญ ์ปค๋ฒ„ 89/89 ยท ์ง€์—ญ๋‹น ์ตœ์†Œ 305๊ณณ
  • ์˜์—… ์ค‘์ธ ๊ณณ๋งŒ ๋‹ด๋Š”๋‹ค. ์›๋ณธ์—๋Š” ํ์—…์ด ์„ž์—ฌ ์žˆ๋Š”๋ฐ(๊ฒฝ๋ถ ์ˆ™๋ฐ•์€ 41%๊ฐ€ ํ์—…) ๊ฑฐ๋ฅด์ง€ ์•Š์œผ๋ฉด ์—†์–ด์ง„ ๊ฐ€๊ฒŒ๊ฐ€ ์ฝ”์Šค์— ๋“ค์–ด๊ฐ„๋‹ค.
  • ์ˆ ์ง‘ยทํŽธ์˜์ ยท๋ถ€์†๋งค์  ๋“ฑ ์—ฌํ–‰์ง€๋กœ ๋ณผ ์ˆ˜ ์—†๋Š” ์—…ํƒœ 115,530๊ฑด์„ ์ œ์™ธํ–ˆ๋‹ค. ์—ฌ๊ธฐ์— ๋”ํ•ด ๋ฐฑํ™”์ ยท์•„์šธ๋ ›ยท์‡ผํ•‘๋ชฐยท๋Œ€ํ˜•๋งˆํŠธ ์•ˆ ์‹๋‹นยท์นดํŽ˜(216๊ฑด)์™€ ํŽธ์˜์ (465๊ฑด)์„ ๋บ€๋‹ค โ€” ์—…ํƒœ ํ•„ํ„ฐ๊ฐ€ ์žˆ๋Š”๋ฐ๋„ ๋‚จ์•˜๋‹ค. ๋ฐฑํ™”์  ์•ˆ ์Šคํƒ€๋ฒ…์Šค์˜ ์—…ํƒœ๋Š” '์ปคํ”ผ'๊ณ , ํŽธ์˜์ ๋„ ํœด๊ฒŒ์Œ์‹์ ์œผ๋กœ ๋“ฑ๋ก๋˜๋ฉด '๋ถ„์‹'์ด๋ผ ์—…ํƒœ๋กœ๋Š” ๊ฐ€๋ฆด ์ˆ˜ ์—†๋‹ค. ์œ„์น˜ ๋‹จ์„œ๊ฐ€ ์ฃผ์†Œ ๋ฌธ์ž์—ด์—๋งŒ ์žˆ์–ด ์‹œ์„ค๋ช…ยท๋ธŒ๋žœ๋“œ๋ช…์œผ๋กœ ๊ฑฐ๋ฅด๋˜, ๋‹ค๋ฅธ ์ƒํ˜ธ์— ๋ผ๋Š” ๊ฒƒ(์ œ์ด๋งˆํŠธยท์”จ์œ ๋ฏผ๋ฐ•ยทCUBE)์€ ์ „์ˆ˜๋กœ ํ™•์ธํ•ด ์˜ˆ์™ธ๋กœ ๋’€๋‹ค.
  • ์ฃผ์†Œ์˜ ์‹œ๋„ยท์‹œ๊ตฐ๊ตฌ๊ฐ€ ๊ทธ ์ง€์—ญ๊ณผ ๋งž๋Š”์ง€ ํ™•์ธํ•œ๋‹ค. ์˜ˆ์ „์—๋Š” ์‹œ๊ตฐ๊ตฌ ์ด๋ฆ„๋งŒ ๋งž์œผ๋ฉด ๋ถ™์—ฌ์„œ, ์ „๊ตญ์˜ ๋™๊ตฌยท๋‚จ๊ตฌ๊ฐ€ ๋ถ€์‚ฐ ๋™๊ตฌยท๋Œ€๊ตฌ ๋‚จ๊ตฌ๋กœ ๋นจ๋ ค ๋“ค์–ด์™”๋‹ค(๋ถ€์‚ฐ ๋™๊ตฌ๋Š” 15,701๊ฑด ์ค‘ ๋ถ€์‚ฐ์ด 1,816๊ฑด๋ฟ์ด์—ˆ๋‹ค). ๋ฐฐํฌ ํŒŒ์ผ์„ ์ง์ ‘ ์—ฌ๋Š” ํ…Œ์ŠคํŠธ๊ฐ€ ์ด ๋ถˆ๋ณ€์‹์„ ์ž ๊ทผ๋‹ค.
  • ์ „ํ™”๋ฒˆํ˜ธ๊ฐ€ 49% ๋ถ™์–ด ์žˆ๋‹ค. ๊ด€๊ด‘ API์—๋Š” ์—†๋˜ ์ •๋ณด๋‹ค.
  • ๊ฐฑ์‹ ์€ ๋ถ„๊ธฐ 1ํšŒ, ๋นŒ๋“œ ํƒ€์ž„ ์Šคํฌ๋ฆฝํŠธ๋กœ ์ฒ˜๋ฆฌํ•œ๋‹ค(scripts/build_place_pool.py).

์ถ•์ œ๋Š” TourAPI๊ฐ€ ๋น„์›Œ ๋‘” ์ž๋ฆฌ๋‹ค. ๊ด€๊ด‘ API์˜ ์ถ•์ œ ์กฐํšŒ๋ฅผ 89๊ณณ ์ „์ˆ˜๋กœ ๋Œ๋ฆฌ๋ฉด ํ•ฉ๊ณ„ 1๊ฑด์ด ๋‚˜์˜จ๋‹ค(์ถ•์ œ 0๊ฑด์ธ ์ง€์—ญ 86๊ณณ). ํƒ์นจ ์˜ค๋ฅ˜๊ฐ€ ์•„๋‹ˆ๋ผ ์ถ•์ œ ํƒ€์ž…๋งŒ ๋น„์–ด ์žˆ๋Š” ๊ฒƒ์œผ๋กœ, ์•ˆ๋™๊ตญ์ œํƒˆ์ถคํŽ˜์Šคํ‹ฐ๋ฒŒ์ด ์žˆ๋Š” ์•ˆ๋™์‹œ์กฐ์ฐจ 0์ด์—ˆ๋‹ค. ๊ฐ™์€ 89๊ณณ์„ ์ „๊ตญ๋ฌธํ™”์ถ•์ œํ‘œ์ค€๋ฐ์ดํ„ฐ๋กœ ์žฌ๋ฉด 446๊ฑด์ด๊ณ  88/89๊ณณ์„ ๋ฎ๋Š”๋‹ค(0๊ฑด์€ ๊ฒฝ๋‚จ ํ•จ์•ˆ๊ตฐ ํ•˜๋‚˜). ๊ทธ์ค‘ ์ขŒํ‘œ๊ฐ€ ์žˆ๋Š” 345๊ฑด๋งŒ ๋‹ด๋Š”๋‹ค โ€” ์ขŒํ‘œ๊ฐ€ ์—†์œผ๋ฉด ๋™์„ ์— ๋ชป ์˜ฌ๋ฆฐ๋‹ค. ์ƒ์œ„๋Š” ๋ณด๋ น์‹œ 26 ยท ์‹ ์•ˆ๊ตฐ 25 ยท ํ•˜๋™๊ตฐ 25 ยท ์˜์›”๊ตฐ 15๊ณณ์ด๊ณ , ์ง€์—ญ๋‹น ์ค‘์•™๊ฐ’์€ 3๊ณณ์ด๋‹ค. ๋‹ค๋ฅธ ํ’€๊ณผ ๋‹ฌ๋ฆฌ ์‚ฌ์ง„์ด ์˜ค์ง€ ์•Š๋Š”๋‹ค. ์—ฌํ–‰์ผ์— ์‹ค์ œ๋กœ ์—ด๋ฆฌ๋Š” ์ถ•์ œ๋งŒ ์ฝ”์Šค ํ›„๋ณด๊ฐ€ ๋˜๋ฉฐ, ๊ฐฑ์‹ ์€ ์›” 1ํšŒ ๋ฐฐ์น˜๋‹ค.

์•ผ์˜์žฅ์€ ์ˆ™์†Œ์˜ ๋นˆํ‹ˆ์„ ๋ฉ”์šด๋‹ค โ€” ์ˆ˜๊ฐ€ ์•„๋‹ˆ๋ผ ์‚ฌ์ง„์ด๋‹ค. ์ธํ—ˆ๊ฐ€ ์ˆ™์†Œ๋Š” 26,365๊ฑด์œผ๋กœ ์ง€์—ญ๋‹น ํ‰๊ท  296๊ณณ์ด๋‚˜ ๋˜์ง€๋งŒ ์‚ฌ์ง„์ด ํ•œ ์žฅ๋„ ์—†๋‹ค. ์ด๋ฆ„ยท์ฃผ์†Œยท์ „ํ™”๋ฟ์ด๋ผ ์ฝ”์Šค์— ์˜ฌ๋ผ๊ฐ€๋„ ํ™”๋ฉด์ด ํšŒ์ƒ‰ ํŒ์ด ๋œ๋‹ค. ์‚ฌ์ง„์ด ๋ถ™์€ ์ˆ™์†Œ๋Š” ๊ด€๊ด‘ API ์ชฝ 922๊ฑด๋ฟ์ด๊ณ , 89๊ณณ์œผ๋กœ ๋‚˜๋ˆ„๋ฉด ์ง€์—ญ๋‹น ์—ด๋‘ ๊ณณ ๋‚จ์ง“์ด ํ™”๋ฉด์— ์“ธ ์ˆ˜ ์žˆ๋Š” ์ „๋ถ€์˜€๋‹ค.

  • ๊ณ ์บ ํ•‘์„ ์šฐ๋ฆฌ 89๊ณณ์œผ๋กœ ์žฌ๋ฉด ์šด์˜ ์ค‘์ธ ๊ฒƒ์ด 1,702๊ฑด์ด๊ณ  ๊ทธ์ค‘ 1,698๊ฑด(99.8%)์— ์ขŒํ‘œ, 1,288๊ฑด(75%)์— ์‚ฌ์ง„์ด ์žˆ๋‹ค. 87/89๊ณณ์„ ๋ฎ๊ณ  ์ง€์—ญ๋‹น ์ค‘์•™๊ฐ’์€ 13๊ณณ์ด๋‹ค. ๋น ์ง„ ๋‘˜์€ ๋ถ€์‚ฐ ๋™๊ตฌยท๋Œ€๊ตฌ ๋‚จ๊ตฌ๋กœ, ๋„์‹ฌ ์ž์น˜๊ตฌ๋ผ ์•ผ์˜์žฅ์ด ์—†๋Š” ๊ฒƒ์ด ์ •์ƒ์ด๋‹ค.
  • ๊ฒน์นจ์„ ๋จผ์ € ์Ÿ€๋‹ค. ๊ด€๊ด‘ API ์ˆ™์†Œ์— ์ด๋ฏธ ์•ผ์˜์žฅ์ด ์„ž์—ฌ ์žˆ์–ด(๋Œ€๋ถ„๋ฅ˜ ์ˆ™๋ฐ• 977๊ฑด ์ค‘ 625๊ฑด์ด ๋ ˆํฌ์ธ  ํƒ€์ž…) ์ด๋ฆ„์ด ๊ฐ™๊ฑฐ๋‚˜ ์ขŒํ‘œ๊ฐ€ 200m ์ด๋‚ด์ธ 375๊ฑด์„ ์ œ์™ธํ–ˆ๋‹ค. ์ˆœ์ฆ์€ 1,323๊ฑด์ด๊ณ  ๊ทธ์ค‘ 964๊ฑด์— ์‚ฌ์ง„์ด ์žˆ๋‹ค โ€” ์‚ฌ์ง„ ์žˆ๋Š” ์ˆ™์†Œ ํ›„๋ณด๊ฐ€ 922 โ†’ 1,886๊ฑด์ด ๋œ๋‹ค.
  • ํœด์žฅ์€ ๋‹ด์ง€ ์•Š๋Š”๋‹ค. ์ „๊ตญ 3,115๊ฑด ์ค‘ 123๊ฑด์ด ํœด์žฅ์ธ๋ฐ, ๋ฌธ ๋‹ซ์€ ๊ณณ์„ ์ฝ”์Šค์— ๋„ฃ์œผ๋ฉด ํ—›๊ฑธ์Œ์ด๋ผ ์นด๋“œ๊ฐ€ ๋น„๋Š” ๊ฒƒ๋ณด๋‹ค ๋‚˜์˜๋‹ค.
  • ํ‘œ์˜ ๊ด€๊ด‘๋ช…์†Œ์—๋„ ์•ผ์˜์žฅ์ด ์žˆ์ง€๋งŒ ๋‹ค๋ฅธ ๊ฒƒ์ด๋‹ค. ๊ทธ์ชฝ์€ ์ธํ—ˆ๊ฐ€ ๋ฐ์ดํ„ฐ์˜ ๋ณผ๊ฑฐ๋ฆฌ ๋ถ„๋ฅ˜์ด๊ณ , ์ด ํ’€์€ ์ˆ™์†Œ ํ›„๋ณด๋กœ ๋“ค์–ด๊ฐ„๋‹ค.
  • ์šด์˜๊ธฐ๊ฐ„ยท์šด์˜์ผยท์˜ˆ์•ฝ๋ฐฉ๋ฒ•์ด ํ•จ๊ป˜ ์˜จ๋‹ค(78~80%). ์šฐ๋ฆฌ๊ฐ€ ๊ฐ€์ง„ ์žฅ์†Œ ํ’€ ์ค‘ "์–ธ์ œ ์—ฌ๋‚˜" ์— ๋‹ตํ•˜๋Š” ์œ ์ผํ•œ ์†Œ์Šค๋ผ, ์ƒ์„ธ์—์„œ ์ง€๋„๋กœ ๋„˜๊ธฐ์ง€ ์•Š๋Š”๋‹ค.
  • ์ฝ”์Šค์—๋Š” ์‚ฌ์ง„ ์žˆ๋Š” ์ˆ™์†Œ๊ฐ€ ์—†์„ ๋•Œ๋งŒ ์˜ฌ๋ผ๊ฐ„๋‹ค. ์ˆ™๋ฐ• ์Šฌ๋กฏ์€ ๋ณผ๊ฑฐ๋ฆฌ ์ค‘์‹ฌ์—์„œ ๊ฐ€๊นŒ์šด ๊ฒƒ์„ ๋ฝ‘๋Š”๋ฐ, ์•ผ์˜์žฅ์€ ์‚ฐยท๊ณ„๊ณกยท์œ ์  ๊ทผ์ฒ˜๋ผ ๊ทธ ์ค‘์‹ฌ์— ๊ฐ€๊น๋‹ค. ๊ฑฐ๋ฆฌ๋งŒ ๋ณด๋ฉด ์‚ฌ์ง„ ์žˆ๋Š” ํ˜ธํ…”์„ ๋ฐ€์–ด๋‚ด ์‚ฌ์ง„ ์žˆ๋Š” ์ˆ™์†Œ๊ฐ€ 141 โ†’ 119๊ฑด์œผ๋กœ ์˜คํžˆ๋ ค ์ค„์—ˆ๋‹ค(83๊ณณ ร— 2๋ฐ• ์‹ค์ธก). ๊ทธ๋ž˜์„œ ์ˆ™์†Œ๋ฅผ ๋จผ์ € ์ฑ„์šฐ๊ณ  ๋ชจ์ž๋ž„ ๋•Œ๋งŒ ์•ผ์˜์žฅ์„ ์“ด๋‹ค โ€” ๊ทธ ๊ฒฐ๊ณผ ์ˆ™๋ฐ• ์ž๋ฆฌ์˜ 1%(2์ž๋ฆฌ) ์—๋งŒ ๋“ค์–ด๊ฐ€๊ณ , ์‚ฌ์ง„ ์žˆ๋Š” ์ˆ™์†Œ๋Š” 166/166 ์ด ๋œ๋‹ค.
  • ๊ฐฑ์‹ ์€ ์›” 1ํšŒ ๋ฐฐ์น˜๋‹ค.

๊ตญ๊ฐ€์œ ์‚ฐ์€ ์ธํ—ˆ๊ฐ€ ๋ณผ๊ฑฐ๋ฆฌ์˜ ๋นˆํ‹ˆ์„ ๋ฉ”์šด๋‹ค. ์ธํ—ˆ๊ฐ€ ๊ด€๊ด‘๋ช…์†Œ์—๋Š” ์•ผ์˜์žฅยท๊ณจํ”„์žฅ์ด ์„ž์—ฌ ์žˆ๋Š”๋ฐ, ๊ตญ๋ณดยท์‚ฌ์ ยท์ฒœ์—ฐ๊ธฐ๋…๋ฌผ์€ ๊ทธ ์ž์ฒด๊ฐ€ ๊ด€๊ด‘ ์ž์›์ด๋‹ค. 88/89๊ณณ์„ ๋ฎ๊ณ  ์ง€์—ญ๋‹น ์ค‘์•™๊ฐ’ 36๊ณณ์ด๋ฉฐ, ๋ณผ๊ฑฐ๋ฆฌ๊ฐ€ ๊ฐ€์žฅ ์–‡๋˜ ๊ฒฝ๋ถ(1,489)ยท๊ฒฝ๋‚จ(1,269)ยท์ „๋‚จ(992)์ด ๊ฐ€์žฅ ๋‘๊ป๊ฒŒ ์ฑ„์›Œ์ง„๋‹ค. ๋Œ€๊ตฌ ์„œ๊ตฌ๋งŒ 0๊ณณ์ธ๋ฐ ๊ทธ ์ง€์—ญ ๊ตญ๊ฐ€์œ ์‚ฐ์ด ๋ฌดํ˜•์œ ์‚ฐ 3๊ฑด๋ฟ์ด๋ผ ๊ทธ๋ ‡๋‹ค.

  • ์‚ฌ์ง„ 97%ยท์„ค๋ช… 98% ๊ฐ€ ํ•จ๊ป˜ ์˜จ๋‹ค(์ ์žฌ 3,437๊ฑด ๊ธฐ์ค€). ์ธํ—ˆ๊ฐ€ ๋ฐ์ดํ„ฐ์—๋Š” ๋‘˜ ๋‹ค ์—†์–ด ์นด๋“œ๊ฐ€ ๋น„์—ˆ๋˜ ์ž๋ฆฌ๋‹ค.
  • ๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ๋งŒ ๋‹ด๋Š”๋‹ค. ์ˆ˜์ง‘ํ•œ 6,387๊ฑด ์ค‘ ์œ ๋ฌผ(1,409)ยท๊ธฐ๋ก์œ ์‚ฐ(846)ยท๋ฌดํ˜•์œ ์‚ฐ(234)์„ ๋Œ€๋ถ„๋ฅ˜๋กœ ๋นผ๊ณ , ๋Œ€๋ถ„๋ฅ˜๊ฐ€ ํ†ต๊ณผํ•œ ๊ฒƒ์—์„œ๋„ ๋ฐœ๊ตด ์กฐ์‚ฌ ๊ตฌ์—ญ(์‹ ์•ˆ ํ•ด์ €์œ ๋ฌผ ๋งค์žฅํ•ด์—ญ)๊ณผ ๊ฐœ์ธ ๋ฌ˜(์ด๊ทœ๋ณด ๋ฌ˜) 292๊ฑด์„ ์ค‘๋ถ„๋ฅ˜๋กœ ๋บ€๋‹ค. ์ขŒํ‘œ๋ฅผ ๋ชป ์ฑ„์šด 126๊ฑด๊ณผ ์›๋ณธ์— ์†Œ์žฌ์ง€๊ฐ€ ์—†๋Š” 6๊ฑด๋„ ๋น ์ง„๋‹ค. ์ข…๋ชฉ์œผ๋กœ๋Š” ์•ˆ ๊ฐˆ๋ฆฐ๋‹ค โ€” ์šฐ๋ฆฌ 89๊ณณ์˜ ๊ตญ๋ณดยท๋ณด๋ฌผ ํ‘œ๋ณธ 12๊ฑด์ด ์ „๋ถ€ ๋™๊ถ๋„ยท์ž์ˆ˜ ์ดˆ์ถฉ๋„ ๋ณ‘ํ’ ๊ฐ™์€ ์†Œ์žฅ ์œ ๋ฌผ์ด์—ˆ๊ณ , ์ฃผ์†Œ๊ฐ€ ์†Œ์žฅ ๊ธฐ๊ด€์ด๋ผ ๊ทธ๋Œ€๋กœ ์“ฐ๋ฉด ๊ทธ๋ฆผ ํ•œ ์ ์ด ๋ชฉ์ ์ง€๊ฐ€ ๋œ๋‹ค. ๋ฐ˜๋Œ€๋กœ ๊ตญ๋ณดยท๋ณด๋ฌผ์„ ํ†ต์งธ๋กœ ๋นผ๋ฉด ์‚ฌ์ฐฐ ๋Œ€์›…์ „ยท์„ํƒ‘์ด ํ•จ๊ป˜ ๋‚ ์•„๊ฐ„๋‹ค. ๊ตญ๊ฐ€์œ ์‚ฐ์ฒญ์ด ์ฃผ๋Š” ๋Œ€๋ถ„๋ฅ˜๊ฐ€ ์ •ํ™•ํžˆ ์ด ๋‘˜์„ ๊ฐ€๋ฅธ๋‹ค.
  • ์ขŒํ‘œ๋ฅผ ์ง€์˜ค์ฝ”๋”ฉ์œผ๋กœ ์ฑ„์šด๋‹ค. ์›๋ณธ์€ 72%๋งŒ ์ขŒํ‘œ๋ฅผ ์ฃผ๋Š”๋ฐ, ์†Œ์žฌ์ง€ ์ฃผ์†Œ๋ฅผ ์นด์นด์˜คยท๋„ค์ด๋ฒ„๋กœ ์˜ฎ๊ฒจ 89% ๋กœ ์˜ฌ๋ ธ๋‹ค. ๋ถ€์‚ฐ๊ด‘์—ญ์‹œ ๋™๊ตฌ์ฒ˜๋Ÿผ ์‹œ๊ตฐ๊ตฌ๊นŒ์ง€๋งŒ ์žˆ๋Š” ์ฃผ์†Œ๋Š” ๊ด€๊ณต์„œ ์ขŒํ‘œ๋กœ ์ฐํžˆ๋ฏ€๋กœ ์ผ๋ถ€๋Ÿฌ ๋ฒ„๋ฆฐ๋‹ค.
  • ๊ด€๊ด‘ API ์ผ์ผ ํ•œ๋„์™€ ๋ฌด๊ด€ํ•˜๋‹ค โ€” ๊ตญ๊ฐ€์œ ์‚ฐ์ฒญ ์ž์ฒด API ๋ผ ๊ทธ์ชฝ์ด ๋ง๋ผ๋„ ์ด ํ›„๋ณด๋Š” ์‚ฐ๋‹ค.
  • ๊ฐฑ์‹ ์€ ์—ฐ 1ํšŒ๋ฉด ์ถฉ๋ถ„ํ•˜๋‹ค(scripts/build_heritage_pool.py).

์—ฌ๊ธฐ์— ๊ด€๊ด‘ API(TourAPI) ๊ฐ€ ์–นํžŒ๋‹ค. ๊ทธ์ชฝ์€ ์‚ฌ์ง„ยท์†Œ๊ฐœ๊ฐ€ ๋ถ™์–ด ํ™”๋ฉด ํ’ˆ์งˆ์ด ๋†’์œผ๋ฏ€๋กœ 1์ˆœ์œ„๋กœ ์“ฐ๊ณ , ๋ชจ์ž๋ž€ ์ž๋ฆฌ๋งŒ ์œ„ ํ’€๋กœ ์ฑ„์šด๋‹ค.

์ง€์—ญ ์นด๋“œ์˜ ๋Œ€ํ‘œ ์‚ฌ์ง„์€ ๋”ฐ๋กœ ๊ณ ๋ฅธ๋‹ค. ๊ด€๊ด‘๊ณต์‚ฌ ์ค‘์‹ฌ ๊ด€๊ด‘์ง€(์‹ค์ œ ์ด๋™ ๋ฐ์ดํ„ฐ ๊ธฐ๋ฐ˜ ์ˆœ์œ„) ์ƒ์œ„๋ฅผ ํ›‘์–ด ๊ด€๊ด‘์‚ฌ์ง„ ๊ฐค๋Ÿฌ๋ฆฌ 6,118๊ฑด์—์„œ ์‚ฌ์ง„์ด ์žˆ๋Š” ์ฒซ ๋ช…์†Œ๋ฅผ ์„ธ์šด๋‹ค โ€” ๊ณต์ฃผ์‹œ๋ฉด ๊ณต์‚ฐ์„ฑ์ด๋‹ค. ํ„ฐ๋ฏธ๋„ยท์—ญยท๊ณจํ”„์žฅยท์Šคํ‚ค๋ฆฌ์กฐํŠธ๊ฐ€ 1์œ„์ธ ์ง€์—ญ์ด ํ”ํ•ด์„œ ์ˆœ์œ„๋ฅผ ๊ทธ๋Œ€๋กœ ์“ฐ์ง€ ์•Š๋Š”๋‹ค. 86/89๊ณณ์ด ๊ฐค๋Ÿฌ๋ฆฌ ์‚ฌ์ง„์œผ๋กœ ์ฑ„์›Œ์ง€๊ณ , ๋‚˜๋จธ์ง€ 3๊ณณ๋งŒ ๊ด€๊ด‘ API ์‚ฌ์ง„์œผ๋กœ ๋‚ด๋ ค๊ฐ„๋‹ค.

๊ฐค๋Ÿฌ๋ฆฌ๊ฐ€ ์ฃผ๋Š” URL์€ 19%๊ฐ€ ์ฃฝ์–ด ์žˆ์–ด(1,790์žฅ ์ค‘ 345์žฅ์ด 404) ์ ์žฌํ•  ๋•Œ ์ƒ์กด์„ ํ™•์ธํ•˜๊ณ  ๋ฒ„๋ฆฐ๋‹ค. ํ™•์ธํ•˜์ง€ ์•Š์œผ๋ฉด ์ง€์—ญ 15๊ณณ์— ๊นจ์ง„ ์ด๋ฏธ์ง€๊ฐ€ ๊ทธ๋Œ€๋กœ ๋‚˜๊ฐ”๋‹ค.


์„ค๊ณ„์—์„œ ๊ฐ€์žฅ ์‹ ๊ฒฝ ์“ด ๊ฒƒ โ€” ์™ธ๋ถ€๊ฐ€ ์ฃฝ์–ด๋„ ์„œ๋น„์Šค๋Š” ์‚ฐ๋‹ค

์ด ํ”„๋กœ์ ํŠธ๋Š” ๋А๋ฆฌ๊ณ  ๋ถˆ์•ˆ์ •ํ•œ ๊ณต๊ณต API ์œ„์— ์„œ ์žˆ๋‹ค. ํ™”๋ฉด ํ•˜๋‚˜๊ฐ€ ์™ธ๋ถ€ API ์—ฌ๋Ÿฌ ๊ฐœ๋ฅผ ๋ชจ์œผ๋ฏ€๋กœ, ์™ธ๋ถ€ ์žฅ์• ๊ฐ€ ๊ณง ์„œ๋น„์Šค ์žฅ์• ๊ฐ€ ๋˜๊ธฐ ์‰ฝ๋‹ค. ์‹ค์ œ๋กœ ๊ฒช์—ˆ๋‹ค โ€” ๊ด€๊ด‘ API ์ผ์ผ ํ•œ๋„๊ฐ€ ์†Œ์ง„๋˜์ž ์ฝ”์Šค ์ƒ์„ฑ์ด ํ†ต์งธ๋กœ ๋ฉˆ์ท„๋‹ค.

๊ทธ๋ž˜์„œ ๋ฐ”๋€Œ์ง€ ์•Š๋Š” ๋ฐ์ดํ„ฐ๋Š” ๋ฏธ๋ฆฌ DB์— ๋„ฃ๋Š”๋‹ค.

๋ฐฉ์‹ ๊ทœ๋ชจ
์ˆ™์†Œยท๋ง›์ง‘ยท์นดํŽ˜ยท๊ด€๊ด‘๋ช…์†Œ ์ง€๋ฐฉํ–‰์ •์ธํ—ˆ๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ๋นŒ๋“œ ํƒ€์ž„์— ๊ฐ€๊ณต โ†’ ๋ถ€ํŒ… ์‹œ ์ ์žฌ 122,085๊ฑด
89๊ฐœ ์ง€์—ญ ๋งˆ์Šคํ„ฐ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ seed 89๊ณณ
๊ณตํœด์ผยท๊ด€๊ด‘ยท๋‚ ์”จยท๊ตํ†ต ๋Ÿฐํƒ€์ž„ ํ˜ธ์ถœ + ์บ์‹œ 11๊ฐœ ํด๋ผ์ด์–ธํŠธ

ํšจ๊ณผ๊ฐ€ ๋ถ„๋ช…ํ•˜๋‹ค. ๊ด€๊ด‘ API๊ฐ€ ์ฃฝ์–ด ์žˆ์–ด๋„ ์ฝ”์Šค๊ฐ€ ๋‚˜์˜จ๋‹ค.

// ๊ด€๊ด‘ API ํ•œ๋„ ์†Œ์ง„ ์ƒํƒœ์—์„œ ์ƒ์„ฑํ•œ ์˜์„ฑ๊ตฐ 1๋ฐ•2์ผ
"items": [
  { "kind": "SIGHT", "title": "๊ณ ์šด์‚ฌ",        "poiContentId": "LIC-199461" },
  { "kind": "FOOD",  "title": "๋‹จ์ดŒํ•œ์šฐ์•”์†Œ์‹๋‹น", "poiContentId": "LIC-197629" },
  { "kind": "STAY",  "title": "๊ฐ‘์‚ฌํ•œ์˜ฅ๋ฏผ๋ฐ•",    "poiContentId": "LIC-199523" }
]

๊ด€๊ด‘ API๊ฐ€ ๋„‰๋„‰ํ•œ ์ง€์—ญ์€ ๊ทธ์ชฝ์„ ๋จผ์ € ์“ฐ๊ณ (์‚ฌ์ง„ยท์†Œ๊ฐœ๊ฐ€ ๋ถ™๋Š”๋‹ค), ๋ชจ์ž๋ž€ ์ž๋ฆฌ๋งŒ ์ธํ—ˆ๊ฐ€ ๋ฐ์ดํ„ฐ๋กœ ์ฑ„์šด๋‹ค. LIC- ์ ‘๋‘์–ด๋กœ ์ถœ์ฒ˜๊ฐ€ ๊ตฌ๋ถ„๋˜๊ณ , ์ƒ์„ธ ์กฐํšŒ๋„ ๋ฐฑ์—”๋“œ๊ฐ€ ์•Œ์•„์„œ ์ฒ˜๋ฆฌํ•œ๋‹ค.

๊ทธ ๋ฐ–์˜ ์„ฑ๋Šฅ ์›์น™

  • ์š”์ฒญ ๊ฒฝ๋กœ์—์„œ ์™ธ๋ถ€ I/O๋ฅผ ๋บ€๋‹ค. ์บ์‹œ TTL์€ ๋ฐ์ดํ„ฐ ํŠน์„ฑ์—์„œ ๋„์ถœํ•œ๋‹ค(์›”๊ฐ„ ๋ฐœํ–‰ โ†’ 6์‹œ๊ฐ„, ์‹ค์‹œ๊ฐ„ โ†’ ์ˆ˜์‹ญ ์ดˆ).
  • ํŒฌ์•„์›ƒ์€ ๋ณ‘๋ ฌ. ํ›„๋ณด N๊ฐœ์— ์™ธ๋ถ€ ํ˜ธ์ถœ์„ ๋ถ™์ด๋Š” ์ˆœ์ฐจ ๋ฃจํ”„๋Š” ์ง€์—ฐ์ด N๋ฐฐ๋กœ ๊ณฑํ•ด์ง„๋‹ค.
  • timeout์€ p99์—์„œ ์ •ํ•œ๋‹ค. ํ˜ธ์ถœ ํ•˜๋‚˜์˜ ์ƒํ•œ๊ณผ ์ž‘์—… ์ „์ฒด์˜ deadline์€ ๋ณ„๊ฐœ๋กœ ๋‘”๋‹ค.
  • ๋นˆ ์‘๋‹ต์„ ์„ฑ๊ณต์œผ๋กœ ์บ์‹œํ•˜์ง€ ์•Š๋Š”๋‹ค. ์‹คํŒจ์™€ ๊ฒฐ๊ณผ๊ฐ€ ๊ฐ™์€๋ฐ ์„ฑ๊ณต TTL๋กœ ๋ˆ„๋ฅด๋ฉด ๋ฌด์˜๋ฏธํ•œ ์ƒํƒœ๊ฐ€ ๊ทธ๋งŒํผ ๊ตณ๋Š”๋‹ค.

๊ทผ๊ฑฐ์™€ ์‹ค์ธก์น˜๋Š” ADR 0001.


์•„ํ‚คํ…์ฒ˜

package-by-feature. ๋„๋ฉ”์ธ์ด ๋šœ๋ ทํ•˜๊ฒŒ ๋‚˜๋‰˜๊ณ  ์™ธ๋ถ€ API ์—ฐ๋™์„ ๊ฒฉ๋ฆฌํ•œ๋‹ค.

com.offway.core.<domain>/
โ”œโ”€โ”€ controller/     HTTP ์ง„์ž… ยท <D>Api(OpenAPI ์ธํ„ฐํŽ˜์ด์Šค) ยท dto(API ๊ณ„์•ฝ)
โ”œโ”€โ”€ service/        ์œ ์Šค์ผ€์ด์Šค ์กฐ์œจ ยท @Transactional ๊ฒฝ๊ณ„ ยท dto(๋‚ด๋ถ€ command/result)
โ”œโ”€โ”€ domain/         ์—”ํ‹ฐํ‹ฐ ยท ๊ฐ’๊ฐ์ฒด ยท enum ยท ์˜ˆ์™ธ          โ† ํ”„๋ ˆ์ž„์›Œํฌ ์˜์กด ์ตœ์†Œ
โ”œโ”€โ”€ repository/     port(interface) + adapter(Impl โ†’ JpaRepository)
โ””โ”€โ”€ infrastructure/ ์™ธ๋ถ€ API port + adapter

์˜์กด ๋ฐฉํ–ฅ์€ controller โ†’ service โ†’ domain์ด๊ณ , repository์™€ infrastructure๊ฐ€ domain์˜ port๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค.

๋„๋ฉ”์ธ๊ณผ ์™ธ๋ถ€ API ์†Œ์œ 

๋„๋ฉ”์ธ ์ฑ…์ž„ ์†Œ์œ  ์™ธ๋ถ€ API
leave ์—ฐ์ฐจยท๊ฐ€์šฉ์‹œ๊ฐ„(LNT)ยท์ƒŒ๋“œ์œ„์น˜ ์—ฐํœด ํŠน์ผ์ •๋ณด
trip ์ธ๊ตฌ๊ฐ์†Œ์ง€์—ญยท๊ด€๊ด‘์ง€ ์ถ”์ฒœ ยท ์žฅ์†Œ ํ’€ TourAPI ยท ๊ด€๊ด‘๋น…๋ฐ์ดํ„ฐ
transport ๊ตํ†ตยท๋™์„  TMAP ยท TAGO(๋ฒ„์Šคยท์—ด์ฐจ)
weather ๋‚ ์”จ ๊ธฐ์ƒ์ฒญ ๋‹จ๊ธฐ/์ค‘๊ธฐ ยท ๊ด€๊ด‘๊ธฐํ›„์ง€์ˆ˜
itinerary ์ฝ”์Šค ์ƒ์„ฑ(trip+transport ์กฐํ•ฉ) โ€”
region ์ธ๊ตฌ๊ฐ์†Œ์ง€์—ญ 89๊ณณ ๋งˆ์Šคํ„ฐยทํƒœ๊ทธ โ€”
policy ์—ฌํ–‰ ํ˜œํƒ ๋งค์นญ โ€”
user ์‚ฌ์šฉ์žยท์ธ์ฆ OAuth (ํ›„์ˆœ์œ„)

์™ธ๋ถ€ API๋Š” ์†Œ์œ  ๋„๋ฉ”์ธ์˜ infrastructure/์— port+adapter๋กœ ๋‘”๋‹ค. ๋‹ค๋ฅธ ๋„๋ฉ”์ธ์ด ํ•„์š”ํ•˜๋ฉด ์†Œ์œ  ๋„๋ฉ”์ธ์˜ service๋ฅผ ๊ฑฐ์นœ๋‹ค โ€” ์ง์ ‘ ํ˜ธ์ถœํ•˜์ง€ ์•Š๋Š”๋‹ค.

๋„๋ฉ”์ธ ๊ฐ„ ์ฐธ์กฐ๋Š” raw ID + ์„œ๋น„์Šค ์กฐํšŒ๋‹ค. JPA ์—ฐ๊ด€๊ด€๊ณ„๋Š” ์• ๊ทธ๋ฆฌ๊ฑฐํŠธ ๋‚ด๋ถ€์—๋งŒ ์“ด๋‹ค(Itinerary โ†” ItineraryItem ๊ฐ™์€ ๊ฒƒ). ๋Œ€๋ถ€๋ถ„์˜ ์ฐธ์กฐ ๋Œ€์ƒ์ด ์™ธ๋ถ€ API์—์„œ ์˜จ ๋ ˆํผ๋Ÿฐ์Šค ๋ฐ์ดํ„ฐ๋ผ ์˜จ์ „ํ•œ ์—”ํ‹ฐํ‹ฐ๊ฐ€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.


์‘๋‹ต ๊ตฌ์กฐ

๋ชจ๋“  ์‘๋‹ต์ด ๊ฐ™์€ ๋ž˜ํผ๋ฅผ ์“ด๋‹ค. ์ปจํŠธ๋กค๋Ÿฌ๋Š” ApiResponseBody<T>๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ  raw DTO๋ฅผ ๋…ธ์ถœํ•˜์ง€ ์•Š๋Š”๋‹ค.

{
  "status": 200,
  "data": { ... },        // ์‹คํŒจ ์‹œ null
  "detail": "์š”์ฒญ์ด ์ •์ƒ ์ฒ˜๋ฆฌ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.",
  "code": "OK",           // ์‹คํŒจ ์‹œ ๋„๋ฉ”์ธ ์ฝ”๋“œ (LEAVE-001, TOUR-003 ...)
  "pageResponse": null    // ๋ชฉ๋ก ์‘๋‹ต์—๋งŒ
}

์—๋Ÿฌ๋Š” ์ฝ”๋“œ๋กœ ์‹๋ณ„ํ•œ๋‹ค

๋ฌธ๊ตฌ๊ฐ€ ์•„๋‹ˆ๋ผ code(์˜ˆ: TRIP-001)๋กœ ์‚ฌ์œ ๋ฅผ ๊ฐ€๋ฅธ๋‹ค. ๋„๋ฉ”์ธ๋ณ„ *ErrorCode enum์ด codeยทcategoryยทmessage๋ฅผ single source๋กœ ๊ฐ–๊ณ , HTTP status๋Š” ErrorCategory์—์„œ ํŒŒ์ƒํ•œ๋‹ค โ€” ์˜ˆ์™ธ๊ฐ€ status๋ฅผ ์ง์ ‘ ๋“ค์ง€ ์•Š๋Š”๋‹ค.

๋ฒˆํ˜ธ๋Š” append-only๋‹ค. ์žฌ์‚ฌ์šฉยท์žฌ๋ฐฐ์น˜ํ•˜์ง€ ์•Š๊ณ  ๊ฒฐ๋ฒˆ์„ ์œ ์ง€ํ•œ๋‹ค(์ฝ”๋“œ๊ฐ€ ํด๋ผ์ด์–ธํŠธ ๊ณ„์•ฝ์ด๋ฏ€๋กœ).

์—†๋Š” ๊ฐ’์€ ๋‚ด๋ ค๋ณด๋‚ด์ง€ ์•Š๋Š”๋‹ค

์ธํ—ˆ๊ฐ€ ๋ฐ์ดํ„ฐ๋กœ ์ฑ„์šด ์Šฌ๋กฏ์€ ์‚ฌ์ง„ยท์†Œ๊ฐœ๊ฐ€ ์—†์–ด ๋งค๋ฒˆ null์ด ์‹ค๋ ธ๋‹ค. ์ฝ”์Šค ์‘๋‹ต์—์„œ ๊ทธ๋Ÿฐ ํ•„๋“œ๋ฅผ ๋บ๋‹ค โ€” ์‘๋‹ต์ด 16% ๊ฐ€๋ฒผ์›Œ์กŒ๋‹ค(3,077์ž โ†’ 2,572์ž, null ํ•„๋“œ 26๊ฐœ โ†’ 0๊ฐœ).

๋‹ค๋งŒ ๋ž˜ํผ์˜ dataยทpageResponse๋Š” null๋กœ ๋‚˜๊ฐ€๋Š” ๊ฒƒ์ด ๊ณ„์•ฝ์ด๋ผ ์ „์—ญ ์„ค์ •์œผ๋กœ ์ผœ์ง€ ์•Š๋Š”๋‹ค.

๊ทธ ๋ฐ–์˜ ๊ณ„์•ฝ

  • HTTP 204๋ฅผ ์“ฐ์ง€ ์•Š๋Š”๋‹ค. ๋ž˜ํผ๊ฐ€ ํ•ญ์ƒ body๋ฅผ ๋งŒ๋“ค๋ฏ€๋กœ "body ์—†์Œ"์ด ๋ณธ์งˆ์ธ 204์™€ ์ถฉ๋Œํ•œ๋‹ค. ๋‚ด๋ฆด ๋ฐ์ดํ„ฐ๊ฐ€ ์—†์œผ๋ฉด 200 + data: null.
  • ํ”„๋ ˆ์ž„์›Œํฌ ์˜ˆ์™ธ(๊นจ์ง„ JSONยท์ž˜๋ชป๋œ ๋ฉ”์„œ๋“œ)๋Š” ResponseEntityExceptionHandler๋ฅผ ์ƒ์†ํ•ด Spring์ด ํŒ์ •ํ•œ 4xx๋ฅผ ๊ทธ๋Œ€๋กœ ์“ด๋‹ค. 500์œผ๋กœ ๋ฎ์œผ๋ฉด ํด๋ผ์ด์–ธํŠธ ์‹ค์ˆ˜๊ฐ€ ์„œ๋ฒ„ ์˜ค๋ฅ˜๋กœ ๋‘”๊ฐ‘ํ•œ๋‹ค.

์„ธ๋ถ€๋Š” ์˜ˆ์™ธยท์‘๋‹ต ๊ทœ์•ฝ.


์ธ์ฆ

๋ชจ๋“  ์—”๋“œํฌ์ธํŠธ๊ฐ€ HTTP Basic ์ธ์ฆ์„ ์š”๊ตฌํ•œ๋‹ค. ์™ธ๋ถ€์— ์—ด๋ฆฐ ํฌํŠธ๋กœ ์•„๋ฌด๋‚˜ ์šฐ๋ฆฌ ์™ธ๋ถ€ API ํ‚ค๋ฅผ ํƒœ์šฐ์ง€ ๋ชปํ•˜๊ฒŒ ๋ง‰๋Š” ์ž„์‹œ ๊ฒŒ์ดํŠธ๋‹ค โ€” TMAP ๊ฒฝ์œ ์ง€ ์ตœ์ ํ™”๋Š” ํ•˜๋ฃจ 50๊ฑด์ด๋ผ ๋ด‡ ํ•œ ๋งˆ๋ฆฌ๋กœ ๊ณ ๊ฐˆ๋œ๋‹ค.

Authorization: Basic base64(์•„์ด๋””:๋น„๋ฐ€๋ฒˆํ˜ธ)

์ธ์ฆ ์‹คํŒจ๋Š” 401 + ๊ณตํ†ต ๋ž˜ํผ(code: COMMON-401). ์†Œ์…œ ๋กœ๊ทธ์ธ์ด ๋ถ™์œผ๋ฉด ์ด ๊ฒŒ์ดํŠธ๋Š” ๊ฑท์–ด๋‚ธ๋‹ค.

ํ˜„์žฌ ๋ฐฐํฌ๋Š” ํ‰๋ฌธ HTTP๋‹ค. Basic ์ธ์ฆ์€ ์ž๊ฒฉ์ฆ๋ช…์„ Base64๋กœ ์ธ์ฝ”๋”ฉ๋งŒ ํ•˜๋ฏ€๋กœ(์•”ํ˜ธํ™”๊ฐ€ ์•„๋‹ˆ๋‹ค) ๊ฐ™์€ ๋„คํŠธ์›Œํฌ ๊ฒฝ๋กœ์—์„œ ์ฝํžŒ๋‹ค. ํŒ€ ๋‚ด๋ถ€ ํ…Œ์ŠคํŠธ์šฉ์ด๋ผ ๊ฐ์ˆ˜ํ•˜๊ณ  ์žˆ์œผ๋‚˜, ์šด์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ๊ธฐ ์ „์— HTTPS ์ข…๋‹จ์ด ์„ ํ–‰๋ผ์•ผ ํ•œ๋‹ค.


ํ’ˆ์งˆ ์žฅ์น˜

main์œผ๋กœ ๊ฐ€๋Š” ๊ธธ๋ชฉ์— ๋„ค ๊ฐ€์ง€๊ฐ€ ๊ฑธ๋ ค ์žˆ๋‹ค.

๋ฌด์—‡
build & test ์ปดํŒŒ์ผ + ์ „์ฒด ํ…Œ์ŠคํŠธ (Testcontainers MySQL)
์ปจ๋ฒค์…˜ ๊ฒ€์‚ฌ FK ์ œ์•ฝยทFetchType.EAGERยท@MockBeanยทdomain setter ๋“ฑ์„ ์†Œ์Šค ์ „์ˆ˜๋กœ ์ฐจ๋‹จ + PR ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€ ํ˜•์‹
MySQL ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๊ฒ€์ฆ ์‹ค์ œ MySQL 8.4์— Flyway 20๊ฐœ๋ฅผ ์ ์šฉํ•ด ๋ณธ๋‹ค. H2๋กœ๋งŒ ๋Œ๋ฉด ALTER COLUMN vs MODIFY ๊ฐ™์€ ๋ฐฉ์–ธ ์ฐจ์ด๋ฅผ ๋ฐฐํฌ ์ค‘์—์•ผ ์•ˆ๋‹ค
CodeRabbit ์ฝ”๋“œ ๋ฆฌ๋ทฐ

๋ฐฐํฌ๋Š” dev ๋จธ์ง€ ์‹œ ์ž๋™์œผ๋กœ ๋ˆ๋‹ค. ๊ธฐ๋™ ํ™•์ธ โ†’ ์Šค๋ชจํฌ โ†’ ์‹คํŒจ ์‹œ ์ด์ „ ์ด๋ฏธ์ง€๋กœ ๋กค๋ฐฑ๊นŒ์ง€ ์›Œํฌํ”Œ๋กœ์šฐ๊ฐ€ ์ฒ˜๋ฆฌํ•œ๋‹ค. ์Šค๋ชจํฌ๋Š” ์ƒํƒœ ์ฝ”๋“œ๋งŒ ๋ณด์ง€ ์•Š๊ณ  ์ ์žฌ ๊ฑด์ˆ˜๊นŒ์ง€ ํ™•์ธํ•œ๋‹ค โ€” "200์ธ๋ฐ ๋‚ด์šฉ์ด ๋นˆ" ๋ฐฐํฌ๋ฅผ ์„ฑ๊ณต์œผ๋กœ ๋„˜๊ธฐ์ง€ ์•Š๊ธฐ ์œ„ํ•ด์„œ๋‹ค.

์šด์˜ ๋กœ๊ทธ ๋ณด๊ธฐ

scripts/prod-logs.sh                 # ์ตœ๊ทผ 200์ค„ + ๊ณ„์† ๋”ฐ๋ผ๊ฐ€๊ธฐ
scripts/prod-logs.sh --level WARN    # WARN ์ด์ƒ๋งŒ
scripts/prod-logs.sh --trace a1b2c3  # ์š”์ฒญ ํ•˜๋‚˜๋งŒ

๋ฐฐํฌ๊ฐ€ ์„ฑ๊ณต์ด๊ณ  API๊ฐ€ 200์ธ๋ฐ ํ™”๋ฉด๋งŒ ์ด์ƒํ•œ ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค โ€” ์ ์žฌ ๋ฐฐ์น˜๊ฐ€ ์กฐ์šฉํžˆ ์‹คํŒจํ–ˆ์„ ๋•Œ๋‹ค. ๊ทธ๋•Œ ๋‹ต์€ ์„œ๋ฒ„ ๋กœ๊ทธ์˜ ์™„๋ฃŒ ํ•œ ์ค„์— ์žˆ๋‹ค. traceId๋Š” ๊ฐ’์—์„œ ์ƒ‰์„ ๋ฝ‘์œผ๋ฏ€๋กœ, ํ•œ ์š”์ฒญ์ด ๋‚จ๊ธด ๋กœ๊ทธ๊ฐ€ ํฉ์–ด์ ธ ์žˆ์–ด๋„ ์ƒ‰์œผ๋กœ ์ด์–ด ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

์ ‘์†ํ•˜๋ ค๋ฉด ๋ณด์•ˆ๊ทธ๋ฃน์— ์ž๊ธฐ IP๊ฐ€ 22๋ฒˆ์œผ๋กœ ์—ด๋ ค ์žˆ์–ด์•ผ ํ•œ๋‹ค. ๋ฐฐํฌ ์›Œํฌํ”Œ๋กœ์šฐ๋Š” ๋Ÿฌ๋„ˆ IP๋งŒ ์ž ๊น ์—ด๊ณ  ํšŒ์ˆ˜ํ•˜๋ฏ€๋กœ ํ‰์†Œ์—” ๋‹ซํ˜€ ์žˆ๋Š” ๊ฒƒ์ด ์ •์ƒ์ด๋‹ค.


๊ทœ์•ฝ

์ด ํ”„๋กœ์ ํŠธ๋Š” ๊ทœ์•ฝ์„ ๋ฌธ์„œ์— ์ ๊ณ  ๊ธฐ๊ณ„๋กœ ๊ฐ•์ œํ•œ๋‹ค.

  • ๋งค์ง ๊ฐ’ ๊ธˆ์ง€(์ƒ์ˆ˜ยทenum), rich domain, DIP, ๋‹คํ˜•์„ฑ โ€” CLAUDE.md
  • ํŒ๋‹จ์ด ํ•„์š” ์—†๋Š” ๊ฒƒ(FKยทEAGERยท204ยท@MockBean ๋“ฑ)์€ ํ›…๊ณผ CI๊ฐ€ ์ฐจ๋‹จํ•œ๋‹ค
  • ํŒ๋‹จ์ด ํ•„์š”ํ•œ ๊ฒƒ(์ˆœ์ฐจ ํŒฌ์•„์›ƒยท์บ์‹œ ํ‚ค ์ƒํ•œยทtimeout ๊ทผ๊ฑฐ)์€ PR self-audit์ด ๋‹ด๋‹นํ•œ๋‹ค
๋ฌธ์„œ ๋‚ด์šฉ
CLAUDE.md ๊ฐœ๋ฐœ ๊ทœ์•ฝ (์•„ํ‚คํ…์ฒ˜ยท๊ฐ์ฒด์ง€ํ–ฅ ์Šคํƒ€์ผยท์„ฑ๋Šฅยท์šฉ์–ด์ง‘)
.claude/rules/ ์ฃผ์ œ๋ณ„ ์„ธ๋ถ€ ๊ทœ์•ฝ (์˜ˆ์™ธ/์‘๋‹ต ยท ์˜์†์„ฑ ยท API ยท ํ…Œ์ŠคํŠธ)
docs/adr/ ์„ค๊ณ„ ๊ฒฐ์ • ๊ธฐ๋ก
docs/external-api-inventory.md ์™ธ๋ถ€ ๊ณต๊ณต๋ฐ์ดํ„ฐ ์ธ๋ฒคํ† ๋ฆฌยท๋ฐœ๊ธ‰ ์ฒดํฌ๋ฆฌ์ŠคํŠธ

๊ธฐ์ˆ  ์Šคํƒ

Spring Boot 4.1 ยท Java 25 ยท Lombok ยท JPA ยท Flyway ยท MySQL ยท Redis ยท Spring Security ยท WebFlux(WebClient)

๋ฒ„์ „์˜ ๋‹จ์ผ ์ง„์‹ค ์›์ฒœ์€ build.gradle.kts.

๋กœ์ปฌ์€ ๋„์ปค๋กœ ๋„์šด MySQL์„ ์“ด๋‹ค(docker compose up -d). ์šด์˜๊ณผ ๊ฐ™์€ DB๋กœ ๋Œ๋ ค์•ผ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๋ฌธ๋ฒ• ์˜ค๋ฅ˜๋ฅผ ๋กœ์ปฌ์—์„œ ์žก์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค โ€” H2 ์‹œ์ ˆ์—” ๋กœ์ปฌ์ด ์ „๋ถ€ ์ดˆ๋ก์ธ๋ฐ MySQL์—์„œ ๊นจ์ง€๋Š” ์ผ์ด ์‹ค์ œ๋กœ ์žˆ์—ˆ๋‹ค.

์™ธ๋ถ€ API ํ‚ค๋Š” ์—†์–ด๋„ ๋ถ€ํŒ…๋œ๋‹ค(์‹ค์ œ ํ˜ธ์ถœ๋งŒ ๋น„ํ™œ์„ฑ). ์ด๊ฑด ๊ทœ์•ฝ์ด๋‹ค โ€” ๋ถ€ํŒ…์— ์‹ค ํ‚ค๋ฅผ ๊ฐ•์ œํ•˜๋Š” ๋ณ€๊ฒฝ์€ ๊ธˆ์ง€ํ•œ๋‹ค. CI ์Šค๋ชจํฌ๊ฐ€ ๋นจ๊ฐ„๋ถˆ์ด ๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

About

offway-be-core

Resources

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages