๐Ÿฆ„Change Log

v2.1.0 - 2025.07.14

โœจ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ (Features)

  • Spring-boot-admin client ๋„์ž…

    • ๋ชจ๋‹ˆํ„ฐ๋ง ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

v2.0.0 - 2025.06.01

BookMeta Entity๋ฅผ ์ƒˆ๋กญ๊ฒŒ ๋„์ž…ํ•˜์—ฌ Collection์„ ๋ณธ์—ฐ์˜ ๊ธฐ๋Šฅ์— ์ถฉ์‹ค ํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ฐœ์„ 

โœจ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ (Features)

  • BookMeta ๋„์ž…

    • ๊ธฐ์กด Book ์—”ํ‹ฐํ‹ฐ์— ๊ธฐ์ž…๋˜์—ˆ๋˜ Book์˜ Meta ์ •๋ณด๋ฅผ BookMeta๋ผ๋Š” ๋ณ„๋„์˜ ์—”ํ‹ฐํ‹ฐ์— ๊ธฐ์ž…ํ•˜๋„๋ก ๊ฐœ์„ ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

    • ์ด๋ฅผ ํ†ตํ•ด Book์€ Book ๋ณธ์—ฐ์˜ ๊ธฐ๋Šฅ์— ์ถฉ์‹คํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

  • BookMetaCollection Entity ๋„์ž…

    • ๊ธฐ์กด BookCollection ์—”ํ‹ฐํ‹ฐ๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  BookMetaCollection ์—”ํ‹ฐํ‹ฐ๋ฅผ ๋„์ž…ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

    • Collection์€ ์ฑ…์˜ ๊ธฐ๋ณธ์ •๋ณด๋งŒ์„ ๋ณด์—ฌ์ฃผ๋„๋ก ๊ฐœ์„ ํ•˜์˜€์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์ปฌ๋ ‰์…˜์€ ๋ณธ์—ฐ์˜ ๊ธฐ๋Šฅ์— ์ถฉ์‹คํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๐Ÿš€ ๊ฐœ์„ ์‚ฌํ•ญ (Improvements)

  • Collection API spec ๊ฐœ์„ 

    • collection์˜ api ์—”๋“œํฌ์ธํŠธ๋„ค์ด๋ฐ์ด RESTfulํ•˜๊ฒŒ ๋ณ€๊ฒฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

    • create/add/delete ๋“ฑ์˜ ๋„ค์ด๋ฐ ์‚ฌ์šฉ์„ ์ง€์–‘ํ•จ์œผ๋กœ์จ RESTfulํ•˜๊ฒŒ ๋ณ€๊ฒฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ“ ๊ธฐํƒ€ ๋ณ€๊ฒฝ์‚ฌํ•ญ (Other Changes)

  • springdoc-openapi-starter-webmvc-ui ๋„์ž…

    • api reference๋ฅผ ์›นํŽ˜์ด์ง€์—์„œ ์†์‰ฝ๊ฒŒ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

v1.0.0 - 2025.05.23

Gomdolbook ๋ฐฑ์—”๋“œ์˜ ์ฒซ ๋ฒˆ์งธ ์ •์‹ ๋ฆด๋ฆฌ์ฆˆ์ž…๋‹ˆ๋‹ค! ์ด ๋ฒ„์ „์—์„œ๋Š” ์‚ฌ์šฉ์ž์˜ ๋…์„œ ๊ฒฝํ—˜์„ ํ’๋ถ€ํ•˜๊ฒŒ ํ•˜๊ณ , ํšจ์œจ์ ์ธ ์ฑ… ๊ด€๋ฆฌ๋ฅผ ๋•๋Š” ํ•ต์‹ฌ ๊ธฐ๋Šฅ๋“ค์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

