Skip to content

Commit

Permalink
7์ฐจ release (#605)
Browse files Browse the repository at this point in the history
* etc: ํŒจํ‚ค์ง€ ๊ตฌ์กฐ ๋ณ€๊ฒฝ

* refactor: ์—”ํ‹ฐํ‹ฐ boolean ํ•„๋“œ์ด๋ฆ„ is์ œ๊ฑฐ TINYINT(1) ์ถ”๊ฐ€, ์นด๋“œ์˜ ์งˆ๋ฌธ ์ •๋‹ต 2000์ž ์ดํ•˜๋กœ ์ˆ˜์ •

* W07 - ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ฌธ์ œ์ง‘ ์กฐํšŒ์‹œ ์ตœ์‹ ์ˆœ์œผ๋กœ ์กฐํšŒ๋  ์ˆ˜ ์žˆ๋„๋ก ๊ตฌํ˜„ํ•œ๋‹ค. (#241)

* feat: ์ตœ์‹ ์ˆœ์œผ๋กœ Workbook์ด ์กฐํšŒ๋˜๋„๋ก ์ˆ˜์ • ๋ฐ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ถ”๊ฐ€

* feat: admin์ด ๋ฌธ์ œ์ง‘์„ ์ถ”๊ฐ€ํ•  ๋•Œ admin์˜ id๊ฐ€ ์ €์žฅ๋  ์ˆ˜ ์žˆ๋„๋ก ์ฝ”๋“œ ์ถ”๊ฐ€

* refactor: ํ”ผ๋“œ๋ฐฑ ๋ฐ˜์˜

* C06 - ๋ชจ์•„๋ณด๊ธฐ์—์„œ ์นด๋“œ๋ฅผ ์ตœ์‹ ์ˆœ์œผ๋กœ ์ œ๊ณตํ•œ๋‹ค. (#237)

* feat: ๋ชจ์•„๋ณด๊ธฐ ์š”์ฒญ์‹œ ์นด๋“œ ์ƒ์„ฑ ์‹œ๊ฐ„ ์—ญ์ˆœ์œผ๋กœ ์ œ๊ณต

* refactor: ์ตœ์‹ ์ˆœ์œผ๋กœ ์นด๋“œ ์ •๋ ฌํ•˜๋Š” ๋ฉ”์„œ๋“œ ๋‹จ์ˆœํ™”

* refactor: ์ตœ์‹ ์ˆœ์œผ๋กœ ์นด๋“œ ์ •๋ ฌํ•˜๋Š” ๋ฉ”์„œ๋“œ jpql ์‚ฌ์šฉํ•˜๋„๋ก ๋ณ€๊ฒฝ ๋ฐ CardSimpleResponse ์ œ๊ฑฐ

* feat: ์นด๋“œ ์ถ”๊ฐ€, ์ˆ˜์ •, ์‚ญ์ œ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•œ๋‹ค (#244)

* feat: ์นด๋“œ ์ถ”๊ฐ€ ๊ธฐ๋Šฅ ๊ตฌํ˜„

- FormProvider onBlur ์ถ”๊ฐ€
- ๋ฆฌ์ฝ”์ผ ์ƒํƒœ ๊ด€๋ฆฌ ๋ฐฉ์‹ ๋ณ€๊ฒฝ

Co-authored-by: Kyle <[email protected]>

* feat: cardState ์บ์‹œ ๋ฐ์ดํ„ฐ ์—…๋ฐ์ดํŠธ ํŠธ๋ฆฌ๊ฑฐ ์ถ”๊ฐ€

Co-authored-by: dudtjr913 <[email protected]>

* feat: ์นด๋“œ ์ถ”๊ฐ€ validator ๊ตฌํ˜„

* feat: ๋ถ๋งˆํฌ ์ˆ˜์ • ๊ตฌํ˜„

- debounce

Co-authored-by: dudtjr913 <[email protected]>

* feat: filter ํ›„ fetch

Co-authored-by: dudtjr913 <[email protected]>

* feat: ์นด๋“œ ์ˆ˜์ • ๊ธฐ๋Šฅ ๊ตฌํ˜„

Co-authored-by: Kyle <[email protected]>

* feat: ์นด๋“œ ์‚ญ์ œ ๊ธฐ๋Šฅ ๊ตฌํ˜„

Co-authored-by: Kyle <[email protected]>

Co-authored-by: dudtjr913 <[email protected]>
Co-authored-by: dudtjr913 <[email protected]>

* fix: UPDATE ,DELETE ๋ฉ”์„œ๋“œ CORS ํ—ˆ์šฉ (#243)

* feat: DataLoader ์‹ค์ œ ์–ด๋“œ๋ฏผ ์ •๋ณด ์ถ”๊ฐ€

* UI11 - ํŽ˜์ด์ง€ -> ๋ชจ๋‹ฌ (#248)

* fix: PublicQnACard ํƒ€์ž… ์˜ค๋ฅ˜ ์ˆ˜์ •

* fix: ๋ถ๋งˆํฌ ์ •๋ ฌ ์˜ค๋ฅ˜ ์ˆ˜์ •

Co-authored-by: dudtjr913 <[email protected]>

* refactor: ์นด๋“œ ์ถ”๊ฐ€ ํŽ˜์ด์ง€ -> ๋ชจ๋‹ฌ

Co-authored-by: dudtjr913 <[email protected]>

* refactor: ์นด๋“œ ์ˆ˜์ • ํŽ˜์ด์ง€ => ๋ชจ๋‹ฌ ๊ต์ฒด

Co-authored-by: Kyle <[email protected]>

* feat: ์นด๋“œ ์‚ญ์ œ confirm ์ถ”๊ฐ€

Co-authored-by: dudtjr913 <[email protected]>

* fix: modal์—์„œ ๋’ค๋กœ๊ฐ€๊ธฐ ์˜ค๋ฅ˜ ์ˆ˜์ •

* etc: ํ”„๋ก ํŠธ์—”๋“œ ํŒŒ์ดํ”„๋ผ์ธ ์„œ๋ธŒ๋ชจ๋“ˆ ์—…๋ฐ์ดํŠธ ์ถ”๊ฐ€

* W05 - ๊ณต์œ  ๋ฌธ์ œ์ง‘ ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ์„ ๊ฐœ์„ ํ•œ๋‹ค.  (#238)

* etc: ํŒจํ‚ค์ง€ ์œ„์น˜ ๋ณ€๊ฒฝ

* refactor: null๋กœ ๊ฒ€์ƒ‰ -> ๋”๋ฏธ ๋ฌธ์ œ์ง‘, ""๋กœ ๊ฒ€์ƒ‰ -> ๊ฒฐ๊ณผ์—†์Œ ์œผ๋กœ ๋ณ€๊ฒฝ

* etc: 	๋ถˆํ•„์š”ํ•œ import ์ œ๊ฑฐ

* refactor: ์˜ˆ์™ธ๋ช… ์ˆ˜์ •

* refactor: ๊ฒ€์ƒ‰์‹œ ๋ฐ˜๋“œ์‹œ ๊ฒ€์ƒ‰์–ด๋ฅผ ์ž…๋ ฅ๋ฐ›๋„๋ก ์ˆ˜์ •, ์ž…๋ ฅ๋ฐ›์ง€ ๋ชปํ•  ์‹œ ์˜ˆ์™ธ ํ•ธ๋“ค๋ง ์ถ”๊ฐ€

* refactor: ๊ฒ€์ƒ‰์— ๋ฐ˜๋“œ์‹œ ๊ฒ€์ƒ‰์–ด๊ฐ€ ํ•„์š”ํ•˜๋„๋ก ๋„๋ฉ”์ธ ์ˆ˜์ • *๋”๋ฏธ ๋ฌธ์ œ์ง‘ ๊ฒ€์ƒ‰์— ์‚ฌ์šฉ๋˜๋˜ NoSearchKeyword ์ œ๊ฑฐ)

* W06 - ๋ฌธ์ œ์ง‘ ๋ฌธ์„œํ™”, ์ธ์ˆ˜ ํ…Œ์ŠคํŠธ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค. (#247)

* etc: ํŒจํ‚ค์ง€ ์œ„์น˜ ๋ณ€๊ฒฝ

* refactor: null๋กœ ๊ฒ€์ƒ‰ -> ๋”๋ฏธ ๋ฌธ์ œ์ง‘, ""๋กœ ๊ฒ€์ƒ‰ -> ๊ฒฐ๊ณผ์—†์Œ ์œผ๋กœ ๋ณ€๊ฒฝ

* test: ๋ฌธ์ œ์ง‘ ๋ฌธ์„œํ™” ํ…Œ์ŠคํŠธ์— ๋น„ํšŒ์› ์กฐํšŒ, ๊ณต์œ  ๋ฌธ์ œ์ง‘ ๊ฒ€์ƒ‰ ์ถ”๊ฐ€

* refactor: ๋ฌธ์ œ์ง‘๋ณ„ ์นด๋“œ ๋ชจ์•„๋ณด๊ธฐ API์— ๋ชจ๋“  ์นด๋“œ ํ•„๋“œ๋ฅผ ์ฃผ๋„๋ก ๋ณ€๊ฒฝ

* refactor: ๋ฌธ์ œ์ง‘ ์กฐํšŒ์™€ ๊ฒ€์ƒ‰์— ํ•„์š”ํ•œ ํ•„๋“œ๋งŒ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ์ˆ˜์ •

* refactor: ๊ฐ๊ฐ ๋ฌธ์„œํ™” ํ…Œ์ŠคํŠธ์— ์กด์žฌํ•˜๋˜ AuthService, MockMvc ๋ถ€๋ชจ ํ…Œ์ŠคํŠธ๋กœ ์ด๋™

* refactor: ํ•„์š”์—†๋Š” ์‘๋‹ตํ•„๋“œ ์ œ๊ฑฐ, ํ‚ค์›Œ๋“œ ์—†์ด ๊ณต์œ  ๋ฌธ์ œ์ง‘ ๊ฒ€์ƒ‰ ํ…Œ์ŠคํŠธ ์ œ๊ฑฐ

* etc: ์ธ์ฆ๊ด€๋ จ ์ธํ„ฐ์…‰ํ„ฐ์—์„œ /api/workbooks ์ œ์™ธ, ํ† ํฐ ์ถ”์ถœ์— ์‹คํŒจํ•˜๋ฉด null์„ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ์ˆ˜์ •

* etc: ์ฝ”๋“œ ์ •๋ฆฌ

* test: ๋ฌธ์ œ์ง‘ ์ธ์ˆ˜ํ…Œ์ŠคํŠธ์— ๋น„ํšŒ์› ๋ฌธ์ œ์ง‘ ์กฐํšŒ, ๊ฒ€์ƒ‰ ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€

* refactor: queryParam ์‚ฌ์šฉํ•˜๋„๋ก ์ˆ˜์ •

* feat: ๋ฌธ์ œ์ง‘์„ ์ถ”๊ฐ€, ์ˆ˜์ •, ์‚ญ์ œํ•œ๋‹ค. (#252)

* feat: ํ•ด์‹œํƒœ๊ทธ ์ปดํฌ๋„ŒํŠธ ์ถ”๊ฐ€

Co-authored-by: Kyle <[email protected]>

* feat: Toggle ์ถ”๊ฐ€

Co-authored-by: dudtjr913 <[email protected]>

* feat: ๋ฌธ์ œ์ง‘ ์ถ”๊ฐ€ ๊ธฐ๋Šฅ ๊ตฌํ˜„

Co-authored-by: dudtjr913 <[email protected]>

* feat: ๋ฌธ์ œ์ง‘ ์ˆ˜์ • ๊ธฐ๋Šฅ ์ถ”๊ฐ€

Co-authored-by: Kyle <[email protected]>

* feat: ๋ฌธ์ œ์ง‘ ์‚ญ์ œ ๊ธฐ๋Šฅ ์ถ”๊ฐ€

Co-authored-by: dudtjr913 <[email protected]>
Co-authored-by: dudtjr913 <[email protected]>

* W08 - ๋ฌธ์ œ์ง‘ ์ถ”๊ฐ€, ์กฐํšŒ, ์ˆ˜์ •, ์‚ญ์ œ ๊ธฐ๋Šฅ์— User๋ฅผ ๋„์ž…ํ•œ๋‹ค. (#249)

* feat: Workbook ์ถ”๊ฐ€ api ๊ตฌํ˜„ ๋ฐ ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€

* refactor: put ๋ฉ”์„œ๋“œ์— params ์ธ์ž๋กœ ๋ฐ›๋„๋ก ์ˆ˜์ •

* feat: Workbook ์ˆ˜์ • api ๊ตฌํ˜„ ๋ฐ ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€

* etc: test yml์— ์žˆ๋Š” show-sql true ์‚ญ์ œ

* feat: Workbook ์‚ญ์ œ api ๊ตฌํ˜„ ๋ฐ ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€

* refactor: ํ•„์š”์—†๋Š” ๋ฉ”์„œ๋“œ ์‚ญ์ œ ๋ฐ ์ผ๋ถ€ ๋ฉ”์„œ๋“œ๋ช… ๋ณ€๊ฒฝ

* refactor: ์†Œํ”„ํŠธ ์‚ญ์ œ๋ฅผ workbook ์—”ํ‹ฐํ‹ฐ ๋ณ€๊ฒฝ๊ฐ์ง€๋ฅผ ์ด์šฉํ•˜๋„๋ก ์ˆ˜์ •

* refactor: ๋ฉ”์„œ๋“œ๋ช…์— ์žˆ๋Š” owned๋ฅผ author๋กœ ์ˆ˜์ •

* feat: ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•œ๋‹ค (#260)

* feat: ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ ์ถ”๊ฐ€

Co-authored-by: Kyle <[email protected]>

* feat: ๊ณต์œ  ํŽ˜์ด์ง€ ์ƒ์„ธ ๊ตฌํ˜„

Co-authored-by: dudtjr913 <[email protected]>

* refactor: recoil state ์ •๋ฆฌ

- public ์‚ญ์ œ
- initialState ํŒŒ์ผ ์ถ”๊ฐ€

Co-authored-by: Kyle <[email protected]>

* refactor: hook ์ •๋ฆฌ

Co-authored-by: dudtjr913 <[email protected]>

* refactor: custom hook์œผ๋กœ ๋กœ์ง ์ด๋™

Co-authored-by: Kyle <[email protected]>

Co-authored-by: dudtjr913 <[email protected]>
Co-authored-by: dudtjr913 <[email protected]>

* B37 - ๋ฐฑ์—”๋“œ ๋ ˆ์ด๋ธ”์ด ๋ถ™์ง€ ์•Š์€ ๊ฒฝ์šฐ ๋ฐฑ์—”๋“œ ์  ํ‚จ์Šค ๋นŒ๋“œ๋ฅผ ํ•˜์ง€ ์•Š๋Š”๋‹ค. (#266)

* etc: ๋ถˆํ•„์š”ํ•œ Jenkinsfile ์ œ๊ฑฐ

* etc: ๋ฐฑ์—”๋“œ ํ™˜๊ฒฝ ์‹คํ–‰ ๋ฐฉ๋ฒ• ์ˆ˜์ •

* B35 - api ์š”์ฒญ์„ intelliJ ์—์„œ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋„๋ก http ํŒŒ์ผ์„ ๋งŒ๋“ ๋‹ค. (#258)

* feat: ์นด๋“œ์™€ ์›Œํฌ๋ถ ๊ด€๋ จ ์š”์ฒญ ํŒŒ์ผ ์ถ”๊ฐ€

* feat: ๋ฌธ์ œ์ง‘ ์‚ญ์ œ ์š”์ฒญ ์ •๋ณด ์ถ”๊ฐ€

* feat: ๊ณต์œ  ๋ฌธ์ œ์ง‘ ๊ฒ€์ƒ‰ ์š”์ฒญ ์ •๋ณด ์ถ”๊ฐ€

* feat: ํ€ด์ฆˆ ์ƒ์„ฑ api ์š”์ฒญ ์ถ”๊ฐ€

* feat: ๊ด€๋ฆฌ์ž ๋ฌธ์ œ์ง‘ ์ถ” api ์š”์ฒญ ์ถ”๊ฐ€

* feat: ๋กœ๊ทธ์ธ ๋ฐ ์œ ์ € ๊ด€๋ จ ์š”์ฒญ ์ •๋ณด ์ถ”๊ฐ€

* B36 - ์ผ๋ฐ˜ ์œ ์ € ์ƒ์„ฑ์„ DataLoader ์— ์ถ”๊ฐ€ํ•œ๋‹ค. (#263)

* feat: ๋กœ์ปฌ ํ™˜๊ฒฝ์— ์ผ๋ฐ˜ ์œ ์ € ์ •๋ณด ์ถ”๊ฐ€

* refactor: DataJpaTest ์—์„œ show sql ์„ค์ • false ๋กœ ๋ณ€๊ฒฝ

* refactor: dml์— ์ž„์˜๋กœ ์ƒ์„ฑํ•œ ์œ ์ € ์ •๋ณด ์ถ”๊ฐ€

* feat: DataLoader๋กœ ์ €์žฅ๋˜๋Š” ๋ฌธ์ œ์ง‘ ์ค‘ ์ฒซ ์„ธ ๊ฐœ๋Š” ์–ด๋“œ๋ฏผ์œผ๋กœ ๋“ฑ๋กํ•˜๊ณ  ๋‚˜๋จธ์ง€๋Š” ์ผ๋ฐ˜ ์œ ์ €๋กœ ๋“ฑ๋ก

* C07 - Card CRUD์— ์œ ์ € ์ถ”๊ฐ€  (#256)

* fix&feat: CardUpdate ์‹œ 2๊ฐœ ์ถ”๊ฐ€๋˜๋Š” ๋ฒ„๊ทธ ์ˆ˜์ • ๋ฐ ๋กœ๊ทธ์ธํ•œ ํšŒ์›๋งŒ ์นด๋“œ ์ถ”๊ฐ€ํ•˜๋Š” ๊ธฐ๋Šฅ ๊ตฌํ˜„

* feat&test: ์นด๋“œ ์ˆ˜์ •, ์‚ญ์ œ ๊ธฐ๋Šฅ์„ ๋กœ๊ทธ์ธ ์‚ฌ์šฉ์ž๋งŒ ๊ฐ€๋Šฅํ•˜๋„๋ก ๊ตฌํ˜„ ๋ฐ ํ…Œ์ŠคํŠธ

* refactor&test: soft delete ๋ฐฉ์‹ ์ˆ˜์ • ๋ฐ ์นด๋“œ CUD ๋ฐ ๋„๋ฉ”์ธ ๊ด€๋ จ ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€

* refactor: Workbook null ํ—ˆ์šฉํ•˜๋„๋ก ๋ณ€๊ฒฝ ๋ฐ ์ž„์‹œ ์›Œํฌ๋ถ ์ œ๊ฑฐ

* etc: jenkins ํ…Œ์ŠคํŠธ ์ปค๋ฐ‹

* feat: ์นด๋“œ ์‚ญ์ œ ์‹œ ๋ฌธ์ œ์ง‘์—์„œ๋„ ์‚ญ์ œ๋˜๋„๋ก ๋ณ€๊ฒฝ

* fix: ์นด๋“œ ์‚ญ์ œ ์‹œ workbook์ด ๋„์ผ ๋•Œ ์กฐ๊ฑด ์ถ”๊ฐ€ ๋ฐ C07 ๋ฐ˜์˜ ์•ˆ๋œ ๋ณ€๊ฒฝ์‚ฌํ•ญ ์ถ”๊ฐ€ (#273)

* feat: ๋ฐ”๋กœ ํ’€์–ด๋ณด๊ธฐ ๊ธฐ๋Šฅ ๋ฐ ๋ฌธ์ œ ๊ฐ€์ ธ์˜ค๊ธฐ UI๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค (#276)

* etc: ํ™˜๊ฒฝ์„ค์ •

- react-refresh
- fort-ts-checker-webpack-plugin

Co-authored-by: dudtjr913 <[email protected]>

* etc: ํ™˜๊ฒฝ์„ค์ •

- babel.config.js ์ •๋ฆฌ

Co-authored-by: dudtjr913 <[email protected]>

* feat: ๋ฐ”๋กœ ํ’€๊ธฐ ๊ธฐ๋Šฅ ๊ตฌํ˜„

* etc: cross-env ์ถ”๊ฐ€

- QuizPage์•ˆ์œผ๋กœ Header ์ด๋™

Co-authored-by: Kyle <[email protected]>

* fix: ๋ฌธ์ œ์ง‘์ด ์—†์„ ๊ฒฝ์šฐ ํ€ด์ฆˆ ์„ค์ • ํŽ˜์ด์ง€๋กœ ์ด๋™ ๋ชปํ•˜๋„๋ก ๋ณ€๊ฒฝ

Co-authored-by: Kyle <[email protected]>

* feat: SelectBox ์ปดํฌ๋„ŒํŠธ ์ถ”๊ฐ€

Co-authored-by: Kyle <[email protected]>

* feat: SelectBox Modal UI ๊ตฌํ˜„ ์™„๋ฃŒ

Co-authored-by: Kyle <[email protected]>

* etc: ํŒŒ์ดํ”„๋ผ์ธ ์ˆœ์„œ ๋ณ€๊ฒฝ

- test ํ›„ build

Co-authored-by: Kyle <[email protected]>

Co-authored-by: imgwang-yeol <[email protected]>

* fix: http-file-appender.xml ์˜คํƒ€ ์ˆ˜์ •

* fix: ์Šคํ”„๋ง ์žฌ์‹œ์ž‘์‹œ ๋กœ๊ทธ ํŒŒ์ผ ์ œ๋ชฉ์— ๋‚ ์งœ ํฌํ•จ๋˜๋„๋ก ์ˆ˜์ • (#278)

* feat: ๋‹ค์Œ์— ๋˜ ๋ณด๊ธฐ ๊ธฐ๋Šฅ ๊ตฌํ˜„ (#280)

Co-authored-by: dudtjr913 <[email protected]>

* fix: ํ€ด์ฆˆ ์ƒ์„ฑ์‹œ ๋˜ ๋ณด๊ธฐ ์ทจ์†Œ ๊ธฐ๋Šฅ ์˜ค์ž‘๋™ ์ˆ˜์ •

* etc: application ์„ค์ •์—์„œ ๋กœ๊น… ์„ค์ • ์ œ๊ฑฐ (#282)

* feat: ๋‚ด ๋ฌธ์ œ์ง‘์œผ๋กœ ๊ฐ€์ ธ๊ฐ€๊ธฐ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•œ๋‹ค (#284)

* etc: import ์ •๋ฆฌ

Co-authored-by: dudtjr913 <[email protected]>

* feat: ๋ฌธ์ œ์ง‘์œผ๋กœ ๊ฐ€์ ธ์˜ค๊ธฐ ๊ธฐ๋Šฅ ๊ตฌํ˜„

Co-authored-by: dudtjr913 <[email protected]>

* fix: ์ „์ฒด์ ์ธ ์ฝ”๋“œ ํ๋ฆ„ ๋ณ€๊ฒฝ

Co-authored-by: Kyle <[email protected]>

Co-authored-by: imgwang-yeol <[email protected]>

* F18 - ์ „์ฒด์ ์ธ ๋””์ž์ธ ๋ฆฌํ„ฐ์น˜ (#286)

* feat: ๊ฒ€์ƒ‰ ์ค‘ ๊ฐœ๊ตฌ๋ฆฌ ์ด๋ฏธ์ง€ ์ถ”๊ฐ€

Co-authored-by: Kyle <[email protected]>

* feat: PublicCardLoadable ๊ตฌํ˜„

Co-authored-by: dudtjr913 <[email protected]>

* etc: textarea ํฌ์ปค์Šค ์ ์šฉ

Co-authored-by: dudtjr913
[email protected]
[email protected]
<[email protected]>

Co-authored-by: dudtjr913 <[email protected]>
Co-authored-by: dudtjr913 <[email protected]>

* W09 - ๋ฌธ์ œ์ง‘์œผ๋กœ ์นด๋“œ ๊ฐ€์ ธ๊ฐ€๊ธฐ (#267)

* fix&feat: CardUpdate ์‹œ 2๊ฐœ ์ถ”๊ฐ€๋˜๋Š” ๋ฒ„๊ทธ ์ˆ˜์ • ๋ฐ ๋กœ๊ทธ์ธํ•œ ํšŒ์›๋งŒ ์นด๋“œ ์ถ”๊ฐ€ํ•˜๋Š” ๊ธฐ๋Šฅ ๊ตฌํ˜„

* feat&test: ์นด๋“œ ์ˆ˜์ •, ์‚ญ์ œ ๊ธฐ๋Šฅ์„ ๋กœ๊ทธ์ธ ์‚ฌ์šฉ์ž๋งŒ ๊ฐ€๋Šฅํ•˜๋„๋ก ๊ตฌํ˜„ ๋ฐ ํ…Œ์ŠคํŠธ

* refactor&test: soft delete ๋ฐฉ์‹ ์ˆ˜์ • ๋ฐ ์นด๋“œ CUD ๋ฐ ๋„๋ฉ”์ธ ๊ด€๋ จ ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€

* feat: ๋‚ด ๋ฌธ์ œ์ง‘์œผ๋กœ ์นด๋“œ ๊ฐ€์ ธ์˜ค๊ธฐ ๊ธฐ๋Šฅ ์ดˆ์•ˆ ๊ตฌํ˜„

* refactor: Workbook null ํ—ˆ์šฉํ•˜๋„๋ก ๋ณ€๊ฒฝ ๋ฐ ์ž„์‹œ ์›Œํฌ๋ถ ์ œ๊ฑฐ

* feat: Card ๋ณ€๊ฒฝ์‚ฌํ•ญ ๋ฐ˜์˜

* refactor: workbook์—์„œ ์นด๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋„๋ก ์ˆ˜์ •

* refactor: scrapCard ๋ฉ”์„œ๋“œ ์ˆ˜์ •

* refactor&test: ๋ฉ”์„œ๋“œ ๋ถ„๋ฆฌ ๋ฐ ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€

* test: ๋ฌธ์ œ์ง‘์œผ๋กœ ์นด๋“œ ๊ฐ€์ ธ์˜ค๊ธฐ ๊ด€๋ จ ํ…Œ์ŠคํŠธ ๊ตฌํ˜„

* fix: ํ…Œ์ŠคํŠธ ๋ฉ”์„œ๋“œ๋ฅผ delete -> post๋กœ ์ˆ˜์ •

* feat: ํ”ผ์ผ€์ด, ์˜ค์ฆˆ ๋ฆฌ๋ทฐ ๋ฐ˜์˜ ๋ฐ DataLoader ์–ด๋“œ๋ฏผ์œ ์ € profile url ๋ณ€๊ฒฝ

* refactor: ๋ฌธ์ œ์ง‘์œผ๋กœ ์นด๋“œ ๊ฐ€์ ธ์˜ค๊ธฐ ์‘๋‹ต ๋ณ€๊ฒฝ

* refactor: ์นด๋“œ ์Šคํฌ๋žฉ ์‹œ ์นด๋“œ ์•„์ด๋””์— ๋Œ€ํ•œ ๊ฒฝ์šฐ์˜ ์ˆ˜ ์ถ”๊ฐ€ ๋ฐ ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€

* test: ์š”์ฒญ์ด ๋น„์–ด์žˆ๋Š” ๊ฒฝ์šฐ์— ๋Œ€ํ•œ ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€

* refactor: ํ”ผ์ผ€์ด ๋ฆฌ๋ทฐ ๋ฐ˜์˜ ๋ฐ ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€

* W10 - ๋ฌธ์ œ์ง‘ ์‚ญ์ œ์‹œ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์นด๋“œ๋„ ์‚ญ์ œํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๊ณ  ์ฝ”๋“œ ์ผ๋ถ€๋ฅผ ๋ฆฌํŒฉํ„ฐ๋งํ•œ๋‹ค. (#271)

* refactor: WorkbookService ๋‚ด ๋ฉ”์„œ๋“œ ๋ถ„๋ฆฌ

* feat: ๋ฌธ์ œ์ง‘ ์‚ญ์ œ์‹œ ์นด๋“œ๋„ ์‚ญ์ œ๋˜๋„๋ก ์ˆ˜์ •

* refactor: ์ž‘์„ฑ์ž ๊ฒ€์ฆ ๋กœ์ง์„ ์„œ๋น„์Šค๋กœ ์ด๋™ ๋ฐ ํ…Œ์ŠคํŠธ ์ˆ˜์ •

* refactor: ๋ฌธ์ œ์ง‘ ์‚ญ์ œ์‹œ ์นด๋“œ ์‚ญ์ œ ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€ ๋ฐ ๊ด€๋ จ ๋ฉ”์„œ๋“œ ์ˆ˜์ •

* refactor: ๋ฌธ์ œ์ง‘ ์ƒ์„ฑ api created uri ๋ณ€๊ฒฝ

* refactor: ํ”ผ์ผ€์ด ๋ฆฌ๋ทฐ ๋ฐ˜์˜

* refactor: ์ค‘๊ฐ„๊ณฐ ๋ฆฌ๋ทฐ ๋ฐ˜์˜

* refactor: ํ•„์š”์—†๋Š” ๋ฉ”์„œ๋“œ ์‚ญ์ œ ๋ฐ ๋ฉ”์„œ๋“œ๋ช… ์ˆ˜์ •

* refactor: ๋ผ์šฐํ„ฐ ์ •๋ฆฌ (#290)

Co-authored-by: dudtjr913
<[email protected]>

* etc: react-ga ์ถ”๊ฐ€ (#293)

Co-authored-by: Kyle <[email protected]>

* etc: ์„œ๋ธŒ๋ชจ๋“ˆ ์—…๋ฐ์ดํŠธ

Co-authored-by: Kyle <[email protected]>

* etc: main.js ํŒŒ์ผ ์ด๋ฆ„ ๋ฒ„์ „์— ๋งž๋„๋ก ๋ณ€๊ฒฝ

* T01 - ๋ฌธ์ œ์ง‘ CRUD์— ํƒœ๊ทธ ์ถ”๊ฐ€ (#275)

* feat: TagName ๋„๋ฉ”์ธ ์ƒ์„ฑ

* feat: TagNames ๋„๋ฉ”์ธ ์ƒ์„ฑ

* feat: ํƒœ๊ทธ ์—”ํ‹ฐํ‹ฐ ์ƒ์„ฑ

* feat: TagRepository ์ถ”๊ฐ€

* feat: Tag ์ƒ์„ฑ ์‹œ null ๊ฒ€์ฆ ์ถ”๊ฐ€

* feat: ๋ฌธ์ œ์ง‘๊ณผ ํƒœ๊ทธ์˜ n:m ๊ด€๊ณ„์˜ ์ค‘๊ฐ„ ํ…Œ์ด๋ธ” ์ƒ์„ฑ ๋ชฉ์ ์œผ๋กœ WorkbookTag ์—”ํ‹ฐํ‹ฐ ์ถ”๊ฐ€

* feat: ๋ฌธ์ œ์ง‘ ์—์„œ ์“ฐ์ด๋Š” DTO์— ํƒœ๊ทธ ๊ด€๋ จ ํ•„๋“œ ๋ฐ ๊ฒ€์ฆ ์ถ”๊ฐ€

* feat: Tag๋ฅผ String์œผ๋กœ ์ƒ์„ฑํ•˜๋Š” ํŒฉํ† ๋ฆฌ ๋ฉ”์„œ๋“œ ์ถ”๊ฐ€

* feat: TagService ์ถ”๊ฐ€

* feat: ์ƒ์„ฑ์ž ์ธ์ž๋ฅผ ํ•„๋“œ์™€ ๊ฐ™์€ ํƒ€์ž…์œผ๋กœ ์ˆ˜์ •, null ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€

* feat: ์˜ˆ์™ธ ๋ฉ”์‹œ์ง€ ์ˆ˜์ •

* feat: Tags ๋ถ„๋ฆฌ

* feat: ๋ฌธ์ œ์ง‘ ์ถ”๊ฐ€์™€ ํ•จ๊ป˜ ํƒœ๊ทธ๋„ ์ถ”๊ฐ€

* feat: ๋ฌธ์ œ์ง‘ ์ˆ˜์ •๊ณผ ์‚ญ์ œ์— ํƒœ๊ทธ ์ถ”๊ฐ€

* feat: ๋ฌธ์„œํ™” ํ…Œ์ŠคํŠธ ์ˆ˜์ •

* etc: import ์ •๋ฆฌ

* etc: ddl, dml, DataLoader ์ถ”๊ฐ€

* etc: ํ…Œ์ด๋ธ” ์ƒ์„ฑ ์‹œ ํ•„๋“œ ์ด๋ฆ„ name์œผ๋กœ ์ƒ์„ฑ๋˜๊ฒŒ ๋ณ€๊ฒฝ

* feat: WorkbookTagRepository ์ถ”๊ฐ€

* test: Workbook ์ถ”๊ฐ€, ์‚ญ์ œ์‹œ WorkbookTag ์™€ Tag์˜ cascade์— ๋Œ€ํ•œ ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€

* test: ๋ฌธ์ œ์ง‘ ์ˆ˜์ • ์š”์ฒญ์—์„œ opened ํ•„๋“œ๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€

* refactor: ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ์—์„œ ๋ฐ์ดํ„ฐ ๋กœ๋”๊ฐ€ ์‹คํ–‰๋˜์–ด ์ถ”๊ฐ€

* refactor: TagService๋กœ TagRequest๋ฅผ ์ „๋‹ฌํ•˜๋„๋ก ์ˆ˜์ •, TagNames ์‚ญ์ œ ์ค‘๋ณต ์ œ๊ฑฐ ๋กœ์ง์„ converTags ๋ฉ”์„œ๋“œ๋กœ ์œ„์ž„

* feat: WorkbookTag ์†Œํ”„ํŠธ ๋”œ๋ฆฌํŠธ๋กœ ์ˆ˜์ •

* feat: ์กฐ์•ค ๋ฆฌ๋ทฐ ๋ฐ˜์˜ (from -> of, new ArrayList<>() ์‚ญ์ œ)

* fix: Post ์š”์ฒญ์‹œ tags๋ฅผ ์ „๋‹ฌํ•˜์ง€ ์•Š์œผ๋ฉด ๋ฐœ์ƒํ•˜๋˜ ์—๋Ÿฌ ์ˆ˜์ •

* fix: ๋ฌธ์ œ์ง‘ api ์ˆ˜์ • (#296)

Co-authored-by: Kyle <[email protected]>

* W13 - ๊ณต์œ  ๋ฌธ์ œ์ง‘ ์ƒ์„ธ๋ณด๊ธฐ api๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค.  (#295)

* feat: TagName ๋„๋ฉ”์ธ ์ƒ์„ฑ

* feat: TagNames ๋„๋ฉ”์ธ ์ƒ์„ฑ

* feat: ํƒœ๊ทธ ์—”ํ‹ฐํ‹ฐ ์ƒ์„ฑ

* feat: TagRepository ์ถ”๊ฐ€

* feat: Tag ์ƒ์„ฑ ์‹œ null ๊ฒ€์ฆ ์ถ”๊ฐ€

* feat: ๋ฌธ์ œ์ง‘๊ณผ ํƒœ๊ทธ์˜ n:m ๊ด€๊ณ„์˜ ์ค‘๊ฐ„ ํ…Œ์ด๋ธ” ์ƒ์„ฑ ๋ชฉ์ ์œผ๋กœ WorkbookTag ์—”ํ‹ฐํ‹ฐ ์ถ”๊ฐ€

* feat: ๋ฌธ์ œ์ง‘ ์—์„œ ์“ฐ์ด๋Š” DTO์— ํƒœ๊ทธ ๊ด€๋ จ ํ•„๋“œ ๋ฐ ๊ฒ€์ฆ ์ถ”๊ฐ€

* feat: Tag๋ฅผ String์œผ๋กœ ์ƒ์„ฑํ•˜๋Š” ํŒฉํ† ๋ฆฌ ๋ฉ”์„œ๋“œ ์ถ”๊ฐ€

* feat: TagService ์ถ”๊ฐ€

* feat: ์ƒ์„ฑ์ž ์ธ์ž๋ฅผ ํ•„๋“œ์™€ ๊ฐ™์€ ํƒ€์ž…์œผ๋กœ ์ˆ˜์ •, null ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€

* feat: ์˜ˆ์™ธ ๋ฉ”์‹œ์ง€ ์ˆ˜์ •

* feat: Tags ๋ถ„๋ฆฌ

* feat: ๋ฌธ์ œ์ง‘ ์ถ”๊ฐ€์™€ ํ•จ๊ป˜ ํƒœ๊ทธ๋„ ์ถ”๊ฐ€

* feat: ๋ฌธ์ œ์ง‘ ์ˆ˜์ •๊ณผ ์‚ญ์ œ์— ํƒœ๊ทธ ์ถ”๊ฐ€

* feat: ๋ฌธ์„œํ™” ํ…Œ์ŠคํŠธ ์ˆ˜์ •

* etc: import ์ •๋ฆฌ

* etc: ddl, dml, DataLoader ์ถ”๊ฐ€

* etc: ํ…Œ์ด๋ธ” ์ƒ์„ฑ ์‹œ ํ•„๋“œ ์ด๋ฆ„ name์œผ๋กœ ์ƒ์„ฑ๋˜๊ฒŒ ๋ณ€๊ฒฝ

* feat: WorkbookTagRepository ์ถ”๊ฐ€

* test: Workbook ์ถ”๊ฐ€, ์‚ญ์ œ์‹œ WorkbookTag ์™€ Tag์˜ cascade์— ๋Œ€ํ•œ ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€

* test: ๋ฌธ์ œ์ง‘ ์ˆ˜์ • ์š”์ฒญ์—์„œ opened ํ•„๋“œ๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€

* refactor: ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ์—์„œ ๋ฐ์ดํ„ฐ ๋กœ๋”๊ฐ€ ์‹คํ–‰๋˜์–ด ์ถ”๊ฐ€

* refactor: TagService๋กœ TagRequest๋ฅผ ์ „๋‹ฌํ•˜๋„๋ก ์ˆ˜์ •, TagNames ์‚ญ์ œ ์ค‘๋ณต ์ œ๊ฑฐ ๋กœ์ง์„ converTags ๋ฉ”์„œ๋“œ๋กœ ์œ„์ž„

* feat: WorkbookTag ์†Œํ”„ํŠธ ๋”œ๋ฆฌํŠธ๋กœ ์ˆ˜์ •

* feat: ์กฐ์•ค ๋ฆฌ๋ทฐ ๋ฐ˜์˜ (from -> of, new ArrayList<>() ์‚ญ์ œ)

* feat: ์ธํ„ฐ์…‰ํ„ฐ ํ†ต๊ณผํ•˜์ง€ ์•Š๋Š” ๊ณต์œ  ๋ฌธ์ œ์ง‘ ์กฐํšŒ ๊ฒฝ๋กœ ์ถ”๊ฐ€

* feat: ์ƒํ™ฉ์— ๋”ฐ๋ฅธ ๋‹ค๋ฅธ ์ •๋ณด๋ฅผ ๋‹ด๊ธฐ ์œ„ํ•ด CardResponse์— JsonInclude ์ถ”๊ฐ€

* feat: ๊ณต์œ  ๋ฌธ์ œ์ง‘ ์ƒ์„ธ์กฐํšŒ api ๊ตฌํ˜„

* test: ๊ณต์œ  ๋ฌธ์ œ์ง‘ ์ƒ์„ธ์กฐํšŒ api ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€

* refactor: WorkbookCardResponse ์ •์  ํŒฉํ† ๋ฆฌ ๋ฉ”์„œ๋“œ ์ถ”๊ฐ€

* feat: ๊ณต์œ  ๋ฌธ์ œ์ง‘ ์ƒ์„ธ๋ณด๊ธฐ api ๋ฌธ์„œํ™” ๋ฐ ์š”์ฒญ ์ •๋ณด ์ถ”๊ฐ€

* refactor: WorkbookCardResponse ์˜ ํƒœ๊ทธ ์‘๋‹ต ํ•„๋“œ ์ด๋ฆ„ ๋ณ€๊ฒฝ

Co-authored-by: seunghyun <[email protected]>

* etc: ddl, dml ๋ณ€๊ฒฝ

* refactor: ์ „์ฒด์ ์ธ ๋””์ž์ธ ์ˆ˜์ • ๋ฐ ๋ฒ„๊ทธ ํ•ด๊ฒฐ (#299)

Co-authored-by: Kyle <[email protected]>

* fix: ๊ณต์œ  ํŽ˜์ด์ง€์˜ ํŠน์ • ์‹œ์ ์— ์บ์‹ฑ ๋ฌดํšจํ™”

Co-authored-by: Kyle <[email protected]>

* etc: ๋ฒ„์ „ 0.2.0 ์—…๋ฐ์ดํŠธ

Co-authored-by: Kyle <[email protected]>

* C09 - ๋กœ๊ทธ์ธํ•œ ํšŒ์›๋งŒ ๋‹ค์Œ์— ๋˜๋ณด๊ธฐ ๊ฐ€๋Šฅํ•˜๋„๋ก API ์ˆ˜์ • (#288)

* feat&test: ๋กœ๊ทธ์ธํ•œ ์‚ฌ์šฉ์ž๋งŒ ๋‹ค์Œ์— ๋˜๋ณด๊ธฐ ๊ฐ€๋Šฅํ•˜๋„๋ก ๊ธฐ๋Šฅ ๊ตฌํ˜„ ๋ฐ ํ…Œ์ŠคํŠธ

* etc: ์˜คํƒ€ ์ˆ˜์ •

* etc: ์„œ๋ธŒ๋ชจ๋“ˆ ์—…๋ฐ์ดํŠธ

* etc: ๋กœ๊ทธ์ธ oauth ์ •๋ณด botobo-team ์ •๋ณด๋กœ ๊ต์ฒด (#306)

* refactor: ๋ชจ๋‹ฌ ๊ด€๋ จ ์ด์Šˆ ์ •๋ฆฌ (#309)

- ์นด๋“œ ์ถ”๊ฐ€, ์ˆ˜์ •
- selectbox

Co-authored-by: dudtjr913
<[email protected]>

* refactor: ์†Œ๊ทœ๋ชจ ๋ฆฌํŒฉํ† ๋ง (#317)

* etc: ์ถฉ๋Œ ํ•ด๊ฒฐ

* refactor: CardsPage ๋ฆฌํŒฉํ† ๋ง

- cardInfo ์ง€์—ญ ์ƒํƒœ๋กœ ๋ณ€๊ฒฝ

Co-authored-by: Kyle <[email protected]>

* refactor: ์ „์—ญ ์ƒํƒœ -> ์ง€์—ญ ์ƒํƒœ๋กœ ๋ณ€๊ฒฝ

- publicCardState

Co-authored-by: dudtjr913
<[email protected]>

* etc: xmldom ์ทจ์•ฝ์„ฑ ํ•ด๊ฒฐ

Co-authored-by: Kyle <[email protected]>

Co-authored-by: seovalue <[email protected]>
Co-authored-by: Kyle <[email protected]>

* refactor: ํŽ˜์ด์ง€ ํ—ค๋” -> ๋ฉ”์ธ ํ—ค๋” ๊ต์ฒด (#319)

Co-authored-by: Kyle <[email protected]>

* refactor: ๋Œ€๊ทœ๋ชจ ๋ฆฌํŒฉํ† ๋ง (#321)

* refactor: ๋ฆฌํŒฉํ† ๋ง

- cardform autofocus
- workbookadd ๋นˆ ํƒœ๊ทธ ์ž…๋ ฅ ์˜ค๋ฅ˜ ์ˆ˜์ •
- route ๊ฒฝ๋กœ ์ •๋ฆฌ
- ๋กœ๋”ฉ ์• ๋‹ˆ๋ฉ”์ด์…˜ ์ˆ˜์ •

Co-authored-by: dudtjr913 <[email protected]>

* feat: ๋‚ด ๋ฌธ์ œ์ง‘์œผ๋กœ ๊ฐ€์ ธ์˜ค๊ธฐ default option ๊ตฌํ˜„

Co-authored-by: dudtjr913 <[email protected]>

* C10 - ๋˜ ๋ณด๊ธฐ ์นด๋“œ ๋“ฑ๋ก ๊ด€๋ จ ํ…Œ์ŠคํŠธ ๋ฆฌํŒฉํ† ๋ง์„ ํ•œ๋‹ค. (#303)

* test: ํ€ด์ฆˆ๋ฅผ ์œ„ํ•œ ์นด๋“œ์˜ ๋˜๋ณด๊ธฐ ์˜ต์…˜์ด false ๋กœ ๋ฐ”๋€Œ์—ˆ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค

* etc: ์นดํ…Œ๊ณ ๋ฆฌ ๊ด€๋ จ ๋‚ด์šฉ ์ˆ˜์ •

* etc: import.sql ์ œ๊ฑฐ

* fix: ๋˜ ๋ณด๊ธฐ ํฌํ•จ ํ€ด์ฆˆ ์ƒ์„ฑ ์ธ์ˆ˜ ํ…Œ์ŠคํŠธ ๋ฒ„๊ทธ ์ˆ˜์ •

* etc: ์กฐ์•ค ๋ฆฌ๋ทฐ ๋ฐ˜์˜ ๋ฐ ํ€ด์ฆˆ ์š”์ฒญ ์ •๋ณด Host ๋ณ€๊ฒฝ

* W11, W12, W14 - ์ž์‹ ์˜ ๋ฌธ์ œ์ง‘๋งŒ ์นด๋“œ ๋ชจ์•„๋ณด๊ธฐ ์ถ”๊ฐ€ ๋ฐ ๋ฌธ์ œ์ง‘ ์ธ์ˆ˜ํ…Œ์ŠคํŠธ ๋ฆฌํŒฉํ„ฐ๋ง (#307)

* feat: ์นด๋“œ ๋ชจ์•„๋ณด๊ธฐ์—์„œ ์ž์‹ ์˜ ๋ฌธ์ œ์ง‘๋งŒ ๋ณผ ์ˆ˜ ์žˆ๋„๋ก ์ˆ˜์ •

* refactor: ๋ฌธ์ œ์ง‘ ์ธ์ˆ˜ํ…Œ์ŠคํŠธ ์ „์ฒด ๋ฆฌํŒฉํ„ฐ๋ง

* docs: ๋ฌธ์ œ์ง‘ ๊ฐ€์ ธ์˜ค๊ธฐ asciidoc ์ถ”๊ฐ€

* refactor: ํ”ผ๋“œ๋ฐฑ ๋ฐ˜์˜

* refactor: ์ค‘๊ฐ„๊ณฐ ํ”ผ๋“œ๋ฐฑ ๋ฐ˜์˜

* B38 - RequestBuilder ๋ฆฌํŒฉํ† ๋ง (#310)

* refactor: RequestBuilder ๋ฆฌํŒฉํ† ๋ง ๋ฐ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ํด๋ž˜์Šค ์ œ๊ฑฐ

* etc: DocumentationUtils host๋ฅผ botobo.kro.kr๋กœ ๋ณ€๊ฒฝ

* refactor: PK ๋ฆฌ๋ทฐ ๋ฐ˜์˜

* refactor: parameter ์—†์ด ์‚ฌ์šฉํ•˜๋Š” ์œ ์ € ์—†์Œ ํ…Œ์ŠคํŠธ ์‹œ ์‚ฌ์šฉํ•˜๋Š” auth๋ฅผ failAuth๋กœ ๋ช…์นญ ๋ณ€๊ฒฝ

* etc: requestBuilder ์„ค๋ช… ์ถ”๊ฐ€

* refactor: ๋ฌธ์ œ์ง‘ ๊ฐ€์ ธ๊ฐ€๊ธฐ์—์„œ [๊ณต์œ ] ์ถ”๊ฐ€ (#324)

Co-authored-by: Kyle <[email protected]>

* etc: submodule ๋™๊ธฐํ™”

* B41 - ๊ฒฝ๋กœ์™€ HttpMethod๋ฅผ ์ด์šฉํ•ด ์ธํ„ฐ์…‰ํ„ฐ ์„ค์ • ๊ฐ€๋Šฅํ•˜๋„๋ก ์ˆ˜์ • ๋ฐ /api/workbooks ๊ฒฝ๋กœ๋ฅผ ์ธํ„ฐ์…‰ํ„ฐ์— ์ถ”๊ฐ€ํ•œ๋‹ค. (#322)

* feat: ๊ฒฝ๋กœ์™€ HttpMethod๋กœ interceptor ์„ค์ • ๊ฐ€๋Šฅํ•˜๋„๋ก ๊ตฌํ˜„

* refactor: ํ”ผ๋“œ๋ฐฑ ๋ฐ˜์˜

* test: PathMatcherInterceptor ๊ด€๋ จ ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€

* feat: ํ€ด์ฆˆ ํŽ˜์ด์ง€์˜ ์นด๋“œ ์Šฌ๋ผ์ด๋“œ๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค (#326)

* feat: ์นด๋“œ ์Šฌ๋ผ์ด๋“œ ๊ธฐ๋Šฅ ๊ตฌํ˜„

* fix: ์นด๋“œ ์›€์ง์ด๋Š” ์‹œ๊ฐ„ 0.1์ดˆ๋กœ ์ˆ˜์ •

* Q15 - ํ€ด์ฆˆ ์„ค์ •์— ํ€ด์ฆˆ ๊ฐœ์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค. (#316)

* feat&test: Quiz ์ƒ์„ฑ ์‹œ ํšŒ์›์ธ์ง€ ํ™•์ธ ๋ฐ ํ€ด์ฆˆ ์š”์ฒญ์— ๊ฐœ์ˆ˜ ์ถ”๊ฐ€

* etc: develop ๋ณ€๊ฒฝ์‚ฌํ•ญ ๋ฐ˜์˜

* feat: ๋‚ด ์›Œํฌ๋ถ์—์„œ ์ƒ์„ฑ๋œ ํ€ด์ฆˆ์ธ์ง€ ๊ฒ€์ฆ ์ถ”๊ฐ€

* feat: ๋ฉ”์ธ ํ—ค๋”์˜ ๋ฉ”๋‰ด๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค (#330)

* feat: ๋“œ๋กญ๋‹ค์šด ๋ฉ”๋‰ด ๊ตฌํ˜„

* feat: LogoutPage ๊ตฌํ˜„

* etc: ๋ฆฌ๋ทฐ ๋ฐ˜์˜

- ์ปจ๋ฒค์…˜
- role naming
- ์• ๋‹ˆ๋ฉ”์ด์…˜ ์†๋„

* etc: ์„œ๋ธŒ๋ชจ๋“ˆ ๋™๊ธฐํ™”

* feat: ์œ ์ €์˜ ๋งˆ์ด ํŽ˜์ด์ง€๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค (#333)

* etc: ํ•„์š”์—†๋Š” import ๊ตฌ๋ฌธ ์ •๋ฆฌ

* feat: ์œ ์ € ํ”„๋กœํ•„ ํŽ˜์ด์ง€ ๊ตฌํ˜„

* etc: ImageEditor ์œ„์น˜ ๊ณ ์ •

* feat: TextField ์ถ”๊ฐ€

* fix: z-index ์˜ค๋ฅ˜ ์ˆ˜์ •

* etc: ํ•„์š”์—†๋Š” css ์†์„ฑ ์ œ๊ฑฐ

* etc: ์„œ๋ธŒ๋ชจ๋“ˆ ๋™๊ธฐํ™”

* U06 - ๋งˆ์ดํŽ˜์ด์ง€ ํ”„๋กœํ•„ ์‚ฌ์ง„ ์ˆ˜์ • api ๊ตฌํ˜„  (#332)

* feat: ๋‚ด ์ •๋ณด ์ˆ˜์ • api ๋ผˆ๋Œ€ ์ฝ”๋“œ ์ž‘์„ฑ

* feat: S3 ํŒŒ์ผ ์—…๋กœ๋“œ ๊ธฐ๋Šฅ ๊ตฌํ˜„

* feat: Multipartfile ์—…๋กœ๋“œ ๊ด€๋ จ ์„ค์ • ์ถ”๊ฐ€

* feat: FileNameGenerator์— BASE DIR์ถ”๊ฐ€ ๋ฐ ์‘๋‹ต ๋ฐ˜ํ™˜ํ•˜๋„๋ก ์ˆ˜์ •

* feat: ์„œ๋ธŒ๋ชจ๋“ˆ ์ˆ˜์ • ๋ฐ build.gradle ์—…๋ฐ์ดํŠธ

* etc: ์„œ๋ธŒ๋ชจ๋“ˆ ์ˆ˜์ • ๋ฐ˜์˜

* Merge develop into feature/U06-B

* feat: S3Uploader, FileNameGenerator url ๋ฃจํŠธ ๋ณ€๊ฒฝ

* feat: S3 ๊ด€๋ จ ์˜ˆ์™ธ ํด๋ž˜์Šค ์ถ”๊ฐ€ ๋ฐ ํ•ธ๋“ค๋ง

* etc: ํ…Œ์ŠคํŠธ์— ํ•„์š”ํ•œ ๋ฆฌ์†Œ์Šค ํŒŒ์ผ ์ถ”๊ฐ€

* test&feat: S3 ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•œ ์„ค์ • ํŒŒ์ผ ์ถ”๊ฐ€ ๋ฐ ํ…Œ์ŠคํŠธ ๊ตฌํ˜„

* etc: ์ฝ”๋“œ ํฌ๋งทํŒ…

* feat: 10MB ์ด์ƒ์˜ ํŒŒ์ผ ์š”์ฒญ ์‹œ ์˜ˆ์™ธ์ฒ˜๋ฆฌ ๊ตฌํ˜„

* etc: ์„œ๋ธŒ๋ชจ๋“ˆ ์—…๋ฐ์ดํŠธ

* etc: Merge develop into feature/U06-B

* feat&test: MultipartFile์ด ๋น„์–ด์žˆ๊ฑฐ๋‚˜ ์—†๋Š” ๊ฒฝ์šฐ ๋””ํดํŠธ ์ด๋ฏธ์ง€๋กœ ๋Œ€์ฒด

* etc: println ์‚ญ์ œ

* refactor: ๋ถˆํ•„์š”ํ•œ ์ฃผ์„ ์‚ญ์ œ ๋ฐ ์˜ค์ฆˆ ๋ฆฌ๋ทฐ ๋ฐ˜์˜

* feat: ์ค‘๊ฐ„๊ณฐ ๋ฆฌ๋ทฐ ๋ฐ˜์˜

* feat: ๊ฒ€์ƒ‰ ํŽ˜์ด์ง€ UI ๋ฐ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•œ๋‹ค (#334)

* feat: ๊ณต์œ  ๊ฒ€์ƒ‰ ํŽ˜์ด์ง€ ๋ผ์šฐํŒ… ๊ธฐ๋Šฅ ๊ตฌํ˜„

* refactor: ๊ณต์œ  ๋ฌธ์ œ์ง‘ ํŽ˜์ด์ง€ ์‚ญ์ œ

* feat: util type ์ถ”๊ฐ€

- ValueOf: ๊ฐ์ฒด์˜ value๋ฅผ ํƒ€์ž…์œผ๋กœ ์ง€์ •ํ•ด์ฃผ๋Š” ์—ญํ• 

* feat: ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ api์ ์šฉ

* feat: searchState ํŒŒ์ผ ์ถ”๊ฐ€

- search ๊ด€๋ จ recoil(atom) ๋ชจ์Œ

* feat: ํƒœ๊ทธ, ์ž‘์„ฑ์ž ๊ฒ€์ƒ‰ UI ๋ฐ ๊ธฐ๋Šฅ ๊ตฌํ˜„

* refactor: ๊ฒ€์ƒ‰ ์ปดํฌ๋„ŒํŠธ์˜ ํ™•์žฅ์„ฑ์„ ์œ„ํ•ด ์œ ์—ฐํ•˜๊ฒŒ ๋ณ€๊ฒฝ

* refactor: ๋ณ€์ˆ˜ ์ด๋ฆ„ ๋ณ€๊ฒฝ ๋ฐ ์ถ”์ƒํ™”๋œ searchResponse ์ œ๊ฑฐ

- response๋ผ๋Š” ์ด๋ฆ„์ด ์ ์ ˆํ•˜์ง€ ์•Š์€ ๊ฒƒ ๊ฐ™์•„์„œ result๋กœ ๋ณ€๊ฒฝ
- searchResponse์—์„œ ๋‘ ๊ฐ€์ง€์˜ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋ณด๋‹ˆ ํ™•์žฅ์„ฑ์ด ์–ด๋ ต๊ณ , ํƒ€์ž… ๊ฐ€๋“œ๋ฅผ ํ•ด์•ผ ํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ด์„œ ๋ณ€๊ฒฝ

* feat: ๊ณต์œ  ๋ฌธ์ œ์ง‘ ํŽ˜์ด์ง€ ์ถ”๊ฐ€

* feat: ๊ณต์œ  ๋ฌธ์ œ์ง‘ ํ•„ํ„ฐ ๊ธฐ๋Šฅ ์ถ”๊ฐ€ ๊ตฌํ˜„

* fix: ๊ฒ€์ƒ‰ํ•  ๋•Œ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์ด์ง€ ์•Š๋„๋ก ์ˆ˜์ •

* fix: ํ‚ค์›Œ๋“œ๊ฐ€ ์ž…๋ ฅ๋˜์ง€ ์•Š์•˜์„ ๋•Œ api ์š”์ฒญ ๋ณด๋‚ด๋Š” ๋ฒ„๊ทธ ์ˆ˜์ •

* fix: ๊ณต์œ  ๋ฌธ์ œ์ง‘ ํŽ˜์ด์ง€์˜ ์ฒซ ๋žœ๋”๋ง ์‹œ ๋™๊ธฐํ™”๊ฐ€ ๋˜์ง€ ์•Š๋Š” ๋ฒ„๊ทธ ํ•ด๊ฒฐ

* feat: intersection Observer ์ ์šฉ - ์ธํ”ผ๋‹ˆํ‹ฐ ์Šคํฌ๋กค

* refactor: ๊ณต์œ  ๋ฌธ์ œ์ง‘ ์ปดํฌ๋„ŒํŠธ๋กœ intersection ์ด๋™

- ๊ณต์œ  ๊ฒ€์ƒ‰ ํŽ˜์ด์ง€์™€ ๊ณต์œ  ๋ฌธ์ œ์ง‘ ํŽ˜์ด์ง€ ๋‘ ๊ตฐ๋ฐ์—์„œ ์‚ฌ์šฉํ•ด์•ผ ํ–ˆ๊ธฐ์— ๋‘˜์˜ ๊ณตํ†ต์ ์ธ ๊ณต์œ  ๋ฌธ์ œ์ง‘ ์ปดํฌ๋„ŒํŠธ๋กœ ์ด๋™

* refactor: keyword, type์„ recoil์—์„œ ๊ฐ€์ ธ๋‹ค๊ฐ€ ์“ฐ๋„๋ก ๋ณ€๊ฒฝ

- onClickItem ์‚ญ์ œ, ์ด์œ ๋Š” ํ•„์š”ํ•˜์ง€ ์•Š์€ ์ •๋ณด์˜€๊ธฐ ๋•Œ๋ฌธ
- ๊ฒ€์ƒ‰ ํ›„ ๋’ค๋กœ๊ฐ€๊ธฐ๋ฅผ ํ–ˆ์„ ๋•Œ, ํ•ด๋‹น ํƒญ์ด ์œ ์ง€๋˜๋„๋ก ๋ณ€๊ฒฝ

* refactor: ๊ฒ€์ƒ‰ ํ›„ ๋‹ค์‹œ ๋Œ์•„์™”์„ ๋•Œ, ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณด์กด๋˜๋„๋ก ๋ณ€๊ฒฝ

* fix: ๋ฌดํ•œ ์Šคํฌ๋กค ๋ฒ„๊ทธ ์ˆ˜์ • ๋ฐ startIndex 1์”ฉ ์ฆ๊ฐ€ํ•˜๋„๋ก ๋ณ€๊ฒฝ

* fix: ํ‚ค์›Œ๋“œ์˜ ์ œ๋ชฉ์œผ๋กœ ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ˆ˜์ •

- ๊ฒ€์ƒ‰ ํŽ˜์ด์ง€์— ๋“ค์–ด์™”์„ ๋• ํ•ญ์ƒ ๊ฒ€์ƒ‰์–ด๊ฐ€ ์ดˆ๊ธฐํ™”๋˜๋„๋ก ๋ณ€๊ฒฝ
- ๊ฒ€์ƒ‰ ์‹œ๋„ ์ค‘์ผ ๋•Œ loading true๋กœ ๋ณ€๊ฒฝ

* fix: ํ•„ํ„ฐ๋ง ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ ์ด์ „ ๋ฐ์ดํ„ฐ ๋ˆ„์ ๋˜๋Š” ๋ฒ„๊ทธ ํ•ด๊ฒฐ

* refactor: ์ข‹์•„์š” like => heart ๋ณ€๊ฒฝ

* feat: ๊ณต์œ  ๋ฌธ์ œ์ง‘ ํŽ˜์ด์ง€ ์Šค์ผˆ๋ ˆํ†ค ๊ตฌํ˜„

* fix: searchKeyword๊ฐ€ ์„ธํŒ…๋˜๊ธฐ ์ „์— ๋ผ์šฐํŒ…ํ•˜๋Š” ๋ฌธ์ œ ํ•ด๊ฒฐ

* fix: ๊ณต์œ  ๋ฌธ์ œ์ง‘ ํŽ˜์ด์ง€ ์Šค์ผˆ๋ ˆํ†ค์˜ title height ์ˆ˜์ •

* refactor: ๋กœ๋”ฉ์„ setํ•˜๋Š” ๋ถ€๋ถ„์„ ํŽ˜์ด์ง€๋กœ ์œ„์ž„

* fix: ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” snackbar ์‚ญ์ œ

* refactor: PublicWorkbook => PublicSearchResultPage

* etc: eol ํ•ด๊ฒฐ

* refactor: Intersection Observer์˜ entries =>[entry]

* fix: MainHeader์— z-index ์ถ”๊ฐ€

* fix: ํ•„ํ„ฐ ํด๋ฆญ ์‹œ startIndex๊ฐ€ ์ฆ๊ฐ€ํ•˜๋Š” ๋ฒ„๊ทธ ์ˆ˜์ •

* refactor: query๋กœ ์ƒˆ๋กœ๊ณ ์นจ ์‹œ์—๋„ ๊ฒ€์ƒ‰์ด ๊ฐ€๋Šฅํ•˜๋„๋ก ๋ณ€๊ฒฝ

* refactor: searchForKeyword ๋ถ„๋ฆฌ

* etc: ๋ณ€์ˆ˜ ๋ช… ๋ณ€๊ฒฝ searchInfo => searchInfos

* fix: input์— ๊ฐ’ ์ž…๋ ฅ ์‹œ start๊ฐ€ 0์œผ๋กœ ๋˜์ง€ ์•Š๋Š” ๋ฒ„๊ทธ ์ˆ˜์ •

* feat: ๊ฒ€์ƒ‰ ์ฐฝ sticky ์†์„ฑ ์ ์šฉ

* etc: ์ฝ˜์†”๋กœ๊ทธ ์‚ญ์ œ

* W15 - ์œ ์ €๋งˆ๋‹ค ๋ฌธ์ œ์ง‘์— ํ•˜ํŠธ๋ฅผ ๋ˆ„๋ฅด๊ณ  ์ทจ์†Œํ•  ์ˆ˜ ์žˆ๋Š” ํ† ๊ธ€ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•œ๋‹ค. (#336)

* feat: Heart ์—”ํ‹ฐํ‹ฐ ์ƒ์„ฑ

* feat: Hearts ์ผ๊ธ‰์ปฌ๋ ‰์…˜ ์ƒ์„ฑ

* feat: Workbook์— Heart ์—ฐ๊ฒฐ

* feat: WorkbookService์— ํ•˜ํŠธ ํ† ๊ธ€ ๊ธฐ๋Šฅ ์ถ”๊ฐ€

* feat: ์ข‹์•„์š”์˜ ๊ฒฐ๊ณผ์ธ HeartResponse ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ธฐ๋Šฅ ์ถ”๊ฐ€

* feat: ํ•˜ํŠธ ํ† ๊ธ€ api ์ถ”๊ฐ€

* feat: heartCount ์ถ”๊ฐ€์™€ ๊ทธ์— ๋”ฐ๋ฅธ ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€, ๋ณ€๊ฒฝ

* feat: ๊ณต์œ  ๋ฌธ์ œ์ง‘ ์ƒ์„ธ ์กฐํšŒ์—๋„ heartCount ๋‚˜์˜ค๋„๋ก ์ถ”๊ฐ€

* feat: ๊ณต์œ  ๋ฌธ์ œ์ง‘ ์ƒ์„ธ์กฐํšŒ api ์ˆ˜์ • - ํ•ด๋‹น api๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์œ ์ €๊ฐ€ ํ•ด๋‹น ๋ฌธ์ œ์ง‘์˜ ํ•˜ํŠธ๋ฅผ ๋ˆŒ๋ €๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ์•Œ๋ ค์ฃผ๋Š” heart ํ•„๋“œ ์ถ”๊ฐ€

* refactor: ๋ฌธ์„œํ™” ํ…Œ์ŠคํŠธ์—์„œ botobo.access.token์„ ์‚ฌ์šฉํ•˜๋Š” ์š”์ฒญ์ด AppUser๋ฅผ ๋งŒ๋“ค์–ด ๋‚ด๋„๋ก findAppUserByToken ๋ฉ”์„œ๋“œ๋ฅผ ๋ชจํ‚น // ๋ฌธ์ œ์ง‘ ๋ฌธ์„œํ™” ํ…Œ์ŠคํŠธ์— ์ ์šฉ

* feat: Token์„ ์ž…๋ ฅํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ๋น„ํšŒ์›์œผ๋กœ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ๋ชจํ‚น

* feat: ํ…Œ์ŠคํŠธ์—์„œ body๊ฐ€ ์—†๋Š” ์š”์ฒญ์— ์ž„์‹œ๋กœ DummyRequest๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€์‹  putWithoutBody ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉ

* etc: heart ddl ์ถ”๊ฐ€

* refactor: ๋น„ํšŒ์›์ด ๊ณต์œ  ๋ฌธ์ œ์ง‘ ์ƒ์„ธ ์กฐํšŒ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋„๋ก ๋ณ€๊ฒฝ

* etc: build ์ „ copyDev๊ฐ€ ์‹คํ–‰๋˜๋„๋ก ๋ณ€๊ฒฝ

* feat: ์นด๋“œ ์ƒ์„ธ ํŽ˜์ด์ง€์— ํ•˜ํŠธ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•œ๋‹ค  (#340)

* feat: ํ•˜ํŠธ ๊ธฐ๋Šฅ ๊ตฌํ˜„

* fix: ํ•˜ํŠธ ํ† ๊ธ€ ๋กœ์ง ๋ณ€๊ฒฝ

* feat: ์นด๋“œ ์Šฌ๋ผ์ด๋“œ ๋ฉ”์‹œ์ง€๊ฐ€ ๋ชจ๋ฐ”์ผ์—์„œ๋งŒ ๋ณด์ด๋„๋ก ์ˆ˜์ •ํ•œ๋‹ค (#348)

* feat: ๋ชจ๋ฐ”์ผ ๊ธฐ๊ธฐ ํ™•์ธ ๊ธฐ๋Šฅ ์ถ”๊ฐ€

* fix: ๋น„ํšŒ์›์ธ ๊ฒฝ์šฐ key๊ฐ€ 0์ธ ๋ฒ„๊ทธ ์ˆ˜์ •

* fix: isMobile ๋กœ์ง ๋ณ€๊ฒฝ ๋ฐ GUEST์ผ ๋•Œ id๊ฐ’ ์„ค์ •

* fix: ๊ฐœํ–‰ ๋ฐ ๋„์–ด์“ฐ๊ธฐ ์œ ์ง€๋˜๋„๋ก ๋ณ€๊ฒฝ (#352)

* U07 - ๊ตฌ๊ธ€ ์†Œ์…œ ๋กœ๊ทธ์ธ์„ ๊ตฌํ˜„ํ•œ๋‹ค (#337)

* refactor: OauthManager ์ธํ„ฐํŽ˜์ด์Šค ๋ถ„๋ฆฌ ๋ฐ ์†Œ์…œ ๋กœ๊ทธ์ธ ์ฝ”๋“œ ๋ฆฌํŒฉํ„ฐ๋ง

* feat: ๊ตฌ๊ธ€ ์†Œ์…œ ๋กœ๊ทธ์ธ ๊ตฌํ˜„ ๋ฐ ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€

* refactor: interceptor url ์ˆ˜์ • ๋ฐ import ๋ณ€๊ฒฝ

* refactor: ํ”ผ๋“œ๋ฐฑ ๋ฐ˜์˜

* refactor: ๋ฉ”์„œ๋“œ๋ช… ์ˆ˜์ • ๋ฐ ํ•„์š”์—†๋Š” ์ฝ”๋“œ ์‚ญ์ œ

* etc: ์„œ๋ธŒ๋ชจ๋“ˆ ๋™๊ธฐํ™”

* feat: ๋งˆ์ดํŽ˜์ด์ง€์˜ ์ •๋ณด๋ฅผ ์ˆ˜์ •ํ•œ๋‹ค (#354)

* etc: UserInfo ํƒ€์ž…์— bio ํ•„๋“œ ์ถ”๊ฐ€

* etc: ProfilePage UI ๋ณด์™„

* feat: ํ”„๋กœํ•„ ์ˆ˜์ • ๊ตฌํ˜„

* feat: ์ด๋ฏธ์ง€ ์—…๋กœ๋“œ ๊ตฌํ˜„

* etc: ํฌ์ธํ„ฐ ๋ณ€๊ฒฝ

* feat: ์œ ์ € ์ด๋ฆ„ validation ๊ฐ•ํ™”

* etc: ์ฝ”๋“œ ์Šคํƒ€์ผ ์ •๋ฆฌ

* U11 - ๋งˆ์ดํŽ˜์ด์ง€ ํ”„๋กœํ•„ ๋‹‰๋„ค์ž„ ๋ฐ ๋ฐ”์ด์˜ค ์ˆ˜์ • api ๊ตฌํ˜„, U12 - ํšŒ์›๋ช… ์ค‘๋ณต ๊ฒ€์‚ฌ api๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค.  (#343)

* feat: User ์—”ํ‹ฐํ‹ฐ์— bio ํ•„๋“œ ์ถ”๊ฐ€

* feat: ๋‚ด ์ •๋ณด ์ˆ˜์ • ๊ธฐ๋Šฅ ๊ตฌํ˜„

* test: ๋‚ด ์ •๋ณด ์ˆ˜์ • Acceptance Test

* test: UserUpdateRequest Validation ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€

* test: UserDocumentationTest ์ถ”๊ฐ€

* test: ๋‚ด ์ •๋ณด ์ˆ˜์ • ๊ด€๋ จ UserServiceTest ๋ฐ UserTest ์ถ”๊ฐ€

* feat&test: ์œ ์ € ์ด๋ฆ„ ์ค‘๋ณต ๊ฒ€์ฆ ์ถ”๊ฐ€ ๋ฐ ํ…Œ์ŠคํŠธ ๊ตฌํ˜„

* feat: ํšŒ์›๋ช… ์ค‘๋ณต์กฐํšŒ api ๊ตฌํ˜„

* test: ํšŒ์›๋ช… ์ค‘๋ณต ์กฐํšŒ ํ…Œ์ŠคํŠธ ๊ตฌํ˜„

* refactor: ์ค‘๋ณต ๋ฉ”์„œ๋“œ ์ƒ์†ํ•˜๋„๋ก ๋ณ€๊ฒฝ

* feat&test: pk ๋ฆฌ๋ทฐ ๋ฐ˜์˜, ํšŒ์›๋ช… ๊ณต๋ฐฑ ๋ถˆ๊ฐ€ ๊ฒ€์ฆ ๊ตฌํ˜„ ๋ฐ ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€

* refactor: ๊ตฌ๊ธ€ ์†Œ์…œ ๋กœ๊ทธ์ธ ์ถ”๊ฐ€๋œ User ๋Œ€์‘ ๋ฐ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋ฉ”์„œ๋“œ ์ œ๊ฑฐ

* fix: UserDocumentTest ์‘๋‹ต ์ˆ˜์ • ๋ฐ ์ž„์‹œ ์ฒ˜๋ฆฌ

* refactor: ํšŒ์› ์ •๋ณด ์ˆ˜์ • ์‹œ ํšŒ์›๋ช… ์ค‘๋ณต ์กฐํšŒ๋ฅผ ์šฐ์„ ํ•˜๋„๋ก ์ˆ˜์ •

* etc: ์ฝ”๋“œ ์ •๋ฆฌ ๋ฐ http ํŒŒ์ผ ์ถ”๊ฐ€

* feat: UserName ์ปค์Šคํ…€ Validator ์ถ”๊ฐ€

* feat: sonarqube ๋„์ž… ๋ฐ CORS ์„ค์ • ๋ณ€๊ฒฝ (#362)

* B45 - ์†Œ๋‚˜ํ๋ธŒ๋ฅผ CI ๊ณผ์ •์— ๋„์ž…ํ•œ๋‹ค - 2 (#364)

* feat: sonarqube ๋„์ž… ๋ฐ CORS ์„ค์ • ๋ณ€๊ฒฝ

* fix: build.gradle ํ”Œ๋Ÿฌ๊ทธ์ธ ๋ถˆํ•„์š”ํ•œ ์„ค์ • ์ œ๊ฑฐ

* feat: ํ€ด์ฆˆ ์„ค์ • ํŽ˜์ด์ง€ UI ๋ฐ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•œ๋‹ค (#356)

* refactor: SelectBox์—์„œ list์˜ height๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ๊ฒŒ ๋ณ€๊ฒฝ

* feat: ํ€ด์ฆˆ ์„ค์ • ํŽ˜์ด์ง€ UI ๊ตฌํ˜„

* feat: ํ€ด์ฆˆ ์„ค์ • ๊ธฐ๋Šฅ ๊ตฌํ˜„

* feat: ํ€ด์ฆˆ ํŽ˜์ด์ง€ ์‹œ๊ฐ„ ๊ธฐ๋Šฅ ๊ตฌํ˜„

* fix: ์‹œ๊ฐ„ ๊ตฌํ•˜๋Š” ์œ ํ‹ธ ํ•จ์ˆ˜ ๋ณ€๊ฒฝ

* feat: ํ€ด์ฆˆ ๊ฒฐ๊ณผ ํŽ˜์ด์ง€ ์‹œ๊ฐ„ ํ‘œ์‹œ ๊ธฐ๋Šฅ ๊ตฌํ˜„

* feat: useInterval ์ถ”๊ฐ€

* fix: alert => snackbar ๊ต์ฒด

* feat: ํ€ด์ฆˆ ์„ธํŒ… ํŽ˜์ด์ง€ ์Šค์ผˆ๋ ˆํ†ค ๊ตฌํ˜„

* etc: ํ•„์š”ํ•˜์ง€ ์•Š์€ style ์‚ญ์ œ

* refactor: ๋ชจ๋ฐ”์ผ ๊ธฐ๊ธฐ์—์„œ ํ„ฐ์น˜ ์Šฌ๋ผ์ด๋“œ ๋ฐ” ๊ตฌํ˜„

* etc: Clock => Timer ๋ณ€๊ฒฝ ๋ฐ ๋ณ€์ˆ˜๋ช… ์ˆ˜์ •

* etc: import ๋ณ€๊ฒฝ

* feat: ๋งˆ์ฃผ์นœ ํšŸ์ˆ˜๋ฅผ ํ‘œ์‹œํ•œ๋‹ค(ํ€ด์ฆˆ ํŽ˜์ด์ง€ ๋ฐ ์นด๋“œ ๋ชจ์•„๋ณด๊ธฐ ํŽ˜์ด์ง€)  (#350)

* feat: ํ’€์–ด๋ณธ ํšŸ์ˆ˜ ๊ธฐ๋Šฅ ์ถ”๊ฐ€

* fix: resize ์ด๋ฒคํŠธ ๋ฐœ์ƒ ์‹œ ์นด๋“œ width๊ฐ€ ๋ณ€ํ•˜์ง€ ์•Š๋Š” ๋ฒ„๊ทธ ํ•ด๊ฒฐ

* fix: resize ์‹œ ์ฆ‰์‹œ ์นด๋“œ ๋ณ€๊ฒฝ๋˜๋„๋ก ๋ณ€๊ฒฝ

* etc: ์œ ์ € ์ •๋ณด ์ˆ˜์ • ํ•„๋“œ์—์„œ id ์ œ๊ฑฐ (#363)

* feat: ๊ตฌ๊ธ€ ์†Œ์…œ ๋กœ๊ทธ์ธ์„ ๊ตฌํ˜„ํ•œ๋‹ค (#359)

* feat: OAtuh component ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ํ˜•ํƒœ๋กœ ๋ณ€๊ฒฝ

* feat: ๊ตฌ๊ธ€ ์†Œ์…œ ๋กœ๊ทธ์ธ ๊ตฌํ˜„

* etc: oauth ์Šคํƒ€์ผ ๋ฐฉ์‹ ๋ณ€๊ฒฝ

* refactor: OAuthCallbackPage๋กœ ํ†ต์ผ

* fix: ๋ฌธ์ œ์ง‘ ์ถ”๊ฐ€ ํŽ˜์ด์ง€์—์„œ ๋ฐœ์ƒํ•˜๋Š” ๋ฉ”์ธ ํ—ค๋” z-index ์˜ค๋ฅ˜๋ฅผ ์ˆ˜์ •ํ•œ๋‹ค (#366)

* fix: ๋ฌธ์ œ์ง‘ ์ถ”๊ฐ€ ํŽ˜์ด์ง€์—์„œ z-index ์˜ค๋ฅ˜ ์ˆ˜์ •

* etc: ๋ฉ”์ธ ํ—ค๋”์— shadow prop ๋ฐ›๊ฒŒ ์ˆ˜์ •

* etc: CORS ์„ค์ • ๋ณ€๊ฒฝ

* etc: ๋ฒˆ๋“ค ์‚ฌ์ด์ฆˆ ์ค„์ด๊ธฐ (#368)

- ํฐํŠธ html๋กœ ์ด๋™(๋‹ค์ด๋‚˜๋ฏน import)
- gzip ์˜ต์…˜ ์ถ”๊ฐ€
- browser ๋ชฉ๋ก ์ถ”๊ฐ€

* S01 - ํƒœ๊ทธ, ์ž‘์„ฑ์ž ๊ธฐ์ค€์œผ๋กœ ๊ฒ€์ƒ‰ ๊ฐ€๋Šฅํ•˜๋„๋ก ์„ธ๋ถ„ํ™”ํ•œ๋‹ค.  (#341)

* feat: ๋ฌธ์ œ์ง‘ ์ด๋ฆ„, ํƒœ๊ทธ, ๊ทธ๋ฆฌ๊ณ  ์ž‘์„ฑ์ž ๊ธฐ์ค€์œผ๋กœ ๋ฌธ์ œ์ง‘ ์กฐํšŒ ์ฟผ๋ฆฌ ์ถ”๊ฐ€

* feat: ๊ณต์œ  ๋ฌธ์ œ์ง‘ ์กฐํšŒ ๋ฐฉ์‹ ๋ณ€๊ฒฝ

* feat: ๊ฒ€์ƒ‰ ์š”์ฒญ ๊ด€๋ จ ์–ด๋…ธํ…Œ์ด์…˜ ๋ฐ ๋ฆฌ์กธ๋ฒ„ ์ถ”๊ฐ€

* test: ๊ฒ€์ƒ‰ ๊ด€๋ จ ์œ ๋‹› ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€

* test: ๋ฌธ์ œ์ง‘ ๊ฒ€์ƒ‰ ๊ด€๋ จ ์ธ์ˆ˜ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€

* etc: ๋ถˆํ•„์š”ํ•œ ํŒŒ์ผ ์‚ญ์ œ

* etc: ๋ถˆํ•„์š”ํ•œ ๊ธฐ๋Šฅ ์ œ๊ฑฐ ๋ฐ ์ฝ”๋“œ ์ •๋ฆฌ

* feat: ํƒœ๊ทธ ๊ฒ€์ƒ‰ ์ž๋™์™„์„ฑ ๊ธฐ๋Šฅ ์ถ”๊ฐ€

* feat: ์œ ์ € ๊ฒ€์ƒ‰ ์ž๋™์™„์„ฑ ๊ธฐ๋Šฅ ์ถ”๊ฐ€

* feat: ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ ๊ตฌํ˜„

* ํƒœ๊ทธ, ์œ ์ €, ๋ฌธ์ œ์ง‘ ์ด๋ฆ„์œผ๋กœ ์ฐพ๊ธฐ ๊ฐ€๋Šฅ
* ์นด๋“œ ์ˆ˜, ๋ฌธ์ œ์ง‘ ์ด๋ฆ„, ์ตœ์‹ ์ˆœ ์ •๋ ฌ ๊ฐ€๋Šฅ
* ์ •๋ ฌ ๋ฐฉ์‹ ์˜ค๋ฆ„์ฐจ์ˆœ, ๋‚ด๋ฆผ์ฐจ์ˆœ ์„ ํƒ ๊ฐ€๋Šฅ

* feat: ์นด๋“œ ์ˆ˜ 0๊ฐœ์ธ ๋ฌธ์ œ์ง‘ ๊ฒ€์ƒ‰์—์„œ ์ œ๊ฑฐํ•˜๋Š” ๊ธฐ๋Šฅ ๊ตฌํ˜„

* test: ๋ฌธ์ œ์ง‘ ๊ฒ€์ƒ‰ ๊ด€๋ จ ์ธ์ˆ˜ ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€

* test: ์œ ์ €, ํƒœ๊ทธ ์ž๋™์™„์„ฑ ๊ด€๋ จ ์ธ์ˆ˜ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€

* feat: ํƒœ๊ทธ ์ž๋™์™„์„ฑ ์‹œ ๋Œ€์†Œ ๊ตฌ๋ถ„ํ•˜์ง€ ์•Š๋„๋ก ๋ณ€๊ฒฝ

* feat: ๋ฌธ์ œ์ง‘ ๊ฒ€์ƒ‰์‹œ ๋ฌธ์ œ์ง‘ ์ด๋ฆ„๊ณผ ํƒœ๊ทธ ํ‚ค์›Œ๋“œ์˜ ๊ฒฝ์šฐ ๋Œ€์†Œ ๊ตฌ๋ถ„ํ•˜์ง€ ์•Š๋„๋ก ๋ณ€๊ฒฝ

* refactor: ์œ ์ € ์ด๋ฆ„ ์ž๋™์™„์„ฑ ์‘๋‹ต ํ•„๋“œ userName ์—์„œ name ์œผ๋กœ ๋ณ€๊ฒฝ

* etc: ๋ฐ์ดํ„ฐ๋กœ๋” ๋ฐ ๋”๋ฏธ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ

* refactor: ์œ ์ € ์ž๋™์™„์„ฑ ์‘๋‹ต ํด๋ž˜์Šค ์ด๋ฆ„ ๋ณ€๊ฒฝ

* test: ๊ฒ€์ƒ‰ ๊ด€๋ จ ๋„ํ๋จผํŠธ ํ…Œ์ŠคํŠธ ๋ฐ ์•„์Šคํ‚ค๋… ์ถ”๊ฐ€

* test: ๊ฒ€์ƒ‰ ์„œ๋น„์Šค ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€

* refactor: ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ ๋ฆฌํŒฉํ† ๋ง

* etc: ๋ถˆํ•„์š”ํ•œ ์ž„ํฌํŠธ๋ฌธ ์ œ๊ฑฐ

* etc: feature/W15-B ๋ธŒ๋žœ์น˜ ์Šค์ฟผ์‹œ ๋จธ์ง€

* feat: ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ ์ข‹์•„์š” ์ˆ˜ ์ •๋ ฌ ๊ธฐ๋Šฅ ์ถ”๊ฐ€

* test: ๊ฒ€์ƒ‰์‹œ ํ•˜ํŠธ ์ •๋ ฌ ๊ด€๋ จ ์ธ์ˆ˜ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€

* etc: DataLoader ํ•˜ํŠธ ์ •๋ณด ์ถ”๊ฐ€

* etc: ์ค‘๋ณต๋˜๋Š” ๋ฉ”์„œ๋“œ ์ œ๊ฑฐ

* refactor: ๊ฒ€์ƒ‰์–ด trim ๊ธฐ๋Šฅ ์‚ญ์ œ ๋ฐ ์œ ์ € ์ž๋™์™„์„ฑ ๊ฒฐ๊ณผ ์ˆ˜ ์ œํ•œ

* refactor: ๋ฉ”์„œ๋“œ ๋ฆฌํŒฉํ† ๋ง

* refactor: merge ํ›„ ์ •๋ฆฌ ๋ฐ Exception ๋กœ๊น… ๋ฐฉ์‹ ๋ณ€๊ฒฝ

* feat: ๊ฒ€์ƒ‰ ์š”์ฒญ http ์ •๋ณด ์ถ”๊ฐ€

Co-authored-by: seunghyun <[email protected]>

* fix: ์œ ์ € ์ด๋ฆ„ ์ค‘๋ณต ์กฐํšŒ ์˜ค๋ฅ˜๋ฅผ ์ˆ˜์ •ํ•œ๋‹ค (#370)

* fix: ์œ ์ € ์ด๋ฆ„ ์ค‘๋ณต ์กฐํšŒ ์˜ค๋ฅ˜ ์ˆ˜์ •

* fix: ํ•„์š”์—†๋Š” return ์ œ๊ฑฐ

* fix: ๊ณต์œ  ์นด๋“œ ํŽ˜์ด์ง€์˜ ํ•˜ํŠธ ๊ธฐ๋Šฅ์˜ ์˜ค์ž‘๋™์„ ์ˆ˜์ •ํ•œ๋‹ค  (#373)

* fix: ์ฒ˜์Œ ํ•˜ํŠธ ๊ฐœ์ˆ˜๊ฐ€ ์ดˆ๊ธฐํ™”๋˜๋˜ ๋ฒ„๊ทธ ์ˆ˜์ •

* etc: ๊ฐœํ–‰ ์ œ๊ฑฐ

* fix: ๊ณต์œ  ์นด๋“œ ํŽ˜์ด์ง€ ๋ฉ”์ธ ํ—ค๋”์— shadow ํ•ด์ œ (#375)

* refactor: ์Šค์ผˆ๋ ˆํ†ค UI๋ฅผ ๋ฆฌํŒฉํ† ๋งํ•œ๋‹ค (#377)

* refactor: ์Šค์ผˆ๋ ˆํ†ค์„ ์กฐ๊ธˆ ๋” ์„ธ๋ถ€์ ์œผ๋กœ ๊พธ๋ฐ€ ์ˆ˜ ์žˆ๋„๋ก ๋ณ€๊ฒฝ

* refactor: ํ—ค๋”์— ์•„์ด์ฝ˜ ๋Œ€์‹  ํ–„๋ฒ„๊ฑฐ ๋ฉ”๋‰ด ์‚ฝ์ž…

* feat: ํ”„๋กœํ•„ ํŽ˜์ด์ง€ ์Šคํฌ๋กค ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋ณ€๊ฒฝ (#381)

* etc: ํ•„์š”ํ•˜์ง€ ์•Š์€ webpack ์„ค์ • ๋ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ญ์ œ (#383)

* etc: compression-webpack-plugin ์‚ญ์ œ

* etc: cross-env ์‚ญ์ œ

* etc: react-ga ์‚ญ์ œ ๋ฐ script tag๋กœ ๋ณ€๊ฒฝ

* etc: ์ทจ์•ฝ์„ฑ ํ•ด๊ฒฐ

* etc: ์ทจ์•ฝ์„ฑ ํ•ด๊ฒฐ

* refactor: ๋น„ํšŒ์›๋„ ๊ฒ€์ƒ‰์ด ๊ฐ€๋Šฅํ•˜๋„๋ก ์ˆ˜์ •ํ•˜๊ธฐ (#386)

* fix: ๋น„ํšŒ์›์ธ ๊ฒฝ์šฐ์—๋„ Bearer์ด ๋“ค์–ด๊ฐ€๋Š” ๋ฒ„๊ทธ ์ˆ˜์ •

- ๋กœ๊ทธ์•„์›ƒ ํŽ˜์ด์ง€๋„ ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋“ค์–ด๊ฐ€๋ฉด ๋ฐ”๋กœ ์‹คํ–‰๋  ์ˆ˜ ์žˆ๋„๋ก ๋ณ€๊ฒฝ
- ํ† ํฐ์„ setํ•˜๊ณ  removeํ•˜๋Š” ๊ฒƒ์„ ๋กœ๊ทธ์ธ, ๋กœ๊ทธ์•„์›ƒ ๋ฉ”์†Œ๋“œ๊ฐ€ ๋‹ด๋‹น

* refactor: ๋น„ํšŒ์›๋„ ๊ฒ€์ƒ‰์ด ๊ฐ€๋Šฅํ•˜๋„๋ก ๋ณ€๊ฒฝ

* fix: ๋ฌธ์ œ์ง‘ ๊ฐ€์ ธ๊ฐ€๊ธฐ ์‹œ z-index ๋ฌธ์ œ ํ•ด๊ฒฐ

* fix: ๋ฌธ์ œ์ง‘ ์ˆ˜์ • ํŽ˜์ด์ง€ ํ—ค๋” shadow ์ œ๊ฑฐ

* B46 - sonarqube ์ปค๋ฒ„๋ฆฌ์ง€ ๊ธฐ์ค€์„ ์„ค์ •ํ•œ๋‹ค  (#387)

* jacoco ์ปค๋ฒ„๋ฆฌ์ง€ ๊ฒ€์ฆ task ๋ฐ ๋กฌ๋ณต ๋ฌด์‹œ ์„ค์ • ์ถ”๊ฐ€

* test: ๋ˆ„๋ฝ๋œ ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€

* test: sonarqube exclusion ์„ค์ • ์ถ”๊ฐ€

* feat: flyway ์ ์šฉ ๋ฐ ์„ค์ • ์ถ”๊ฐ€

* feat: custom ga ์ ์šฉ

* etc: ga script ์ถ”๊ฐ€

* etc: ga devserver ์„ค์ •

* refactor: active profiles ๋ฐ test yml flyway ์„ค์ • ์ถ”๊ฐ€

* etc: ์„œ๋ธŒ๋ชจ๋“ˆ ๋™๊ธฐํ™”

* etc: ddl, dml, flyway sql ์ˆ˜์ •

* etc: ํŒŒ๋น„์ฝ˜ ์ถ”๊ฐ€ ๋ฐ meta og ์†์„ฑ ์ถ”๊ฐ€ (#391)

* etc: ์†Œ๊ฐœ ๋ณ€๊ฒฝ

* refactor: ํ•ด์‹œํƒœ๊ทธ ์ˆ˜ ๋ณ€๊ฒฝ

* feat: ํƒœ๊ทธ ์ตœ๋Œ€ ๊ฐœ์ˆ˜ ์ฆ๊ฐ€ ๋ฐ sonarqube ์„ค์ • ๋ณ€๊ฒฝ (#395)

* feat: ๊ฒ€์ƒ‰ ๋กœ๋”ฉ ์• ๋‹ˆ๋ฉ”์ด์…˜ ์ˆ˜์ • (#393)

* feat: ๊ฒ€์ƒ‰์–ด ์–‘ ์˜† trim ๊ธฐ๋Šฅ ์ œ๊ฑฐ ๋ฐ ์„œ๋ธŒ๋ชจ๋“ˆ ์—…๋ฐ์ดํŠธ (#398)

* feat: ํ•˜ํŠธ ์œ„์น˜ ๋ณ€๊ฒฝ ๋ฐ ํƒœ๊ทธ ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ ์ถ”๊ฐ€ (#402)

* fix: ํ•ด์‹œํƒœ๊ทธ 20๊ธ€์ž ์ œํ•œ

* fix: LoadImage ๋งˆ์ง„ ๋ณ€๊ฒฝ

* fix: ์ œ๋ชฉ์— ์˜์–ด๋กœ width๊ฐ€ ๋„˜์–ด๊ฐˆ ๊ฒฝ์šฐ ํ™”๋ฉด์„ ๋„˜์–ด๊ฐ€๋Š” ๋ฒ„๊ทธ ์ˆ˜์ •

* refactor: selectBox์— (์œผ) ์ถ”๊ฐ€

* feat: ํ•˜ํŠธ ์œ„์น˜ ๋ณ€๊ฒฝ ๋ฐ ์Šคํƒ€์ผ ๋ณ€๊ฒฝ, ํƒœ๊ทธ ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ ์ถ”๊ฐ€

- ํƒœ๊ทธ inline-block์œผ๋กœ ๋ณ€๊ฒฝ(์ž์‹์˜ ๋†’์ด๋ฅผ ๊ทธ๋Œ€๋กœ ๊ฐ€์ง€๊ธฐ ์œ„ํ•จ)
- ํƒœ๊ทธ ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ ์ถ”๊ฐ€

* fix: ํ•ด์‹œํƒœ๊ทธ ๋ฉ”์‹œ์ง€ ๋‚ด์šฉ ์ˆ˜์ •

* E01 - ์—๋Ÿฌ๋ฅผ ์ฝ”๋“œ๋กœ ๊ด€๋ฆฌํ•œ๋‹ค. (#378)

* feat: ErrorType ์ƒ์„ฑ, ์ƒ์œ„ ์˜ˆ์™ธ ์ƒ์„ฑ

* feat: ์ค‘๊ฐ„ ๊ณ„์ธต ์˜ˆ์™ธ ์ถ”๊ฐ€, ์ถ”ํ›„์— Botobo prefix ์‚ญ์ œ์˜ˆ์ •

* feat: ErrorResponse ์ˆ˜์ •, ControllerAdvice ์ˆ˜์ •

* feat: Request message๋ฅผ ์—๋Ÿฌ์ฝ”๋“œ๋กœ ์ˆ˜์ •

* feat: ์ปค์Šคํ…€ ์˜ˆ์™ธ ์ˆ˜์ •, ์‚ญ์ œ, ์ ์šฉ

* test: ๋ฌธ์ œ์ง‘ ๊ด€๋ จ ์ˆ˜์ •๋œ ์ฝ”๋“œ ํ…Œ์ŠคํŠธ์—๋„ ๋ฐ˜์˜

* feat: ์ธ์ฆ, ์œ ์ € ๊ด€๋ จ ์˜ˆ์™ธ ์ถ”๊ฐ€, ํ† ํฐ ๋งŒ๋ฃŒ ์˜ˆ์™ธ ์ถ”๊ฐ€

* feat: ๋ฌธ์ œ์ง‘ ์ˆ˜์ • ๊ด€๋ จ ErrorType  ์ถ”๊ฐ€

* feat: Card ๊ด€๋ จ Request ๋ฉ”์‹œ์ง€ ์ฝ”๋“œ๋กœ ์ˆ˜์ •, ์˜ˆ์™ธ ์ถ”๊ฐ€

* feat: ํ€ด์ฆˆ ๊ด€๋ จ ์˜ˆ์™ธ ์ฝ”๋“œ ์ถ”๊ฐ€

* etc: ๊ฒ€์ƒ‰ ๊ด€๋ จ ์ฝ”๋“œ ์‚ญ์ œ

* feat: Auth, User ๊ด€๋ จ ์ฝ”๋“œ ์ถ”๊ฐ€

* feat: ๊ด€๋ฆฌ์ž Request ๊ด€๋ จ code ์ถ”๊ฐ€

* feat: ๋„๋ฉ”์ธ ๊ด€๋ จ ์—๋Ÿฌ Internal Error ๊ณ„์ธต ๊ด€๊ณ„ ์ถ”๊ฐ€

* test: ์‹คํŒจํ•˜๋Š” ํ…Œ์ŠคํŠธ ์ˆ˜์ •

* etc: ๊ธฐ์กด common์˜ ์˜ˆ์™ธ๋ฅผ ์ง€์šฐ๊ณ , botobo http ์˜ˆ์™ธ๋กœ ์ˆ˜์ •

* etc: import ๋ฌธ ์ •๋ฆฌ

* etc: DisplayName์— ์„ฑ๊ณต, ์‹คํŒจ ๋น ์ง„ ํ…Œ์ŠคํŠธ์— ์ถ”๊ฐ€

* feat: ์œ ์ € ์ˆ˜์ •, ๋‹‰๋„ค์ž„ ์ฒดํฌ ๊ด€๋ จ ErrorType ์ถ”๊ฐ€

* test: ErrorType ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€

* feat: ๊ฒ€์ƒ‰ ๊ด€๋ จ ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ErrorType ์ถ”๊ฐ€ ๋ฐ Controller Advice ์ˆ˜์ •

* feat: Controller Advice์˜ ๋กœ๊ทธ ๋ฉ”์‹œ์ง€ ์ •๋ฆฌ

* feat: InternalServerError ๋ถ€๋ถ„ ๋กœ๊ทธ ๋ฉ”์„ธ์ง€ ์ˆ˜์ •

* fix: ํ† ํฐ ๋งŒ๋ฃŒ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๋„๋ก ์ˆ˜์ •

* fix: ๋ณ‘ํ•ฉ ๊ณผ์ •์—์„œ ๋ฐœ์ƒํ•œ ์‹คํŒจํ•˜๋Š” ํ…Œ์ŠคํŠธ ์ˆ˜์ •

* refactor: ์ „์ฒด ๋ฉ”์‹œ์ง€ ์ˆ˜์ • ๋ฐ ํผ ๋นˆ๊ฐ’ ์ž…๋ ฅ ์‹œ ์—๋Ÿฌ ๋ฉ”์‹œ์ง€๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค (#404)

* etc: FormProvider์—์„œ ๋นˆ๊ฐ’์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ ๊ตฌํ˜„

* etc: ๋ฉ”์‹œ์ง€ ๋‰˜์•™์Šค ์ˆ˜์ • (~ํ•ฉ๋‹ˆ๋‹ค -> ~์š”)

* etc: ๋นˆ๊ฐ’ ์ฒ˜๋ฆฌ ์กฐ๊ฑด๋ฌธ ์ˆ˜์ •

* etc: return ๋ฌธ ์ถ”๊ฐ€

* refactor: api ๋ ˆ์ด์–ด ์ •๋ฆฌ (#406)

* etc: ๋ฌธ์ œ์ง‘ ๊ฐ€์ ธ๊ฐ€๊ธฐ ๋ชจ๋‹ฌ ๊ธฐ๋ณธ๊ฐ’ ์„ค์ • (#408)

* feat: ๋กœ๋”ฉ ์Šคํ”ผ๋„ˆ ๋งŒ๋“ค๊ธฐ (#410)

* feat: ๋กœ๋”ฉ ์Šคํ”ผ๋„ˆ ๊ตฌํ˜„

* refactor: ๋กœ๋”ฉ ์Šคํ”ผ๋„ˆ ์ ์šฉ ๋ฐ ํ•„์š”ํ•˜์ง€ ์•Š์€ ๊ตฌ๋ฌธ ์‚ญ์ œ

- isLastItem์ด ํ•„์š”ํ•˜์ง€ ์•Š์•˜์Œ -> ํ•ญ์ƒ ์˜ต์ €๋ฒ„ ํ›„์—๋Š” ์˜ต์ €๋ฒ„๋ฅผ ํ•ด์ œํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ

* refactor: ์˜ˆ์™ธ์ฒ˜๋ฆฌ๋ฅผ ์ˆ˜์ •ํ•œ๋‹ค (#389)

* refactor: ์˜ˆ์™ธ์ฒ˜๋ฆฌ ๋ฐฉ์‹ ๋ณ€๊ฒฝ

Co-authored-by: dudtjr913 <[email protected]>

* refactor: ์˜ˆ์™ธ์ฒ˜๋ฆฌ ์ˆ˜์ •

Co-authored-by: dudtjr913 <[email protected]>

* B43 - ์ธ์ˆ˜ํ…Œ์ŠคํŠธ ๋ฆฌํŒฉํ† ๋ง (#396)

* feat: dirties context ์ œ๊ฑฐ ๋ฐ db cleaner ๊ฐ์ฒด ์ถ”๊ฐ€

* refactor: ์ธ์ˆ˜ํ…Œ์ŠคํŠธ ๋ฆฌํŒฉํ† ๋ง

* U14 - ์ด๋ฏธ์ง€ ์ˆ˜์ •/์‚ญ์ œ ์‹œ ๊ธฐ์กด์— ๋“ฑ๋ก๋œ ์ด๋ฏธ์ง€๋ฅผ s3์—์„œ ์‚ญ์ œํ•œ๋‹ค.  (#409)

* feat: S3 ํŒŒ์ผ ์—…๋กœ๋“œ ์‹œ ๊ธฐ์กด ํŒŒ์ผ์ด default๊ฐ€ ์•„๋‹ˆ๋ฉด ์ œ๊ฑฐํ•˜๋Š” ๊ธฐ๋Šฅ ๊ตฌํ˜„

* refactor: user update ์‹คํŒจ ์‹œ ์ด์ „ ์‚ฌ์ง„์ด ์‚ญ์ œ๋˜์ง€ ์•Š๋„๋ก ์ˆ˜์ •

* etc: ์ฝ”๋“œ ์ •๋ฆฌ

* fix: ImageExtensionException์„ BADREQUEST๋กœ ์ˆ˜์ •

* feat: ๋ฐ˜์‘ํ˜• ๊ตฌํ˜„ (#413)

Co-authored-by: Kyle <[email protected]>

* refactor: ๋ฐ˜์‘ํ˜•์„ ๊ตฌํ˜„ํ•œ๋‹ค (#416)

* refactor: ๋ฐ˜์‘ํ˜• ๊ตฌํ˜„

* refactor: ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ ์—†์„ ๋•Œ ์•Œ๋ฆผ ํ‘œ์‹œ

Co-authored-by: dudtjr913 <[email protected]>

Co-authored-by: dudtjr913 <[email protected]>

* fix: ๋น„ํšŒ์› ๊ธฐ๋Šฅ์—์„œ ์œ ํšจํ•˜์ง€ ์•Š์€ ํ† ํฐ ๊ด€๋ จ ์—๋ ค ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ถœ๋ ฅํ•˜๋„๋ก ์ˆ˜์ •

* feat: ๊ฒ€์ƒ‰ ์ฐฝ ๋ฏธ๋””์–ด ์ฟผ๋ฆฌ ์ ์šฉ

Co-authored-by: Kyle <[email protected]>

* feat: ์„ธ๋กœ ํ™€์ˆ˜ px์ธ ๋ชจ๋ฐ”์ผ์— ๋งž์ถฐ width ํฌ๊ธฐ 1% ์ถ”๊ฐ€

Co-authored-by: Kyle <[email protected]>

* B50 - ๋ฌธ์„œํ™” ํ…Œ์ŠคํŠธ ๋ฆฌํŒฉํ„ฐ๋ง (#415)

* etc: ์—๋Ÿฌ์ฝ”๋“œ ๊ด€๋ จ adoc ์ถ”๊ฐ€

* test: ์ „์ฒด์ ์œผ๋กœ ๋ฌธ์„œํ™” ํ…Œ์ŠคํŠธ ๋ฆฌํŒฉํ„ฐ๋ง
- ๋ชจ๋“  ํ…Œ์ŠคํŠธ any(xxxx.class)๋กœ ๊ท ์ผํ•˜๊ฒŒ ๋ณ€๊ฒฝ
- ๋ฆฌ์กธ๋ฒ„ ํ…Œ์ŠคํŠธ ๊ด€๋ จ ์ˆ˜์ •
- ์‹คํŒจํ•˜๋Š” ํ…Œ์ŠคํŠธ ์‚ญ์ œ
- ์ƒ์„ฑ๋œ ๋ฌธ์„œ์™€ ํ™•์ธํ•˜์—ฌ ๋น ์ง„ ํ•„๋“œ, ์‘๋‹ต ์—†๋Š” ๋ถ€๋ถ„ ์ฒดํฌ

* etc: ๋ฒ„์ „ 1.0.0์œผ๋กœ ๋ณ€๊ฒฝ ๋ฐ ga main์œผ๋กœ ์ ์šฉ

Co-authored-by: Kyle <[email protected]>

* fix: ๋™์ผํ•œ ์ด๋ฏธ์ง€ ์—…๋กœ๋“œ ์˜ค๋ฅ˜ ์ˆ˜์ •

* etc: textarea resize ์ด๋ฒคํŠธ ์ œ๊ฑฐ

* etc: Guest Quiz์—์„œ ํ’€์–ด๋ณธ ํšŸ์ˆ˜ ํ‘œ์‹œ ํ•˜์ง€ ์•Š๊ฒŒ ์ˆ˜์ •

* etc: textAreaHeight ์ƒํƒœ ๋ณ€์ˆ˜๋กœ ๊ณ ์ •

* fix: ์Šคํฌ๋กค ๋ฒ„๊ทธ ์ˆ˜์ •

* etc: BotoboException ๊ด€๋ จ ๋กœ๊ทธ์— ๋ฉ”์‹œ์ง€ ๋‚˜์˜ค๋„๋ก ๋ณ€๊ฒฝ

* docs: README ์ž‘์„ฑ

* etc: submodule ๋™๊ธฐํ™”

* feat: ๊ฒ€์ƒ‰ ํŽ˜์ด์ง€์˜ ๋ฌธ์ œ์ง‘, ํƒœ๊ทธ, ์ž‘์„ฑ์ž UI๋ฅผ ์‚ญ์ œํ•œ๋‹ค (#446)

* refactor: PublicSearchPage UI ๋ณ€๊ฒฝ

* etc: SearchInput ๋งˆ์ง„๊ฐ’ ์กฐ์ •

* feat: ๊ฒ€์ƒ‰ ์ƒ์„ธ ํŽ˜์ด์ง€์—์„œ ์ž‘์„ฑ์ž ์ˆœ, ํƒœ๊ทธ ์ˆœ UI๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค (#447)

* feat: ์ž‘์„ฑ์ž, ํƒœ๊ทธ ํ•„ํ„ฐ๋ง ์ถ”๊ฐ€

* feat: ์ดˆ๊ธฐํ™” UI ๋ฐ ๊ธฐ๋Šฅ ์ถ”๊ฐ€

* etc: submodule ๋™๊ธฐํ™”

* S01 - ์ถ”์ฒœ ํƒœ๊ทธ API ๊ตฌํ˜„  (#451)

* feat: ๊ธฐ์กด์˜ ํƒœ๊ทธ ๊ฒ€์ƒ‰์„ ์ถ”์ฒœ ํƒœ๊ทธ๋กœ ๋ณ€๊ฒฝํ•˜๊ณ  ํ…Œ์ŠคํŠธํ•œ๋‹ค.

* etc: adoc ํ‘œ ํ•œ์ค„ ์ถ”๊ฐ€

* feat: ํ”ผ์ผ€์ด ๋ฆฌ๋ทฐ ๋ฐ˜์˜ ๋ฐ ๋ฌธ์ž์—ด ์œ ์‚ฌ๋„ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ถ”๊ฐ€

* fix: ์ž˜๋ชป๋œ ์ธ์ž ์ˆ˜์ •

* feat: ์ค‘๊ฐ„๊ณฐ ๋ฆฌ๋ทฐ ๋ฐ˜์˜, ์Šค์ฝ”์–ด๊ฐ€ ๋™์ผํ•  ๊ฒฝ์šฐ ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌ ์ถ”๊ฐ€

* etc: ์˜คํƒ€ ์ˆ˜์ •

* fix/S01: SearchRelated ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€ (#455)

* test: SearchRelated ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€

* test: SearchRelated#create ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€

* W01 - ๋‹ค์–‘ํ•œ ๋ฌธ์ œ์ง‘ ๋ณด๋Ÿฌ๊ฐ€๊ธฐ API ๊ตฌํ˜„  (#448)

* feat&test: ๋‹ค์–‘ํ•œ ๋ฌธ์ œ์ง‘ ๋ณด๋Ÿฌ๊ฐ€๊ธฐ API ๊ตฌํ˜„ ๋ฐ ํ…Œ์ŠคํŠธ

* etc: ์„œ๋ธŒ๋ชจ๋“ˆ ๋™๊ธฐํ™”

* feat: AuthenticationPrincipalConfg#authPathMatcherInterceptor์— public ์ œ์™ธ

* etc: getPublicWorkbookAsync -> getSearchResultAsync

* feat: PublicSearchPage ์ง„์ž… ์‹œ ๋‹ค์–‘ํ•œ ๋ฌธ์ œ์ง‘ ๋ณด์—ฌ์ฃผ๊ธฐ

* etc: dev, prod profile์— ๋”ฐ๋ผ query log ์„ค์ • ๋ณ€๊ฒฝ

Co-authored-by: imgwang-yeol <[email protected]>
Co-authored-by: DESKTOP-VDP6SAT\xntm3 <[email protected]>

* feat: ๊ฒ€์ƒ‰ ํŽ˜์ด์ง€์—์„œ ์ดˆ๊ธฐ ๋ฌธ์ œ์ง‘ 100๊ฐœ๋ฅผ ๋ณด์—ฌ์ค€๋‹ค (#453)

* etc: getPublicWorkbookAsync -> getSearchResultAsync

* feat: PublicSearchPage ์ง„์ž… ์‹œ ๋‹ค์–‘ํ•œ ๋ฌธ์ œ์ง‘ ๋ณด์—ฌ์ฃผ๊ธฐ

* refactor: publicWorkbooks ์ง€์—ญ ์ƒํƒœ๋กœ ๋ณ€๊ฒฝ

* refactor: Intersection Observer ์˜์กด์„ฑ ๋ณ€๊ฒฝ

* refactor: isLoading ์ดˆ๊ธฐ ์ƒํƒœ ๋ณ€๊ฒฝ

* feat: ๊ฒ€์ƒ‰ ์ƒ์„ธ ํŽ˜์ด์ง€์—์„œ ๋ฐ”ํ…€ ๋ชจ๋‹ฌ์„ ์ถ”๊ฐ€ํ•œ๋‹ค(ํƒœ๊ทธ, ์ž‘์„ฑ์ž ํ•„ํ„ฐ๋ง) (#454)

* feat: ๊ฒ€์ƒ‰ ํ•„ํ„ฐ๋ง ๋ฐ”ํ…€ ๋ชจ๋‹ฌ UI ๊ตฌํ˜„

* fix: ๋ชจ๋‹ฌ open ํ•  ๋•Œ body๊ฐ€ ์Šคํฌ๋กค๋˜๋Š” ๋ฒ„๊ทธ ํ•ด๊ฒฐ

* refactor: ํ•„ํ„ฐ๋ง ์Šคํ‹ฐํ‚ค ์ ์šฉ

* refactor: isMobile ํ•จ์ˆ˜ ๋ฆฌํŒฉํ† ๋ง

- userAgent๋ฅผ ํ™œ์šฉํ•ด์„œ ๋ชจ๋ฐ”์ผ๊ณผ ํƒœ๋ธ”๋ฆฟ์„ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•จ
- platform์€ deprecated๋œ ๊ฒƒ์ด์—ˆ์Œ

* refactor: ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ ํŽ˜์ด์ง€ ๋กœ๋”๋ธ” ๋ฆฌํŒฉํ† ๋ง

* refactor: Mac OS => Macintosh๋กœ ๋ณ€๊ฒฝ

* refactor: ํ™•์ธ ๋ฒ„ํŠผ์„ ๋ˆŒ๋ €์„ ๋•Œ ๋ฐ˜์˜๋˜๋„๋ก ๋ณ€๊ฒฝ

- ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ์š”์ฒญํ•ด ๋ฐ›์•„์˜ค๋Š” ๋ฐ์ดํ„ฐ(ํƒœ๊ทธ, ์ž‘์„ฑ์ž)๋ฅผ ์–ธ์ œ ๋ฐ›์•„์˜ฌ์ง€ ๊ณ ๋ฏผ ์ค‘

* feat: ํƒœ๊ทธ, ์ž‘์„ฑ์ž UI ๋ฐ ํด๋ฆญ ์‹œ ์‚ญ์ œ๋˜๋„๋ก ๊ตฌํ˜„

* refactor: ์ดˆ๊ธฐ ํ•„ํ„ฐ๋ง ๋ฐ์ดํ„ฐ ์„ธํŒ…์„ ํŽ˜์ด์ง€๊ฐ€ ๋‹ด๋‹นํ•˜๋„๋ก ๋ณ€๊ฒฝ

* refactor: data => values๋กœ ์ด๋ฆ„ ๋ณ€๊ฒฝ

* refactor: interface, type ๋ถ„๋ฆฌ

* fix: axios upgrade

* feat: ๊ฒ€์ƒ‰ ํŽ˜์ด์ง€์—์„œ ์ถ”์ฒœ ๊ฒ€์ƒ‰์–ด ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•œ๋‹ค (#457)

* etc: Error unknown ํƒ€์ž… ๊ฐ€๋“œ ์ถ”๊ฐ€

* feat: ๊ฒ€์ƒ‰ ํŽ˜์ด์ง€ ์ž๋™์™„์„ฑ, ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ ์ถ”๊ฐ€

* refactor: ๋ฆฌ๋ทฐ ํ”ผ๋“œ๋ฐฑ ๋ฐ˜์˜

* refactor: width => scale๋กœ ๋ณ€๊ฒฝ

* fix: useEffect cleanup function ์„ ์–ธ

Co-authored-by: dudtjr913 <[email protected]>

* etc: ๊ฐ€์ด๋“œ ์ˆ˜์ • (#458)

* T01- (ํ•„ํ„ฐ) ๊ฒ€์ƒ‰์–ด์— ํ•ด๋‹นํ•˜๋Š” ๋ฌธ์ œ์ง‘์— ๋“ฑ๋ก๋œ ๋ชจ๋“  ํƒœ๊ทธ๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค. (#456)

* feat: ํ•„ํ„ฐ ํƒœ๊ทธ ๊ธฐ๋Šฅ ์ผ๋ถ€ ๊ตฌํ˜„

* feat: ํ•„ํ„ฐ ํƒœ๊ทธ ๊ธฐ๋Šฅ ์ผ๋ถ€ ๊ตฌํ˜„

* feat&test: ํƒœ๊ทธ ๊ธฐ๋Šฅ ๊ตฌํ˜„ ๋ฐ ํ…Œ์ŠคํŠธ

* fix: AdminWorkbookRequest#opened ๊ธฐ๋ณธ๊ฐ’ true๋กœ ์ง€์ •

* refactor: ์ฝ”๋“œ ๋ฆฌ๋ทฐ ๋ฐ˜์˜

* refactor: WorkbookName -> FilterCriteria๋กœ ํด๋ž˜์Šค๋ช… ๋ณ€๊ฒฝ

* etc: TODO ์‚ญ์ œ

* U01 - (ํ•„ํ„ฐ) ๊ฒ€์ƒ‰์–ด์— ํ•ด๋‹นํ•˜๋Š” ๋ฌธ์ œ์ง‘์˜ ์ž‘์„ฑ์ž๋ฅผ ๋ชจ๋‘ ๊ฐ€์ ธ์˜จ๋‹ค. (#463)

* feat: ๋ฌธ์ œ์ง‘๋ช…์ด ํฌํ•จ๋œ ๋ฌธ์ œ์ง‘์˜ ์œ ์ € ๊ฐ€์ ธ์˜ค๋Š” ๊ธฐ๋Šฅ ๊ตฌํ˜„

* test: UserRepositoryTest#findAllByContainsWorkbookName ํ…Œ์ŠคํŠธ ๊ตฌํ˜„

* test: ์ธ์ˆ˜ ํ…Œ์ŠคํŠธ ๋ฐ Service ํ…Œ์ŠคํŠธ ๊ตฌํ˜„

* feat&test: UserFilterResponse๋กœ ๋ณ€๊ฒฝ ๋ฐ ๋ฌธ์„œํ™” ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€

* refactor: Repository ๋ถˆํ•„์š”ํ•œ ์กฐ๊ฑด์ ˆ ์ œ๊ฑฐ ๋ฐ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ํ•จ์ˆ˜ ์ œ๊ฑฐ

* refactor: DomainAcceptanceTest#์„œ๋กœ_๋‹ค๋ฅธ_์œ ์ €์˜_์—ฌ๋Ÿฌ๊ฐœ_๋ฌธ์ œ์ง‘_์ƒ์„ฑ_์š”์ฒญ์˜ ์ธ์ž๋กœ Users ๋ฐฐ์—ด ๋ฐ›๋„๋ก ๋ณ€๊ฒฝ

* refactor: Test์—์„œ stream ๋Œ€์‹  extracting ์‚ฌ์šฉํ•˜๋„๋ก ๋ณ€๊ฒฝ

* refactor: fixture ์œ ์ €์— id, role, SocialType ๋ถ€์—ฌ

* refactor: index.adoc์— tags.adoc ์ถ”๊ฐ€

* refactor: ๋ฌธ์„œํ™” ํ…Œ์ŠคํŠธ ์„œ๋กœ ๋‹ค๋ฅธ ์œ ์ €์˜ ๊ฒฝ์šฐ ๋‹ค๋ฅธ ์•„์ด๋”” ๋ถ€์—ฌ

* fix: DomainAcceptanceTest#์„œ๋กœ_๋‹ค๋ฅธ_์œ ์ €์˜_์—ฌ๋Ÿฌ๊ฐœ_๋ฌธ์ œ์ง‘_์ƒ์„ฑ_์š”์ฒญ์—์„œ i++ ์ถ”๊ฐ€

* refactor: ์–ด๋“œ๋ฏผ์ธ ๊ฒฝ์šฐ ๋ช…์นญ์—์„œ ๊ด€๋ฆฌ์ž์ž„์ด ๋“œ๋Ÿฌ๋‚˜๋„๋ก ์ˆ˜์ •

* refactor: Workbook#createBy, Workbook#taggedBy๋ฅผ ๋ชจ๋‘ setter๋กœ ๋ณ€๊ฒฝ

* etc: ์ฝ”๋“œ ์ •๋ฆฌ

* fix: UserFilterResponse#userName -> name์œผ๋กœ ๋ณ€๊ฒฝ (#466)

* feat: ๊ฒ€์ƒ‰ ์ƒ์„ธ ํŽ˜์ด์ง€์—์„œ ์ž‘์„ฑ์ž, ํƒœ๊ทธ ์ˆœ ํ•„ํ„ฐ๋ง ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•œ๋‹ค. (#460)

* feat: ํƒœ๊ทธ/์ž‘์„ฑ์ž ํ•„ํ„ฐ๋ง ์ •๊ทœํ‘œํ˜„์‹์œผ๋กœ ๊ตฌํ˜„

- ์ตœ์‹  ์ŠคํŽ™์ธ replaceAll์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด lib์— ESNest ์ถ”๊ฐ€, DOM์€ window๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ํ•„์š”

* feat: ํƒœ๊ทธ/์ž‘์„ฑ์ž api๋กœ ๋ถˆ๋Ÿฌ์˜ค๋„๋ก ๊ตฌํ˜„

* refactor: authors => users ๋ณ€๊ฒฝ

* refactor: api ๋ณ€๋™์œผ๋กœ ์ธํ•œ type ์‚ญ์ œ ๋ฐ tags, users ์ถ”๊ฐ€

* refactor: ModalProvider์—์„œ router ๊ธฐ๋Šฅ ์‚ฌ์šฉํ•˜๋„๋ก ๋ณ€๊ฒฝ

* fix: ์ž…๋ ฅ๋˜์ง€ ์•Š์€ & ์ถ”๊ฐ€

* feat: ํ•„ํ„ฐ๋ง ์‹œ ํ•ด๋‹น ๋ฌธ์ œ์ง‘ ๊ฒ€์ƒ‰ํ•˜๋„๋ก ๊ตฌํ˜„

- ๋‹ค์ค‘ ํ•„ํ„ฐ๋ง์˜ ํƒœ๊ทธ์™€ ์ž‘์„ฑ์ž๋ฅผ type๊ณผ name์œผ๋กœ ๊ตฌ๋ถ„

* refactor: ์ดˆ๊ธฐํ™” ๋ฒ„ํŠผ ํด๋ฆญ์‹œ query๋„ ์ดˆ๊ธฐํ™”๋˜๋„๋ก ๋ณ€๊ฒฝ

* feat: ํ•„ํ„ฐ๋ง ์‚ญ์ œ์‹œ ๋ฐ์ดํ„ฐ ์กฐํšŒ ๊ธฐ๋Šฅ ์ถ”๊ฐ€

* refactor: usePublicSearch ์ด๋ฆ„ ๋ณ€๊ฒฝ

* refactor: ์Šค์ผˆ๋ ˆํ†ค์ด ์Šคํฌ๋กค์„ ํ•˜์ง€ ์•Š๋„๋ก ๋ณ€๊ฒฝ

* refactor: ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๊ฐ€ ์—†์„ ๋•Œ์˜ UI ๋ณ€๊ฒฝ

* feat: ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ ์ „์—ญ ์ƒํƒœ๋กœ ๋ณ€๊ฒฝ ๋ฐ ์ดˆ๊ธฐ ๋กœ๋”ฉ์‹œ์—๋งŒ ์Šค์ผˆ๋ ˆํ†ค ์ถœ๋ ฅ

* refactor: startIndex๋ฅผ atom์œผ๋กœ ๊ด€๋ฆฌ

* refactor: ๊ฒ€์ƒ‰ ์ƒ์„ธ ํŽ˜์ด์ง€์˜ ์ดˆ๊ธฐ๊ฐ’์„ atom์—์„œ ๊ด€๋ฆฌํ•˜๋„๋ก ๋ณ€๊ฒฝ

* fix: replaceAll => replace ๋ณ€๊ฒฝ

* refactor: ์„œ๋น„์Šค ๋กœ์ง ํ›…์œผ๋กœ ์ด๋™

* fix: ๋น ๋ฅด๊ฒŒ ํ•„ํ„ฐ๋ง์‹œ key๋กœ ์ธํ•ด ์ด์ „ element๋ฅผ ์ฐธ์กฐํ•˜๋Š” ๋ฒ„๊ทธ ํ•ด๊ฒฐ

* refactor: singleFilter atom์œผ๋กœ ์ด๋™ ๋ฐ ํ•„ํ„ฐ๋ง scrollIntoView ์ ์šฉ

* feat: ๊ฒ€์ƒ‰ ์‹คํŒจ์‹œ ์Šค๋‚ต๋ฐ” ๊ตฌํ˜„

* refactor: ๋‹ค์ค‘ ํ•„ํ„ฐ๋ง์ด ์žˆ์„ ๋•Œ ๋Œ์•„๊ฐ€๊ธฐ ๋ฒ„ํŠผ ์‚ญ์ œ

* etc: ๊ฒ€์ƒ‰ api ๋‚˜์˜ค๊ธฐ ์ด์ „์— ๊ฒ€์ƒ‰ ๋˜๋„๋ก ์ž„์‹œ ์„ค์ •

* refactor: api ํ•จ์ˆ˜ ๋ช… ๋ณ€๊ฒฝ

* refactor: type๋ช… ๋‹จ์ˆ˜๋กœ ๋ณ€๊ฒฝ

* refactor: type์„ returnType ๋ช…์œผ๋กœ ๋ณ€๊ฒฝ

* refactor: ๋กœ์ง์„ ํ•จ์ˆ˜๋กœ ๋ณ€๊ฒฝ

* fix: ๋ชจ๋‹ฌ ์˜คํ”ˆ ์‹œ ์Šคํฌ๋กค ์ด์Šˆ ํ•ด๊ฒฐ

* fix: criteria๊ฐ€ ์ดˆ๊ธฐํ™”๋˜๋Š” ๋ฒ„๊ทธ ์ˆ˜์ •

* refactor: tags, users ๋ถ„๋ฆฌ

* fix: ๋ชจ๋‹ฌ ์˜คํ”ˆ ์‹œ ์Šคํฌ๋กค ์ด์Šˆ re ํ•ด๊ฒฐ

* feat: ์ž‘์„ฑ์ž, ํƒœ๊ทธ ์š”์ฒญ์ด ์‹คํŒจํ–ˆ์„ ๋•Œ ๋ชจ๋‹ฌ์—์„œ ๋‹ค์‹œ ์š”์ฒญ ๋ณด๋‚ด๋„๋ก ๊ตฌํ˜„

* refactor: ๊ฒ€์ƒ‰ ์ƒ์ œ ํŽ˜์ด์ง€ ์ƒํƒœ atom์œผ๋กœ ๋‹ค์‹œ ์ด์ „

* feat: ๊ฒฐ๊ณผ๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ ๋ฒ„ํŠผ disableํ•˜๋„๋ก ์„ค์ •

* refactor: ๋ณ€๊ฒฝ๋œ ๊ฒ€์ƒ‰ api๋กœ ๋ณ€๊ฒฝ

* refactor: isNew => isReset์œผ๋กœ ๋ณ€๊ฒฝ

* feat: ํ•„ํ„ฐ๋ง์ด ๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ๋‹ค์‹œ ๋กœ๋”ฉ์„ ํ•˜์ง€ ์•Š๋„๋ก ๋ณ€๊ฒฝ

* feat: ssr์„ ์ ์šฉํ•œ๋‹ค.(๋ฉ”์ธํŽ˜์ด์ง€)  (#468)

* feat: ssr ๊ตฌํ˜„

Co-authored-by: Kyle <[email protected]>

* feat: ssr ๊ตฌํ˜„ - 2

Co-authored-by: dudtjr913 <[email protected]>

* feat: ssr ์ ์šฉ

* chore: package.json, yarn.lock copy

* chore: yarn.lock ์ œ๊ฑฐ

* fix: ๊ฒฝ๋กœ ์ˆ˜์ •

* etc: ํ…Œ์ŠคํŠธ

* etc: ํ…Œ์ŠคํŠธ ์™„๋ฃŒ

* fix: split์— undefined๊ฐ€ ์˜ฌ ์ˆ˜ ์žˆ๋Š” ๋ฒ„๊ทธ ์ˆ˜์ •

* feat: ์—๋Ÿฌ ์ฒ˜๋ฆฌ ์ถ”๊ฐ€ ๋ฐ ํ—ค๋” ์บ์‹œ ์„ค์ •

* fix: ๋กœ๊ทธ์•„์›ƒ ์‹œ ๋ฌธ์ œ์ง‘ ์‚ญ์ œํ•˜๋„๋ก ๋ณ€๊ฒฝ

* etc: ํ…Œ์ŠคํŠธ

* etc: ํ…Œ์ŠคํŠธ

* fix: ์ฟ ํ‚ค๊ฐ€ ์‚ฌ๋ผ์ง€์ง€ ์•Š๋Š” ๋ฒ„๊ทธ ํ•ด๊ฒฐ

Co-authored-by: Kyle <[email protected]>
Co-authored-by: dudtjr913 <[email protected]>

* fix: ๊ฒ€์ƒ‰์–ด ์ž…๋ ฅ ์‹œ ์ž๋™์™„์„ฑ ์˜ค๋ฅ˜ ์ˆ˜์ • (#470)

* S02 - ๋ณ€๊ฒฝ๋œ ๊ฒ€์ƒ‰ API์— ๋งž๊ฒŒ ๊ธฐ๋Šฅ ๊ตฌํ˜„ํ•œ๋‹ค. (#464)

* feat: ๋ณ€๊ฒฝ๋œ ๊ฒ€์ƒ‰ api์— ๋งž๊ฒŒ ์ฝ”๋“œ ์ˆ˜์ • ๋ฐ QueryDSL ์ ์šฉ

* refactor: ๊ฒ€์ƒ‰ ๊ด€๋ จ ํ…Œ์ŠคํŠธ ๋ณ€๊ฒฝ๋œ api์— ๋งž๊ฒŒ ๋ฆฌํŒฉํ† ๋ง

* docs: ๊ฒ€์ƒ‰ api ํ‘œ ์ˆ˜์ •

* refactor: ํ•„์š”์—†๋Š” ์ฝ”๋“œ ์‚ญ์ œ ๋ฐ ๋ฉ”์„œ๋“œ ์ˆ˜์ •

* refactor: ํ”ผ๋“œ๋ฐฑ ๋ฐ˜์˜

* test: WorkbookSearchRepositoryTest ์ถ”๊ฐ€

* refactor: ํ…Œ์ŠคํŠธ ํ”ผ๋“œ๋ฐฑ ๋ฐ˜์˜

* etc: Qํด๋ž˜์Šค๋ฅผ ํ…Œ์ŠคํŠธ ์ปค๋ฒ„๋ฆฌ์ง€์—์„œ ์ œ์™ธ์‹œํ‚ค๋„๋ก ์„ค์ •

* refactor: SearchAcceptanceTest ์ฝ”๋“œ ์ˆ˜์ •

* feat: ํ˜„์žฌ ์‚ฌ์šฉ ์ค‘์ธ profile ์ •๋ณด ํ™•์ธํ•˜๋Š” api ์ƒ์„ฑ (#473)

* feat: health check ์œ„ํ•œ api ์ƒ์„ฑ (#475)

* fix: infra ๊ด€๋ จ api ํ† ํฐ ์—†์ด ์‚ฌ์šฉํ•˜๋„๋ก ์ˆ˜์ • (#476)

* fix: jar ๋นŒ๋“œ์‹œ ์˜ฌ๋ฐ”๋ฅธ ์„ค์ •ํŒŒ์ผ ์„œ๋ธŒ๋ชจ๋“ˆ๋กœ๋ถ€ํ„ฐ ๋ณต์‚ฌ (#477)

* etc: ๋กœ๊น… ํŒŒ์ผ ๋‚ด ํ”„๋กœํ•„ ์ด๋ฆ„ ๋ณ€๊ฒฝ (#478)

* feat: ๋ฌธ์ œ์ง‘ ๊ฒ€์ƒ‰ ์‹œ ์ดˆ๊ธฐํ™”๊ฐ€ ๋˜์ง€ ์•Š๋Š” ๋ฒ„๊ทธ ์ˆ˜์ • (#472)

* fix: ๊ฒ€์ƒ‰ ์‹œ ์ด์ „ ๋ฐ์ดํ„ฐ๊ฐ€ ๋‚จ์•„์žˆ๋Š” ๋ฒ„๊ทธ ์ˆ˜์ •

* fix: ์ดˆ๊ธฐ ์š”์ฒญ์„ 2๋ฒˆ ๋ณด๋‚ด๋Š” ๋ฒ„๊ทธ ์ˆ˜์ •

- ์ตœ๋Œ€ ์š”์ฒญ ์ˆ˜๋Ÿ‰๋ณด๋‹ค ์ ๊ฒŒ ๋ฐ›์•˜์„ ๋•Œ ์š”์ฒญ์„ ๋ณด๋‚ด์ง€ ์•Š๋„๋ก ์ˆ˜์ •

* refactor: ํ•œ๋ฒˆ์— ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ฆฌํŒฉํ† ๋ง(๊ฒ€์ƒ‰ ์‹œ)

* refactor: ํ•„์š”ํ•˜์ง€ ์•Š์€ useEffect์‚ญ์ œ

* refactor: setTimeout ์‚ญ์ œ

* refactor: ๋‹จ์ถ• ๋ฌธ๋ฒ• ์‚ฌ์šฉ

* refactor: publicCards/:id๋กœ ๋ณ€๊ฒฝ (#490)

* feat: S3์— ์ด๋ฏธ์ง€ ์—…๋กœ๋“œ ์‹œ CacheControl ์ •๋ณด ์ถ”๊ฐ€ (#492)

* refactor: ๊ฒ€์ƒ‰ ํŽ˜์ด์ง€ ๋žœ๋ค ๋ฐ์ดํ„ฐ ์บ์‹ฑ (#491)

* etc: ์„œ๋ธŒ๋ชจ๋“ˆ ๋™๊ธฐํ™”

* fix: test, local, dev ์ƒํ™ฉ์—์„œ ๋กœ๊น… ์„ค์ • ๋ณ€๊ฒฝ (#494)

* refactor: ๋‹ค์–‘ํ•œ ๋ฌธ์ œ์ง‘ ๊ฐ€์ ธ์˜ค๊ธฐ api ์‘๋‹ต ๋ฐ˜ํ™˜ ๋ฉ”์„œ๋“œ ๋ณ€๊ฒฝ ๋ฐ ํ…Œ์ŠคํŠธ ์ˆ˜์ • (#496)

* etc: ec2 ๊ด€๋ จ ๋กœ๊น… ์„ค์ • ์œ„์น˜ ๋ณ€๊ฒฝ (#502)

* etc: ์„œ๋ธŒ๋ชจ๋“ˆ ์—…๋ฐ์ดํŠธ (#503)

* etc: ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ… (#498)

* refactor: ๋ผ์šฐํŒ… ์ปดํฌ๋„ŒํŠธ ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…

* etc: ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ… chunk name ์ง€์ •

* feat: @Transactional์˜ readonly ๊ฐ’์— ๋”ฐ๋ผ Master, Slave ๋ฐ์ดํ„ฐ์†Œ์Šค๋กœ ๋ผ์šฐํŒ…ํ•œ๋‹ค. (#497)

* feat: @Transactional์˜ readonly ๊ฐ’์— ๋”ฐ๋ผ Master, Slave ๋ฐ์ดํ„ฐ์†Œ์Šค๋กœ ๋ผ์šฐํŒ…ํ•œ๋‹ค.

* etc: application-dev1, dev2.yml ๋ณ€๊ฒฝ ๋ฐ ์ฃผ์„ ์ œ๊ฑฐ

* etc: ์ฃผ์„ ์‚ญ์ œ, config.datasource ์ž์ฝ”์ฝ”์—์„œ ์ œ์™ธ (#508)

* etc: ์„œ๋ธŒ๋ชจ๋“ˆ ๋ณ€๊ฒฝ (flyway enabled false) (#509)

* etc: DataSourceConfig์— dev, prod ๊ด€๋ จ ํ”„๋กœํŒŒ์ผ ์ด๋ฆ„ ์ถ”๊ฐ€ (#510)

* fix: EntityManagerFactory ๋นˆ ์ƒ์„ฑํ•˜๋Š” ๋ถ€๋ถ„ ๋ณ€๊ฒฝ (#511)

* fix: EntityManagerFactoryBuilder ๋ฅผ ์ƒˆ๋กœ ์ƒ์„ฑํ•˜๋„๋ก ๋ณ€๊ฒฝ, HibernateJpaVendorAdapter ์ถ”๊ฐ€ (#512)

* fix: DataSourceConfig @Profile ๋ณ€๊ฒฝ (#513)

* etc: ์„œ๋ธŒ๋ชจ๋“ˆ ์—…๋ฐ์ดํŠธ, ์ฝ”๋“œ ์ •๋ฆฌ (#514)

* etc: application-prod ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ด€๋ จ ์„ค์ • ์ถ”๊ฐ€ ๋ฐ ๋ณ€๊ฒฝ (#515)

* etc: dev, prod ์„ค์ • ํŒŒ์ผ์— ddl-auto ์‚ญ์ œ (#516)

* refactor: ์ „์ฒด์ ์ธ UI ๊ตฌ์„ฑ ๋ณ€๊ฒฝ (#500)

* refactor: CardsํŽ˜์ด์ง€์— Id ๋„ฃ๊ธฐ (#504)

* feat: Cards, workbookEditPage๋ฅผ id๋กœ ์ ‘๊ทผํ•˜๋„๋ก ๋ณ€๊ฒฝ

* refactor: divํƒœ๊ทธ -> a ํƒœ๊ทธ๋กœ ๋ณ€๊ฒฝ

* refactor: isCursor => isClicable ๋ณ€๊ฒฝ

* ๋‹ค์–‘ํ•œ ๋ฌธ์ œ์ง‘ ๋ณด๋Ÿฌ๊ฐ€๊ธฐ 0๊ฐœ ๋ฌธ์ œ์ง‘ ์ œ์™ธํ•˜๊ธฐ (#507)

* feat&test: WorkbookRepository#findRandomPublicWorkbooks 1๊ฐœ ์ด์ƒ์˜ ์นด๋“œ๋ฅผ ๊ฐ€์ง„ ๋ฌธ์ œ์ง‘์„ ๊ฐ€์ ธ์˜ค๋„๋ก ์ˆ˜์ •

* test: ๋‹ค์–‘ํ•œ ๋ฌธ์ œ์ง‘ ์กฐํšŒ ์‹œ ์นด๋“œ์˜ ๊ฐœ์ˆ˜๊ฐ€ 1๊ฐœ ์ด์ƒ์ธ ๊ฒƒ๋“ค๋งŒ ์กฐํšŒ๋˜๋„๋ก ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€

* feat: ํƒœ๊ทธ ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ ๊ตฌํ˜„ (#517)

* refactor: ๊ณต์œ  ๋ฌธ์ œ์ง‘์— ํƒœ๊ทธ, ์ข‹์•„์š”๋ฅผ ๋ณด์—ฌ์ค€๋‹ค (#499)

* refactor: ๊ณต์œ  ๋ฌธ์ œ์ง‘ ๋ ˆ์ด์•„์›ƒ ์ˆ˜์ •

* refactor: ๊ณต์œ  ๋ฌธ์ œ์ง‘ ๋ฆฌ์ŠคํŠธ ๋ฐ˜์‘ํ˜• ๊ตฌํ˜„

* refactor: ๋ฌธ์ œ์ง‘ ์ด๋ฆ„, ํƒœ๊ทธ ๊ธธ์ด๊ฐ€ ๊ธธ ๋•Œ ... ์ฒ˜๋ฆฌ

* feat: PublicSearchPage์— ๋ฌธ๊ตฌ ์ถ”๊ฐ€

* refactor: PublicSearchLoadable ์Šค์ผˆ๋ ˆํ†ค ์ถ”๊ฐ€

* etc: ๊ธด ๋ฌธ์ž์—ด break-all ์ฒ˜๋ฆฌ

* etc: ๊ธด ๋ฌธ์ž์—ด ... ์ฒ˜๋ฆฌ

* etc: ์…€๋ ‰ํ„ฐ ๋ฌธ์ œ์ง‘ ์ด๋ฆ„ ๋„ˆ๋น„ ๊ณ ์ •

* chore: Webpack chunk ๋ถ„๋ฆฌ, font preload (#518)

* refactor: ํฐํŠธ preload ์„ค์ •

* chore: chunk ์„ค์ •

* chore: moduleIds ์ถ”๊ฐ€

* chore: dist, dist-server๋ถ„๋ฆฌ

* chore: ๋ธŒ๋ผ์šฐ์ € ๋ฒ”์œ„ ์žฌ์„ค์ •

* chore: ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…(vendor ๋ถ„๋ฆฌ)

* refactor: ๋กœ๊ทธ์•„์›ƒ ํŽ˜์ด์ง€ ์ƒ์„ฑ

* fix: ์นด๋“œ, ๋ฌธ์ œ์ง‘์„ ๋น ๋ฅด๊ฒŒ ์‚ญ์ œ ์‹œ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๋ฒ„๊ทธ ์ˆ˜์ •

* fix: ํŠน์ • ํŽ˜์ด์ง€์—์„œ scrollToTop ์‚ญ์ œ

* fix: ํ•˜ํŠธ ํ† ๊ธ€ ์‹œ ๊ฒ€์ƒ‰ ํŽ˜์ด์ง€์—๋„ ๋ฐ˜์˜

* refactor: S3 ํŒŒ์ผ ์—…๋กœ๋“œ ์‹œ userName ๋Œ€์‹  userId๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ๋ณ€๊ฒฝ

* chore: ๋ฒ„์ „ ๋ณ€๊ฒฝ

* etc: spring dev, prod profile ํ•˜๋‚˜๋กœ ํ†ตํ•ฉ (#537)

* refactor: ๋ฌธ์ œ์ง‘ ์ƒ์„ธ๋ณด๊ธฐ ์‘๋‹ต์— ํ•˜ํŠธ ์ˆ˜์™€ ํƒœ๊ทธ ํฌํ•จ (#540)

* R01 - S3๋ฅผ ํ™˜๊ฒฝ์— ๋”ฐ๋ผ ๋ถ„๋ฆฌํ•˜๋ฉฐ, ๋กœ์ปฌ์—์„œ๋Š” Fake ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.  (#532)

* refactor: S3Config dev,prod ํ™˜๊ฒฝ ๋ถ„๋ฆฌ

* refactor: S3Uploader๋ฅผ FileUploader๋กœ ํ•œ๋‹จ๊ณ„ ์ถ”์ƒํ™” ๋ฐ S3Uploader์—์„œ IO์ž‘์—…์ด ์ผ์–ด๋‚˜์ง€ ์•Š๋„๋ก ์ˆ˜์ •

* refactor: FakeS3Uploader#upload ์‹œ ๊ธฐ์กด์˜ ์ด๋ฏธ์ง€๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ๋ณ€๊ฒฝ

* etc: ์„œ๋ธŒ๋ชจ๋“ˆ ์ˆ˜์ • ๋ฐ˜์˜

* feat: S3Uploader ์—…๋กœ๋“œ ์‹คํŒจ ์‹œ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ

* docs: errors.adoc์— ์ถ”๊ฐ€ํ•œ ErrorCode ์ž‘์„ฑ

* etc: yaml ์„ค์ • ํŒŒ์ผ ๋ณ€๊ฒฝ

* etc: FakeS3Uploader ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์–ด๋…ธํ…Œ์ด์…˜ ์ œ๊ฑฐ

* feat: UploadFileDto ์ƒ์„ฑ

* test: ImageTypeTest ์ถ”๊ฐ€

* test: FileNameGeneratorTest ๋ณด์™„

* feat: FakeS3Uploader์˜ ๊ฒฝ์šฐ resources/static์˜ ๋””ํดํŠธ ์ด๋ฏธ์ง€๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ์ˆ˜์ •

* refactor: U013 ErrorType ์ œ๊ฑฐ

* etc: yml ํŒŒ์ผ ์—…๋ฐ์ดํŠธ

* etc: jacoco ์„ค์ • ๋ณ€๊ฒฝ

* etc: logback-spring.xml ์ˆ˜์ •

* feat: test yaml ๋ฆฌํŒฉํ† ๋ง ๋ฐ s3uploaderTest ๋ณด์™„

* etc: logging ์ „์—ญ ์„ค์ • ์ถ”๊ฐ€

* etc: errors.adoc ์ˆ˜์ •

* refactor: UploadFileDto ๋ช…์นญ ๋ณ€๊ฒฝ ๋ฐ application.properties ์ œ๊ฑฐ

* B08 - DataSourceConfig ์ˆ˜์ • (#535)

* refactor: DataSourceConfig ์ˆ˜์ •

* refactor: @Profile({"dev", "prod"}) ๋กœ ๋ณ€๊ฒฝ

* etc: ์„œ๋ธŒ๋ชจ๋“ˆ ๋™๊ธฐํ™”

* refactor: ๋ฉ”์ธ ํŽ˜์ด์ง€ ๋ฐ ์นด๋“œ ํŽ˜์ด์ง€์˜ UI๋ฅผ ๋ณ€๊ฒฝํ•œ๋‹ค. (#547)

* refactor: ๋ฉ”์ธ ํŽ˜์ด์ง€์— heart์™€ tag ์ ์šฉ

- PublicWorkbook => Workbook์œผ๋กœ ๋ณ€๊ฒฝ(์ถ”์ƒํ™”)
- ์ž์ž˜ํ•œ ์Šคํƒ€์ผ ๋ณ€๊ฒฝ(margin ์ค„์ด๊ธฐ)
- WorkbookList css ์Šคํƒ€์ผ ์ถ”๊ฐ€(grid ์†์„ฑ์ด ์ค‘๋ณต๋˜์–ด์„œ ์ถ”์ถœ)

* refactor: ๋ฌธ์ œ์ง‘ ์ƒ์„ธ๋ณด๊ธฐ ์‘๋‹ต์— ํ•˜ํŠธ ์ˆ˜์™€ ํƒœ๊ทธ ํฌํ•จ

* feat: Cards ํŽ˜์ด์ง€์— ํƒœ๊ทธ์™€ ํ•˜ํŠธ ๊ฐœ์ˆ˜ ์ถ”๊ฐ€

* fix: ์ž์‹ ์˜ ๋ฌธ์ œ์ง‘ ํ•˜ํŠธ๋ฅผ ํ† ๊ธ€ํ–ˆ์„ ๋•Œ ๋ฉ”์ธ ํŽ˜์ด์ง€์— ๊ฐฑ์‹ ๋˜์ง€ ์•Š๋Š” ๋ฌธ์ œ ํ•ด๊ฒฐ

* refactor: ์Šค์ผˆ๋ ˆํ†ค ์Šคํƒ€์ผ ๋ณ€๊ฒฝ

* etc: ํƒœ๊ทธ ๋‹ซ์Œ

Co-authored-by: Eugine Park <[email protected]>

* fix/S01,S02 - ๊ฒ€์ƒ‰ ์‹œ private ๋ฌธ์ œ์ง‘์„ ์ œ์™ธํ•˜๋ฉฐ, ๊ฒ€์ƒ‰์–ด๊ฐ€ ํƒœ๊ทธ ๋˜๋Š” ๋ฌธ์ œ์ง‘๋ช…์— ํฌํ•จ๋œ ๋ฌธ์ œ์ง‘์„ ๊ฐ€์ ธ์˜จ๋‹ค. (#544)

* feat&test: ๊ฒ€์ƒ‰ ์‹œ ๊ณต๊ฐœ ๋ฌธ์ œ์ง‘๋งŒ ์กฐํšŒ๋˜๋„๋ก ์กฐ๊ฑด ์ถ”๊ฐ€

* fix: ๊ฒ€์ƒ‰ ์‹œ ๊ฒ€์ƒ‰์–ด๊ฐ€ ํƒœ๊ทธ์— ํฌํ•จ๋˜๊ฑฐ๋‚˜, ๋ฌธ์ œ์ง‘๋ช…์— ํฌํ•จ๋œ ๋ฌธ์ œ์ง‘์„ ๊ฒฐ๊ณผ๋กœ ๊ฐ€์ ธ์˜จ๋‹ค.

* fix/U01, T01 - ํ•„ํ„ฐ์—์„œ ์กฐํšŒ๋˜๋Š” ์œ ์ €์™€ ํƒœ๊ทธ๊ฐ€ ๋ฌธ์ œ์ง‘์˜ ์นด๋“œ๊ฐ€ 0๊ฐœ์ผ ๋•Œ๋Š” ์กฐํšŒ๋˜์ง€ ์•Š๋„๋ก ์ˆ˜์ •ํ•œ๋‹ค.  (#549)

* fix: ํ•„ํ„ฐ์—์„œ ์กฐํšŒ๋˜๋Š” ์œ ์ €์™€ ํƒœ๊ทธ๊ฐ€ ๋ฌธ์ œ์ง‘ ์นด๋“œ๊ฐ€ 0๊ฐœ์ผ ๋•Œ ์กฐํšŒ๋˜์ง€ ์•Š๋„๋ก ์ˆ˜์ •

* feat: TagFilterRepository ์ถ”๊ฐ€

* feat&test: ์œ ์ € ํ•„ํ„ฐ ์กฐํšŒ๋ฅผ querydsl๋กœ ๋ณ€๊ฒฝ

* refactor: TagFilterRepository๋กœ ๋ถ„๋ฆฌ ๋ฐ TagService ๋กœ์ง ์‚ญ์ œ

* refactor,test: ์ฝ”๋“œ ํฌ๋งทํŒ… ๋ฐ ์„œ๋น„์Šค ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€

Co-authored-by: seovalue <[email protected]>

* B07 - ๋น„๋™๊ธฐ ๋กœ๊น… ์ ์šฉ ๋ฐ ๋กœ๊น… ๊ฐ€๋…์„ฑ์žˆ๊ฒŒ ๊ฐœ์„ ํ•˜๊ธฐ (#550)

* refactor: Json Pretty Print ์„ค์ •์„ local, test์—์„œ๋งŒ ์ ์šฉํ•˜๋„๋ก ๋ณ€๊ฒฝ

* feat: query pattern ๋ณ€๊ฒฝ

* refactor: file๊ณผ console ํŒจํ„ด ๋ถ„๋ฆฌ

* feat: AsyncAppender ๋„์ž…

* refactor: utf8 ์ œ๊ฑฐ

* refactor: AsyncAppender ์„ค์ • ๋ณ€๊ฒฝ

* refactor: Config ํŒŒ์ผ ๋ถ„๋ฆฌ

* fix/UT01 - UserFilterRepositoryTest ๋ธŒ๋žœ์น˜ ์ปค๋ฒ„๋ฆฌ์ง€ ๋งŒ์กฑํ•˜๋„๋ก ์ˆ˜์ • (#553)

* refactor: Json Pretty Print ์„ค์ •์„ local, test์—์„œ๋งŒ ์ ์šฉํ•˜๋„๋ก ๋ณ€๊ฒฝ

* feat: query pattern ๋ณ€๊ฒฝ

* refactor: file๊ณผ console ํŒจํ„ด ๋ถ„๋ฆฌ

* feat: AsyncAppender ๋„์ž…

* refactor: utf8 ์ œ๊ฑฐ

* refactor: AsyncAppender ์„ค์ • ๋ณ€๊ฒฝ

* refactor: Config ํŒŒ์ผ ๋ถ„๋ฆฌ

* fix: branch coverage ๋งŒ์กฑํ•˜๋„๋ก ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€

* fix: URI ์—๋Ÿฌ ๋ฐ ๊ฐ์ข… ๋ฒ„๊ทธ๋ฅผ fixํ•œ๋‹ค.  (#552)

* fix: URI ๊ด€๋ จ ์—๋Ÿฌ ์ˆ˜์ •(URLSearchParams)

* fix: ์˜ˆ์•ฝ์–ด๋กœ ์ธํ•œ ์ •๊ทœํ‘œํ˜„์‹ ์—๋Ÿฌ ๋ฐ ๋ชจ๋‹ฌ ๋ฒ„๊ทธ ์ˆ˜์ •

* fix: ์ƒˆ๋กœ๊ณ ์นจ ์‹œ ํƒœ๊ทธ์™€ ์ž‘์„ฑ์ž๊ฐ€ ์‚ฌ๋ผ์ง€๋Š” ๋ฒ„๊ทธ ์ˆ˜์ •

* fix: ๋น ๋ฅด๊ฒŒ ๊ฒ€์ƒ‰ํ–ˆ์„ ๋•Œ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ๋ฐฉ์ง€ํ•˜๋„๋ก ์„ค์ •

* B06 - cors ๊ด€๋ จ allowedOrigins ๊ฐ’์„ ํ™˜๊ฒฝ๋ณ„ Profile์—์„œ ๊ด€๋ฆฌ (#538)

* etc: cors ๊ด€๋ จ allowedOrigins ๊ฐ’์„ ํ™˜๊ฒฝ๋ณ„ Profile์—์„œ ๊ด€๋ฆฌ

* refector: Acceptance ํ…Œ์ŠคํŠธ์—์„œ ํ•ด๋‹น ์†์„ฑ์ด ํ•„์š”ํ•˜์—ฌ : ์„ ์ ์–ด์คŒ ${property:default value} ํ˜•์‹์ธ๋ฐ ๋น„์›Œ๋‘๋‹ˆ๊นŒ ๋น„์–ด์žˆ๋Š” ๋ฐฐ์—ด๋กœ ์ƒ์„ฑ

* refactor: /api prefix ์ œ๊ฑฐ (#558)

* refactor: asciidoc index.html ์ด๋™

* fix: filter๋ฅผ ๊ฐ€์ ธ์˜ฌ ๋•Œ, tag์—๋งŒ ํฌํ•จ๋˜์–ด์žˆ๋Š” ๊ฒฝ์šฐ์—๋„ ๊ฐ€์ ธ์˜ค๋„๋ก ์ˆ˜์ • (#555)

* fix: filter๋ฅผ ๊ฐ€์ ธ์˜ฌ ๋•Œ, tag์—๋งŒ ํฌํ•จ๋˜์–ด์žˆ๋Š” ๊ฒฝ์šฐ์—๋„ ๊ฐ€์ ธ์˜ค๋„๋ก ์ˆ˜์ •

* etc: ์ฃผ์„ ์ œ๊ฑฐ

* fix: AcceptanceTest /api prefix ์ œ๊ฑฐ

* fix: ๊ฒฝํ•ฉ ์กฐ๊ฑด ํ•ด๊ฒฐ

Co-authored-by: Kyle <[email protected]>

* fix: ์Šคํฌ๋กค ๋ฒ„๊ทธ ์ˆ˜์ •

* fix/T01 - ์—ฐ๊ด€ ํƒœ๊ทธ ๊ฒ€์ƒ‰ ์‹œ ๋ฌธ์ œ์ง‘์ด ๋น„๊ณต๊ฐœ์ด๊ฑฐ๋‚˜, ์นด๋“œ๊ฐ€ 0๊ฐœ์ธ ๋ฌธ์ œ์ง‘์— ํฌํ•จ๋œ ํƒœ๊ทธ๋Š” ์กฐํšŒํ•˜์ง€ ์•Š๋Š”๋‹ค.  (#560)

* fix: ์—ฐ๊ด€ ํƒœ๊ทธ ์กฐํšŒ ์‹œ ๋ฌธ์ œ์ง‘์ด private์ด๊ฑฐ๋‚˜ card๊ฐ€ ๋น„์–ด์žˆ๋Š” ๊ฒฝ์šฐ์˜ ํƒœ๊ทธ๋Š” ์กฐํšŒํ•˜์ง€ ์•Š๋Š”๋‹ค.

* test: add branch coverage test

* chore: ๋ฒ„์ „ ์ˆ˜์ •

* fix: ๋ฌธ์ œ์ง‘์„ ํƒœ๊ทธ ์ด๋ฆ„์œผ๋กœ ๊ฒ€์ƒ‰ํ–ˆ์„ ๊ฒฝ์šฐ ํƒœ๊ทธ ํ•„ํ„ฐ๋ง ์•ˆ๋˜๋˜ ๋ฒ„๊ทธ ์ˆ˜์ •

* etc: ํ•ซํ”ฝ์Šค merge (#567)

* 5์ฐจ release (#562)

* B14 - ๋กœ๊น… ์ „๋žต wiki ๋ฌธ์„œํ™” ๋ฐ xml ์ฝ”๋“œ ์ƒ ๋ฐ˜์˜ (#172)

* etc: ์„œ๋ธŒ๋ชจ๋“ˆ ๋ณ€๊ฒฝ์‚ฌํ•ญ ์ ์šฉ

* feat: http๊ด€๋ จ ๋กœ๊น… ์„ค์ •

* feat: ๊ธฐ์กด ๋กœ๊ทธ ํŒจํ„ด ์ˆ˜์ • ๋ฐ ์ €์žฅ ๋ ˆ๋ฒจ ๋ณ€๊ฒฝ

* feat: ๋กœ๊ทธ ๋ ˆ๋ฒจ ๋ณ„ ํŒŒ์ผ ๋ถ„๋ฆฌ

* etc: ๋กœ๊น… ๊ด€๋ จ ์„ค์ • ๋ณ€๊ฒฝ

* feat: ํŒŒ์ผ, ์ฝ˜์†” ๋กœ๊น… ์–ดํŽœ๋” ์ถ”๊ฐ€

* feat: logback ํŒŒ์ผ์— ๋ถ„๋ฆฌ๋œ ์–ดํŽœ๋” ์ถ”๊ฐ€

* feat: http ์š”์ฒญ, ์‘๋‹ต body ์ถœ๋ ฅ ๊ด€๋ จ ์„ค์ • ์ถ”๊ฐ€

Co-authored-by: seunghyun <[email protected]>

* U03 - ๋กœ๊ทธ์ธ ํ•œ ์‚ฌ์šฉ์ž์™€ ๊ด€๋ จ์žˆ๋Š” /users/me api ๋ฐ User ํ…Œ์ŠคํŠธ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.  (#175)

* feat: /users/me api ๋ฐ ์ธ์ˆ˜ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€

* test: user ๊ด€๋ จ ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€

* refactor: ํ•„์š”์—†๋Š” ๋ฉ”์„œ๋“œ ์ œ๊ฑฐ ๋ฐ ํŒจํ‚ค์ง€ ๊ตฌ์กฐ ๋ณ€๊ฒฝ

* B28 - ๋กœ์ปฌ์—์„œ ์‹คํ–‰ ์‹œ ํ•„์š”ํ•œ ์ดˆ๊ธฐ๋ฐ์ดํ„ฐ๋ฅผ ์œ„ํ•œ ๋ฐ์ดํ„ฐ๋กœ๋” ๋ฆฌํŒฉํ† ๋ง (#176)

* etc: application.yml ์ˆ˜์ •

* refactor: ๋ฐ์ดํ„ฐ๋กœ๋” ๋ฆฌํŒฉํ„ฐ๋ง

* etc: ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์ดˆ๊ธฐ ๋ฐ์ดํ„ฐ๋กœ ์‚ฌ์šฉํ•  ์ฟผ๋ฆฌ ์ƒ์„ฑ

* C04 - ์นด๋“œ์— '๋‹ค์Œ์— ๋˜ ๋ณด๊ธฐ' ์ •๋ณด๋ฅผ ์—…๋ฐ์ดํŠธํ•œ๋‹ค. (#178)

* UI05 - ๊ณต์œ  ๋ฌธ์ œ์ง‘ ํŽ˜์ด์ง€ UI๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค  (#165)

* feat: ๊ณต์œ  ํŽ˜์ด์ง€ UI ์ถ”๊ฐ€

* etc: ์„œ๋ฒ„ url ๋ณ€๊ฒฝ (localhost:8080)

Co-authored-by: dudtjr913 <[email protected]>

* etc: SearchPage ์‚ญ์ œ

Co-authored-by: dudtjr913 <[email protected]>

* etc: path ๋ณ€๊ฒฝ (sharedWorkbookDetail -> SharedCards)

Co-authored-by: dudtjr913 <[email protected]>

Co-authored-by: imgwang-yeol <[email protected]>

* refactor: Cards ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ƒ์„ฑ์ž ์ œ๊ฑฐ

* feat: ๋ฌธ์ œ์ง‘์— ์นด๋“œ ์—†๋Š” ๊ฒฝ์šฐ ์˜ˆ์™ธ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋„๋ก ๋ณ€๊ฒฝ

- ๋ฉ”์„œ๋“œ ์ด๋ฆ„ ์ˆ˜์ •
- ๋ฌธ์ œ์ง‘์— ์นด๋“œ ์—†๋Š” ๊ฒฝ์šฐ๋ฅผ ํ…Œ์ŠคํŠธํ•˜๋Š” ๋ถ€๋ถ„ ์ œ๊ฑฐ

* feat: Card ๋˜ ๋ณด๊ธฐ ๋ณ€๊ฒฝ ๋ฉ”์„œ๋“œ ์ถ”๊ฐ€

* feat: CardRepository ์—ฌ๋Ÿฌ id๋กœ ์นด๋“œ ์กฐํšŒํ•˜๋Š” ๋ฉ”์„œ๋“œ ์ถ”๊ฐ€

* etc: ํ…Œ์ŠคํŠธ ๋””๋ ‰ํ† ๋ฆฌ ์ œ์ž๋ฆฌ๋กœ ์ด๋™

* feat: CardService, ๋˜ ๋ณด๊ธฐ ๊ธฐ๋Šฅ ๊ตฌํ˜„ ๋ฐ ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€

* feat: CardController ์ถ”๊ฐ€ ๋ฐ ๋˜ ๋ณด๊ธฐ api ์ƒ์„ฑ

* refactor: ์ธ์ˆ˜ ํ…Œ์ŠคํŠธ์—์„œ ์นด๋“œ & ๋ฌธ์ œ์ง‘ ์ƒ์„ฑ ๋ฉ”์„œ๋“œ AuthAcceptanceTest๋กœ ์ด๋™

* test: ๋˜ ๋ณด๊ธฐ ์นด๋“œ ์„ ํƒ ๊ธฐ๋Šฅ ์ธ์ˆ˜ ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€

* docs: ๋˜ ๋ณด๊ธฐ ์นด๋“œ ์„ ํƒ api ๋ฌธ์„œํ™”

- workbook ๊ด€๋ จ ์•„์Šคํ‚ค๋… ํŒŒ์ผ ์ด๋ฆ„ ๋ณ€๊ฒฝ

* B14 - ๋กœ๊น… ์ „๋žต wiki ๋ฌธ์„œํ™” ๋ฐ xml ์ฝ”๋“œ ์ƒ ๋ฐ˜์˜ (#172)

* etc: ์„œ๋ธŒ๋ชจ๋“ˆ ๋ณ€๊ฒฝ์‚ฌํ•ญ ์ ์šฉ

* feat: http๊ด€๋ จ ๋กœ๊น… ์„ค์ •

* feat: ๊ธฐ์กด ๋กœ๊ทธ ํŒจํ„ด ์ˆ˜์ • ๋ฐ ์ €์žฅ ๋ ˆ๋ฒจ ๋ณ€๊ฒฝ

* feat: ๋กœ๊ทธ ๋ ˆ๋ฒจ ๋ณ„ ํŒŒ์ผ ๋ถ„๋ฆฌ

* etc: ๋กœ๊น… ๊ด€๋ จ ์„ค์ • ๋ณ€๊ฒฝ

* feat: ํŒŒ์ผ, ์ฝ˜์†” ๋กœ๊น… ์–ดํŽœ๋” ์ถ”๊ฐ€

* feat: logback ํŒŒ์ผ์— ๋ถ„๋ฆฌ๋œ ์–ดํŽœ๋” ์ถ”๊ฐ€

* feat: http ์š”์ฒญ, ์‘๋‹ต body ์ถœ๋ ฅ ๊ด€๋ จ ์„ค์ • ์ถ”๊ฐ€

Co-authored-by: seunghyun <[email protected]>

* refactor: DomainAcceptanceTest ์ถ”๊ฐ€

Co-authored-by: dudtjr913 <[email protected]>
Co-authored-by: imgwang-yeol <[email protected]>
Co-authored-by: seunghyun <[email protected]>

* F09 - api ์ฃผ์†Œ ๋ฐ ๋ณ€์ˆ˜ ๋ช… ๋ณ€๊ฒฝ (#182)

* etc: category -> workbook ์ด๋ฆ„ ์ˆ˜์ •

- axios ํƒ€์ž… ์ฒ˜๋ฆฌ

* refactor: ๋กœ๊ทธ์ธ ๋ฐ ๋กœ๊ทธ์•„์›ƒ ์ฝ”๋“œ ์ˆ˜์ •

- localStorage์— ํ† ํฐ ์ €์žฅ

Co-authored-by: Kyle <[email protected]>

* fix: ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์˜ค๋ฅ˜ ์ˆ˜์ •

- setupFiles ๋ฐ setupFilesAfterEnv ์„ค์ •

Co-authored-by: Kyle <[email protected]>

Co-authored-by: dudtjr913 <[email protected]>

* feat: recoil ๊ด€๋ จ ์ดˆ๊ธฐ ์„ค์ • ๊ธฐ๋Šฅ ์ถ”๊ฐ€(ํ…Œ์ŠคํŠธ) (#186)

- initializeState

Co-authored-by: Kyle <[email protected]>

* docs: ๋ฐฑ์—”๋“œ ์„œ๋ฒ„ ์‹คํ–‰ ๋ฐฉ๋ฒ• ์ž‘์„ฑ (#187)

* feat: ๊ณต์œ  ๋ฌธ์ œ์ง‘ ์ƒ์„ธ ํŽ˜์ด์ง€ UI๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค (#191)

* feat: ๊ณต์œ  ๋ฌธ์ œ์ง‘ ์ƒ์„ธ ํŽ˜์ด์ง€ ์ถ”๊ฐ€

- ๋ผ์šฐํ„ฐ ์ ์šฉ
- check svg ์ƒ์„ฑ
- Checkbox ์ปดํฌ๋„ŒํŠธ ์ƒ์„ฑ
- SharedQnACard ์ปดํฌ๋„ŒํŠธ ์ƒ์„ฑ
- SharedCardsPage ์ƒ์„ฑ

* refactor: PageHeader ๋ฐ ๋””์ž์ธ ๋ฆฌํ„ฐ์น˜

- PageHeader sticky, rightContent ์ถ”๊ฐ€
- ์ „์ฒด์ ์œผ๋กœ ๋””์ž์ธ ๋ฆฌํ„ฐ์น˜

Co-authored-by: Kyle <[email protected]>

* refactor: shared => public ๋ณ€๊ฒฝ

Co-authored-by: Kyle <[email protected]>

Co-authored-by: Kyle <[email protected]>

* feat: ๋ฌธ์ œ์ง‘ ์ถ”๊ฐ€ ํ™”๋ฉด์„ ๊ตฌํ˜„ํ•œ๋‹ค.  (#189)

* etc: ์„œ๋ธŒ๋ชจ๋“ˆ ๋™๊ธฐํ™”

* feat: ๋ฌธ์ œ์ง‘ ์ถ”๊ฐ€ ํŽ˜์ด์ง€ ๊ตฌํ˜„

* test: ๋ฌธ์ œ์ง‘ ์ถ”๊ฐ€ ํŽ˜์ด์ง€ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ

* etc: ์›Œํฌ๋ถ ๋†’์ด ์ˆ˜์ •

* refactor: ๋””์ž์ธ ๋ฆฌํ„ฐ์น˜

- workbook, skeleton height ๋ณ€๊ฒฝ

Co-authored-by: dudtjr913 <[email protected]>

Co-authored-by: dudtjr913 <[email protected]>

* feat: ๋น„ํšŒ์› ํ€ด์ฆˆ ํ’€๊ธฐ ๊ตฌํ˜„ (#193)

* feat: ๋น„ํšŒ์› ํ€ด์ฆˆ ํ’€๊ธฐ ๊ธฐ๋Šฅ ๊ตฌํ˜„

Co-authored-by: Kyle <[email protected]>

* refactor: history ์ •๋ฆฌ

- useRouter ํ›… ์ถ”๊ฐ€

Co-authored-by: dudtjr913 <[email protected]>

Co-authored-by: dudtjr913 <[email protected]>
Co-authored-by: dudtjr913 <[email protected]>

* B29 - ํ…Œ์ŠคํŠธ๋ฅผ ๋ฆฌํŒฉํ† ๋งํ•œ๋‹ค. (#181)

* refactor: oauth ์ธ์ฆ์„ ์š”๊ตฌํ•˜์ง€ ์•Š๋Š” GET ๋ฉ”์„œ๋“œ ๋ฆฌํŒฉํ† ๋ง

* refactor: auth๊ฐ€ ํ•„์š”ํ•œ GET ์š”์ฒญ ๋ฆฌํŒฉํ† ๋ง

* refactor: acceptanceTest์˜ post, put, delete ๋ฉ”์„œ๋“œ ๋ฆฌํŒฉํ† ๋ง

* refactor: UserAcceptanceTest ๋ฆฌํŒฉํ† ๋ง

* refactor: Documentation Test ๋ฆฌํŒฉํ† ๋ง

* refactor: CardAcceptanceTest ๋ฐ DomainAcceptanceTest ๋ฆฌํŒฉํ† ๋ง

* etc: ์นดํ…Œ๊ณ ๋ฆฌ์—์„œ ๋ฌธ์ œ์ง‘์œผ๋กœ ๋ช…์นญ ์ˆ˜์ •

* refactor: Document ํ…Œ์ŠคํŠธ util ํŒจํ‚ค์ง€ ์ƒ์„ฑ

* refactor: RestAssuredTest์˜ log ์˜ต์…˜์„ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ณ€๊ฒฝ

* refactor: ๋ฉ”์„œ๋“œ๋ช… ๊ฐ€๋…์„ฑ์žˆ๊ฒŒ ๋ณ€๊ฒฝ ๋ฐ document์˜ status, identifier ๋ถ„๋ฆฌ

* etc: env ํด๋” ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ๋‹ค์‹œ ์„ค์ •ํ•œ๋‹ค (#196)

* etc: submodule ๋™๊ธฐํ™”

Co-authored-by: Kyle <[email protected]>

* etc: script ๋ช…๋ น์–ด ๋ณ€๊ฒฝ

- build:dev
- build:prod

Co-authored-by: Kyle <[email protected]>

Co-authored-by: Kyle <[email protected]>

* fix: DataLoader์—์„œ ํŒŒ์ผ ์ฝ์„ ๋•Œ UTF-8 ์บ๋ฆญํ„ฐ์…‹ ์‚ฌ์šฉํ•˜๋„๋ก ์ˆ˜์ • (#199)

* feat: ๋กœ๊ทธ์ธ ํ•œ ์œ ์ € ์ •๋ณด ๋ฐ›์•„์˜ค๊ธฐ (#200)

Co-authored-by: dudtjr913 <[email protected]>

* refactor: ์นด๋“œ ํ…œํ”Œ๋ฆฟ ์ถ”๊ฐ€ (#202)

Co-authored-by: Kyle <[email protected]>

Co-authored-by: Kyle <[email protected]>

* refactor: ๋ฆฌํŒฉํ† ๋ง (#204)

* etc: WorkbookResponse ์ˆ˜์ •

- logoUrl, description ์‚ญ์ œ

Co-authored-by: dudtjr913 <[email protected]>

* etc: ๋ฌธ์ œ์ง‘ ์ถ”๊ฐ€ ๋ฒ„ํŠผ ๋ณ€๊ฒฝ

Co-authored-by: dudtjr913 <[email protected]>

Co-authored-by: dudtjr913 <[email protected]>

* feat: ModalProvider ์ถ”๊ฐ€ (#206)

Co-authored-by: Kyle <[email protected]>

Co-authored-by: Kyle <[email protected]>

* Q05 - ํ€ด์ฆˆ์—์„œ '๋˜ ๋ณด๊ธฐ' ์นด๋“œ๋ฅผ ๋จผ์ € ๋‹ด์•„ ์œ ์ €์—๊ฒŒ ์ œ๊ณตํ•œ๋‹ค  (#190)

* feat: QuizResponse์— ๋งˆ์ฃผ์นœ ํšŸ์ˆ˜ ํ•„๋“œ ์ถ”๊ฐ€

* feat: ๋‹ค์Œ์— ๋˜๋ณด๊ธฐ๊ฐ€ ํฌํ•จ๋œ ํ€ด์ฆˆ ์ƒ์„ฑ

* feat: ๋‹ค์Œ์— ๋˜ ๋ณด๊ธฐ์— ์ถ”๊ฐ€๋œ ์นด๋“œ์˜ ๋˜๋ณด๊ธฐ ์˜ต์…˜ ์ทจ์†Œ ๊ตฌํ˜„

* refactor&test: Quiz ํด๋ž˜์Šค ์ƒ์„ฑ ๋ฐ createQuiz ์ฑ…์ž„ ๋ถ„๋ฆฌ, ๊ด€๋ จ ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€

* etc: ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋ฉ”์„œ๋“œ ์‚ญ์ œ

* feat: ํšŒ์›, ๋น„ํšŒ์› ๋‚˜๋ˆŒ Role ์ถ”๊ฐ€ (#195)

* etc: pull request template ์ถ”๊ฐ€

* etc: Jenkinsfiles ์ถ”๊ฐ€

* W03- Workbook์— User์ถ”๊ฐ€, /workbooks//{id}/cards API์— ํ•„๋“œ ์ถ”๊ฐ€ (#208)

* feat: Workbook์— User ํ•„๋“œ ์ถ”๊ฐ€

* refactor: ์ผ๋ถ€ ์ฃผ๊ด€์ ์ธ ์Šคํƒ€์ผ์„ ๋ฐ˜์˜

* feat: CardResponse์— ํ•„๋“œ ์ถ”๊ฐ€

* refactor: ํŒจํ‚ค์ง€ ์ด๋™ dto -> dto/workbook // workResponse ํ•„๋“œ ์ˆ˜์ •

* feat: ๋ฌธ์ œ์ง‘์˜ ์ฃผ์ธ์„ ์•Œ์•„๋‚ด๋Š” ๊ธฐ๋Šฅ ๊ตฌํ˜„

* feat: User ํ…Œ์ด๋ธ”์— Role ์ถ”๊ฐ€

* etc: ddl, dml ์ˆ˜์ •

* refactor: DataLoader์—์„œ ADMIN์œผ๋กœ ์œ ์ € ์ƒ์„ฑ ํ›„ ๋ฐ์ดํ„ฐ ์ดˆ๊ธฐํ™” ์œ ์ €๋กœ ์ด์šฉ

* refactor: CardResponse ํ•„๋“œ ์กฐ์ •

* refactor: ๋ฐ์ดํ„ฐ๋กœ๋”์˜ ๋”๋ฏธ ๋ฌธ์ œ์ง‘ ๊ณต๊ฐœ์—ฌ๋ถ€ true๋กœ ๋ณ€๊ฒฝ

* refactor: ํ…Œ์ŠคํŠธ ์„ฑ๊ณตํ•˜๋„๋ก ์ˆ˜์ •

* etc: api ๋ฌธ์„œ ๊ฒฝ๋กœ ๋ณ€๊ฒฝ (#212)

* etc: Jenkinsfiles์— slack ์„ค์ • ์ถ”๊ฐ€

* C05 - ์นด๋“œ๋ฅผ ์ถ”๊ฐ€, ์ˆ˜์ •, ์‚ญ์ œํ•˜๋Š” api๋ฅผ ๋งŒ๋“ ๋‹ค.  (#210)

* feat: ๋ชจ์•„๋ณด๊ธฐ ํ™”๋ฉด์—์„œ ๋ณด์—ฌ์ฃผ๋Š” ์นด๋“œ์˜ ์ •๋ณด์— ๋ถ๋งˆํฌ ์—ฌ๋ถ€์™€ ๋งˆ์ฃผ์นœ ํšŸ์ˆ˜ ์ถ”๊ฐ€

* feat: ์นด๋“œ ์ƒ์„ฑ api ์ถ”๊ฐ€

* test: ์นด๋“œ ์ƒ์„ฑ ๊ด€๋ จ ์ธ์ˆ˜ ํ…Œ์ŠคํŠธ์™€ ์„œ๋น„์Šค ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€

* feat: ์นด๋“œ ์ƒ์„ฑ ์š”์ฒญ ๋ฐ ๋˜ ๋ณด๊ธฐ ์š”์ฒญ ๊ด€๋ จ ๊ฒ€์ฆ ์ถ”๊ฐ€

* feat: ์นด๋“œ ์ˆ˜์ • ๊ธฐ๋Šฅ api ์ถ”๊ฐ€

* test: ์นด๋“œ ์ˆ˜์ • ๊ด€๋ จ ์„œ๋น„์Šค ํ…Œ์ŠคํŠธ ๋ฐ ์ธ์ˆ˜ ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€

* etc: Jenkinsfiles ์ถ”๊ฐ€

* etc: Jenkinsfiles ์ˆ˜์ •

* etc: tools ์ถ”๊ฐ€

* etc: frontend ๊ฒฝ๋กœ ์ถ”๊ฐ€ ์„ค์ •

* etc: ssh ์„ค์ • ์ถ”๊ฐ€

* docs: ์นด๋“œ ์ƒ์„ฑ ๋ฐ ์ˆ˜์ • api ๋ฌธ์„œํ™”

* refactor: Cards ๊ด€๋ จ ํ…Œ์ŠคํŠธ ๋ณ€๊ฒฝ๋œ ํ…Œ์ŠคํŠธ ๋ฐฉ์‹ ์ ์šฉ

* feat: ์นด๋“œ ์‚ญ์ œ ๊ด€๋ จ api ์ƒ์„ฑ ๋ฐ ๊ด€๋ จ ํ…Œ์ŠคํŠธ, ๋ฌธ์„œ ์ถ”๊ฐ€

* etc: ์ฝ”๋“œ ์ •๋ฆฌ

* test: ๋ˆ„๋ฝ๋œ ์นด๋“œ ์ถ”๊ฐ€ ์‹คํŒจ ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€

* refactor: workbook ๊ด€๋ จ ์‘๋‹ต์—์„œ workbookName์„ name์œผ๋กœ ์ˆ˜์ •

* test: CardAcceptanceTest ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ์ถ”๊ฐ€

* feat: ์นด๋“œ ์ˆ˜์ • api ์š”์ฒญ๊ณผ ์‘๋‹ต ์–‘์‹ ๋ณ€๊ฒฝ

* refactor: CardService workbook ์ฐพ๋Š” ๋ฉ”์„œ๋“œ ์ถ”์ถœ

Co-authored-by: joanne <[email protected]>
Co-authored-by: dudtjr913 <[email protected]>

* feat: form context ์ถ”๊ฐ€ (#219)

Co-authored-by: dudtjr913 <[email protected]>

* etc: ์„œ๋ธŒ๋ชจ๋“ˆ ์—…๋ฐ์ดํŠธ (#221)


Co-authored-by: dudtjr913 <[email protected]>

* feat: ํ…Œ์ŠคํŠธ ํŒŒ์ผ ์ˆ˜์ • (#224)

* test: ํ…Œ์ŠคํŠธ ํŒŒ์ผ ์‚ญ์ œ

Co-authored-by: Kyle <[email protected]>

* feat: ๊ณต์œ  ํŽ˜์ด์ง€ ์ด๋™ ๋ฐฐ๋„ˆ ๋งŒ๋“ค๊ธฐ (#226)

* refactor: inputField focus ์ƒํƒœ ์ถ”๊ฐ€
* feat: ๊ณต์œ  ๋ฌธ์ œ์ง‘ ์ด๋™ ๋ฐฐ๋„ˆ ์ถ”๊ฐ€

Co-authored-by: Kyle <[email protected]>

* Q04 - ๋ฐ”๋กœ ํ’€์–ด๋ณด๊ธฐ API๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค (#216)

* feat&test: ๋ฌธ์ œ์ง‘์—์„œ ๋ฐ”๋กœ ํ’€๊ธฐ ๊ธฐ๋Šฅ ๊ตฌํ˜„ ๋ฐ ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€

* test: increaseEncounterCount ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€

* test: Quiz ๋„๋ฉ”์ธ์— incrementEncounterCount Test ์ถ”๊ฐ€

* fix: ๋ฌธ์ œ์ง‘์—์„œ ๋ฐ”๋กœํ’€๊ธฐ ์‹œ ๋งˆ์ฃผ์นœ ํšŸ์ˆ˜ ์ฆ๊ฐ€๋˜์ง€ ์•Š๋„๋ก ์ˆ˜์ •

* refactor: ๋ฌธ์ œ์ง‘์—์„œ ๋ฐ”๋กœํ’€๊ธฐ ์‹œ ๋‹ค์Œ์— ๋˜๋ณด๊ธฐ ์ทจ์†Œ ๊ธฐ๋Šฅ ์‚ญ์ œ

* feat: ๋ฌธ์ œ์ง‘์ด public์ธ์ง€ ํ™•์ธํ•˜๋Š” ๊ธฐ๋Šฅ ์ถ”๊ฐ€

* feat: CardAddPage, CardEditPage ๊ตฌํ˜„ (#229)

Co-authored-by: dudtjr913 <[email protected]>

* U05 - Role์ด admin์ธ User๋งŒ admin api์— ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๋„๋ก AdminInterceptor๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค. (#217)

* feat: GithubUserInfoResponse์—์„œ Role์„ ์ถ”๊ฐ€ํ•ด์„œ User๋กœ ๋ณ€ํ™˜๋˜๋„๋ก ์ถ”๊ฐ€

* feat: AdminInterceptor ๋ฐ ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€

* refactor: AdminAcceptanceTest๋‚ด Category๋ฅผ Workbook์œผ๋กœ ์ˆ˜์ •

* UI10 - ์Šคํฌ๋กค ๋ฐ”๋ฅผ ์ปค์Šคํ…€ํ•œ๋‹ค (#233)

* refactor: ์ปค์Šคํ…€ ์Šคํฌ๋กค ๋ฐ” ๊ตฌํ˜„

Co-authored-by: Kyle <[email protected]>

* W04 - Workbook์„ ์กฐํšŒํ•˜๋Š” ๊ธฐ๋Šฅ์„ ๊ฐœ์„ ํ•œ๋‹ค. (#218)

* feat: Workbook์— User ํ•„๋“œ ์ถ”๊ฐ€

* refactor: ์ผ๋ถ€ ์ฃผ๊ด€์ ์ธ ์Šคํƒ€์ผ์„ ๋ฐ˜์˜

* feat: CardResponse์— ํ•„๋“œ ์ถ”๊ฐ€

* refactor: ํŒจํ‚ค์ง€ ์ด๋™ dto -> dto/workbook // workResponse ํ•„๋“œ ์ˆ˜์ •

* feat: ๋ฌธ์ œ์ง‘์˜ ์ฃผ์ธ์„ ์•Œ์•„๋‚ด๋Š” ๊ธฐ๋Šฅ ๊ตฌํ˜„

* feat: User ํ…Œ์ด๋ธ”์— Role ์ถ”๊ฐ€

* etc: ddl, dml ์ˆ˜์ •

* refactor: DataLoader์—์„œ ADMIN์œผ๋กœ ์œ ์ € ์ƒ์„ฑ ํ›„ ๋ฐ์ดํ„ฐ ์ดˆ๊ธฐํ™” ์œ ์ €๋กœ ์ด์šฉ

* refactor: CardResponse ํ•„๋“œ ์กฐ์ •

* refactor: ๋ฐ์ดํ„ฐ๋กœ๋”์˜ ๋”๋ฏธ ๋ฌธ์ œ์ง‘ ๊ณต๊ฐœ์—ฌ๋ถ€ true๋กœ ๋ณ€๊ฒฝ

* refactor: ํ…Œ์ŠคํŠธ ์„ฑ๊ณตํ•˜๋„๋ก ์ˆ˜์ •

* refactor: TestUtils์˜ ๋ฌธ์ž์—ด ์ƒ์„ฑ ๋ฉ”์„œ๋“œ ์ด๋ฆ„ ๋ณ€๊ฒฝ

* feat: ๊ฒ€์ƒ‰์–ด ๊ฐ์ฒด์ธ SearchKeyword ์ƒ์„ฑ

* feat: ๊ฒ€์ƒ‰ ์กฐ๊ฑด ๊ฐ์ฒด์ธ WorkbookCriteria ์ƒ์„ฑ

* feat: ๋ฌธ์ œ์ง‘ ๊ฒ€์ƒ‰์„ ์œ„ํ•œ resolver ์ƒ์„ฑ ๋ฐ API์— ์ ์šฉ

* feat: ๊ฒ€์ƒ‰์— ํ™œ์šฉํ•  AccessType ํด๋ž˜์Šค ๊ตฌํ˜„

* refactor: boolean ๋Œ€์‹  AccessType์„ ์‚ฌ์šฉํ•˜๋„๋ก ์ˆ˜์ •

* refactor: ํƒญ ๋ฌธ์ž์™€ ๊ฐœํ–‰ ๋ฌธ์ž๋ฅผ ๊ณ ๋ คํ•˜์—ฌ ์ˆ˜์ •

* refactor: ํ•„๋“œ๋ช… ์ˆ˜์ • (workbookName -> name)

* etc: dml ์ˆ˜์ •

* feat: ๋ฌธ์ œ์ง‘์˜ ์ด๋ฆ„์— ๋‹จ์–ด๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๋Š”์ง€ ๊ฒ€์‚ฌํ•˜๋Š” ๊ธฐ๋Šฅ ์ถ”๊ฐ€

* feat: ๊ฒ€์ƒ‰์‹œ ์ฃผ์ธ์„ ์„ค์ •ํ•˜๋Š” OwerType ํด๋ž˜์Šค ์ƒ์„ฑ

* refactor: ์˜ˆ์™ธ๋ช… ๋ณ€๊ฒฝ, ์ด์™ธ ์ž์ž˜ํ•œ ์ˆ˜์ •

* feat: ์ž„์‹œ ์„œ๋น„์Šค ๋กœ์ง ์ถ”๊ฐ€

* feat: ๊นจ์ง€๋Š” ํ…Œ์ŠคํŠธ๋ฅผ ์ˆ˜์ • (๋กœ๊ทธ์ธ ๋ฐ ๋ฌธ์ œ์ง‘ ๊ณต๊ฐœ)

* feat: RequestBuilder์— query parameter๋ฅผ ์œ„ํ•œ ๊ธฐ๋Šฅ ์ถ”๊ฐ€

* refactor: lombok.EqualsAndHashCode ์‚ฌ์šฉ

* refactor: ํ…Œ์ŠคํŠธ ๊ตฌ์กฐ ์›์ƒ ๋ณต๊ตฌ

* refactor: workbook resolver ์‚ญ์ œ

* refactor: ๋„๋ฉ”์ธ์œผ๋กœ์„œ ๋™์ž‘์ด ์ ํ•ฉํ•˜๋„๋ก WorkbookCriteria ์ˆ˜์ •

* feat: WorkbookCriteria๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ฌธ์ œ์ง‘์„ ํ•„ํ„ฐ๋งํ•˜๋Š” ํด๋ž˜์Šค ์ƒ์„ฑ

* feat: ๋ฌธ์ œ์ง‘ ์กฐํšŒ, ๊ฒ€์ƒ‰ Service ๋ฉ”์†Œ๋“œ ๊ตฌํ˜„

* feat: ๋กœ๊ทธ์ธ ์œ ์ € ๋ฌธ์ œ์ง‘ ์กฐํšŒ API, ๋ฌธ์ œ์ง‘ ๊ฒ€์ƒ‰ API ์ถ”๊ฐ€

* refactor: ์‹คํŒจํ•˜๋Š” ํ…Œ์ŠคํŠธ ์ˆ˜์ •

* refactor: @Param ์ถ”๊ฐ€ ๋ฐ ํ…Œ์ŠคํŠธ ์ˆ˜์ •

* etc: ํŒจํ‚ค์ง€ ๊ตฌ์กฐ ๋ณ€๊ฒฝ

* refactor: ์—”ํ‹ฐํ‹ฐ boolean ํ•„๋“œ์ด๋ฆ„ is์ œ๊ฑฐ TINYINT(1) ์ถ”๊ฐ€, ์นด๋“œ์˜ ์งˆ๋ฌธ ์ •๋‹ต 2000์ž ์ดํ•˜๋กœ ์ˆ˜์ •

* W07 - ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ฌธ์ œ์ง‘ ์กฐํšŒ์‹œ ์ตœ์‹ ์ˆœ์œผ๋กœ ์กฐํšŒ๋  ์ˆ˜ ์žˆ๋„๋ก ๊ตฌํ˜„ํ•œ๋‹ค. (#241)

* feat: ์ตœ์‹ ์ˆœ์œผ๋กœ Workbook์ด ์กฐํšŒ๋˜๋„๋ก ์ˆ˜์ • ๋ฐ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ถ”๊ฐ€

* feat: admin์ด ๋ฌธ์ œ์ง‘์„ ์ถ”๊ฐ€ํ•  ๋•Œ admin์˜ id๊ฐ€ ์ €์žฅ๋  ์ˆ˜ ์žˆ๋„๋ก ์ฝ”๋“œ ์ถ”๊ฐ€

* refactor: ํ”ผ๋“œ๋ฐฑ ๋ฐ˜์˜

* C06 - ๋ชจ์•„๋ณด๊ธฐ์—์„œ ์นด๋“œ๋ฅผ ์ตœ์‹ ์ˆœ์œผ๋กœ ์ œ๊ณตํ•œ๋‹ค. (#237)

* feat: ๋ชจ์•„๋ณด๊ธฐ ์š”์ฒญ์‹œ ์นด๋“œ ์ƒ์„ฑ ์‹œ๊ฐ„ ์—ญ์ˆœ์œผ๋กœ ์ œ๊ณต

* refactor: ์ตœ์‹ ์ˆœ์œผ๋กœ ์นด๋“œ ์ •๋ ฌํ•˜๋Š” ๋ฉ”์„œ๋“œ ๋‹จ์ˆœํ™”

* refactor: ์ตœ์‹ ์ˆœ์œผ๋กœ ์นด๋“œ ์ •๋ ฌํ•˜๋Š” ๋ฉ”์„œ๋“œ jpql ์‚ฌ์šฉํ•˜๋„๋ก ๋ณ€๊ฒฝ ๋ฐ CardSimpleResponse ์ œ๊ฑฐ

* feat: ์นด๋“œ ์ถ”๊ฐ€, ์ˆ˜์ •, ์‚ญ์ œ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•œ๋‹ค (#244)

* feat: ์นด๋“œ ์ถ”๊ฐ€ ๊ธฐ๋Šฅ ๊ตฌํ˜„

- FormProvider onBlur ์ถ”๊ฐ€
- ๋ฆฌ์ฝ”์ผ ์ƒํƒœ ๊ด€๋ฆฌ ๋ฐฉ์‹ ๋ณ€๊ฒฝ

Co-authored-by: Kyle <[email protected]>

* feat: cardState ์บ์‹œ ๋ฐ์ดํ„ฐ ์—…๋ฐ์ดํŠธ ํŠธ๋ฆฌ๊ฑฐ ์ถ”๊ฐ€

Co-authored-by: dudtjr913 <[email protected]>

* feat: ์นด๋“œ ์ถ”๊ฐ€ validator ๊ตฌํ˜„

* feat: ๋ถ๋งˆํฌ ์ˆ˜์ • ๊ตฌํ˜„

- debounce

Co-authored-by: dudtjr913 <[email protected]>

* feat: filter ํ›„ fetch

Co-authored-by: dudtjr913 <[email protected]>

* feat: ์นด๋“œ ์ˆ˜์ • ๊ธฐ๋Šฅ ๊ตฌํ˜„

Co-authored-by: Kyle <[email protected]>

* feat: ์นด๋“œ ์‚ญ์ œ ๊ธฐ๋Šฅ ๊ตฌํ˜„

Co-authored-by: Kyle <[email protected]>

Co-authored-by: dudtjr913 <[email protected]>
Co-authored-by: dudtjr913 <[email protected]>

* fix: UPDATE ,DELETE ๋ฉ”์„œ๋“œ CORS ํ—ˆ์šฉ (#243)

* feat: DataLoader ์‹ค์ œ ์–ด๋“œ๋ฏผ ์ •๋ณด ์ถ”๊ฐ€

* UI11 - ํŽ˜์ด์ง€ -> ๋ชจ๋‹ฌ (#248)

* fix: PublicQnACard ํƒ€์ž… ์˜ค๋ฅ˜ ์ˆ˜์ •

* fix: ๋ถ๋งˆํฌ ์ •๋ ฌ ์˜ค๋ฅ˜ ์ˆ˜์ •

Co-authored-by: dudtjr913 <[email protected]>

* refactor: ์นด๋“œ ์ถ”๊ฐ€ ํŽ˜์ด์ง€ -> ๋ชจ๋‹ฌ

Co-authored-by: dudtjr913 <[email protected]>

* refactor: ์นด๋“œ ์ˆ˜์ • ํŽ˜์ด์ง€ => ๋ชจ๋‹ฌ ๊ต์ฒด

Co-authored-by: Kyle <[email protected]>

* feat: ์นด๋“œ ์‚ญ์ œ confirm ์ถ”๊ฐ€

Co-authored-by: dudtjr913 <[email protected]>

* fix: modal์—์„œ ๋’ค๋กœ๊ฐ€๊ธฐ ์˜ค๋ฅ˜ ์ˆ˜์ •

* etc: ํ”„๋ก ํŠธ์—”๋“œ ํŒŒ์ดํ”„๋ผ์ธ ์„œ๋ธŒ๋ชจ๋“ˆ ์—…๋ฐ์ดํŠธ ์ถ”๊ฐ€

* W05 - ๊ณต์œ  ๋ฌธ์ œ์ง‘ ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ์„ ๊ฐœ์„ ํ•œ๋‹ค.  (#238)

* etc: ํŒจํ‚ค์ง€ ์œ„์น˜ ๋ณ€๊ฒฝ

* refactor: null๋กœ ๊ฒ€์ƒ‰ -> ๋”๋ฏธ ๋ฌธ์ œ์ง‘, ""๋กœ ๊ฒ€์ƒ‰ -> ๊ฒฐ๊ณผ์—†์Œ ์œผ๋กœ ๋ณ€๊ฒฝ

* etc: 	๋ถˆํ•„์š”ํ•œ import ์ œ๊ฑฐ

* refactor: ์˜ˆ์™ธ๋ช… ์ˆ˜์ •

* refactor: ๊ฒ€์ƒ‰์‹œ ๋ฐ˜๋“œ์‹œ ๊ฒ€์ƒ‰์–ด๋ฅผ ์ž…๋ ฅ๋ฐ›๋„๋ก ์ˆ˜์ •, ์ž…๋ ฅ๋ฐ›์ง€ ๋ชปํ•  ์‹œ ์˜ˆ์™ธ ํ•ธ๋“ค๋ง ์ถ”๊ฐ€

* refactor: ๊ฒ€์ƒ‰์— ๋ฐ˜๋“œ์‹œ ๊ฒ€์ƒ‰์–ด๊ฐ€ ํ•„์š”ํ•˜๋„๋ก ๋„๋ฉ”์ธ ์ˆ˜์ • *๋”๋ฏธ ๋ฌธ์ œ์ง‘ ๊ฒ€์ƒ‰์— ์‚ฌ์šฉ๋˜๋˜ NoSearchKeyword ์ œ๊ฑฐ)

* W06 - ๋ฌธ์ œ์ง‘ ๋ฌธ์„œํ™”, ์ธ์ˆ˜ ํ…Œ์ŠคํŠธ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค. (#247)

* etc: ํŒจํ‚ค์ง€ ์œ„์น˜ ๋ณ€๊ฒฝ

* refactor: null๋กœ ๊ฒ€์ƒ‰ -> ๋”๋ฏธ ๋ฌธ์ œ์ง‘, ""๋กœ ๊ฒ€์ƒ‰ -> ๊ฒฐ๊ณผ์—†์Œ ์œผ๋กœ ๋ณ€๊ฒฝ

* test: ๋ฌธ์ œ์ง‘ ๋ฌธ์„œํ™” ํ…Œ์ŠคํŠธ์— ๋น„ํšŒ์› ์กฐํšŒ, ๊ณต์œ  ๋ฌธ์ œ์ง‘ ๊ฒ€์ƒ‰ ์ถ”๊ฐ€

* refactor: ๋ฌธ์ œ์ง‘๋ณ„ ์นด๋“œ ๋ชจ์•„๋ณด๊ธฐ API์— ๋ชจ๋“  ์นด๋“œ ํ•„๋“œ๋ฅผ ์ฃผ๋„๋ก ๋ณ€๊ฒฝ

* refactor: ๋ฌธ์ œ์ง‘ ์กฐํšŒ์™€ ๊ฒ€์ƒ‰์— ํ•„์š”ํ•œ ํ•„๋“œ๋งŒ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ์ˆ˜์ •

* refactor: ๊ฐ๊ฐ ๋ฌธ์„œํ™” ํ…Œ์ŠคํŠธ์— ์กด์žฌํ•˜๋˜ AuthService, MockMvc ๋ถ€๋ชจ ํ…Œ์ŠคํŠธ๋กœ ์ด๋™

* refactor: ํ•„์š”์—†๋Š” ์‘๋‹ตํ•„๋“œ ์ œ๊ฑฐ, ํ‚ค์›Œ๋“œ ์—†์ด ๊ณต์œ  ๋ฌธ์ œ์ง‘ ๊ฒ€์ƒ‰ ํ…Œ์ŠคํŠธ ์ œ๊ฑฐ

* etc: ์ธ์ฆ๊ด€๋ จ ์ธํ„ฐ์…‰ํ„ฐ์—์„œ /api/workbooks ์ œ์™ธ, ํ† ํฐ ์ถ”์ถœ์— ์‹คํŒจํ•˜๋ฉด null์„ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ์ˆ˜์ •

* etc: ์ฝ”๋“œ ์ •๋ฆฌ

* test: ๋ฌธ์ œ์ง‘ ์ธ์ˆ˜ํ…Œ์ŠคํŠธ์— ๋น„ํšŒ์› ๋ฌธ์ œ์ง‘ ์กฐํšŒ, ๊ฒ€์ƒ‰ ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€

* refactor: queryParam ์‚ฌ์šฉํ•˜๋„๋ก ์ˆ˜์ •

* feat: ๋ฌธ์ œ์ง‘์„ ์ถ”๊ฐ€, ์ˆ˜์ •, ์‚ญ์ œํ•œ๋‹ค. (#252)

* feat: ํ•ด์‹œํƒœ๊ทธ ์ปดํฌ๋„ŒํŠธ ์ถ”๊ฐ€

Co-authored-by: Kyle <[email protected]>

* feat: Toggle ์ถ”๊ฐ€

Co-authored-by: dudtjr913 <[email protected]>

* feat: ๋ฌธ์ œ์ง‘ ์ถ”๊ฐ€ ๊ธฐ๋Šฅ ๊ตฌํ˜„

Co-authored-by: dudtjr913 <[email protected]>

* feat: ๋ฌธ์ œ์ง‘ ์ˆ˜์ • ๊ธฐ๋Šฅ ์ถ”๊ฐ€

Co-authored-by: Kyle <[email protected]>

* feat: ๋ฌธ์ œ์ง‘ ์‚ญ์ œ ๊ธฐ๋Šฅ ์ถ”๊ฐ€

Co-authored-by: dudtjr913 <[email protected]>
Co-authored-by: dudtjr913 <[email protected]>

* W08 - ๋ฌธ์ œ์ง‘ ์ถ”๊ฐ€, ์กฐํšŒ, ์ˆ˜์ •, ์‚ญ์ œ ๊ธฐ๋Šฅ์— User๋ฅผ ๋„์ž…ํ•œ๋‹ค. (#249)

* feat: Workbook ์ถ”๊ฐ€ api ๊ตฌํ˜„ ๋ฐ ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€

* refactor: put ๋ฉ”์„œ๋“œ์— params ์ธ์ž๋กœ ๋ฐ›๋„๋ก ์ˆ˜์ •

* feat: Workbook ์ˆ˜์ • api ๊ตฌํ˜„ ๋ฐ ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€

* etc: test yml์— ์žˆ๋Š” show-sql true ์‚ญ์ œ

* feat: Workbook ์‚ญ์ œ api ๊ตฌํ˜„ ๋ฐ ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€

* refactor: ํ•„์š”์—†๋Š” ๋ฉ”์„œ๋“œ ์‚ญ์ œ ๋ฐ ์ผ๋ถ€ ๋ฉ”์„œ๋“œ๋ช… ๋ณ€๊ฒฝ

* refactor: ์†Œํ”„ํŠธ ์‚ญ์ œ๋ฅผ workbook ์—”ํ‹ฐํ‹ฐ ๋ณ€๊ฒฝ๊ฐ์ง€๋ฅผ ์ด์šฉํ•˜๋„๋ก ์ˆ˜์ •

* refactor: ๋ฉ”์„œ๋“œ๋ช…์— ์žˆ๋Š” owned๋ฅผ author๋กœ ์ˆ˜์ •

* feat: ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•œ๋‹ค (#260)

* feat: ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ ์ถ”๊ฐ€

Co-authored-by: Kyle <[email protected]>

* feat: ๊ณต์œ  ํŽ˜์ด์ง€ ์ƒ์„ธ ๊ตฌํ˜„

Co-authored-by: dudtjr913 <[email protected]>

* refactor: recoil state ์ •๋ฆฌ

- public ์‚ญ์ œ
- initialState ํŒŒ์ผ ์ถ”๊ฐ€

Co-authored-by: Kyle <[email protected]>

* refactor: hook ์ •๋ฆฌ

Co-authored-by: dudtjr913 <[email protected]>

* refactor: custom hook์œผ๋กœ ๋กœ์ง ์ด๋™

Co-authored-by: Kyle <[email protected]>

Co-authored-by: dudtjr913 <[email protected]>
Co-authored-by: dudtjr913 <[email protected]>

* B37 - ๋ฐฑ์—”๋“œ ๋ ˆ์ด๋ธ”์ด ๋ถ™์ง€ ์•Š์€ ๊ฒฝ์šฐ ๋ฐฑ์—”๋“œ ์  ํ‚จ์Šค ๋นŒ๋“œ๋ฅผ ํ•˜์ง€ ์•Š๋Š”๋‹ค. (#266)

* etc: ๋ถˆํ•„์š”ํ•œ Jenkinsfile ์ œ๊ฑฐ

* etc: ๋ฐฑ์—”๋“œ ํ™˜๊ฒฝ ์‹คํ–‰ ๋ฐฉ๋ฒ• ์ˆ˜์ •

* B35 - api ์š”์ฒญ์„ intelliJ ์—์„œ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋„๋ก http ํŒŒ์ผ์„ ๋งŒ๋“ ๋‹ค. (#258)

* feat: ์นด๋“œ์™€ ์›Œํฌ๋ถ ๊ด€๋ จ ์š”์ฒญ ํŒŒ์ผ ์ถ”๊ฐ€

* feat: ๋ฌธ์ œ์ง‘ ์‚ญ์ œ ์š”์ฒญ ์ •๋ณด ์ถ”๊ฐ€

* feat: ๊ณต์œ  ๋ฌธ์ œ์ง‘ ๊ฒ€์ƒ‰ ์š”์ฒญ ์ •๋ณด ์ถ”๊ฐ€

* feat: ํ€ด์ฆˆ ์ƒ์„ฑ api ์š”์ฒญ ์ถ”๊ฐ€

* feat: ๊ด€๋ฆฌ์ž ๋ฌธ์ œ์ง‘ ์ถ” api ์š”์ฒญ ์ถ”๊ฐ€

* feat: ๋กœ๊ทธ์ธ ๋ฐ ์œ ์ € ๊ด€๋ จ ์š”์ฒญ ์ •๋ณด ์ถ”๊ฐ€

* B36 - ์ผ๋ฐ˜ ์œ ์ € ์ƒ์„ฑ์„ DataLoader ์— ์ถ”๊ฐ€ํ•œ๋‹ค. (#263)

* feat: ๋กœ์ปฌ ํ™˜๊ฒฝ์— ์ผ๋ฐ˜ ์œ ์ € ์ •๋ณด ์ถ”๊ฐ€

* refactor: DataJpaTest ์—์„œ show sql ์„ค์ • false ๋กœ ๋ณ€๊ฒฝ

* refactor: dml์— ์ž„์˜๋กœ ์ƒ์„ฑํ•œ ์œ ์ € ์ •๋ณด ์ถ”๊ฐ€

* feat: DataLoader๋กœ ์ €์žฅ๋˜๋Š” ๋ฌธ์ œ์ง‘ ์ค‘ ์ฒซ ์„ธ ๊ฐœ๋Š” ์–ด๋“œ๋ฏผ์œผ๋กœ ๋“ฑ๋กํ•˜๊ณ  ๋‚˜๋จธ์ง€๋Š” ์ผ๋ฐ˜ ์œ ์ €๋กœ ๋“ฑ๋ก

* C07 - Card CRUD์— ์œ ์ € ์ถ”๊ฐ€  (#256)

* fix&feat: CardUpdate ์‹œ 2๊ฐœ ์ถ”๊ฐ€๋˜๋Š” ๋ฒ„๊ทธ ์ˆ˜์ • ๋ฐ ๋กœ๊ทธ์ธํ•œ ํšŒ์›๋งŒ ์นด๋“œ ์ถ”๊ฐ€ํ•˜๋Š” ๊ธฐ๋Šฅ ๊ตฌํ˜„

* feat&test: ์นด๋“œ ์ˆ˜์ •, ์‚ญ์ œ ๊ธฐ๋Šฅ์„ ๋กœ๊ทธ์ธ ์‚ฌ์šฉ์ž๋งŒ ๊ฐ€๋Šฅํ•˜๋„๋ก ๊ตฌํ˜„ ๋ฐ ํ…Œ์ŠคํŠธ

* refactor&test: soft delete ๋ฐฉ์‹ ์ˆ˜์ • ๋ฐ ์นด๋“œ CUD ๋ฐ ๋„๋ฉ”์ธ ๊ด€๋ จ ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€

* refactor: Workbook null ํ—ˆ์šฉํ•˜๋„๋ก ๋ณ€๊ฒฝ ๋ฐ ์ž„์‹œ ์›Œํฌ๋ถ ์ œ๊ฑฐ

* etc: jenkins ํ…Œ์ŠคํŠธ ์ปค๋ฐ‹

* feat: ์นด๋“œ ์‚ญ์ œ ์‹œ ๋ฌธ์ œ์ง‘์—์„œ๋„ ์‚ญ์ œ๋˜๋„๋ก ๋ณ€๊ฒฝ

* fix: ์นด๋“œ ์‚ญ์ œ ์‹œ workbook์ด ๋„์ผ ๋•Œ ์กฐ๊ฑด ์ถ”๊ฐ€ ๋ฐ C07 ๋ฐ˜์˜ ์•ˆ๋œ ๋ณ€๊ฒฝ์‚ฌํ•ญ ์ถ”๊ฐ€ (#273)

* feat: ๋ฐ”๋กœ ํ’€์–ด๋ณด๊ธฐ ๊ธฐ๋Šฅ ๋ฐ ๋ฌธ์ œ ๊ฐ€์ ธ์˜ค๊ธฐ UI๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค (#276)

* etc: ํ™˜๊ฒฝ์„ค์ •

- react-refresh
- fort-ts-checker-webpack-plugin

Co-authored-by: dudtjr913 <[email protected]>

* etc: ํ™˜๊ฒฝ์„ค์ •

- babel.config.js ์ •๋ฆฌ

Co-authored-by: dudtjr913 <[email protected]>

* feat: ๋ฐ”๋กœ ํ’€๊ธฐ ๊ธฐ๋Šฅ ๊ตฌํ˜„

* etc: cross-env ์ถ”๊ฐ€

- QuizPage์•ˆ์œผ๋กœ Header ์ด๋™

Co-authored-by: Kyle <[email protected]>

* fix: ๋ฌธ์ œ์ง‘์ด ์—†์„ ๊ฒฝ์šฐ ํ€ด์ฆˆ ์„ค์ • ํŽ˜์ด์ง€๋กœ ์ด๋™ ๋ชปํ•˜๋„๋ก ๋ณ€๊ฒฝ

Co-authored-by: Kyle <[email protected]>

* feat: SelectBox ์ปดํฌ๋„ŒํŠธ ์ถ”๊ฐ€

Co-authored-by: Kyle <[email protected]>

* feat: SelectBox Modal UI ๊ตฌํ˜„ ์™„๋ฃŒ

Co-authored-by: Kyle <[email protected]>

* etc: ํŒŒ์ดํ”„๋ผ์ธ ์ˆœ์„œ ๋ณ€๊ฒฝ

- test ํ›„ build

Co-authored-by: Kyle <[email protected]>

Co-authored-by: imgwang-yeol <[email protected]>

* fix: http-file-appender.xml ์˜คํƒ€ ์ˆ˜์ •

* fix: ์Šคํ”„๋ง ์žฌ์‹œ์ž‘์‹œ ๋กœ๊ทธ ํŒŒ์ผ ์ œ๋ชฉ์— ๋‚ ์งœ ํฌํ•จ๋˜๋„๋ก ์ˆ˜์ • (#278)

* feat: ๋‹ค์Œ์— ๋˜ ๋ณด๊ธฐ ๊ธฐ๋Šฅ ๊ตฌํ˜„ (#280)

Co-authored-by: dudtjr913 <[email protected]>

* fix: ํ€ด์ฆˆ ์ƒ์„ฑ์‹œ ๋˜ ๋ณด๊ธฐ ์ทจ์†Œ ๊ธฐ๋Šฅ ์˜ค์ž‘๋™ ์ˆ˜์ •

* etc: application ์„ค์ •์—์„œ ๋กœ๊น… ์„ค์ • ์ œ๊ฑฐ (#282)

* feat: ๋‚ด ๋ฌธ์ œ์ง‘์œผ๋กœ ๊ฐ€์ ธ๊ฐ€๊ธฐ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•œ๋‹ค (#284)

* etc: import ์ •๋ฆฌ

Co-authored-by: dudtjr913 <[email protected]>

* feat: ๋ฌธ์ œ์ง‘์œผ๋กœ ๊ฐ€์ ธ์˜ค๊ธฐ ๊ธฐ๋Šฅ ๊ตฌํ˜„

Co-authored-by: dudtjr913 <[email protected]>

* fix: ์ „์ฒด์ ์ธ ์ฝ”๋“œ ํ๋ฆ„ ๋ณ€๊ฒฝ

Co-authored-by: Kyle <[email protected]>

Co-authored-by: imgwang-yeol <[email protected]>

* F18 - ์ „์ฒด์ ์ธ ๋””์ž์ธ ๋ฆฌํ„ฐ์น˜ (#286)

* feat: ๊ฒ€์ƒ‰ ์ค‘ ๊ฐœ๊ตฌ๋ฆฌ ์ด๋ฏธ์ง€ ์ถ”๊ฐ€

Co-authored-by: Kyle <[email protected]>

* feat: PublicCardLoadable ๊ตฌํ˜„

Co-authored-by: dudtjr913 <[email protected]>

* etc: textarea ํฌ์ปค์Šค ์ ์šฉ

Co-authored-by: dudtjr913
[email protected]
[email protected]
<[email protected]>

Co-authored-by: dudtjr913 <[email protected]>
Co-authored-by: dudtjr913 <[email protected]>

* W09 - ๋ฌธ์ œ์ง‘์œผ๋กœ ์นด๋“œ ๊ฐ€์ ธ๊ฐ€๊ธฐ (#267)

* fix&feat: CardUpdate ์‹œ 2๊ฐœ ์ถ”๊ฐ€๋˜๋Š” ๋ฒ„๊ทธ ์ˆ˜์ • ๋ฐ ๋กœ๊ทธ์ธํ•œ ํšŒ์›๋งŒ ์นด๋“œ ์ถ”๊ฐ€ํ•˜๋Š” ๊ธฐ๋Šฅ ๊ตฌํ˜„

* feat&test: ์นด๋“œ ์ˆ˜์ •, ์‚ญ์ œ ๊ธฐ๋Šฅ์„ ๋กœ๊ทธ์ธ ์‚ฌ์šฉ์ž๋งŒ ๊ฐ€๋Šฅํ•˜๋„๋ก ๊ตฌํ˜„ ๋ฐ ํ…Œ์ŠคํŠธ

* refactor&test: soft delete ๋ฐฉ์‹ ์ˆ˜์ • ๋ฐ ์นด๋“œ CUD ๋ฐ ๋„๋ฉ”์ธ ๊ด€๋ จ ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€

* feat: ๋‚ด ๋ฌธ์ œ์ง‘์œผ๋กœ ์นด๋“œ ๊ฐ€์ ธ์˜ค๊ธฐ ๊ธฐ๋Šฅ ์ดˆ์•ˆ ๊ตฌํ˜„

* refactor: Workbook null ํ—ˆ์šฉํ•˜๋„๋ก ๋ณ€๊ฒฝ ๋ฐ ์ž„์‹œ ์›Œํฌ๋ถ ์ œ๊ฑฐ

* feat: Card ๋ณ€๊ฒฝ์‚ฌํ•ญ ๋ฐ˜์˜

* refactor: workbook์—์„œ ์นด๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋„๋ก ์ˆ˜์ •

* refactor: scrapCard ๋ฉ”์„œ๋“œ ์ˆ˜์ •

* refactor&test: ๋ฉ”์„œ๋“œ ๋ถ„๋ฆฌ ๋ฐ ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€

* test: ๋ฌธ์ œ์ง‘์œผ๋กœ ์นด๋“œ ๊ฐ€์ ธ์˜ค๊ธฐ ๊ด€๋ จ ํ…Œ์ŠคํŠธ ๊ตฌํ˜„

* fix: ํ…Œ์ŠคํŠธ ๋ฉ”์„œ๋“œ๋ฅผ delete -> post๋กœ ์ˆ˜์ •

* feat: ํ”ผ์ผ€์ด, ์˜ค์ฆˆ ๋ฆฌ๋ทฐ ๋ฐ˜์˜ ๋ฐ DataLoader ์–ด๋“œ๋ฏผ์œ ์ € profile url ๋ณ€๊ฒฝ

* refactor: ๋ฌธ์ œ์ง‘์œผ๋กœ ์นด๋“œ ๊ฐ€์ ธ์˜ค๊ธฐ ์‘๋‹ต ๋ณ€๊ฒฝ

* refactor: ์นด๋“œ ์Šคํฌ๋žฉ ์‹œ ์นด๋“œ ์•„์ด๋””์— ๋Œ€ํ•œ ๊ฒฝ์šฐ์˜ ์ˆ˜ ์ถ”๊ฐ€ ๋ฐ ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€

* test: ์š”์ฒญ์ด ๋น„์–ด์žˆ๋Š” ๊ฒฝ์šฐ์— ๋Œ€ํ•œ ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€

* refactor: ํ”ผ์ผ€์ด ๋ฆฌ๋ทฐ ๋ฐ˜์˜ ๋ฐ ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€

* W10 - ๋ฌธ์ œ์ง‘ ์‚ญ์ œ์‹œ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์นด๋“œ๋„ ์‚ญ์ œํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๊ณ  ์ฝ”๋“œ ์ผ๋ถ€๋ฅผ ๋ฆฌํŒฉํ„ฐ๋งํ•œ๋‹ค. (#271)

* refactor: WorkbookService ๋‚ด ๋ฉ”์„œ๋“œ ๋ถ„๋ฆฌ

* feat: ๋ฌธ์ œ์ง‘ ์‚ญ์ œ์‹œ ์นด๋“œ๋„ ์‚ญ์ œ๋˜๋„๋ก ์ˆ˜์ •

* refactor: ์ž‘์„ฑ์ž ๊ฒ€์ฆ ๋กœ์ง์„ ์„œ๋น„์Šค๋กœ ์ด๋™ ๋ฐ ํ…Œ์ŠคํŠธ ์ˆ˜์ •

* refactor: ๋ฌธ์ œ์ง‘ ์‚ญ์ œ์‹œ ์นด๋“œ ์‚ญ์ œ ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€ ๋ฐ ๊ด€๋ จ ๋ฉ”์„œ๋“œ ์ˆ˜์ •

* refactor: ๋ฌธ์ œ์ง‘ ์ƒ์„ฑ api created uri ๋ณ€๊ฒฝ

* refactor: ํ”ผ์ผ€์ด ๋ฆฌ๋ทฐ ๋ฐ˜์˜

* refactor: ์ค‘๊ฐ„๊ณฐ ๋ฆฌ๋ทฐ ๋ฐ˜์˜

* refactor: ํ•„์š”์—†๋Š” ๋ฉ”์„œ๋“œ ์‚ญ์ œ ๋ฐ ๋ฉ”์„œ๋“œ๋ช… ์ˆ˜์ •

* refactor: ๋ผ์šฐํ„ฐ ์ •๋ฆฌ (#290)

Co-authored-by: dudtjr913
<[email protected]>

* etc: react-ga ์ถ”๊ฐ€ (#293)

Co-authored-by: Kyle <[email protected]>

* etc: ์„œ๋ธŒ๋ชจ๋“ˆ ์—…๋ฐ์ดํŠธ

Co-authored-by: Kyle <[email protected]>

* etc: main.js ํŒŒ์ผ ์ด๋ฆ„ ๋ฒ„์ „์— ๋งž๋„๋ก ๋ณ€๊ฒฝ

* T01 - ๋ฌธ์ œ์ง‘ CRUD์— ํƒœ๊ทธ ์ถ”๊ฐ€ (#275)

* feat: TagName ๋„๋ฉ”์ธ ์ƒ์„ฑ

* feat: TagNames ๋„๋ฉ”์ธ ์ƒ์„ฑ

* feat: ํƒœ๊ทธ ์—”ํ‹ฐํ‹ฐ ์ƒ์„ฑ

* feat: TagRepository ์ถ”๊ฐ€

* feat: Tag ์ƒ์„ฑ ์‹œ null ๊ฒ€์ฆ ์ถ”๊ฐ€

* feat: ๋ฌธ์ œ์ง‘๊ณผ ํƒœ๊ทธ์˜ n:m ๊ด€๊ณ„์˜ ์ค‘๊ฐ„ ํ…Œ์ด๋ธ” ์ƒ์„ฑ ๋ชฉ์ ์œผ๋กœ WorkbookTag ์—”ํ‹ฐํ‹ฐ ์ถ”๊ฐ€

* feat: ๋ฌธ์ œ์ง‘ ์—์„œ ์“ฐ์ด๋Š” DTO์— ํƒœ๊ทธ ๊ด€๋ จ ํ•„๋“œ ๋ฐ ๊ฒ€์ฆ ์ถ”๊ฐ€

* feat: Tag๋ฅผ String์œผ๋กœ ์ƒ์„ฑํ•˜๋Š” ํŒฉํ† ๋ฆฌ ๋ฉ”์„œ๋“œ ์ถ”๊ฐ€

* feat: TagService ์ถ”๊ฐ€

* feat: ์ƒ์„ฑ์ž ์ธ์ž๋ฅผ ํ•„๋“œ์™€ ๊ฐ™์€ ํƒ€์ž…์œผ๋กœ ์ˆ˜์ •, null ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€

* feat: ์˜ˆ์™ธ ๋ฉ”์‹œ์ง€ ์ˆ˜์ •

* feat: Tags ๋ถ„๋ฆฌ

* feat: ๋ฌธ์ œ์ง‘ ์ถ”๊ฐ€์™€ ํ•จ๊ป˜ ํƒœ๊ทธ๋„ ์ถ”๊ฐ€

* feat: ๋ฌธ์ œ์ง‘ ์ˆ˜์ •๊ณผ ์‚ญ์ œ์— ํƒœ๊ทธ ์ถ”๊ฐ€

* feat: ๋ฌธ์„œํ™” ํ…Œ์ŠคํŠธ ์ˆ˜์ •

* etc: import ์ •๋ฆฌ

* etc: ddl, dml, DataLoader ์ถ”๊ฐ€

* etc: ํ…Œ์ด๋ธ” ์ƒ์„ฑ ์‹œ ํ•„๋“œ ์ด๋ฆ„ name์œผ๋กœ ์ƒ์„ฑ๋˜๊ฒŒ ๋ณ€๊ฒฝ

* feat: WorkbookTagRepository ์ถ”๊ฐ€

* test: Workbook ์ถ”๊ฐ€, ์‚ญ์ œ์‹œ WorkbookTag ์™€ Tag์˜ cascade์— ๋Œ€ํ•œ ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€

* test: ๋ฌธ์ œ์ง‘ ์ˆ˜์ • ์š”์ฒญ์—์„œ opened ํ•„๋“œ๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€

* refactor: ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ์—์„œ ๋ฐ์ดํ„ฐ ๋กœ๋”๊ฐ€ ์‹คํ–‰๋˜์–ด ์ถ”๊ฐ€

* refactor: TagService๋กœ TagRequest๋ฅผ ์ „๋‹ฌํ•˜๋„๋ก ์ˆ˜์ •, TagNames ์‚ญ์ œ ์ค‘๋ณต ์ œ๊ฑฐ ๋กœ์ง์„ converTags ๋ฉ”์„œ๋“œ๋กœ ์œ„์ž„

* feat: WorkbookTag ์†Œํ”„ํŠธ ๋”œ๋ฆฌํŠธ๋กœ ์ˆ˜์ •

* feat: ์กฐ์•ค ๋ฆฌ๋ทฐ ๋ฐ˜์˜ (from -> of, new ArrayList<>() ์‚ญ์ œ)

* fix: Post ์š”์ฒญ์‹œ tags๋ฅผ ์ „๋‹ฌํ•˜์ง€ ์•Š์œผ๋ฉด ๋ฐœ์ƒํ•˜๋˜ ์—๋Ÿฌ ์ˆ˜์ •

* fix: ๋ฌธ์ œ์ง‘ api ์ˆ˜์ • (#296)

Co-authored-by: Kyle <[email protected]>

* W13 - ๊ณต์œ  ๋ฌธ์ œ์ง‘ ์ƒ์„ธ๋ณด๊ธฐ api๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค.  (#295)

* feat: TagName ๋„๋ฉ”์ธ ์ƒ์„ฑ

* feat: TagNames ๋„๋ฉ”์ธ ์ƒ์„ฑ

* feat: ํƒœ๊ทธ ์—”ํ‹ฐํ‹ฐ ์ƒ์„ฑ

* feat: TagRepository ์ถ”๊ฐ€

* feat: Tag ์ƒ์„ฑ ์‹œ null ๊ฒ€์ฆ ์ถ”๊ฐ€

* feat: ๋ฌธ์ œ์ง‘๊ณผ ํƒœ๊ทธ์˜ n:m ๊ด€๊ณ„์˜ ์ค‘๊ฐ„ ํ…Œ์ด๋ธ” ์ƒ์„ฑ ๋ชฉ์ ์œผ๋กœ WorkbookTag ์—”ํ‹ฐํ‹ฐ ์ถ”๊ฐ€

* feat: ๋ฌธ์ œ์ง‘ ์—์„œ ์“ฐ์ด๋Š” DTO์— ํƒœ๊ทธ ๊ด€๋ จ ํ•„๋“œ ๋ฐ ๊ฒ€์ฆ ์ถ”๊ฐ€

* feat: Tag๋ฅผ String์œผ๋กœ ์ƒ์„ฑํ•˜๋Š” ํŒฉํ† ๋ฆฌ ๋ฉ”์„œ๋“œ ์ถ”๊ฐ€

* feat: TagService ์ถ”๊ฐ€

* feat: ์ƒ์„ฑ์ž ์ธ์ž๋ฅผ ํ•„๋“œ์™€ ๊ฐ™์€ ํƒ€์ž…์œผ๋กœ ์ˆ˜์ •, null ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€

* feat: ์˜ˆ์™ธ ๋ฉ”์‹œ์ง€ ์ˆ˜์ •

* feat: Tags ๋ถ„๋ฆฌ

* feat: ๋ฌธ์ œ์ง‘ ์ถ”๊ฐ€์™€ ํ•จ๊ป˜ ํƒœ๊ทธ๋„ ์ถ”๊ฐ€

* feat: ๋ฌธ์ œ์ง‘ ์ˆ˜์ •๊ณผ ์‚ญ์ œ์— ํƒœ๊ทธ ์ถ”๊ฐ€

* feat: ๋ฌธ์„œํ™” ํ…Œ์ŠคํŠธ ์ˆ˜์ •

* etc: import ์ •๋ฆฌ

* etc: ddl, dml, DataLoader ์ถ”๊ฐ€

* etc: ํ…Œ์ด๋ธ” ์ƒ์„ฑ ์‹œ ํ•„๋“œ ์ด๋ฆ„ name์œผ๋กœ ์ƒ์„ฑ๋˜๊ฒŒ ๋ณ€๊ฒฝ

* feat: WorkbookTagRepository ์ถ”๊ฐ€

* test: Workbook ์ถ”๊ฐ€, ์‚ญ์ œ์‹œ WorkbookTag ์™€ Tag์˜ cascade์— ๋Œ€ํ•œ ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€

* test: ๋ฌธ์ œ์ง‘ ์ˆ˜์ • ์š”์ฒญ์—์„œ opened ํ•„๋“œ๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€

* refactor: ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ์—์„œ ๋ฐ์ดํ„ฐ ๋กœ๋”๊ฐ€ ์‹คํ–‰๋˜์–ด ์ถ”๊ฐ€

* refactor: TagService๋กœ TagRequest๋ฅผ ์ „๋‹ฌํ•˜๋„๋ก ์ˆ˜์ •, TagNames ์‚ญ์ œ ์ค‘๋ณต ์ œ๊ฑฐ ๋กœ์ง์„ converTags ๋ฉ”์„œ๋“œ๋กœ ์œ„์ž„

* feat: WorkbookTag ์†Œํ”„ํŠธ ๋”œ๋ฆฌํŠธ๋กœ ์ˆ˜์ •

* feat: ์กฐ์•ค ๋ฆฌ๋ทฐ ๋ฐ˜์˜ (from -> of, new ArrayList<>() ์‚ญ์ œ)

* feat: ์ธํ„ฐ์…‰ํ„ฐ ํ†ต๊ณผํ•˜์ง€ ์•Š๋Š” ๊ณต์œ  ๋ฌธ์ œ์ง‘ ์กฐํšŒ ๊ฒฝ๋กœ ์ถ”๊ฐ€

* feat: ์ƒํ™ฉ์— ๋”ฐ๋ฅธ ๋‹ค๋ฅธ ์ •๋ณด๋ฅผ ๋‹ด๊ธฐ ์œ„ํ•ด CardResponse์— JsonInclude ์ถ”๊ฐ€

* feat: ๊ณต์œ  ๋ฌธ์ œ์ง‘ ์ƒ์„ธ์กฐํšŒ api ๊ตฌํ˜„

* test: ๊ณต์œ  ๋ฌธ์ œ์ง‘ ์ƒ์„ธ์กฐํšŒ api ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€

* refactor: WorkbookCardResponse ์ •์  ํŒฉํ† ๋ฆฌ ๋ฉ”์„œ๋“œ ์ถ”๊ฐ€

* feat: ๊ณต์œ  ๋ฌธ์ œ์ง‘ ์ƒ์„ธ๋ณด๊ธฐ api ๋ฌธ์„œํ™” ๋ฐ ์š”์ฒญ ์ •๋ณด ์ถ”๊ฐ€

* refactor: WorkbookCardResponse ์˜ ํƒœ๊ทธ ์‘๋‹ต ํ•„๋“œ ์ด๋ฆ„ ๋ณ€๊ฒฝ

Co-authored-by: seunghyun <[email protected]>

* etc: ddl, dml ๋ณ€๊ฒฝ

* refactor: ์ „์ฒด์ ์ธ ๋””์ž์ธ ์ˆ˜์ • ๋ฐ ๋ฒ„๊ทธ ํ•ด๊ฒฐ (#299)

Co-authored-by: Kyle <[email protected]>

* fix: ๊ณต์œ  ํŽ˜์ด์ง€์˜ ํŠน์ • ์‹œ์ ์— ์บ์‹ฑ ๋ฌดํšจํ™”

Co-authored-by: Kyle <[email protected]>

* etc: ๋ฒ„์ „ 0.2.0 ์—…๋ฐ์ดํŠธ

Co-authored-by: Kyle <[email protected]>

* C09 - ๋กœ๊ทธ์ธํ•œ ํšŒ์›๋งŒ ๋‹ค์Œ์— ๋˜๋ณด๊ธฐ ๊ฐ€๋Šฅํ•˜๋„๋ก API ์ˆ˜์ • (#288)

* feat&test: ๋กœ๊ทธ์ธํ•œ ์‚ฌ์šฉ์ž๋งŒ ๋‹ค์Œ์— ๋˜๋ณด๊ธฐ ๊ฐ€๋Šฅํ•˜๋„๋ก ๊ธฐ๋Šฅ ๊ตฌํ˜„ ๋ฐ ํ…Œ์ŠคํŠธ

* etc: ์˜คํƒ€ ์ˆ˜์ •

* etc: ์„œ๋ธŒ๋ชจ๋“ˆ ์—…๋ฐ์ดํŠธ

* etc: ๋กœ๊ทธ์ธ oauth ์ •๋ณด botobo-team ์ •๋ณด๋กœ ๊ต์ฒด (#306)

* refactor: ๋ชจ๋‹ฌ ๊ด€๋ จ ์ด์Šˆ ์ •๋ฆฌ (#309)

- ์นด๋“œ ์ถ”๊ฐ€, ์ˆ˜์ •
- selectbox

Co-authored-by: dudtjr913
<[email protected]>

* refactor: ์†Œ๊ทœ๋ชจ ๋ฆฌํŒฉํ† ๋ง (#317)

* etc: ์ถฉ๋Œ ํ•ด๊ฒฐ

* refactor: CardsPage ๋ฆฌํŒฉํ† ๋ง

- cardInfo ์ง€์—ญ ์ƒํƒœ๋กœ ๋ณ€๊ฒฝ

Co-authored-by: Kyle <[email protected]>

* refactor: ์ „์—ญ ์ƒํƒœ -> ์ง€์—ญ ์ƒํƒœ๋กœ ๋ณ€๊ฒฝ

- publicCardState

Co-authored-by: dudtjr913
<[email protected]>

* etc: xmldom ์ทจ์•ฝ์„ฑ ํ•ด๊ฒฐ

Co-authored-by: Kyle <[email protected]>

Co-authored-by: seovalue <[email protected]>
Co-authored-by: Kyle <[email protected]>

* refactor: ํŽ˜์ด์ง€ ํ—ค๋” -> ๋ฉ”์ธ ํ—ค๋” ๊ต์ฒด (#319)

Co-authored-by: Kyle <[email protected]>

* refactor: ๋Œ€๊ทœ๋ชจ ๋ฆฌํŒฉํ† ๋ง (#321)

* refactor: ๋ฆฌํŒฉํ† ๋ง

- cardform autofocus
- workbookadd ๋นˆ ํƒœ๊ทธ ์ž…๋ ฅ ์˜ค๋ฅ˜ ์ˆ˜์ •
- route ๊ฒฝ๋กœ ์ •๋ฆฌ
- ๋กœ๋”ฉ ์• ๋‹ˆ๋ฉ”์ด์…˜ ์ˆ˜์ •

Co-authored-by: dudtjr913 <[email protected]>

* feat: ๋‚ด ๋ฌธ์ œ์ง‘์œผ๋กœ ๊ฐ€์ ธ์˜ค๊ธฐ default option ๊ตฌํ˜„

Co-authored-by: dudtjr913 <[email protected]>

* C10 - ๋˜ ๋ณด๊ธฐ ์นด๋“œ ๋“ฑ๋ก ๊ด€๋ จ ํ…Œ์ŠคํŠธ ๋ฆฌํŒฉํ† ๋ง์„ ํ•œ๋‹ค. (#303)

* test: ํ€ด์ฆˆ๋ฅผ ์œ„ํ•œ ์นด๋“œ์˜ ๋˜๋ณด๊ธฐ ์˜ต์…˜์ด false ๋กœ ๋ฐ”๋€Œ์—ˆ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค

* etc: ์นดํ…Œ๊ณ ๋ฆฌ ๊ด€๋ จ ๋‚ด์šฉ ์ˆ˜์ •

* etc: import.sql ์ œ๊ฑฐ

* fix: ๋˜ ๋ณด๊ธฐ ํฌํ•จ ํ€ด์ฆˆ ์ƒ์„ฑ ์ธ์ˆ˜ ํ…Œ์ŠคํŠธ ๋ฒ„๊ทธ ์ˆ˜์ •

* etc: ์กฐ์•ค ๋ฆฌ๋ทฐ ๋ฐ˜์˜ ๋ฐ ํ€ด์ฆˆ ์š”์ฒญ ์ •๋ณด Host ๋ณ€๊ฒฝ

* W11, W12, W14 - ์ž์‹ ์˜ ๋ฌธ์ œ์ง‘๋งŒ ์นด๋“œ ๋ชจ์•„๋ณด๊ธฐ ์ถ”๊ฐ€ ๋ฐ ๋ฌธ์ œ์ง‘ ์ธ์ˆ˜ํ…Œ์ŠคํŠธ ๋ฆฌํŒฉํ„ฐ๋ง (#307)

* feat: ์นด๋“œ ๋ชจ์•„๋ณด๊ธฐ์—์„œ ์ž์‹ ์˜ ๋ฌธ์ œ์ง‘๋งŒ ๋ณผ ์ˆ˜ ์žˆ๋„๋ก ์ˆ˜์ •

* refactor: ๋ฌธ์ œ์ง‘ ์ธ์ˆ˜ํ…Œ์ŠคํŠธ ์ „์ฒด ๋ฆฌํŒฉํ„ฐ๋ง

* docs: ๋ฌธ์ œ์ง‘ ๊ฐ€์ ธ์˜ค๊ธฐ asciidoc ์ถ”๊ฐ€

* refactor: ํ”ผ๋“œ๋ฐฑ ๋ฐ˜์˜

* refactor: ์ค‘๊ฐ„๊ณฐ ํ”ผ๋“œ๋ฐฑ ๋ฐ˜์˜

* B38 - RequestBuilder ๋ฆฌํŒฉํ† ๋ง (#310)

* refactor: RequestBuilder ๋ฆฌํŒฉํ† ๋ง ๋ฐ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ํด๋ž˜์Šค ์ œ๊ฑฐ

* etc: DocumentationUtils host๋ฅผ botobo.kro.kr๋กœ ๋ณ€๊ฒฝ

* refactor: PK ๋ฆฌ๋ทฐ ๋ฐ˜์˜

* refactor: parameter ์—†์ด ์‚ฌ์šฉํ•˜๋Š” ์œ ์ € ์—†์Œ ํ…Œ์ŠคํŠธ ์‹œ ์‚ฌ์šฉํ•˜๋Š” auth๋ฅผ failAuth๋กœ ๋ช…์นญ ๋ณ€๊ฒฝ

* etc: requestBuilder ์„ค๋ช… ์ถ”๊ฐ€

* refactor: ๋ฌธ์ œ์ง‘ ๊ฐ€์ ธ๊ฐ€๊ธฐ์—์„œ [๊ณต์œ ] ์ถ”๊ฐ€ (#324)

Co-authored-by: Kyle <[email protected]>

* etc: submodule ๋™๊ธฐํ™”

* B41 - ๊ฒฝ๋กœ์™€ HttpMethod๋ฅผ ์ด์šฉํ•ด ์ธํ„ฐ์…‰ํ„ฐ ์„ค์ • ๊ฐ€๋Šฅํ•˜๋„๋ก ์ˆ˜์ • ๋ฐ /api/workbooks ๊ฒฝ๋กœ๋ฅผ ์ธํ„ฐ์…‰ํ„ฐ์— ์ถ”๊ฐ€ํ•œ๋‹ค. (#322)

* feat: ๊ฒฝ๋กœ์™€ HttpMethod๋กœ interceptor ์„ค์ • ๊ฐ€๋Šฅํ•˜๋„๋ก ๊ตฌํ˜„

* refactor: ํ”ผ๋“œ๋ฐฑ ๋ฐ˜์˜

* test: PathMatcherInterceptor ๊ด€๋ จ ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€

* feat: ํ€ด์ฆˆ ํŽ˜์ด์ง€์˜ ์นด๋“œ ์Šฌ๋ผ์ด๋“œ๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค (#326)

* feat: ์นด๋“œ ์Šฌ๋ผ์ด๋“œ ๊ธฐ๋Šฅ ๊ตฌํ˜„

* fix: ์นด๋“œ ์›€์ง์ด๋Š” ์‹œ๊ฐ„ 0.1์ดˆ๋กœ ์ˆ˜์ •

* Q15 - ํ€ด์ฆˆ ์„ค์ •์— ํ€ด์ฆˆ ๊ฐœ์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค. (#316)

* feat&test: Quiz ์ƒ์„ฑ ์‹œ ํšŒ์›์ธ์ง€ ํ™•์ธ ๋ฐ ํ€ด์ฆˆ ์š”์ฒญ์— ๊ฐœ์ˆ˜ ์ถ”๊ฐ€

* etc: develop ๋ณ€๊ฒฝ์‚ฌํ•ญ ๋ฐ˜์˜

* feat: ๋‚ด ์›Œํฌ๋ถ์—์„œ ์ƒ์„ฑ๋œ ํ€ด์ฆˆ์ธ์ง€ ๊ฒ€์ฆ ์ถ”๊ฐ€

* feat: ๋ฉ”์ธ ํ—ค๋”์˜ ๋ฉ”๋‰ด๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค (#330)

* feat: ๋“œ๋กญ๋‹ค์šด ๋ฉ”๋‰ด ๊ตฌํ˜„

* feat: LogoutPage ๊ตฌํ˜„

* etc: ๋ฆฌ๋ทฐ ๋ฐ˜์˜

- ์ปจ๋ฒค์…˜
- role naming
- ์• ๋‹ˆ๋ฉ”์ด์…˜ ์†๋„

* etc: ์„œ๋ธŒ๋ชจ๋“ˆ ๋™๊ธฐํ™”

* feat: ์œ ์ €์˜ ๋งˆ์ด ํŽ˜์ด์ง€๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค (#333)

* etc: ํ•„์š”์—†๋Š” import ๊ตฌ๋ฌธ ์ •๋ฆฌ

* feat: ์œ ์ € ํ”„๋กœํ•„ ํŽ˜์ด์ง€ ๊ตฌํ˜„

* etc: ImageEditor ์œ„์น˜ ๊ณ ์ •

* feat: TextField ์ถ”๊ฐ€

* fix: z-index ์˜ค๋ฅ˜ ์ˆ˜์ •

* etc: ํ•„์š”์—†๋Š” css ์†์„ฑ ์ œ๊ฑฐ

* etc: ์„œ๋ธŒ๋ชจ๋“ˆ ๋™๊ธฐํ™”

* U06 - ๋งˆ์ดํŽ˜์ด์ง€ ํ”„๋กœํ•„ ์‚ฌ์ง„ ์ˆ˜์ • api ๊ตฌํ˜„  (#332)

* feat: ๋‚ด ์ •๋ณด ์ˆ˜์ • api ๋ผˆ๋Œ€ ์ฝ”๋“œ ์ž‘์„ฑ

* feat: S3 ํŒŒ์ผ ์—…๋กœ๋“œ ๊ธฐ๋Šฅ ๊ตฌํ˜„

* feat: Multipartfile ์—…๋กœ๋“œ ๊ด€๋ จ ์„ค์ • ์ถ”๊ฐ€

* feat: FileNameGenerator์— BASE DIR์ถ”๊ฐ€ ๋ฐ ์‘๋‹ต ๋ฐ˜ํ™˜ํ•˜๋„๋ก ์ˆ˜์ •

* feat: ์„œ๋ธŒ๋ชจ๋“ˆ ์ˆ˜์ • ๋ฐ build.gradle ์—…๋ฐ์ดํŠธ

* etc: ์„œ๋ธŒ๋ชจ๋“ˆ ์ˆ˜์ • ๋ฐ˜์˜

* Merge develop into feature/U06-B

* feat: S3Uploader, FileNameGenerator url ๋ฃจํŠธ ๋ณ€๊ฒฝ

* feat: S3 ๊ด€๋ จ ์˜ˆ์™ธ ํด๋ž˜์Šค ์ถ”๊ฐ€ ๋ฐ ํ•ธ๋“ค๋ง

* etc: ํ…Œ์ŠคํŠธ์— ํ•„์š”ํ•œ ๋ฆฌ์†Œ์Šค ํŒŒ์ผ ์ถ”๊ฐ€

* test&feat: S3 ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•œ ์„ค์ • ํŒŒ์ผ ์ถ”๊ฐ€ ๋ฐ ํ…Œ์ŠคํŠธ ๊ตฌํ˜„

* etc: ์ฝ”๋“œ ํฌ๋งทํŒ…

* feat: 10MB ์ด์ƒ์˜ ํŒŒ์ผ ์š”์ฒญ ์‹œ ์˜ˆ์™ธ์ฒ˜๋ฆฌ ๊ตฌํ˜„

* etc: ์„œ๋ธŒ๋ชจ๋“ˆ ์—…๋ฐ์ดํŠธ

* etc: Merge develop into feature/U06-B

* feat&test: MultipartFile์ด ๋น„์–ด์žˆ๊ฑฐ๋‚˜ ์—†๋Š” ๊ฒฝ์šฐ ๋””ํดํŠธ ์ด๋ฏธ์ง€๋กœ ๋Œ€์ฒด

* etc: println ์‚ญ์ œ

* refactor: ๋ถˆํ•„์š”ํ•œ ์ฃผ์„ ์‚ญ์ œ ๋ฐ ์˜ค์ฆˆ ๋ฆฌ๋ทฐ ๋ฐ˜์˜

* feat: ์ค‘๊ฐ„๊ณฐ ๋ฆฌ๋ทฐ ๋ฐ˜์˜

* feat: ๊ฒ€์ƒ‰ ํŽ˜์ด์ง€ UI ๋ฐ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•œ๋‹ค (#334)

* feat: ๊ณต์œ  ๊ฒ€์ƒ‰ ํŽ˜์ด์ง€ ๋ผ์šฐํŒ… ๊ธฐ๋Šฅ ๊ตฌํ˜„

* refactor: ๊ณต์œ  ๋ฌธ์ œ์ง‘ ํŽ˜์ด์ง€ ์‚ญ์ œ

* feat: util type ์ถ”๊ฐ€

- ValueOf: ๊ฐ์ฒด์˜ value๋ฅผ ํƒ€์ž…์œผ๋กœ ์ง€์ •ํ•ด์ฃผ๋Š” ์—ญํ• 

* feat: ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ api์ ์šฉ

* feat: searchState ํŒŒ์ผ ์ถ”๊ฐ€

- search ๊ด€๋ จ recoil(atom) ๋ชจ์Œ

* feat: ํƒœ๊ทธ, ์ž‘์„ฑ์ž ๊ฒ€์ƒ‰ UI ๋ฐ ๊ธฐ๋Šฅ ๊ตฌํ˜„

* refactor: ๊ฒ€์ƒ‰ ์ปดํฌ๋„ŒํŠธ์˜ ํ™•์žฅ์„ฑ์„ ์œ„ํ•ด ์œ ์—ฐํ•˜๊ฒŒ ๋ณ€๊ฒฝ

* refactor: ๋ณ€์ˆ˜ ์ด๋ฆ„ ๋ณ€๊ฒฝ ๋ฐ ์ถ”์ƒํ™”๋œ searchResponse ์ œ๊ฑฐ

- response๋ผ๋Š” ์ด๋ฆ„์ด ์ ์ ˆํ•˜์ง€ ์•Š์€ ๊ฒƒ ๊ฐ™์•„์„œ result๋กœ ๋ณ€๊ฒฝ
- searchResponse์—์„œ ๋‘ ๊ฐ€์ง€์˜ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋ณด๋‹ˆ ํ™•์žฅ์„ฑ์ด ์–ด๋ ต๊ณ , ํƒ€์ž… ๊ฐ€๋“œ๋ฅผ ํ•ด์•ผ ํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ด์„œ ๋ณ€๊ฒฝ

* feat: ๊ณต์œ  ๋ฌธ์ œ์ง‘ ํŽ˜์ด์ง€ ์ถ”๊ฐ€

* feat: ๊ณต์œ  ๋ฌธ์ œ์ง‘ ํ•„ํ„ฐ ๊ธฐ๋Šฅ ์ถ”๊ฐ€ ๊ตฌํ˜„

* fix: ๊ฒ€์ƒ‰ํ•  ๋•Œ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์ด์ง€ ์•Š๋„๋ก ์ˆ˜์ •

* fix: ํ‚ค์›Œ๋“œ๊ฐ€ ์ž…๋ ฅ๋˜์ง€ ์•Š์•˜์„ ๋•Œ api ์š”์ฒญ ๋ณด๋‚ด๋Š” ๋ฒ„๊ทธ ์ˆ˜์ •

* fix: ๊ณต์œ  ๋ฌธ์ œ์ง‘ ํŽ˜์ด์ง€์˜ ์ฒซ ๋žœ๋”๋ง ์‹œ ๋™๊ธฐํ™”๊ฐ€ ๋˜์ง€ ์•Š๋Š” ๋ฒ„๊ทธ ํ•ด๊ฒฐ

* feat: intersection Observer ์ ์šฉ - ์ธํ”ผ๋‹ˆํ‹ฐ ์Šคํฌ๋กค

* refactor: ๊ณต์œ  ๋ฌธ์ œ์ง‘ ์ปดํฌ๋„ŒํŠธ๋กœ intersection ์ด๋™

- ๊ณต์œ  ๊ฒ€์ƒ‰ ํŽ˜์ด์ง€์™€ ๊ณต์œ  ๋ฌธ์ œ์ง‘ ํŽ˜์ด์ง€ ๋‘ ๊ตฐ๋ฐ์—์„œ ์‚ฌ์šฉํ•ด์•ผ ํ–ˆ๊ธฐ์— ๋‘˜์˜ ๊ณตํ†ต์ ์ธ ๊ณต์œ  ๋ฌธ์ œ์ง‘ ์ปดํฌ๋„ŒํŠธ๋กœ ์ด๋™

* refactor: keyword, type์„ recoil์—์„œ ๊ฐ€์ ธ๋‹ค๊ฐ€ ์“ฐ๋„๋ก ๋ณ€๊ฒฝ

- onClickItem ์‚ญ์ œ, ์ด์œ ๋Š” ํ•„์š”ํ•˜์ง€ ์•Š์€ ์ •๋ณด์˜€๊ธฐ ๋•Œ๋ฌธ
- ๊ฒ€์ƒ‰ ํ›„ ๋’ค๋กœ๊ฐ€๊ธฐ๋ฅผ ํ–ˆ์„ ๋•Œ, ํ•ด๋‹น ํƒญ์ด ์œ ์ง€๋˜๋„๋ก ๋ณ€๊ฒฝ

* refactor: ๊ฒ€์ƒ‰ ํ›„ ๋‹ค์‹œ ๋Œ์•„์™”์„ ๋•Œ, ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณด์กด๋˜๋„๋ก ๋ณ€๊ฒฝ

* fix: ๋ฌดํ•œ ์Šคํฌ๋กค ๋ฒ„๊ทธ ์ˆ˜์ • ๋ฐ startIndex 1์”ฉ ์ฆ๊ฐ€ํ•˜๋„๋ก ๋ณ€๊ฒฝ

* fix: ํ‚ค์›Œ๋“œ์˜ ์ œ๋ชฉ์œผ๋กœ ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ˆ˜์ •

- ๊ฒ€์ƒ‰ ํŽ˜์ด์ง€์— ๋“ค์–ด์™”์„ ๋• ํ•ญ์ƒ ๊ฒ€์ƒ‰์–ด๊ฐ€ ์ดˆ๊ธฐํ™”๋˜๋„๋ก ๋ณ€๊ฒฝ
- ๊ฒ€์ƒ‰ ์‹œ๋„ ์ค‘์ผ ๋•Œ loading true๋กœ ๋ณ€๊ฒฝ

* fix: ํ•„ํ„ฐ๋ง ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ ์ด์ „ ๋ฐ์ดํ„ฐ ๋ˆ„์ ๋˜๋Š” ๋ฒ„๊ทธ ํ•ด๊ฒฐ

* refactor: ์ข‹์•„์š” like => heart ๋ณ€๊ฒฝ

* feat: ๊ณต์œ  ๋ฌธ์ œ์ง‘ ํŽ˜์ด์ง€ ์Šค์ผˆ๋ ˆํ†ค ๊ตฌํ˜„

* fix: searchKeyword๊ฐ€ ์„ธํŒ…๋˜๊ธฐ ์ „์— ๋ผ์šฐํŒ…ํ•˜๋Š” ๋ฌธ์ œ ํ•ด๊ฒฐ

* fix: ๊ณต์œ  ๋ฌธ์ œ์ง‘ ํŽ˜์ด์ง€ ์Šค์ผˆ๋ ˆํ†ค์˜ title height ์ˆ˜์ •

* refactor: ๋กœ๋”ฉ์„ setํ•˜๋Š” ๋ถ€๋ถ„์„ ํŽ˜์ด์ง€๋กœ ์œ„์ž„

* fix: ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” snackbar ์‚ญ์ œ

* refactor: PublicWorkbook => PublicSearchResultPage

* etc: eol ํ•ด๊ฒฐ

* refactor: Intersection Observer์˜ entries =>[entry]

* fix: MainHeader์— z-index ์ถ”๊ฐ€

* fix: ํ•„ํ„ฐ ํด๋ฆญ ์‹œ startIndex๊ฐ€ ์ฆ๊ฐ€ํ•˜๋Š” ๋ฒ„๊ทธ ์ˆ˜์ •

* refactor: query๋กœ ์ƒˆ๋กœ๊ณ ์นจ ์‹œ์—๋„ ๊ฒ€์ƒ‰์ด ๊ฐ€๋Šฅํ•˜๋„๋ก ๋ณ€๊ฒฝ

* refactor: searchForKeyword ๋ถ„๋ฆฌ

* etc: ๋ณ€์ˆ˜ ๋ช… ๋ณ€๊ฒฝ searchInfo => searchInfos

* fix: input์— ๊ฐ’ ์ž…๋ ฅ ์‹œ start๊ฐ€ 0์œผ๋กœ ๋˜์ง€ ์•Š๋Š” ๋ฒ„๊ทธ ์ˆ˜์ •

* feat: ๊ฒ€์ƒ‰ ์ฐฝ sticky ์†์„ฑ ์ ์šฉ

* etc: ์ฝ˜์†”๋กœ๊ทธ ์‚ญ์ œ

* W15 - ์œ ์ €๋งˆ๋‹ค ๋ฌธ์ œ์ง‘์— ํ•˜ํŠธ๋ฅผ ๋ˆ„๋ฅด๊ณ  ์ทจ์†Œํ•  ์ˆ˜ ์žˆ๋Š” ํ† ๊ธ€ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•œ๋‹ค. (#336)

* feat: Heart ์—”ํ‹ฐํ‹ฐ ์ƒ์„ฑ

* feat: Hearts ์ผ๊ธ‰์ปฌ๋ ‰์…˜ ์ƒ์„ฑ

* feat: Workbook์— Heart ์—ฐ๊ฒฐ

* feat: WorkbookService์— ํ•˜ํŠธ ํ† ๊ธ€ ๊ธฐ๋Šฅ ์ถ”๊ฐ€

* feat: ์ข‹์•„์š”์˜ ๊ฒฐ๊ณผ์ธ HeartResponse ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ธฐ๋Šฅ ์ถ”๊ฐ€

* feat: ํ•˜ํŠธ ํ† ๊ธ€ api ์ถ”๊ฐ€

* feat: heartCount ์ถ”๊ฐ€์™€ ๊ทธ์— ๋”ฐ๋ฅธ ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€, ๋ณ€๊ฒฝ

* feat: ๊ณต์œ  ๋ฌธ์ œ์ง‘ ์ƒ์„ธ ์กฐํšŒ์—๋„ heartCount ๋‚˜์˜ค๋„๋ก ์ถ”๊ฐ€

* feat: ๊ณต์œ  ๋ฌธ์ œ์ง‘ ์ƒ์„ธ์กฐํšŒ api ์ˆ˜์ • - ํ•ด๋‹น api๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์œ ์ €๊ฐ€ ํ•ด๋‹น ๋ฌธ์ œ์ง‘์˜ ํ•˜ํŠธ๋ฅผ ๋ˆŒ๋ €๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ์•Œ๋ ค์ฃผ๋Š” heart ํ•„๋“œ ์ถ”๊ฐ€

* refactor: ๋ฌธ์„œํ™” ํ…Œ์ŠคํŠธ์—์„œ botobo.access.token์„ ์‚ฌ์šฉํ•˜๋Š” ์š”์ฒญ์ด AppUser๋ฅผ ๋งŒ๋“ค์–ด ๋‚ด๋„๋ก findAppUserByToken ๋ฉ”์„œ๋“œ๋ฅผ ๋ชจํ‚น // ๋ฌธ์ œ์ง‘ ๋ฌธ์„œํ™” ํ…Œ์ŠคํŠธ์— ์ ์šฉ

* feat: Token์„ ์ž…๋ ฅํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ๋น„ํšŒ์›์œผ๋กœ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ๋ชจํ‚น

* feat: ํ…Œ์ŠคํŠธ์—์„œ body๊ฐ€ ์—†๋Š” ์š”์ฒญ์— ์ž„์‹œ๋กœ DummyRequest๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€์‹  putWithoutBody ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉ

* etc: heart ddl ์ถ”๊ฐ€

* refactor: ๋น„ํšŒ์›์ด ๊ณต์œ  ๋ฌธ์ œ์ง‘ ์ƒ์„ธ ์กฐํšŒ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋„๋ก ๋ณ€๊ฒฝ

* etc: build ์ „ copyDev๊ฐ€ ์‹คํ–‰๋˜๋„๋ก ๋ณ€๊ฒฝ

* feat: ์นด๋“œ ์ƒ์„ธ ํŽ˜์ด์ง€์— ํ•˜ํŠธ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•œ๋‹ค  (#340)

* feat: ํ•˜ํŠธ ๊ธฐ๋Šฅ ๊ตฌํ˜„

* fix: ํ•˜ํŠธ ํ† ๊ธ€ ๋กœ์ง ๋ณ€๊ฒฝ

* feat: ์นด๋“œ ์Šฌ๋ผ์ด๋“œ ๋ฉ”์‹œ์ง€๊ฐ€ ๋ชจ๋ฐ”์ผ์—์„œ๋งŒ ๋ณด์ด๋„๋ก ์ˆ˜์ •ํ•œ๋‹ค (#348)

* feat: ๋ชจ๋ฐ”์ผ ๊ธฐ๊ธฐ ํ™•์ธ ๊ธฐ๋Šฅ ์ถ”๊ฐ€

* fix: ๋น„ํšŒ์›์ธ ๊ฒฝ์šฐ key๊ฐ€ 0์ธ ๋ฒ„๊ทธ ์ˆ˜์ •

* fix: isMobile ๋กœ์ง ๋ณ€๊ฒฝ ๋ฐ GUEST์ผ ๋•Œ id๊ฐ’ ์„ค์ •

* fix: ๊ฐœํ–‰ ๋ฐ ๋„์–ด์“ฐ๊ธฐ ์œ ์ง€๋˜๋„๋ก ๋ณ€๊ฒฝ (#352)

* U07 - ๊ตฌ๊ธ€ ์†Œ์…œ ๋กœ๊ทธ์ธ์„ ๊ตฌํ˜„ํ•œ๋‹ค (#337)

* refactor: OauthManager ์ธํ„ฐํŽ˜์ด์Šค ๋ถ„๋ฆฌ ๋ฐ ์†Œ์…œ ๋กœ๊ทธ์ธ ์ฝ”๋“œ ๋ฆฌํŒฉํ„ฐ๋ง

* feat: ๊ตฌ๊ธ€ ์†Œ์…œ ๋กœ๊ทธ์ธ ๊ตฌํ˜„ ๋ฐ ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€

* refactor: interceptor url ์ˆ˜์ • ๋ฐ import ๋ณ€๊ฒฝ

* refactor: ํ”ผ๋“œ๋ฐฑ ๋ฐ˜์˜

* refactor: ๋ฉ”์„œ๋“œ๋ช… ์ˆ˜์ • ๋ฐ ํ•„์š”์—†๋Š” ์ฝ”๋“œ ์‚ญ์ œ

* etc: ์„œ๋ธŒ๋ชจ๋“ˆ ๋™๊ธฐํ™”

* feat: ๋งˆ์ดํŽ˜์ด์ง€์˜ ์ •๋ณด๋ฅผ ์ˆ˜์ •ํ•œ๋‹ค (#354)

* etc: UserInfo ํƒ€์ž…์— bio ํ•„๋“œ ์ถ”๊ฐ€

* etc: ProfilePage UI ๋ณด์™„

* feat: ํ”„๋กœํ•„ ์ˆ˜์ • ๊ตฌํ˜„

* feat: ์ด๋ฏธ์ง€ ์—…๋กœ๋“œ ๊ตฌํ˜„

* etc: ํฌ์ธํ„ฐ ๋ณ€๊ฒฝ

* feat: ์œ ์ € ์ด๋ฆ„ validation ๊ฐ•ํ™”

* etc: ์ฝ”๋“œ ์Šคํƒ€์ผ ์ •๋ฆฌ

* U11 - ๋งˆ์ดํŽ˜์ด์ง€ ํ”„๋กœํ•„ ๋‹‰๋„ค์ž„ ๋ฐ ๋ฐ”์ด์˜ค ์ˆ˜์ • api ๊ตฌํ˜„, U12 - ํšŒ์›๋ช… ์ค‘๋ณต ๊ฒ€์‚ฌ api๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค.  (#343)

* feat: User ์—”ํ‹ฐํ‹ฐ์— bio ํ•„๋“œ ์ถ”๊ฐ€

* feat: ๋‚ด ์ •๋ณด ์ˆ˜์ • ๊ธฐ๋Šฅ ๊ตฌํ˜„

* test: ๋‚ด ์ •๋ณด ์ˆ˜์ • Acceptance Test

* test: UserUpdateRequest Validation ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€

* test: UserDocumentationTest ์ถ”๊ฐ€

* test: ๋‚ด ์ •๋ณด ์ˆ˜์ • ๊ด€๋ จ UserServiceTest ๋ฐ UserTest ์ถ”๊ฐ€

* feat&test: ์œ ์ € ์ด๋ฆ„ ์ค‘๋ณต ๊ฒ€์ฆ ์ถ”๊ฐ€ ๋ฐ ํ…Œ์ŠคํŠธ ๊ตฌํ˜„

* feat: ํšŒ์›๋ช… ์ค‘๋ณต์กฐํšŒ api ๊ตฌํ˜„

* test: ํšŒ์›๋ช… ์ค‘๋ณต ์กฐํšŒ ํ…Œ์ŠคํŠธ ๊ตฌํ˜„

* refactor: ์ค‘๋ณต ๋ฉ”์„œ๋“œ ์ƒ์†ํ•˜๋„๋ก ๋ณ€๊ฒฝ

* feat&test: pk ๋ฆฌ๋ทฐ ๋ฐ˜์˜, ํšŒ์›๋ช… ๊ณต๋ฐฑ ๋ถˆ๊ฐ€ ๊ฒ€์ฆ ๊ตฌํ˜„ ๋ฐ ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€

* refactor: ๊ตฌ๊ธ€ ์†Œ์…œ ๋กœ๊ทธ์ธ ์ถ”๊ฐ€๋œ User ๋Œ€์‘ ๋ฐ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋ฉ”์„œ๋“œ ์ œ๊ฑฐ

* fix: UserDocumentTest ์‘๋‹ต ์ˆ˜์ • ๋ฐ ์ž„์‹œ ์ฒ˜๋ฆฌ

* refactor: ํšŒ์› ์ •๋ณด ์ˆ˜์ • ์‹œ ํšŒ์›๋ช… ์ค‘๋ณต ์กฐํšŒ๋ฅผ ์šฐ์„ ํ•˜๋„๋ก ์ˆ˜์ •

* etc: ์ฝ”๋“œ ์ •๋ฆฌ ๋ฐ http ํŒŒ์ผ ์ถ”๊ฐ€

* feat: UserName ์ปค์Šคํ…€ Validator ์ถ”๊ฐ€

* feat: sonarqube ๋„์ž… ๋ฐ CORS ์„ค์ • ๋ณ€๊ฒฝ (#362)

* B45 - ์†Œ๋‚˜ํ๋ธŒ๋ฅผ CI ๊ณผ์ •์— ๋„์ž…ํ•œ๋‹ค - 2 (#364)

* feat: sonarqube ๋„์ž… ๋ฐ CORS ์„ค์ • ๋ณ€๊ฒฝ

* fix: build.gradle ํ”Œ๋Ÿฌ๊ทธ์ธ ๋ถˆํ•„์š”ํ•œ ์„ค์ • ์ œ๊ฑฐ

* feat: ํ€ด์ฆˆ ์„ค์ • ํŽ˜์ด์ง€ UI ๋ฐ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•œ๋‹ค (#356)

* refactor: SelectBox์—์„œ list์˜ height๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ๊ฒŒ ๋ณ€๊ฒฝ

* feat: ํ€ด์ฆˆ ์„ค์ • ํŽ˜์ด์ง€ UI ๊ตฌํ˜„

* feat: ํ€ด์ฆˆ ์„ค์ • ๊ธฐ๋Šฅ ๊ตฌํ˜„

* feat: ํ€ด์ฆˆ ํŽ˜์ด์ง€ ์‹œ๊ฐ„ ๊ธฐ๋Šฅ ๊ตฌํ˜„

* fix: ์‹œ๊ฐ„ ๊ตฌํ•˜๋Š” ์œ ํ‹ธ ํ•จ์ˆ˜ ๋ณ€๊ฒฝ

* feat: ํ€ด์ฆˆ ๊ฒฐ๊ณผ ํŽ˜์ด์ง€ ์‹œ๊ฐ„ ํ‘œ์‹œ ๊ธฐ๋Šฅ ๊ตฌํ˜„

* feat: useInterval ์ถ”๊ฐ€

* fix: alert => snackbar ๊ต์ฒด

* feat: ํ€ด์ฆˆ ์„ธํŒ… ํŽ˜์ด์ง€ ์Šค์ผˆ๋ ˆํ†ค ๊ตฌํ˜„

* etc: ํ•„์š”ํ•˜์ง€ ์•Š์€ style ์‚ญ์ œ

* refactor: ๋ชจ๋ฐ”์ผ ๊ธฐ๊ธฐ์—์„œ ํ„ฐ์น˜ ์Šฌ๋ผ์ด๋“œ ๋ฐ” ๊ตฌํ˜„

* etc: Clock => Timer ๋ณ€๊ฒฝ ๋ฐ ๋ณ€์ˆ˜๋ช… ์ˆ˜์ •

* etc: import ๋ณ€๊ฒฝ

* feat: ๋งˆ์ฃผ์นœ ํšŸ์ˆ˜๋ฅผ ํ‘œ์‹œํ•œ๋‹ค(ํ€ด์ฆˆ ํŽ˜์ด์ง€ ๋ฐ ์นด๋“œ ๋ชจ์•„๋ณด๊ธฐ ํŽ˜์ด์ง€)  (#350)

* feat: ํ’€์–ด๋ณธ ํšŸ์ˆ˜ ๊ธฐ๋Šฅ ์ถ”๊ฐ€

* fix: resize ์ด๋ฒคํŠธ ๋ฐœ์ƒ ์‹œ ์นด๋“œ width๊ฐ€ ๋ณ€ํ•˜์ง€ ์•Š๋Š” ๋ฒ„๊ทธ ํ•ด๊ฒฐ

* fix: resize ์‹œ ์ฆ‰์‹œ ์นด๋“œ ๋ณ€๊ฒฝ๋˜๋„๋ก ๋ณ€๊ฒฝ

* etc: ์œ ์ € ์ •๋ณด ์ˆ˜์ • ํ•„๋“œ์—์„œ id ์ œ๊ฑฐ (#363)

* feat: ๊ตฌ๊ธ€ ์†Œ์…œ ๋กœ๊ทธ์ธ์„ ๊ตฌํ˜„ํ•œ๋‹ค (#359)

* feat: OAtuh component ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ํ˜•ํƒœ๋กœ ๋ณ€๊ฒฝ

* feat: ๊ตฌ๊ธ€ ์†Œ์…œ ๋กœ๊ทธ์ธ ๊ตฌํ˜„

* etc: oauth ์Šคํƒ€์ผ ๋ฐฉ์‹ ๋ณ€๊ฒฝ

* refactor: OAuthCallbackPage๋กœ ํ†ต์ผ

* fix: ๋ฌธ์ œ์ง‘ ์ถ”๊ฐ€ ํŽ˜์ด์ง€์—์„œ ๋ฐœ์ƒํ•˜๋Š” ๋ฉ”์ธ ํ—ค๋” z-index ์˜ค๋ฅ˜๋ฅผ ์ˆ˜์ •ํ•œ๋‹ค (#366)

* fix: ๋ฌธ์ œ์ง‘ ์ถ”๊ฐ€ ํŽ˜์ด์ง€์—์„œ z-index ์˜ค๋ฅ˜ ์ˆ˜์ •

* etc: ๋ฉ”์ธ ํ—ค๋”์— sโ€ฆ
  • Loading branch information
9 people authored Oct 27, 2021
1 parent c8cfd3c commit bafff0b
Show file tree
Hide file tree
Showing 47 changed files with 1,502 additions and 1,454 deletions.
3 changes: 3 additions & 0 deletions backend/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,9 @@ dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'

// webflux
implementation 'org.springframework.boot:spring-boot-starter-webflux'

// validation
implementation 'org.springframework.boot:spring-boot-starter-validation'

Expand Down
8 changes: 5 additions & 3 deletions backend/src/main/java/botobo/core/application/TagService.java
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
import botobo.core.dto.tag.FilterCriteria;
import botobo.core.dto.tag.TagRequest;
import botobo.core.dto.tag.TagResponse;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

Expand Down Expand Up @@ -36,14 +37,15 @@ public Tags convertTags(List<TagRequest> tagRequests) {
return Tags.of(tags);
}

@Cacheable(value = "filterTags", key = "#filterCriteria.workbook")
public List<TagResponse> findAllTagsByWorkbookName(FilterCriteria filterCriteria) {
String keyword = filterCriteria.getWorkbook();
if (filterCriteria.isEmpty()) {
return TagResponse.listOf(Tags.empty());
}
List<Tag> allTags = tagSearchRepository.findAllByContainsWorkbookName(filterCriteria.getWorkbook());

Tags tags = Tags.of(allTags);
return TagResponse.listOf(tags);
List<Tag> findTags = tagSearchRepository.findAllByContainsWorkbookName(keyword);
return TagResponse.listOf(Tags.of(findTags));
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
import botobo.core.dto.user.UserUpdateRequest;
import botobo.core.exception.user.UserNameDuplicatedException;
import botobo.core.infrastructure.s3.FileUploader;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;
Expand Down Expand Up @@ -76,6 +77,7 @@ private void validateDuplicatedUserName(String requestedName, AppUser me) {
);
}

@Cacheable(value = "filterUsers", key = "#filterCriteria.workbook")
public List<UserFilterResponse> findAllUsersByWorkbookName(FilterCriteria filterCriteria) {
if (filterCriteria.isEmpty()) {
return UserFilterResponse.listOf(emptyList());
Expand Down
15 changes: 10 additions & 5 deletions backend/src/main/java/botobo/core/config/CacheConfig.java
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
import org.springframework.data.redis.serializer.RedisSerializationContext;

import java.time.Duration;
import java.util.Map;

@Configuration
@EnableCaching
Expand All @@ -29,13 +30,17 @@ public CacheConfig(RedisConnectionFactory redisConnectionFactory) {
public CacheManager cacheManager() {
return RedisCacheManager.RedisCacheManagerBuilder.fromConnectionFactory(redisConnectionFactory)
.cacheDefaults(defaultConfiguration())
.withCacheConfiguration(
"workbookRanks",
workbookRanksConfiguration()
)
.withInitialCacheConfigurations(cacheConfigurations())
.build();
}

private Map<String, RedisCacheConfiguration> cacheConfigurations() {
return Map.of("workbookRanks", durationConfiguration(),
"filterUsers", durationConfiguration(),
"filterTags", durationConfiguration()
);
}

private RedisCacheConfiguration defaultConfiguration() {
return RedisCacheConfiguration.defaultCacheConfig()
.entryTtl(Duration.ofDays(7))
Expand All @@ -47,7 +52,7 @@ private RedisCacheConfiguration defaultConfiguration() {
);
}

private RedisCacheConfiguration workbookRanksConfiguration() {
private RedisCacheConfiguration durationConfiguration() {
return RedisCacheConfiguration.defaultCacheConfig()
.entryTtl(Duration.ofMinutes(10));
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package botobo.core.config.redis;

import botobo.core.domain.rank.SearchRank;
import botobo.core.domain.token.RefreshToken;
import org.springframework.boot.autoconfigure.data.redis.RedisProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
Expand Down Expand Up @@ -42,4 +43,12 @@ public RedisTemplate<String, SearchRank> searchRankRedisTemplate() {
searchRankRedisTemplate.setEnableTransactionSupport(true);
return searchRankRedisTemplate;
}

@Bean
public RedisTemplate<String, RefreshToken> refreshTokenRedisTemplate() {
RedisTemplate<String, RefreshToken> refreshTokenRedisTemplate = new RedisTemplate<>();
refreshTokenRedisTemplate.setConnectionFactory(redisConnectionFactory());
refreshTokenRedisTemplate.setEnableTransactionSupport(true);
return refreshTokenRedisTemplate;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
@Repository
public class SearchRankRepository {

public static final String KEY = "SearchRank";
private static final String KEY = "SearchRank";

private final RedisTemplate<String, SearchRank> searchRankRedisTemplate;
private final ListOperations<String, SearchRank> listOperations;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
@Repository
public class SearchScoreRepository {

public static final String KEY = "SearchScore";
private static final String KEY = "SearchScore";

private final StringRedisTemplate stringRedisTemplate;
private final ZSetOperations<String, String> setOperations;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,20 +1,16 @@
package botobo.core.domain.tag;


import botobo.core.domain.workbook.Workbook;
import botobo.core.domain.workbooktag.WorkbookTag;
import com.querydsl.core.types.dsl.BooleanExpression;
import com.querydsl.jpa.JPAExpressions;
import com.querydsl.jpa.impl.JPAQueryFactory;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Repository;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Locale;
import java.util.Objects;
import java.util.Set;

import static botobo.core.domain.card.QCard.card;
import static botobo.core.domain.tag.QTag.tag;
Expand Down Expand Up @@ -52,23 +48,17 @@ public List<Tag> findAllByContainsWorkbookName(String workbookName) {
return Collections.emptyList();
}

List<Workbook> workbooks = jpaQueryFactory.selectFrom(workbook)
return jpaQueryFactory.select(workbookTag.tag)
.from(workbook)
.distinct()
.leftJoin(workbook.workbookTags, workbookTag)
.leftJoin(workbookTag.tag, tag)
.innerJoin(workbook.cards.cards, card)
.where(containKeyword(workbookName),
openedTrue())
.innerJoin(workbook.workbookTags, workbookTag)
.innerJoin(workbookTag.tag, tag)
.where(workbook.in(JPAExpressions.selectFrom(workbook)
.leftJoin(workbook.workbookTags, workbookTag)
.leftJoin(workbookTag.tag, tag)
.innerJoin(workbook.cards.cards, card)
.where(containKeyword(workbookName), openedTrue())))
.fetch();

Set<Tag> tags = new HashSet<>();
for (Workbook workbook : workbooks) {
List<WorkbookTag> workbookTags = workbook.getWorkbookTags();
for (WorkbookTag workbookTag : workbookTags) {
tags.add(workbookTag.getTag());
}
}
return new ArrayList<>(tags);
}

private BooleanExpression containKeyword(String workbookName) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,19 +2,13 @@


import lombok.Getter;
import lombok.NoArgsConstructor;
import org.springframework.data.redis.core.RedisHash;
import org.springframework.data.redis.core.TimeToLive;

import javax.persistence.Id;
import java.io.Serializable;

@Getter
@NoArgsConstructor
@RedisHash("refreshToken")
public class RefreshToken implements Serializable {

@Id
private String id;
private String tokenValue;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,43 @@
package botobo.core.domain.token;

import org.springframework.data.repository.CrudRepository;
import org.springframework.data.redis.core.HashOperations;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Repository;

public interface RefreshTokenRepository extends CrudRepository<RefreshToken, String> {
import java.util.Optional;

@Repository
public class RefreshTokenRepository {

private static final String KEY = "RefreshToken";

private final RedisTemplate<String, RefreshToken> refreshTokenRedisTemplate;
private final HashOperations<String, String, RefreshToken> hashOperations;

public RefreshTokenRepository(RedisTemplate<String, RefreshToken> refreshTokenRedisTemplate) {
this.refreshTokenRedisTemplate = refreshTokenRedisTemplate;
this.hashOperations = refreshTokenRedisTemplate.opsForHash();
}

public Optional<RefreshToken> findById(String id) {
return Optional.ofNullable(hashOperations.get(KEY, id));
}

public RefreshToken save(RefreshToken refreshToken) {
String id = refreshToken.getId();
hashOperations.put(KEY, id, refreshToken);
return refreshToken;
}

public void deleteById(String id) {
hashOperations.delete(KEY, id);
}

public void deleteAll() {
refreshTokenRedisTemplate.delete(KEY);
}

public boolean existsById(String id) {
return hashOperations.hasKey(KEY, id);
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package botobo.core.dto.auth;

import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
Expand All @@ -9,10 +10,10 @@
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class GithubTokenRequest {

public class GithubTokenRequest implements OauthTokenRequest {
private String code;
private String client_id;
private String client_secret;

@JsonProperty("client_id")
private String clientId;
@JsonProperty("client_secret")
private String clientSecret;
}
16 changes: 11 additions & 5 deletions backend/src/main/java/botobo/core/dto/auth/GoogleTokenRequest.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package botobo.core.dto.auth;

import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
Expand All @@ -9,10 +10,15 @@
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class GoogleTokenRequest {
public class GoogleTokenRequest implements OauthTokenRequest {

private String code;
private String client_id;
private String client_secret;
private String redirect_uri;
private String grant_type;
@JsonProperty("client_id")
private String clientId;
@JsonProperty("client_secret")
private String clientSecret;
@JsonProperty("redirect_uri")
private String redirectUri;
@JsonProperty("grant_type")
private String grantType;
}
Original file line number Diff line number Diff line change
@@ -1,18 +1,6 @@
package botobo.core.dto.auth;


import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
public interface OauthTokenRequest {

@Getter
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class OauthTokenRequest {

private String code;
private String client_id;
private String client_secret;
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,14 +6,15 @@
import lombok.Getter;
import lombok.NoArgsConstructor;

import java.io.Serializable;
import java.util.List;
import java.util.stream.Collectors;

@Getter
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class UserFilterResponse {
public class UserFilterResponse implements Serializable {
private Long id;
private String name;

Expand Down
Loading

0 comments on commit bafff0b

Please sign in to comment.