โœจ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ (Features)

  • ๋…์„œ ๊ธฐ๋ก ๊ด€๋ฆฌ:

    • ์ฑ…์˜ ๋…์„œ ์ƒํƒœ(READING, FINISHED, TO_READ, NEW)๋ฅผ ์ €์žฅํ•˜๊ณ  ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    • ๊ฐ ์ฑ…์— ๋Œ€ํ•œ ์„ธ ๊ฐ€์ง€ ๊ฐœ์ธ ๋…ธํŠธ(note1, note2, note3)๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    • ์ฑ…์— ๋Œ€ํ•œ ๋ณ„์ (rating)์„ ๊ธฐ๋กํ•˜๊ณ  ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    • ์ฑ…์˜ ๋…์„œ ์‹œ์ž‘์ผ(startedAt)๊ณผ ์™„๋ฃŒ์ผ(finishedAt)์„ ๊ธฐ๋กํ•˜์—ฌ ๋…์„œ ์Šต๊ด€์„ ์ถ”์ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    • ์™„๋ฃŒ๋œ ์ฑ…๋“ค์˜ ์›”๋ณ„ ๋ชฉ๋ก์„ ์บ˜๋ฆฐ๋” ํ˜•์‹์œผ๋กœ ์กฐํšŒํ•˜์—ฌ ๋…์„œ ํ˜„ํ™ฉ์„ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (GET /v1/book/calendar/finished)

    • ํŠน์ • ๋…์„œ ์ƒํƒœ์— ํ•ด๋‹นํ•˜๋Š” ๋‚ด ์„œ์žฌ ๋ชฉ๋ก์„ ์กฐํšŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (GET /v1/book/Library)

  • ์ฑ… ์ปฌ๋ ‰์…˜ ๊ธฐ๋Šฅ:

    • ์‚ฌ์šฉ์ž ์ •์˜ ์ด๋ฆ„์œผ๋กœ ์ฑ… ์ปฌ๋ ‰์…˜์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (POST /v1/collection/create)

    • ์ƒ์„ฑ๋œ ์ปฌ๋ ‰์…˜์— ์ฑ…์„ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ (POST /v1/collection/{name}/book/add) ์ปฌ๋ ‰์…˜์—์„œ ์ฑ…์„ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (DELETE /v1/collection/{name}/book/remove)

    • ์ž์‹ ์ด ๋งŒ๋“  ๋ชจ๋“  ์ปฌ๋ ‰์…˜ ๋ชฉ๋ก๊ณผ ๊ฐ ์ปฌ๋ ‰์…˜์— ํฌํ•จ๋œ ์ฑ…๋“ค์˜ ์ปค๋ฒ„ ์ด๋ฏธ์ง€๋ฅผ ์กฐํšŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (GET /v1/collection/list)

    • ํŠน์ • ์ปฌ๋ ‰์…˜์— ํฌํ•จ๋œ ๋ชจ๋“  ์ฑ…์˜ ์ƒ์„ธ์ •๋ณด๋ฅผ ์กฐํšŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (GET /v1/collection/{name})

    • ํŠน์ • ์ปฌ๋ ‰์…˜์„ ์‚ญ์ œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (DELETE /v1/collection/delete)

  • ์•Œ๋ผ๋”˜ API ์—ฐ๋™:

    • ISBN ๋˜๋Š” ๊ฒ€์ƒ‰์–ด(query)๋ฅผ ํ†ตํ•ด ์•Œ๋ผ๋”˜ API์—์„œ ๋„์„œ ์ •๋ณด๋ฅผ ๊ฒ€์ƒ‰ํ•˜๊ณ  ์ƒ์„ธ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    • ์•Œ๋ผ๋”˜ API๋กœ๋ถ€ํ„ฐ ๊ฐ€์ ธ์˜จ ๋„์„œ ์ •๋ณด๋Š” Caffeine ๊ธฐ๋ฐ˜์˜ ๋น„๋™๊ธฐ ์บ์‹œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‘๋‹ต ์†๋„๋ฅผ ํ–ฅ์ƒ์‹œํ‚ค๊ณ  API ํ˜ธ์ถœ์„ ์ตœ์†Œํ™”ํ•ฉ๋‹ˆ๋‹ค.

  • ์‚ฌ์šฉ์ž ์ธ์ฆ ๋ฐ ์ธ๊ฐ€:

    • OAuth2 Resource Server (JWT)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž ์ธ์ฆ ๋ฐ ์ธ๊ฐ€๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. email ํด๋ ˆ์ž„์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์‚ฌ์šฉ์ž๋ฅผ ์‹๋ณ„ํ•ฉ๋‹ˆ๋‹ค.

    • @UserCheckAndSave ์–ด๋…ธํ…Œ์ด์…˜๊ณผ AOP(EmailUserValidationAspect)๋ฅผ ํ†ตํ•ด ์ƒˆ๋กœ์šด ์‚ฌ์šฉ์ž์˜ ๊ฒฝ์šฐ ์ž๋™์œผ๋กœ ์‹œ์Šคํ…œ์— ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค.

๐Ÿš€ ๊ฐœ์„ ์‚ฌํ•ญ (Improvements)

  • ์‹œ์Šคํ…œ ์•„ํ‚คํ…์ฒ˜:

    • Spring Boot (Java 17+, Jakarta EE ์‚ฌ์šฉ) ๊ธฐ๋ฐ˜์œผ๋กœ ๊ฒฌ๊ณ ํ•˜๊ณ  ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ๋ฐฑ์—”๋“œ ๊ตฌ์ถ•

    • Spring Data JPA์™€ QueryDSL์„ ํ™œ์šฉํ•œ ํšจ์œจ์ ์ธ ๋ฐ์ดํ„ฐ ์ ‘๊ทผ ๋ฐ ๋ณต์žกํ•œ ์ฟผ๋ฆฌ ๊ตฌํ˜„

    • Caffeine ๊ธฐ๋ฐ˜์˜ ๋กœ์ปฌ ์บ์‹œ ์ ์šฉ (readingLogCache, statusCache, bookByIsbnCache, libraryCache, collectionListCache, collectionCache, finishedBookCalendarData)์œผ๋กœ ๋ฐ˜๋ณต์ ์ธ ๋ฐ์ดํ„ฐ ์กฐํšŒ ์„ฑ๋Šฅ ์ตœ์ ํ™”

    • AOP (TraceAspect)๋ฅผ ํ†ตํ•œ ์„œ๋น„์Šค ๋ฐ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ๋ฉ”์†Œ๋“œ ๋กœ๊น…

    • ์ „์—ญ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ (CustomExceptionHandler)๋ฅผ ํ†ตํ•ด ์ผ๊ด€๋œ ์˜ค๋ฅ˜ ์‘๋‹ต ์ œ๊ณต

    • CQRS ํŒจํ„ด ์ ์šฉ์„ ์œ„ํ•œ Command ๋ฐ Handler ์ธํ„ฐํŽ˜์ด์Šค/ํด๋ž˜์Šค ๋ถ„๋ฆฌ (์˜ˆ: BookSaveCommand, BookSaveHandler)

    • API ์‘๋‹ต ํ†ต์ผ: ApiResponse ๋ž˜ํผ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ผ๊ด€๋œ API ์‘๋‹ต ๊ตฌ์กฐ ์ œ๊ณต

    • CORS ์„ค์ •: ํŠน์ • ์˜ค๋ฆฌ์ง„(https://www.gomdolbook.kr)์— ๋Œ€ํ•œ CORS ์š”์ฒญ ํ—ˆ์šฉ

๐Ÿ› ๏ธ ๋ฒ„๊ทธ ์ˆ˜์ • (Bug Fixes)

๐Ÿ“ ๊ธฐํƒ€ ๋ณ€๊ฒฝ์‚ฌํ•ญ (Other Changes)

  • Gradle ๋ฒ„์ „ 8.11.1 ์‚ฌ์šฉ

  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์Šคํ‚ค๋งˆ ์ •์˜ (schema.sql)

  • ๋‹จ์œ„ ํ…Œ์ŠคํŠธ ๋ฐ ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ (src/test/java ๊ฒฝ๋กœ)

Last updated