Skip to content

v1.4.1

Latest
Compare
Choose a tag to compare
@beni1026 beni1026 released this 25 Feb 11:18
842c96b
v1.4 ๋ฐฐํฌ (#338)

* feat: ๋กœ๊ทธ์ธ์‹œ DB์— ๋“ฑ๋ก๋œ ์ด๋ฉ”์ผ์ด ์—†๋Š” ๊ฒฝ์šฐ ์˜ˆ์™ธ์ฒ˜๋ฆฌ ํด๋ž˜์Šค ์ถ”๊ฐ€

* feat: ์˜ˆ์™ธ์ฒ˜๋ฆฌ ๋กœ์ง ๊ตฌํ˜„

* refactor: UserService isLoginSuccessํ•จ์ˆ˜ ๋กœ์ง ์ˆ˜์ •

* feat: UserService isLogin ๋กœ์ง ๊ตฌํ˜„

* feat: ResponseEntity๋กœ ๋กœ๊ทธ์ธ ์„ฑ๊ณต ์—ฌ๋ถ€ ์‘๋‹ต

* refactor: Message ํด๋ž˜์Šค์— ์ค‘๋ณต ์ฝ”๋“œ ํ•จ์ˆ˜๋กœ ๊ตฌํ˜„
make200Response, make400Response ํ•จ์ˆ˜ ์ƒ์„ฑ ๋ฐ ์Šคํƒœํ‹ฑ ํ•จ์ˆ˜๋กœ ์‚ฌ์šฉ
๋ฉ”์„ธ์ง€๋ฅผ ์ธ์ž๋กœ ์ „๋‹ฌ๋ฐ›์•„  RepsonseEntity ๋ฐ˜ํ™˜ํ•ด์ฃผ๋Š” ํ•จ์ˆ˜

* feat: pagesํด๋” ๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์กฐ ์ˆ˜์ •

* chore: application properties git ignore์— ์ถ”๊ฐ€

* chore: build.gradle ์ˆ˜์ •

* chore: db setting
sql๋ฌธ ์ˆ˜์ •
UserRepository query ์ˆ˜์ •
406 error > Message dto getter ์ถ”๊ฐ€

* ๐Ÿ’„design: add sign up page markup

* refactor: ExceptionHandler ์–ด๋…ธํ…Œ์ด์…˜์„ ํ†ตํ•œ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ๊ตฌํ˜„

* refactor: Controller์—์„œ ResponseEntity ์ƒ์„ฑ

* refactor: UserService isLoginSuccess > login์œผ๋กœ ํ•จ์ˆ˜๋ช… ๋ณ€๊ฒฝ

* feat: Valid ์–ด๋…ธํ…Œ์ด์…˜ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ

* rename: SignupNicknameDuplicatedException >> NicknameDuplicatedException

* feat: UserService, UserRepository ๋ณ€์ˆ˜ private final๋กœ ๋ณ€๊ฒฝ

* TEST: ๋กœ๊ทธ์ธ, ํšŒ์›๊ฐ€์ž… ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ

* feat: ๋ฉ”์ธํŽ˜์ด์ง€ ๋งˆํฌ์—…

* fix: ์ด๋ฏธ์ง€ ๊ฒฝ๋กœ ์ˆ˜์ •

* fix: Valid ์–ด๋…ธํ…Œ์ด์…˜ ์˜ˆ์™ธ์ฒ˜๋ฆฌ ํ•ธ๋“ค๋Ÿฌ ์ˆ˜์ •
MethodArgumentNotValidException >> BindException

* fix: ๊ฐค๋Ÿฌ๋ฆฌ grid ํ˜•ํƒœ๋กœ ์ˆ˜์ •

* fix: ์ด๋ฏธ์ง€ ๋†’์ด ์ˆ˜์ •

* fix: password, nickname ์ˆœ์„œ ๋ณ€๊ฒฝ

* feat: RestControllerAdvice ์–ด๋…ธํ…Œ์ด์…˜ ์‚ญ์ œ

* feat: Post Model ์ž‘์„ฑ
DDL ์ˆ˜์ •
Post Model ์ƒ์„ฑ

* feat: PostRepository ๊ตฌํ˜„

* feat: Post entity id ์ถ”๊ฐ€

* feat: Image model ์ƒ์„ฑ

* feat: dto/GeustPostsResponse ์ƒ์„ฑ
๋น„๋กœ๊ทธ์ธ์—์„œ์˜ ํฌ์ŠคํŠธ Response ํด๋ž˜์Šค

* feat: ImageRepository ์ƒ์„ฑ
postId๋ฅผ ํ†ตํ•ด image๋ฅผ ์ฐพ๋Š” getImageByPostId ๋ฉ”์†Œ๋“œ ์ž‘์„ฑ
fix: PostRepository sql๋ฌธ์˜ where ์‚ญ์ œ

* feat: PostService/GuestPostsResponse ๊ตฌํ˜„
๋น„๋กœ๊ทธ์ธ ์ƒํƒœ์—์„œ ์ตœ๊ทผ ๊ฒŒ์‹œ๋ฌผ 10๊ฐœ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฉ”์†Œ๋“œ

* fix: PostService Repository ์ ‘๊ทผ์ œ์–ด์ž ๋ณ€๊ฒฝ
private final๋กœ ๋ณ€๊ฒฝ
Autowired ์ƒ์„ฑ์ž ์ˆ˜์ •

* feat: PostController ๊ตฌํ˜„์ค‘

* feat: LoginPostsResponse ์ƒ์„ฑ
๋กœ๊ทธ์ธ ์‹œ์˜ ๋ฉ”์ธํŽ˜์ด์ง€ api ํด๋ž˜์Šค

* feat: PostController ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€ ๊ตฌํ˜„์ค‘

* feat: PostController์— ํ”„๋กœํ•„ ์กฐํšŒ ํ•จ์ˆ˜ ์ถ”๊ฐ€

* feat: PostController profile ํ•จ์ˆ˜ ํ˜„์žฌ ์ ‘์†ํ•œ ์‚ฌ์šฉ์ž์— ๋”ฐ๋ฅธ ๋ถ„๊ธฐ ์ถ”๊ฐ€

* feat: ํ•ด์‹œํƒœ๊ทธ(HashTag) ํด๋ž˜์Šค ์ƒ์„ฑ

* feat: HashtagRepository์—์„œ ํƒœ๊ทธ ์ด๋ฆ„์œผ๋กœ Hashtag๋ฅผ ์กฐํšŒํ•˜๋Š” ๋ฉ”์„œ๋“œ ์ถ”๊ฐ€

- findHashtagByName(): ํƒœ๊ทธ ์ด๋ฆ„์œผ๋กœ Hashtag๋ฅผ ์กฐํšŒ

* feat: findHashtagByName()์—์„œ ํ•ด๋‹น ์ด๋ฆ„์˜ ํ•ด์‹œํƒœ๊ทธ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ HashtagNotExistException์„ ๋ฐœ์ƒํ•˜๋„๋ก ๊ตฌํ˜„

* feat: ํ•„์š”์—†๋Š” ๋ฌธ์„œ ์‚ญ์ œ

* feat: ํ‚ค์›Œ๋“œ๋กœ ๊ฒŒ์‹œ๊ธ€ ์กฐํšŒ ์‹œ ์‚ฌ์šฉํ•  ์‘๋‹ต ๊ฐ์ฒด PostSearchResponse ํด๋ž˜์Šค ์ƒ์„ฑ

* feat: PostService์—์„œ ํ‚ค์›Œ๋“œ๋กœ ๊ฒŒ์‹œ๋ฌผ์„ ์กฐํšŒํ•˜๋Š” searchByTags() ๋ฉ”์„œ๋“œ ๊ตฌํ˜„

- ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋“ค์–ด์˜จ ํƒœ๊ทธ๋ฅผ "+" ๊ธฐ์ค€์œผ๋กœ split
- hashtagRepository์—์„œ ํƒœ๊ทธ ์ด๋ฆ„์œผ๋กœ Hashtag ์กฐํšŒํ•˜์—ฌ ํ•ด๋‹น Hashtag์˜ ์•„์ด๋””๋ฅผ hashtagIds ๋ฆฌ์ŠคํŠธ์— ์ถ”๊ฐ€
- postRepository.searchByHashtags()๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ํ•ด์‹œํƒœ๊ทธ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฒŒ์‹œ๋ฌผ ์กฐํšŒ
- imageRepository.getImageByPostId()๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์ด๋ฏธ์ง€๋ฅผ ์กฐํšŒํ•˜์—ฌ ๋ฆฌ์ŠคํŠธ์— ์ถ”๊ฐ€
- ์ด๋ฏธ์ง€ ๋ฆฌ์ŠคํŠธ๋ฅผ PostsSearchResponse ์‘๋‹ต ๊ฐ์ฒด์— ๋„ฃ์–ด์„œ ๋ฐ˜ํ™˜

* feat: PostRepository์—์„œ ํ•ด์‹œํƒœ๊ทธ๋กœ ๊ฒŒ์‹œ๋ฌผ์„ ์กฐํšŒํ•˜๋Š” searchByHashtags() ๋ฉ”์„œ๋“œ ๊ตฌํ˜„

- ์ธ์ž๋กœ ๋„˜๊ฒจ์˜จ hashtagIds๋กœ where ์กฐ๊ฑด์ ˆ์„ ์ƒ์„ฑ
- where ์กฐ๊ฑด์ ˆ์„ ํฌํ•จํ•œ ์ „์ฒด ์ฟผ๋ฆฌ๋ฌธ ์ƒ์„ฑ
- jdbcTemplate์œผ๋กœ ์ฟผ๋ฆฌ๋ฌธ ์‹คํ–‰
- List<Post> ํƒ€์ž…์œผ๋กœ ๋ฐ˜ํ™˜

* feat: HashtagRepository์— @Repository ์–ด๋…ธํ…Œ์ด์…˜ ์ถ”๊ฐ€

* feat: PostController์— ํƒœ๊ทธ๋กœ ๊ฒŒ์‹œ๋ฌผ์„ ์กฐํšŒํ•˜๋Š” searchPostsByTags() ๋ฉ”์„œ๋“œ ์ถ”๊ฐ€

- @GetMapping์—์„œ URL ์ถฉ๋Œ์ด ๋‚˜๊ธฐ ๋•Œ๋ฌธ์— ์ฃผ์„ ์ฒ˜๋ฆฌ

* feat: PostController์—์„œ ํƒœ๊ทธ๋กœ ๊ฒŒ์‹œ๋ฌผ์„ ์กฐํšŒํ•˜๋Š” searchPostsByTags() ๋ฉ”์„œ๋“œ์™€ ๋งคํ•‘๋  URL ๋ณ€๊ฒฝ

- @GetMapping์— ๋งคํ•‘๋  URL์„ "/posts/m/search"๋กœ ๋ณ€๊ฒฝ

* refactor: subString()์„ ์‚ฌ์šฉํ•˜์—ฌ ๋กœ์ง ๋‹จ์ถ•

- ๋งจ ๋งˆ์ง€๋ง‰์— ๋“ค์–ด๊ฐ€๋Š” " ON " ๋ฌธ์ž์—ด์„ ์‚ญ์ œํ•˜๋Š” ๋กœ์ง์„ deleteCharAt()์„ 4๋ฒˆ ํ˜ธ์ถœํ•˜๋Š” ๋Œ€์‹  subString()์„ ์‚ฌ์šฉ

* feat: ๊ธ€ ์ž‘์„ฑ ํŽ˜์ด์ง€ ๋งˆํฌ์—…

* style: SQL๋ฌธ์„ ๋Œ€๋ฌธ์ž๋กœ ํ†ต์ผ

* ๐Ÿ’„design: add sign up Postdetail Page markup

* feat: PostService์˜ getRecentPosts() ๋ฉ”์„œ๋“œ ๋‚ด๋ถ€ ๋กœ์ง ์ˆ˜์ •

๊ธฐ์กด์˜ ๋กœ์ง์€ postRepository๋ฅผ ํ†ตํ•ด post๋ฅผ ๊ฐ€์ ธ์˜จ ๋‹ค์Œ, post์˜ ์•„์ด๋””๋กœ image๋ฅผ ๊ฐ€์ ธ์™”์ง€๋งŒ, ์ด ๋ฐฉ์‹์€ ์ฟผ๋ฆฌ๋ฅผ 2๋ฒˆ์ด๋‚˜ ๋ณด๋‚ด๊ธฐ ๋•Œ๋ฌธ์— ์„ฑ๋Šฅ ์ €ํ•˜์˜ ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ฟผ๋ฆฌ๋ฅผ 2๋ฒˆ ๋ณด๋‚ด๋Š” ๋Œ€์‹  imageRepository.getImagesOfRecentPosts()๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ IMAGE ํ…Œ์ด๋ธ”๊ณผ POST ํ…Œ์ด๋ธ”์„ joinํ•˜์—ฌ ๋ฐ”๋กœ List<image>๋ฅผ ๊ฐ€์ ธ์˜ค๋„๋ก ์ˆ˜์ •ํ•˜์˜€๋‹ค.
- ImageRepository์— getImagesOfRecentPosts() ๋ฉ”์„œ๋“œ ์ถ”๊ฐ€

* pulled develop

* feat: Follow model ์ƒ์„ฑ

* feat: FollowRepository ์ƒ์„ฑ
getFollowerIds ๋ฉ”์†Œ๋“œ: following id๋กœ follower id ๋ชฉ๋ก์„ ์กฐํšŒํ•˜๋Š” ๋ฉ”์†Œ๋“œ
getFollowingIds ๋ฉ”์†Œ๋“œ: follower id๋กœ following id ๋ชฉ๋ก์„ ์กฐํšŒํ•˜๋Š” ๋ฉ”์†Œ๋“œ
getFollowerCount ๋ฉ”์†Œ๋“œ: followingId๋กœ follower ์ˆ˜๋ฅผ ์กฐํšŒํ•˜๋Š” ๋ฉ”์†Œ๋“œ
getFollowingCount ๋ฉ”์†Œ๋“œ: followerId๋กœ following ์ˆ˜๋ฅผ ์กฐํšŒํ•˜๋Š” ๋ฉ”์†Œ๋“œ
feat: User์— id ์ถ”๊ฐ€

* chore: PostRepository ๋ณ‘ํ•ฉ
๊ธฐ์กด์˜ pr๋œ ์ฝ”๋“œ์™€ ๋ณ‘ํ•ฉ

* chore: PostService ๋ณ‘ํ•ฉ
๊ธฐ์กด pr๊ณผ ๋ณ‘ํ•ฉ

* feat: PostController ๊ธฐ๋Šฅ ์ถ”๊ฐ€
getLoginPosts: ๋กœ๊ทธ์ธ ์ƒํƒœ์˜ response๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ธฐ๋Šฅ

* refactor: HttpServletRequest๋ฅผ ๋ฐ›๋Š” ๋ฐฉ์‹ ๋ณ€๊ฒฝ
method ์ธ์ž๋กœ ๋ฐ”๋กœ ๋ฐ›๋Š” ๋ฐฉ์‹์œผ๋กœ ์ˆ˜์ •

* chore: cherrypick ์ค‘ ๋ˆ„๋ฝ๋œ import ์ˆ˜์ •

* feat: ๊ธ€ ์ˆ˜์ • menu ์ถ”๊ฐ€

* feat: ImageRepository ๊ธฐ๋Šฅ ์ถ”๊ฐ€ ๋ฐ PostService ๋กœ์ง ๋ณ€๊ฒฝ
ImageRepository.getImagesOfRecentFollowingPosts: followerId๋ฅผ ํ†ตํ•ด ์ด๋ฏธ์ง€ ๋ฆฌ์ŠคํŠธ๋ฅผ ์กฐํšŒํ•˜๋Š” ๋ฉ”์†Œ๋“œ
PostService.getRecentFollowerPosts: ๊ธฐ์กด postRepository ์‚ฌ์šฉ ๋กœ์ง -> imageRepository ์‚ฌ์šฉ ๋กœ์ง์œผ๋กœ ๋ณ€๊ฒฝ
PostRepository ๋”์ด์ƒ ์•ˆ์“ฐ๋Š” ๊ธฐ์กด ๋ฉ”์†Œ๋“œ deprecated ์ฒ˜๋ฆฌ

* Update README.md

ERD ์ฐจ๋Ÿ‰ ๋ชจ๋ธ, ์ฐจ๋Ÿ‰ ํƒ€์ž… ํ…Œ์ด๋ธ” ์ถ”๊ฐ€

* feat: PostController profile ์กฐํšŒ ํ•จ์ˆ˜ ์„ค๊ณ„

* feat: ํ”„๋กœํ•„ dto ํด๋ž˜์Šค ์ƒ์„ฑ

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

* feat: User repository ๋‹‰๋„ค์ž„์œผ๋กœ ์ด๋ฉ”์ผ ์กฐํšŒ ํ•  ๋•Œ ์˜ˆ์™ธ์ฒ˜๋ฆฌ

* feat: UserRepository findEmailByNickname select * >> select email
emailRowMapper ํ•จ์ˆ˜ ๋งŒ๋“ค์–ด์„œ ์ด๋ฉ”์ผ ํ•˜๋‚˜๋งŒ ๊ฐ€์ ธ์˜ค๋„๋ก ๊ตฌํ˜„

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

* feat: UserID์™€ ๋‹‰๋„ค์ž„์œผ๋กœ DB์—์„œ Image๋ฅผ ์ฐพ๋Š” ๋กœ์ง ๊ตฌํ˜„

* fix: ImageRepository select๋ฌธ ์นผ๋Ÿผ ์ˆ˜์ •
*->IMAGE.post_id, IMAGE.image_url

* feat: PostService ํ”„๋กœํ•„ ํŒŒ์ผ ๋ถˆ๋Ÿฌ์˜ค๋Š” ๊ธฐ๋Šฅ ๊ตฌํ˜„
followRepository๋ฅผ ํ†ตํ•œ ์ •๋ณด ์กฐํšŒ ๊ธฐ๋Šฅ ๊ตฌํ˜„

* feat: FollowRepository isFollow query ์ˆ˜์ •

* refactor: response dto builder ํŒจํ„ด ์ ์šฉ

* refactor: builderํŒจํ„ด ํ•จ์ˆ˜๋ช… ๋ณ€๊ฒฝ
set ์ œ๊ฑฐ

* feat: PostService์˜ searchByTags() ๋ฉ”์„œ๋“œ ๋‚ด๋ถ€ ๋กœ์ง ์ˆ˜์ •

๊ธฐ์กด์˜ ๋กœ์ง์€ hashtagRepository๋กœ ํƒœ๊ทธ ์ด๋ฆ„์— ํ•ด๋‹นํ•˜๋Š” ํƒœ๊ทธ์˜ ์•„์ด๋””๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ , postRepository๋ฅผ ํ†ตํ•ด ํ•ด๋‹น ํƒœ๊ทธ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” post๋ฅผ ๊ฐ€์ ธ์˜จ ๋‹ค์Œ, ImageRepository๋ฅผ ํ†ตํ•ด post์˜ ์•„์ด๋””๋กœ image๋ฅผ ๊ฐ€์ ธ์™”๋‹ค. ์ด ๋ฐฉ์‹์€ ์ฟผ๋ฆฌ๋ฅผ ์ด 3๋ฒˆ์ด๋‚˜ ๋ณด๋‚ด๊ธฐ ๋•Œ๋ฌธ์— ์„ฑ๋Šฅ ์ €ํ•˜์˜ ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ฟผ๋ฆฌ๋ฅผ 3๋ฒˆ ๋ณด๋‚ด๋Š” ๋Œ€์‹  imageRepository.getImagesOfRecentPostsByTags()๋ฅผ ํ˜ธ์ถœํ•˜๋„๋ก ์ˆ˜์ •ํ•˜์˜€๋‹ค.

- ImageRepository์— getImagesOfRecentPostsByTags() ๋ฉ”์„œ๋“œ ์ถ”๊ฐ€
    - POST, POST_HASHTAG, HASHTAG, IMAGE ํ…Œ์ด๋ธ”์„ joinํ•˜์—ฌ List<image> ๋ฐ˜ํ™˜
- ํƒœ๊ทธ ์ด๋ฆ„ ๊ด€๋ จ ์กฐ๊ฑด์ ˆ์„ ์ƒ์„ฑํ•˜๋Š” createTagNameConditionalStatement() ๋ฉ”์„œ๋“œ ์ถ”๊ฐ€
    - ์ธ์ž๋กœ ์ฃผ์–ด์ง„ ํƒœ๊ทธ ์ด๋ฆ„๋“ค์„ " OR "๋กœ ์—ฐ๊ฒฐํ•˜์—ฌ ์กฐ๊ฑด์ ˆ ์ƒ์„ฑ
- PostRepository์˜ searchByHashtags(), createWhereStatement() ๋ฉ”์„œ๋“œ ์‚ญ์ œ

* style: ํ•ด๋‹น ํƒœ๊ทธ ์ด๋ฆ„์„ ๊ฐ€์ง€๋Š” ํ•ด์‹œํƒœ๊ทธ๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ ๋ฐœ์ƒํ•˜๋Š” ์˜ˆ์™ธ ๋ฉ”์‹œ์ง€ ๋ณ€๊ฒฝ

- "ERROR: Hashtag not exist"๋กœ ๋ณ€๊ฒฝ

* feat: profile page markup posts mode markup

* refactor: PostsSearchResponse ์‘๋‹ต ๊ฐ์ฒด์— Builder ํŒจํ„ด ์ ์šฉ

* docs: DDL ์ˆ˜์ •

TYPE ํ…Œ์ด๋ธ” ์ถ”๊ฐ€
MODEL ํ…Œ์ด๋ธ” ์ถ”๊ฐ€
POST ํ…Œ์ด๋ธ” create_date column์— index ์„ค์ •

* feat: ์ปดํฌ๋„ŒํŠธ obj ๋™์  ๊ฐ’ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋„๋ก ์ˆ˜์ •

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

* feat: ํ—ค๋” ๋ถ„๋ฆฌ

* feat: ํ•ด์‹œ ํƒœ๊ทธ ๋ฆฌ์ŠคํŠธ ๋ถ„๋ฆฌ

* feat: postlist๋ถ„๋ฆฌ

* feat: ๊ฒ€์ƒ‰ ํผ ๋ถ„๋ฆฌ

* feat: ๋ถ„๋ฆฌ๋œ ์ปดํฌ๋„ŒํŠธ ์ƒ์„ฑ

๋”๋ฏธ๋ฐ์ดํ„ฐ ์ด์šฉ

* refactor: ๋ฉ”์ธ ํŽ˜์ด์ง€ response ๋ฐ user ๋ ˆํฌ์ง€ํ† ๋ฆฌ ๋ฆฌํŒฉํ† ๋ง (#118)

* refactor: GuestPostsResponse Builder ํŒจํ„ด ์ ์šฉ

* refactor: LoginPostsResponse Builder ํŒจํ„ด ์ ์šฉ

* refactor: PostService์˜ response Builder ํŒจํ„ด ์ ์šฉ

* feat: UserRepository์— findUserByNickname ๋ฉ”์†Œ๋“œ ์ถ”๊ฐ€
deprecated: findEmailByNickname, findUserIdByNickname, emailRowMapper, idRowMapper

* refactor: PostService.otherProfile ๋‚ด๋ถ€ ๋ฉ”์†Œ๋“œ์ผ๋ถ€ ์ˆ˜์ •
findUserIdByNickname -> findUserByNickname.getId ๋กœ ์ˆ˜์ •
findUserEmailByNickname -> findUserByNickname.getEmail ๋กœ ์ˆ˜์ •

* refactor: PostService.otherProfile์˜ profileUserId->profileUser ๋กœ ๋ณ€๊ฒฝ

* fix: findUserByNickname ์˜ exception์„ LoginEmailNotExistException -> NicknameNotExistException ์œผ๋กœ ๋ณ€๊ฒฝ

* refactor: User ๊ด€๋ จ Exception ๋ฉ”์‹œ์ง€ ์ƒ์ˆ˜ํ™”

* refactor: userRepository.findUserByNickname(profileUserNickname) -> profileUser๋กœ ๋ณ€๊ฒฝ

* feat: add profile page modify modal markup

* delete: postdetail scss ์˜คํƒ€ ์ˆ˜์ •

* refactor: login, signup scss ์ „์—ญ ์„ค์ • ๋๋˜ ๊ฒƒ๋“ค container ์•ˆ์— ๋„ฃ์Œ

* refactor: scss tab ๊ฐ„๊ฒฉ ์ˆ˜์ •

* delete: pretiierrc ์‚ญ์ œ

* feat: ๋‹‰๋„ค์ž„ ๋ณ€๊ฒฝ (#119)

* feat: UserController ๋‹‰๋„ค์ž„ ๋ณ€๊ฒฝ ํ•จ์ˆ˜ ๊ตฌํ˜„
๋กœ์ง ๊ตฌํ˜„, dto ํด๋ž˜์Šค ์ƒ์„ฑ

* feat: UserService ๋‹‰๋„ค์ž„๋ณ€๊ฒฝ ๋กœ์ง ๊ตฌํ˜„์ค‘
origin pull ๋ฐ›๊ธฐ

* feat: UserService, UserRepository ๋‹‰๋„ค์ž„๋ณ€๊ฒฝ ๋กœ์ง ๊ตฌํ˜„ ์™„๋ฃŒ

* feat: ๊ธฐ์กด ๋‹‰๋„ค์ž„์ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์—†์„ ๊ฒฝ์šฐ ์˜ˆ์™ธ์ฒ˜๋ฆฌ ์ถ”๊ฐ€

* feat: UserController์—์„œ ์ถ”๊ฐ€ํ•œ ์˜ˆ์™ธ์ฒ˜๋ฆฌ ํ•ธ๋“ค๋ง

* rename: ๋‹‰๋„ค์ž„ ๋ณ€๊ฒฝ dto ํด๋ž˜์Šค ์ด๋ฆ„ ๋ณ€๊ฒฝ

* rename: UserRepository ํ•จ์ˆ˜๋ช… ๋ณ€๊ฒฝ
modifyNicknameByNewNickname >> modifyNickname

* feat: request body json์œผ๋กœ ๋ณ€๊ฒฝ > Requestbody ์–ด๋…ธํ…Œ์ด์…˜ ์ถ”๊ฐ€

* test: ํ•ด์‹œํƒœ๊ทธ๋ฅผ ํ†ตํ•œ ๊ฒŒ์‹œ๋ฌผ ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ (#121)

* refactor: HashtagNotExistException์˜ ์—๋Ÿฌ ๋ฉ”์‹œ์ง€๋ฅผ ์™ธ๋ถ€์—์„œ ์ธ์ž๋กœ ์ฃผ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ exception ํด๋ž˜์Šค์—์„œ ๊ด€๋ฆฌํ•˜๋„๋ก ๋ณ€๊ฒฝ

* fix: UserServiceTest์˜ ํ…Œ์ŠคํŠธ ์‹คํŒจํ•˜๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ์„ฑ๊ณตํ•˜๋„๋ก ๋ณ€์ˆ˜์˜ ๊ฐ’ ์ˆ˜์ •

- signupNicknameDuplicate() ํ…Œ์ŠคํŠธ: ๋‹‰๋„ค์ž„ ์ž…๋ ฅ ๊ฐ’ ์ˆ˜์ •
- loginSuccess() ํ…Œ์ŠคํŠธ: ๋น„๋ฐ€๋ฒˆํ˜ธ ์ž…๋ ฅ ๊ฐ’ ์ˆ˜์ •
- ๋ถˆํ•„์š”ํ•œ import๋ฌธ ์‚ญ์ œ ๋ฐ ์ธํ…”๋ฆฌ์ œ์ด ์ž๋™ ์ •๋ ฌ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ฝ”๋“œ ํฌ๋งทํŒ…
- ๋ถˆํ•„์š”ํ•œ ๋ฉค๋ฒ„ ๋ณ€์ˆ˜ userRepository ์‚ญ์ œ

* fix: ์ฟผ๋ฆฌ๋ฌธ์—์„œ ๋ฌธ์ž์—ด์„ ์‚ฌ์šฉํ•  ๋•Œ ๋ฌธ์ž์—ด์„ ''๋กœ ๊ฐ์‹ธ๋„๋ก ์ˆ˜์ •

ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜์—ฌ ํ…Œ์ŠคํŠธ ์‹คํ–‰ ์ค‘ ๋ฐœ๊ฒฌํ•œ ์˜ค๋ฅ˜๋กœ, ์ฟผ๋ฆฌ๋ฌธ์˜ ๋ฌธ์ž์—ด์„ ''๋กœ ๊ฐ์‹ธ๋„๋ก ์ˆ˜์ •

* test: ํ•ด์‹œํƒœ๊ทธ๋ฅผ ํ†ตํ•œ ๊ฒŒ์‹œ๋ฌผ ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ

์™ธ๋ถ€ DB์— ์ €์žฅ๋˜์–ด์žˆ๋Š” ์ƒ˜ํ”Œ ๋ฐ์ดํ„ฐ๋กœ ํ…Œ์ŠคํŠธ ์‹คํ–‰

* refactor: PostService์˜ ๋ถˆํ•„์š”ํ•œ ๋ฉค๋ฒ„ ๋ณ€์ˆ˜ hashtagRepository ์‚ญ์ œ

* test: ๋ฉ”์ธ ํŽ˜์ด์ง€ ๊ฒŒ์‹œ๊ธ€ ์ด๋ฏธ์ง€ ๋ฆฌ์ŠคํŠธ ์กฐํšŒ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ (#124)

* chore: pr๊ณผ merge

* test: PostServiceTest์˜ getRecentFollowerPostsTest ์ž‘์„ฑ
๋น„๋กœ๊ทธ์ธ ์ƒํƒœ์—์„œ์˜ ์ •์ƒ์ ์ธ ๋ฉ”์ธ ํŽ˜์ด์ง€ ๋™์ž‘ ํ…Œ์ŠคํŠธ
fix: ImageRepository์˜ getImagesOfRecentFollowingPosts ์ฟผ๋ฆฌ์— ๋„์–ด์“ฐ๊ธฐ ๋ˆ„๋ฝ๋œ ๋ฒ„๊ทธ ์ˆ˜์ •

* chore: PR merge

* chore: ๊ตฌํ˜„ํ•˜์ง€ ์•Š์€ test method ์‚ญ์ œ

* Update README.md

๋…ธ์…˜ ๋งํฌ ๋ณ€๊ฒฝ

* feat: ๋น„๋ฐ€๋ฒˆํ˜ธ ๋ณ€๊ฒฝ (#125)

* feat: UserController ๋น„๋ฐ€๋ฒˆํ˜ธ ๋ณ€๊ฒฝ ํ•จ์ˆ˜ ๋กœ์ง ๊ตฌํ˜„ ๋ฐ dto ์ถ”๊ฐ€

* feat: UserService, UserRepository ๋น„๋ฐ€๋ฒˆํ˜ธ ๋ณ€๊ฒฝ ํ•จ์ˆ˜ ๊ตฌํ˜„

* feat: ๊ธฐ์กด ๋น„๋ฐ€๋ฒˆํ˜ธ์™€ ์ž…๋ ฅํ•œ ๋น„๋ฐ€๋ฒˆํ˜ธ ํ™•์ธ ๋กœ์ง ์ถ”๊ฐ€

* fix: ์„ธ์…˜ ๊ด€๋ จ ๋กœ์ง ์ˆ˜์ •
์„ธ์…˜์— user id๋ฅผ ์ €์žฅํ•˜๊ณ  ๋ถˆ๋Ÿฌ์˜จ userid๋ฅผ ํ†ตํ•ด user๋ฅผ ์กฐํšŒํ•˜๊ณ  ๊ด€๋ จ ๋กœ์ง์„ ์ˆ˜ํ–‰ํ•˜๋„๋ก ๋ณ€๊ฒฝ
๊ธฐ์กด์—๋Š” user ํ†ต์งธ๋กœ ์„ธ์…˜์— ์ €์žฅํ•จ >> ๋ณ€๊ฒฝ ์‚ฌํ•ญ ๋ฐœ์ƒ ์‹œ ์„ธ์…˜์„ ์ผ์ผํžˆ ์—…๋ฐ์ดํŠธ ํ•ด์ฃผ์–ด์•ผ๋จ
>> ์„ธ์…˜์—๋Š” ๋ณ€๊ฒฝ์ด ๋ถˆ๊ฐ€๋Šฅํ•œ userid๋ฅผ ์ €์žฅํ•˜๊ณ  userid๋ฅผ ํ†ตํ•ด ์œ ์ € ์ •๋ณด ๊ด€๋ฆฌ

* refactor: modifyPassword ํ•จ์ˆ˜ ๋‚ด ๋กœ์ง ์ด๋ฏธ ๊ตฌํ˜„ํ•ด๋†“์€ ํ•จ์ˆ˜๋กœ ๋ฆฌํŒฉํ† ๋ง

* feat: ModifyPasswordForm password ํ•„๋“œ์—๋„ ์ œ์•ฝ์กฐ๊ฑด ์ถ”๊ฐ€

* refactor: isLogin ํŒŒ๋ผ๋ฏธํ„ฐ ๋ณ€๊ฒฝ, checkLoginํ•จ์ˆ˜ ๊ตฌํ˜„, exception ์ƒ์„ฑ

* feat: ๋กœ๊ทธ์ธ ์•„๋‹Œ ๊ฒฝ์šฐ ์˜ˆ์™ธ์ฒ˜๋ฆฌ ์ถ”๊ฐ€

* rename: checkLogin >> checkLoginException ํ•จ์ˆ˜๋ช… ๋ณ€๊ฒฝ

* Create main.yml

๋ฐฐํฌ๋ฅผ ์œ„ํ•œ yml ํŒŒ์ผ ์ž‘์„ฑ

* v0.1 ๋ฐฐํฌ (#126)

* chore: ํ”„๋กœ์ ํŠธ ๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์กฐ ์„ค์ •

* chore: ๋ฐฑ์—”๋“œ ํ”„๋กœ์ ํŠธ ์„ธํŒ…

* chore: .DS_Store ๊ด€๋ จ ์„ธํŒ…

* chore: build.gradle ๊ด€๋ จ ์„ธํŒ…

* chore: ํ”„๋ก ํŠธ ํ”„๋กœ์ ํŠธ ์„ธํŒ…

* docs: README.md ERD ์‚ฌ์ง„ ์ถ”๊ฐ€

* docs: README.md ERD ์‚ฌ์ง„ ์ˆ˜์ •

* docs: README.md ERD ์ด๋ฏธ์ง€ ๋ณ€๊ฒฝ

* chore: READMD.md ERD ์˜คํƒ€ ์ˆ˜์ •

* chore: ํ”„๋กœ์ ํŠธ ์ดˆ๊ธฐ ํด๋” ๊ตฌ์กฐ ์„ธํŒ…

* chore: MySQL ์˜์กด์„ฑ ์ถ”๊ฐ€

* chore: MySQL ์—ฐ๊ฒฐ ์ •๋ณด ์ถ”๊ฐ€

- ํŒจ์Šค์›Œ๋“œ ์ œ์™ธํ•˜๊ณ  ์ž‘์„ฑ

* chore:์ ˆ๋Œ€๊ฒฝ๋กœ ์„ค์ •

* fix: ํ•œ๊ธ€ ์ธ์ฝ”๋”ฉ ์—๋Ÿฌ ํ•ด๊ฒฐ

* chore: ์ „์—ญ style ์„ค์ •

* chore: ์›น ํฐํŠธ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ

* docs: DB ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ•˜๋Š” DDL ์ถ”๊ฐ€

* docs: DB ํ…Œ์ด๋ธ”์„ ์‚ญ์ œํ•˜๋Š” DDL ์ถ”๊ฐ€

* docs: ์‚ฌ์šฉ์ž์™€ ๊ฒŒ์‹œ๋ฌผ ์ƒ˜ํ”Œ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฝ์ž…ํ•˜๊ณ  ์กฐํšŒํ•˜๋Š” sql๋ฌธ ์ถ”๊ฐ€

* chore: ํ”„๋กœ์ ํŠธ ๋””๋ ‰ํ† ๋ฆฌ ์„ธํŒ…

* feat: ํšŒ์›๊ฐ€์ž… dto ์ƒ์„ฑ

* feat: UserController signup ํ•จ์ˆ˜ ์ถ”๊ฐ€
PostMapping์œผ๋กœ ์ฒ˜๋ฆฌ, ๊ฒฐ๊ณผ return์€ ์ž„์‹œ๋กœ String์œผ๋กœ ์ฒ˜๋ฆฌ

* feat: UserController์™€ UserService Bean ์—ฐ๊ฒฐ
์ƒ์„ฑ์ž ์ฃผ์ž… ๋ฐฉ์‹์œผ๋กœ ์—ฐ๊ฒฐ

* feat: UserService ๋กœ์ง ์„ค๊ณ„
signupํ•จ์ˆ˜์™€ isDuplicatedํ•จ์ˆ˜ ์„ค๊ณ„ ๋ฐ ๊ตฌํ˜„์ค€๋น„

* fix: ๊ตฌํ˜„๋˜์ง€ ์•Š์€ db๋กœ์ง ์ฃผ์„์ฒ˜๋ฆฌ

* feat: ๊ธฐ๋ณธ page ์ƒ์„ฑ

* feat: routes ์ƒ์ˆ˜ ๋ถ„๋ฆฌ

* feat: ๋ผ์šฐํŒ… ๊ธฐ๋Šฅ ์ถ”๊ฐ€

push, replace ๊ธฐ๋Šฅ

* feat: App์— ๋ผ์šฐํŒ… ๊ธฐ๋Šฅ ์ ์šฉ

* chore: axios ๊ฐ์ฒด ์ƒ์„ฑ

* Update README.md

* ๐Ÿ’„design: ์ถ”๊ฐ€ ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€ ์ดˆ๊ธฐ ๋งˆํฌ์—…

* โš’refactor: modify baseURL

* โš’refactor: set Timedut and divide Content

* โš’refactor: add encoding

* feat: build.gradle ์ถ”๊ฐ€
spring-boot-starter-validation ์ถ”๊ฐ€

* feat: ์ž…๋ ฅ๋ฐ›์€ ์ •๋ณด๊ฐ€ ์ž˜๋ชป๋œ ํ˜•์‹์ผ ๊ฒฝ์šฐ ํšŒ์›๊ฐ€์ž… ์ œํ•œ
์ด๋ฉ”์ผ ํ˜•์‹์ด ์•„๋‹ ๊ฒฝ์šฐ, ๋‹‰๋„ค์ž„์„ 16์ž ๋„˜์–ด ์ž…๋ ฅํ•  ๊ฒฝ์šฐ, ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ 16์ž ๋„˜์–ด ์ž…๋ ฅํ•  ๊ฒฝ์šฐ ์ œํ•œ
@Valid  ์–ด๋…ธํ…Œ์ด์…˜์„ ํ†ตํ•ด ๊ตฌํ˜„
์ค‘๋ณต๋œ ์‚ฌ์šฉ์ž ์ด๋ฉ”์ผ, ๋‹‰๋„ค์ž„ ํŒ๋ณ„์€ db์™€ ๊ฐ™์ด ๊ตฌํ˜„ ํ•„์š”

* feat: jdbc gradle ์ถ”๊ฐ€

* feat: SignupForm getter ์ถ”๊ฐ€

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

* feat: user ํด๋ž˜์Šค ๊ตฌํ˜„

* feat: UserRepository ์ด๋ฉ”์ผ, ๋‹‰๋„ค์ž„ ์ค‘๋ณต์ฒดํฌ ๊ธฐ๋Šฅ ๊ตฌํ˜„

* feat: exception ์ฒ˜๋ฆฌ ํด๋ž˜์Šค ์ถ”๊ฐ€

* feat: UserService ๋กœ์ง ์ˆ˜์ •
isDuplicated > checkDuplicated๋กœ ํ•จ์ˆ˜๋ช… ์ˆ˜์ •
๋งŒ๋“  custom exception์œผ๋กœ ์ด๋ฉ”์ผ, ๋‹‰๋„ค์ž„ ์ค‘๋ณต ํ•ธ๋“ค๋ง

* feat: ์‘๋‹ต์„ ์œ„ํ•œ Message DTO ์ถ”๊ฐ€

* feat: ResponseEntity๋กœ ํšŒ์›๊ฐ€์ž… ์„ฑ๊ณต ์—ฌ๋ถ€ ์‘๋‹ต

* feat: app.js์— render ํ•จ์ˆ˜ ์ถ”๊ฐ€

* feat: UserController login ํ•จ์ˆ˜ ์ž‘์„ฑ

* feat: LoginForm dto class ์ƒ์„ฑ

* fix: ๋ฏธ๊ตฌํ˜„ ํ•จ์ˆ˜ ์ฃผ์„์ฒ˜๋ฆฌ

* feat: UserService login ํ•จ์ˆ˜ ์„ค๊ณ„

* feat: LoginForm ํ˜•์‹ ์ œํ•œ

* feat: UserRepository ํ•จ์ˆ˜ ์ž‘์„ฑ ๋ฐ ์ฃผ์„์ฒ˜๋ฆฌ
db์„ค๊ณ„ ํ›„ ํ•ฉ์น˜๊ธฐ

* fix: UserRepository ์ฃผ์„ ์‚ญ์ œ

* feat: LoginForm, User ํด๋ž˜์Šค getter ์ถ”๊ฐ€

* feat: ๋กœ๊ทธ์ธ์‹œ DB์— ๋“ฑ๋ก๋œ ์ด๋ฉ”์ผ์ด ์—†๋Š” ๊ฒฝ์šฐ ์˜ˆ์™ธ์ฒ˜๋ฆฌ ํด๋ž˜์Šค ์ถ”๊ฐ€

* feat: ์˜ˆ์™ธ์ฒ˜๋ฆฌ ๋กœ์ง ๊ตฌํ˜„

* refactor: UserService isLoginSuccessํ•จ์ˆ˜ ๋กœ์ง ์ˆ˜์ •

* feat: UserService isLogin ๋กœ์ง ๊ตฌํ˜„

* feat: ResponseEntity๋กœ ๋กœ๊ทธ์ธ ์„ฑ๊ณต ์—ฌ๋ถ€ ์‘๋‹ต

* refactor: Message ํด๋ž˜์Šค์— ์ค‘๋ณต ์ฝ”๋“œ ํ•จ์ˆ˜๋กœ ๊ตฌํ˜„
make200Response, make400Response ํ•จ์ˆ˜ ์ƒ์„ฑ ๋ฐ ์Šคํƒœํ‹ฑ ํ•จ์ˆ˜๋กœ ์‚ฌ์šฉ
๋ฉ”์„ธ์ง€๋ฅผ ์ธ์ž๋กœ ์ „๋‹ฌ๋ฐ›์•„  RepsonseEntity ๋ฐ˜ํ™˜ํ•ด์ฃผ๋Š” ํ•จ์ˆ˜

* feat: pagesํด๋” ๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์กฐ ์ˆ˜์ •

* chore: application properties git ignore์— ์ถ”๊ฐ€

* chore: build.gradle ์ˆ˜์ •

* chore: db setting
sql๋ฌธ ์ˆ˜์ •
UserRepository query ์ˆ˜์ •
406 error > Message dto getter ์ถ”๊ฐ€

* ๐Ÿ’„design: add sign up page markup

* refactor: ExceptionHandler ์–ด๋…ธํ…Œ์ด์…˜์„ ํ†ตํ•œ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ๊ตฌํ˜„

* refactor: Controller์—์„œ ResponseEntity ์ƒ์„ฑ

* refactor: UserService isLoginSuccess > login์œผ๋กœ ํ•จ์ˆ˜๋ช… ๋ณ€๊ฒฝ

* feat: Valid ์–ด๋…ธํ…Œ์ด์…˜ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ

* rename: SignupNicknameDuplicatedException >> NicknameDuplicatedException

* feat: UserService, UserRepository ๋ณ€์ˆ˜ private final๋กœ ๋ณ€๊ฒฝ

* TEST: ๋กœ๊ทธ์ธ, ํšŒ์›๊ฐ€์ž… ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ

* feat: ๋ฉ”์ธํŽ˜์ด์ง€ ๋งˆํฌ์—…

* fix: ์ด๋ฏธ์ง€ ๊ฒฝ๋กœ ์ˆ˜์ •

* fix: Valid ์–ด๋…ธํ…Œ์ด์…˜ ์˜ˆ์™ธ์ฒ˜๋ฆฌ ํ•ธ๋“ค๋Ÿฌ ์ˆ˜์ •
MethodArgumentNotValidException >> BindException

* fix: ๊ฐค๋Ÿฌ๋ฆฌ grid ํ˜•ํƒœ๋กœ ์ˆ˜์ •

* fix: ์ด๋ฏธ์ง€ ๋†’์ด ์ˆ˜์ •

* fix: password, nickname ์ˆœ์„œ ๋ณ€๊ฒฝ

* feat: RestControllerAdvice ์–ด๋…ธํ…Œ์ด์…˜ ์‚ญ์ œ

* feat: Post Model ์ž‘์„ฑ
DDL ์ˆ˜์ •
Post Model ์ƒ์„ฑ

* feat: PostRepository ๊ตฌํ˜„

* feat: Post entity id ์ถ”๊ฐ€

* feat: Image model ์ƒ์„ฑ

* feat: dto/GeustPostsResponse ์ƒ์„ฑ
๋น„๋กœ๊ทธ์ธ์—์„œ์˜ ํฌ์ŠคํŠธ Response ํด๋ž˜์Šค

* feat: ImageRepository ์ƒ์„ฑ
postId๋ฅผ ํ†ตํ•ด image๋ฅผ ์ฐพ๋Š” getImageByPostId ๋ฉ”์†Œ๋“œ ์ž‘์„ฑ
fix: PostRepository sql๋ฌธ์˜ where ์‚ญ์ œ

* feat: PostService/GuestPostsResponse ๊ตฌํ˜„
๋น„๋กœ๊ทธ์ธ ์ƒํƒœ์—์„œ ์ตœ๊ทผ ๊ฒŒ์‹œ๋ฌผ 10๊ฐœ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฉ”์†Œ๋“œ

* fix: PostService Repository ์ ‘๊ทผ์ œ์–ด์ž ๋ณ€๊ฒฝ
private final๋กœ ๋ณ€๊ฒฝ
Autowired ์ƒ์„ฑ์ž ์ˆ˜์ •

* feat: PostController ๊ตฌํ˜„์ค‘

* feat: LoginPostsResponse ์ƒ์„ฑ
๋กœ๊ทธ์ธ ์‹œ์˜ ๋ฉ”์ธํŽ˜์ด์ง€ api ํด๋ž˜์Šค

* feat: PostController ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€ ๊ตฌํ˜„์ค‘

* feat: PostController์— ํ”„๋กœํ•„ ์กฐํšŒ ํ•จ์ˆ˜ ์ถ”๊ฐ€

* feat: PostController profile ํ•จ์ˆ˜ ํ˜„์žฌ ์ ‘์†ํ•œ ์‚ฌ์šฉ์ž์— ๋”ฐ๋ฅธ ๋ถ„๊ธฐ ์ถ”๊ฐ€

* feat: ํ•ด์‹œํƒœ๊ทธ(HashTag) ํด๋ž˜์Šค ์ƒ์„ฑ

* feat: HashtagRepository์—์„œ ํƒœ๊ทธ ์ด๋ฆ„์œผ๋กœ Hashtag๋ฅผ ์กฐํšŒํ•˜๋Š” ๋ฉ”์„œ๋“œ ์ถ”๊ฐ€

- findHashtagByName(): ํƒœ๊ทธ ์ด๋ฆ„์œผ๋กœ Hashtag๋ฅผ ์กฐํšŒ

* feat: findHashtagByName()์—์„œ ํ•ด๋‹น ์ด๋ฆ„์˜ ํ•ด์‹œํƒœ๊ทธ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ HashtagNotExistException์„ ๋ฐœ์ƒํ•˜๋„๋ก ๊ตฌํ˜„

* feat: ํ•„์š”์—†๋Š” ๋ฌธ์„œ ์‚ญ์ œ

* feat: ํ‚ค์›Œ๋“œ๋กœ ๊ฒŒ์‹œ๊ธ€ ์กฐํšŒ ์‹œ ์‚ฌ์šฉํ•  ์‘๋‹ต ๊ฐ์ฒด PostSearchResponse ํด๋ž˜์Šค ์ƒ์„ฑ

* feat: PostService์—์„œ ํ‚ค์›Œ๋“œ๋กœ ๊ฒŒ์‹œ๋ฌผ์„ ์กฐํšŒํ•˜๋Š” searchByTags() ๋ฉ”์„œ๋“œ ๊ตฌํ˜„

- ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋“ค์–ด์˜จ ํƒœ๊ทธ๋ฅผ "+" ๊ธฐ์ค€์œผ๋กœ split
- hashtagRepository์—์„œ ํƒœ๊ทธ ์ด๋ฆ„์œผ๋กœ Hashtag ์กฐํšŒํ•˜์—ฌ ํ•ด๋‹น Hashtag์˜ ์•„์ด๋””๋ฅผ hashtagIds ๋ฆฌ์ŠคํŠธ์— ์ถ”๊ฐ€
- postRepository.searchByHashtags()๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ํ•ด์‹œํƒœ๊ทธ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฒŒ์‹œ๋ฌผ ์กฐํšŒ
- imageRepository.getImageByPostId()๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์ด๋ฏธ์ง€๋ฅผ ์กฐํšŒํ•˜์—ฌ ๋ฆฌ์ŠคํŠธ์— ์ถ”๊ฐ€
- ์ด๋ฏธ์ง€ ๋ฆฌ์ŠคํŠธ๋ฅผ PostsSearchResponse ์‘๋‹ต ๊ฐ์ฒด์— ๋„ฃ์–ด์„œ ๋ฐ˜ํ™˜

* feat: PostRepository์—์„œ ํ•ด์‹œํƒœ๊ทธ๋กœ ๊ฒŒ์‹œ๋ฌผ์„ ์กฐํšŒํ•˜๋Š” searchByHashtags() ๋ฉ”์„œ๋“œ ๊ตฌํ˜„

- ์ธ์ž๋กœ ๋„˜๊ฒจ์˜จ hashtagIds๋กœ where ์กฐ๊ฑด์ ˆ์„ ์ƒ์„ฑ
- where ์กฐ๊ฑด์ ˆ์„ ํฌํ•จํ•œ ์ „์ฒด ์ฟผ๋ฆฌ๋ฌธ ์ƒ์„ฑ
- jdbcTemplate์œผ๋กœ ์ฟผ๋ฆฌ๋ฌธ ์‹คํ–‰
- List<Post> ํƒ€์ž…์œผ๋กœ ๋ฐ˜ํ™˜

* feat: HashtagRepository์— @Repository ์–ด๋…ธํ…Œ์ด์…˜ ์ถ”๊ฐ€

* feat: PostController์— ํƒœ๊ทธ๋กœ ๊ฒŒ์‹œ๋ฌผ์„ ์กฐํšŒํ•˜๋Š” searchPostsByTags() ๋ฉ”์„œ๋“œ ์ถ”๊ฐ€

- @GetMapping์—์„œ URL ์ถฉ๋Œ์ด ๋‚˜๊ธฐ ๋•Œ๋ฌธ์— ์ฃผ์„ ์ฒ˜๋ฆฌ

* feat: PostController์—์„œ ํƒœ๊ทธ๋กœ ๊ฒŒ์‹œ๋ฌผ์„ ์กฐํšŒํ•˜๋Š” searchPostsByTags() ๋ฉ”์„œ๋“œ์™€ ๋งคํ•‘๋  URL ๋ณ€๊ฒฝ

- @GetMapping์— ๋งคํ•‘๋  URL์„ "/posts/m/search"๋กœ ๋ณ€๊ฒฝ

* refactor: subString()์„ ์‚ฌ์šฉํ•˜์—ฌ ๋กœ์ง ๋‹จ์ถ•

- ๋งจ ๋งˆ์ง€๋ง‰์— ๋“ค์–ด๊ฐ€๋Š” " ON " ๋ฌธ์ž์—ด์„ ์‚ญ์ œํ•˜๋Š” ๋กœ์ง์„ deleteCharAt()์„ 4๋ฒˆ ํ˜ธ์ถœํ•˜๋Š” ๋Œ€์‹  subString()์„ ์‚ฌ์šฉ

* feat: ๊ธ€ ์ž‘์„ฑ ํŽ˜์ด์ง€ ๋งˆํฌ์—…

* style: SQL๋ฌธ์„ ๋Œ€๋ฌธ์ž๋กœ ํ†ต์ผ

* ๐Ÿ’„design: add sign up Postdetail Page markup

* feat: PostService์˜ getRecentPosts() ๋ฉ”์„œ๋“œ ๋‚ด๋ถ€ ๋กœ์ง ์ˆ˜์ •

๊ธฐ์กด์˜ ๋กœ์ง์€ postRepository๋ฅผ ํ†ตํ•ด post๋ฅผ ๊ฐ€์ ธ์˜จ ๋‹ค์Œ, post์˜ ์•„์ด๋””๋กœ image๋ฅผ ๊ฐ€์ ธ์™”์ง€๋งŒ, ์ด ๋ฐฉ์‹์€ ์ฟผ๋ฆฌ๋ฅผ 2๋ฒˆ์ด๋‚˜ ๋ณด๋‚ด๊ธฐ ๋•Œ๋ฌธ์— ์„ฑ๋Šฅ ์ €ํ•˜์˜ ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ฟผ๋ฆฌ๋ฅผ 2๋ฒˆ ๋ณด๋‚ด๋Š” ๋Œ€์‹  imageRepository.getImagesOfRecentPosts()๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ IMAGE ํ…Œ์ด๋ธ”๊ณผ POST ํ…Œ์ด๋ธ”์„ joinํ•˜์—ฌ ๋ฐ”๋กœ List<image>๋ฅผ ๊ฐ€์ ธ์˜ค๋„๋ก ์ˆ˜์ •ํ•˜์˜€๋‹ค.
- ImageRepository์— getImagesOfRecentPosts() ๋ฉ”์„œ๋“œ ์ถ”๊ฐ€

* pulled develop

* feat: Follow model ์ƒ์„ฑ

* feat: FollowRepository ์ƒ์„ฑ
getFollowerIds ๋ฉ”์†Œ๋“œ: following id๋กœ follower id ๋ชฉ๋ก์„ ์กฐํšŒํ•˜๋Š” ๋ฉ”์†Œ๋“œ
getFollowingIds ๋ฉ”์†Œ๋“œ: follower id๋กœ following id ๋ชฉ๋ก์„ ์กฐํšŒํ•˜๋Š” ๋ฉ”์†Œ๋“œ
getFollowerCount ๋ฉ”์†Œ๋“œ: followingId๋กœ follower ์ˆ˜๋ฅผ ์กฐํšŒํ•˜๋Š” ๋ฉ”์†Œ๋“œ
getFollowingCount ๋ฉ”์†Œ๋“œ: followerId๋กœ following ์ˆ˜๋ฅผ ์กฐํšŒํ•˜๋Š” ๋ฉ”์†Œ๋“œ
feat: User์— id ์ถ”๊ฐ€

* chore: PostRepository ๋ณ‘ํ•ฉ
๊ธฐ์กด์˜ pr๋œ ์ฝ”๋“œ์™€ ๋ณ‘ํ•ฉ

* chore: PostService ๋ณ‘ํ•ฉ
๊ธฐ์กด pr๊ณผ ๋ณ‘ํ•ฉ

* feat: PostController ๊ธฐ๋Šฅ ์ถ”๊ฐ€
getLoginPosts: ๋กœ๊ทธ์ธ ์ƒํƒœ์˜ response๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ธฐ๋Šฅ

* refactor: HttpServletRequest๋ฅผ ๋ฐ›๋Š” ๋ฐฉ์‹ ๋ณ€๊ฒฝ
method ์ธ์ž๋กœ ๋ฐ”๋กœ ๋ฐ›๋Š” ๋ฐฉ์‹์œผ๋กœ ์ˆ˜์ •

* chore: cherrypick ์ค‘ ๋ˆ„๋ฝ๋œ import ์ˆ˜์ •

* feat: ๊ธ€ ์ˆ˜์ • menu ์ถ”๊ฐ€

* feat: ImageRepository ๊ธฐ๋Šฅ ์ถ”๊ฐ€ ๋ฐ PostService ๋กœ์ง ๋ณ€๊ฒฝ
ImageRepository.getImagesOfRecentFollowingPosts: followerId๋ฅผ ํ†ตํ•ด ์ด๋ฏธ์ง€ ๋ฆฌ์ŠคํŠธ๋ฅผ ์กฐํšŒํ•˜๋Š” ๋ฉ”์†Œ๋“œ
PostService.getRecentFollowerPosts: ๊ธฐ์กด postRepository ์‚ฌ์šฉ ๋กœ์ง -> imageRepository ์‚ฌ์šฉ ๋กœ์ง์œผ๋กœ ๋ณ€๊ฒฝ
PostRepository ๋”์ด์ƒ ์•ˆ์“ฐ๋Š” ๊ธฐ์กด ๋ฉ”์†Œ๋“œ deprecated ์ฒ˜๋ฆฌ

* Update README.md

ERD ์ฐจ๋Ÿ‰ ๋ชจ๋ธ, ์ฐจ๋Ÿ‰ ํƒ€์ž… ํ…Œ์ด๋ธ” ์ถ”๊ฐ€

* feat: PostController profile ์กฐํšŒ ํ•จ์ˆ˜ ์„ค๊ณ„

* feat: ํ”„๋กœํ•„ dto ํด๋ž˜์Šค ์ƒ์„ฑ

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

* feat: User repository ๋‹‰๋„ค์ž„์œผ๋กœ ์ด๋ฉ”์ผ ์กฐํšŒ ํ•  ๋•Œ ์˜ˆ์™ธ์ฒ˜๋ฆฌ

* feat: UserRepository findEmailByNickname select * >> select email
emailRowMapper ํ•จ์ˆ˜ ๋งŒ๋“ค์–ด์„œ ์ด๋ฉ”์ผ ํ•˜๋‚˜๋งŒ ๊ฐ€์ ธ์˜ค๋„๋ก ๊ตฌํ˜„

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

* feat: UserID์™€ ๋‹‰๋„ค์ž„์œผ๋กœ DB์—์„œ Image๋ฅผ ์ฐพ๋Š” ๋กœ์ง ๊ตฌํ˜„

* fix: ImageRepository select๋ฌธ ์นผ๋Ÿผ ์ˆ˜์ •
*->IMAGE.post_id, IMAGE.image_url

* feat: PostService ํ”„๋กœํ•„ ํŒŒ์ผ ๋ถˆ๋Ÿฌ์˜ค๋Š” ๊ธฐ๋Šฅ ๊ตฌํ˜„
followRepository๋ฅผ ํ†ตํ•œ ์ •๋ณด ์กฐํšŒ ๊ธฐ๋Šฅ ๊ตฌํ˜„

* feat: FollowRepository isFollow query ์ˆ˜์ •

* refactor: response dto builder ํŒจํ„ด ์ ์šฉ

* refactor: builderํŒจํ„ด ํ•จ์ˆ˜๋ช… ๋ณ€๊ฒฝ
set ์ œ๊ฑฐ

* feat: PostService์˜ searchByTags() ๋ฉ”์„œ๋“œ ๋‚ด๋ถ€ ๋กœ์ง ์ˆ˜์ •

๊ธฐ์กด์˜ ๋กœ์ง์€ hashtagRepository๋กœ ํƒœ๊ทธ ์ด๋ฆ„์— ํ•ด๋‹นํ•˜๋Š” ํƒœ๊ทธ์˜ ์•„์ด๋””๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ , postRepository๋ฅผ ํ†ตํ•ด ํ•ด๋‹น ํƒœ๊ทธ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” post๋ฅผ ๊ฐ€์ ธ์˜จ ๋‹ค์Œ, ImageRepository๋ฅผ ํ†ตํ•ด post์˜ ์•„์ด๋””๋กœ image๋ฅผ ๊ฐ€์ ธ์™”๋‹ค. ์ด ๋ฐฉ์‹์€ ์ฟผ๋ฆฌ๋ฅผ ์ด 3๋ฒˆ์ด๋‚˜ ๋ณด๋‚ด๊ธฐ ๋•Œ๋ฌธ์— ์„ฑ๋Šฅ ์ €ํ•˜์˜ ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ฟผ๋ฆฌ๋ฅผ 3๋ฒˆ ๋ณด๋‚ด๋Š” ๋Œ€์‹  imageRepository.getImagesOfRecentPostsByTags()๋ฅผ ํ˜ธ์ถœํ•˜๋„๋ก ์ˆ˜์ •ํ•˜์˜€๋‹ค.

- ImageRepository์— getImagesOfRecentPostsByTags() ๋ฉ”์„œ๋“œ ์ถ”๊ฐ€
    - POST, POST_HASHTAG, HASHTAG, IMAGE ํ…Œ์ด๋ธ”์„ joinํ•˜์—ฌ List<image> ๋ฐ˜ํ™˜
- ํƒœ๊ทธ ์ด๋ฆ„ ๊ด€๋ จ ์กฐ๊ฑด์ ˆ์„ ์ƒ์„ฑํ•˜๋Š” createTagNameConditionalStatement() ๋ฉ”์„œ๋“œ ์ถ”๊ฐ€
    - ์ธ์ž๋กœ ์ฃผ์–ด์ง„ ํƒœ๊ทธ ์ด๋ฆ„๋“ค์„ " OR "๋กœ ์—ฐ๊ฒฐํ•˜์—ฌ ์กฐ๊ฑด์ ˆ ์ƒ์„ฑ
- PostRepository์˜ searchByHashtags(), createWhereStatement() ๋ฉ”์„œ๋“œ ์‚ญ์ œ

* style: ํ•ด๋‹น ํƒœ๊ทธ ์ด๋ฆ„์„ ๊ฐ€์ง€๋Š” ํ•ด์‹œํƒœ๊ทธ๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ ๋ฐœ์ƒํ•˜๋Š” ์˜ˆ์™ธ ๋ฉ”์‹œ์ง€ ๋ณ€๊ฒฝ

- "ERROR: Hashtag not exist"๋กœ ๋ณ€๊ฒฝ

* feat: profile page markup posts mode markup

* refactor: PostsSearchResponse ์‘๋‹ต ๊ฐ์ฒด์— Builder ํŒจํ„ด ์ ์šฉ

* docs: DDL ์ˆ˜์ •

TYPE ํ…Œ์ด๋ธ” ์ถ”๊ฐ€
MODEL ํ…Œ์ด๋ธ” ์ถ”๊ฐ€
POST ํ…Œ์ด๋ธ” create_date column์— index ์„ค์ •

* feat: ์ปดํฌ๋„ŒํŠธ obj ๋™์  ๊ฐ’ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋„๋ก ์ˆ˜์ •

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

* feat: ํ—ค๋” ๋ถ„๋ฆฌ

* feat: ํ•ด์‹œ ํƒœ๊ทธ ๋ฆฌ์ŠคํŠธ ๋ถ„๋ฆฌ

* feat: postlist๋ถ„๋ฆฌ

* feat: ๊ฒ€์ƒ‰ ํผ ๋ถ„๋ฆฌ

* feat: ๋ถ„๋ฆฌ๋œ ์ปดํฌ๋„ŒํŠธ ์ƒ์„ฑ

๋”๋ฏธ๋ฐ์ดํ„ฐ ์ด์šฉ

* refactor: ๋ฉ”์ธ ํŽ˜์ด์ง€ response ๋ฐ user ๋ ˆํฌ์ง€ํ† ๋ฆฌ ๋ฆฌํŒฉํ† ๋ง (#118)

* refactor: GuestPostsResponse Builder ํŒจํ„ด ์ ์šฉ

* refactor: LoginPostsResponse Builder ํŒจํ„ด ์ ์šฉ

* refactor: PostService์˜ response Builder ํŒจํ„ด ์ ์šฉ

* feat: UserRepository์— findUserByNickname ๋ฉ”์†Œ๋“œ ์ถ”๊ฐ€
deprecated: findEmailByNickname, findUserIdByNickname, emailRowMapper, idRowMapper

* refactor: PostService.otherProfile ๋‚ด๋ถ€ ๋ฉ”์†Œ๋“œ์ผ๋ถ€ ์ˆ˜์ •
findUserIdByNickname -> findUserByNickname.getId ๋กœ ์ˆ˜์ •
findUserEmailByNickname -> findUserByNickname.getEmail ๋กœ ์ˆ˜์ •

* refactor: PostService.otherProfile์˜ profileUserId->profileUser ๋กœ ๋ณ€๊ฒฝ

* fix: findUserByNickname ์˜ exception์„ LoginEmailNotExistException -> NicknameNotExistException ์œผ๋กœ ๋ณ€๊ฒฝ

* refactor: User ๊ด€๋ จ Exception ๋ฉ”์‹œ์ง€ ์ƒ์ˆ˜ํ™”

* refactor: userRepository.findUserByNickname(profileUserNickname) -> profileUser๋กœ ๋ณ€๊ฒฝ

* feat: add profile page modify modal markup

* delete: postdetail scss ์˜คํƒ€ ์ˆ˜์ •

* refactor: login, signup scss ์ „์—ญ ์„ค์ • ๋๋˜ ๊ฒƒ๋“ค container ์•ˆ์— ๋„ฃ์Œ

* refactor: scss tab ๊ฐ„๊ฒฉ ์ˆ˜์ •

* delete: pretiierrc ์‚ญ์ œ

* feat: ๋‹‰๋„ค์ž„ ๋ณ€๊ฒฝ (#119)

* feat: UserController ๋‹‰๋„ค์ž„ ๋ณ€๊ฒฝ ํ•จ์ˆ˜ ๊ตฌํ˜„
๋กœ์ง ๊ตฌํ˜„, dto ํด๋ž˜์Šค ์ƒ์„ฑ

* feat: UserService ๋‹‰๋„ค์ž„๋ณ€๊ฒฝ ๋กœ์ง ๊ตฌํ˜„์ค‘
origin pull ๋ฐ›๊ธฐ

* feat: UserService, UserRepository ๋‹‰๋„ค์ž„๋ณ€๊ฒฝ ๋กœ์ง ๊ตฌํ˜„ ์™„๋ฃŒ

* feat: ๊ธฐ์กด ๋‹‰๋„ค์ž„์ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์—†์„ ๊ฒฝ์šฐ ์˜ˆ์™ธ์ฒ˜๋ฆฌ ์ถ”๊ฐ€

* feat: UserController์—์„œ ์ถ”๊ฐ€ํ•œ ์˜ˆ์™ธ์ฒ˜๋ฆฌ ํ•ธ๋“ค๋ง

* rename: ๋‹‰๋„ค์ž„ ๋ณ€๊ฒฝ dto ํด๋ž˜์Šค ์ด๋ฆ„ ๋ณ€๊ฒฝ

* rename: UserRepository ํ•จ์ˆ˜๋ช… ๋ณ€๊ฒฝ
modifyNicknameByNewNickname >> modifyNickname

* feat: request body json์œผ๋กœ ๋ณ€๊ฒฝ > Requestbody ์–ด๋…ธํ…Œ์ด์…˜ ์ถ”๊ฐ€

* test: ํ•ด์‹œํƒœ๊ทธ๋ฅผ ํ†ตํ•œ ๊ฒŒ์‹œ๋ฌผ ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ (#121)

* refactor: HashtagNotExistException์˜ ์—๋Ÿฌ ๋ฉ”์‹œ์ง€๋ฅผ ์™ธ๋ถ€์—์„œ ์ธ์ž๋กœ ์ฃผ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ exception ํด๋ž˜์Šค์—์„œ ๊ด€๋ฆฌํ•˜๋„๋ก ๋ณ€๊ฒฝ

* fix: UserServiceTest์˜ ํ…Œ์ŠคํŠธ ์‹คํŒจํ•˜๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ์„ฑ๊ณตํ•˜๋„๋ก ๋ณ€์ˆ˜์˜ ๊ฐ’ ์ˆ˜์ •

- signupNicknameDuplicate() ํ…Œ์ŠคํŠธ: ๋‹‰๋„ค์ž„ ์ž…๋ ฅ ๊ฐ’ ์ˆ˜์ •
- loginSuccess() ํ…Œ์ŠคํŠธ: ๋น„๋ฐ€๋ฒˆํ˜ธ ์ž…๋ ฅ ๊ฐ’ ์ˆ˜์ •
- ๋ถˆํ•„์š”ํ•œ import๋ฌธ ์‚ญ์ œ ๋ฐ ์ธํ…”๋ฆฌ์ œ์ด ์ž๋™ ์ •๋ ฌ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ฝ”๋“œ ํฌ๋งทํŒ…
- ๋ถˆํ•„์š”ํ•œ ๋ฉค๋ฒ„ ๋ณ€์ˆ˜ userRepository ์‚ญ์ œ

* fix: ์ฟผ๋ฆฌ๋ฌธ์—์„œ ๋ฌธ์ž์—ด์„ ์‚ฌ์šฉํ•  ๋•Œ ๋ฌธ์ž์—ด์„ ''๋กœ ๊ฐ์‹ธ๋„๋ก ์ˆ˜์ •

ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜์—ฌ ํ…Œ์ŠคํŠธ ์‹คํ–‰ ์ค‘ ๋ฐœ๊ฒฌํ•œ ์˜ค๋ฅ˜๋กœ, ์ฟผ๋ฆฌ๋ฌธ์˜ ๋ฌธ์ž์—ด์„ ''๋กœ ๊ฐ์‹ธ๋„๋ก ์ˆ˜์ •

* test: ํ•ด์‹œํƒœ๊ทธ๋ฅผ ํ†ตํ•œ ๊ฒŒ์‹œ๋ฌผ ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ

์™ธ๋ถ€ DB์— ์ €์žฅ๋˜์–ด์žˆ๋Š” ์ƒ˜ํ”Œ ๋ฐ์ดํ„ฐ๋กœ ํ…Œ์ŠคํŠธ ์‹คํ–‰

* refactor: PostService์˜ ๋ถˆํ•„์š”ํ•œ ๋ฉค๋ฒ„ ๋ณ€์ˆ˜ hashtagRepository ์‚ญ์ œ

* test: ๋ฉ”์ธ ํŽ˜์ด์ง€ ๊ฒŒ์‹œ๊ธ€ ์ด๋ฏธ์ง€ ๋ฆฌ์ŠคํŠธ ์กฐํšŒ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ (#124)

* chore: pr๊ณผ merge

* test: PostServiceTest์˜ getRecentFollowerPostsTest ์ž‘์„ฑ
๋น„๋กœ๊ทธ์ธ ์ƒํƒœ์—์„œ์˜ ์ •์ƒ์ ์ธ ๋ฉ”์ธ ํŽ˜์ด์ง€ ๋™์ž‘ ํ…Œ์ŠคํŠธ
fix: ImageRepository์˜ getImagesOfRecentFollowingPosts ์ฟผ๋ฆฌ์— ๋„์–ด์“ฐ๊ธฐ ๋ˆ„๋ฝ๋œ ๋ฒ„๊ทธ ์ˆ˜์ •

* chore: PR merge

* chore: ๊ตฌํ˜„ํ•˜์ง€ ์•Š์€ test method ์‚ญ์ œ

* Update README.md

๋…ธ์…˜ ๋งํฌ ๋ณ€๊ฒฝ

* feat: ๋น„๋ฐ€๋ฒˆํ˜ธ ๋ณ€๊ฒฝ (#125)

* feat: UserController ๋น„๋ฐ€๋ฒˆํ˜ธ ๋ณ€๊ฒฝ ํ•จ์ˆ˜ ๋กœ์ง ๊ตฌํ˜„ ๋ฐ dto ์ถ”๊ฐ€

* feat: UserService, UserRepository ๋น„๋ฐ€๋ฒˆํ˜ธ ๋ณ€๊ฒฝ ํ•จ์ˆ˜ ๊ตฌํ˜„

* feat: ๊ธฐ์กด ๋น„๋ฐ€๋ฒˆํ˜ธ์™€ ์ž…๋ ฅํ•œ ๋น„๋ฐ€๋ฒˆํ˜ธ ํ™•์ธ ๋กœ์ง ์ถ”๊ฐ€

* fix: ์„ธ์…˜ ๊ด€๋ จ ๋กœ์ง ์ˆ˜์ •
์„ธ์…˜์— user id๋ฅผ ์ €์žฅํ•˜๊ณ  ๋ถˆ๋Ÿฌ์˜จ userid๋ฅผ ํ†ตํ•ด user๋ฅผ ์กฐํšŒํ•˜๊ณ  ๊ด€๋ จ ๋กœ์ง์„ ์ˆ˜ํ–‰ํ•˜๋„๋ก ๋ณ€๊ฒฝ
๊ธฐ์กด์—๋Š” user ํ†ต์งธ๋กœ ์„ธ์…˜์— ์ €์žฅํ•จ >> ๋ณ€๊ฒฝ ์‚ฌํ•ญ ๋ฐœ์ƒ ์‹œ ์„ธ์…˜์„ ์ผ์ผํžˆ ์—…๋ฐ์ดํŠธ ํ•ด์ฃผ์–ด์•ผ๋จ
>> ์„ธ์…˜์—๋Š” ๋ณ€๊ฒฝ์ด ๋ถˆ๊ฐ€๋Šฅํ•œ userid๋ฅผ ์ €์žฅํ•˜๊ณ  userid๋ฅผ ํ†ตํ•ด ์œ ์ € ์ •๋ณด ๊ด€๋ฆฌ

* refactor: modifyPassword ํ•จ์ˆ˜ ๋‚ด ๋กœ์ง ์ด๋ฏธ ๊ตฌํ˜„ํ•ด๋†“์€ ํ•จ์ˆ˜๋กœ ๋ฆฌํŒฉํ† ๋ง

* feat: ModifyPasswordForm password ํ•„๋“œ์—๋„ ์ œ์•ฝ์กฐ๊ฑด ์ถ”๊ฐ€

* refactor: isLogin ํŒŒ๋ผ๋ฏธํ„ฐ ๋ณ€๊ฒฝ, checkLoginํ•จ์ˆ˜ ๊ตฌํ˜„, exception ์ƒ์„ฑ

* feat: ๋กœ๊ทธ์ธ ์•„๋‹Œ ๊ฒฝ์šฐ ์˜ˆ์™ธ์ฒ˜๋ฆฌ ์ถ”๊ฐ€

* rename: checkLogin >> checkLoginException ํ•จ์ˆ˜๋ช… ๋ณ€๊ฒฝ

---------

Co-authored-by: EUNA <[email protected]>
Co-authored-by: Soomin Lim <[email protected]>
Co-authored-by: ์ด์žฌํ›ˆ <[email protected]>
Co-authored-by: Soomin-Lim <[email protected]>
Co-authored-by: Dongja <[email protected]>
Co-authored-by: EUNA <[email protected]>
Co-authored-by: Dongja <[email protected]>
Co-authored-by: jaehunLee-dev <[email protected]>

* feat: ์นดํ…Œ๊ณ ๋ฆฌ(ํ‚ค์›Œ๋“œ) ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ (#127)

* feat: ์ปดํฌ๋„ŒํŠธ ๊ตฌ์กฐ ์ˆ˜์ •

* feat: api ์ธ์Šคํ„ด์Šค ์ด๋ฆ„ ์ˆ˜์ •

* feat: scss formatter ์ ์šฉ

* feat: ์นดํ…Œ๊ณ ๋ฆฌ ํ•จ์ˆ˜ ๋ถ„๋ฆฌ

* feat: ์นดํ…Œ๊ณ ๋ฆฌ ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ

* feat : ํšŒ์›๊ฐ€์ž… input validation (#129)

* feat: password, nickname ๊ธธ์ด 16์ž ์ œํ•œ

* feat: ํšŒ์›๊ฐ€์ž… ์„ฑ๊ณต์‹œ ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€๋กœ ์ด๋™

* feat: ์ž…๋ ฅ๊ฐ’ ์ฒดํฌ ํ•จ์ˆ˜๋ถ„๋ฆฌ

* refactor: ์—๋Ÿฌ๋ฉ”์‹œ์ง€ ์ƒ์ˆ˜ ๋ถ„๋ฆฌ

* feat: input๊ฐ’ trim ์ถ”๊ฐ€

* delete: ์ค‘๋ณต ์ฒดํฌ ๋กœ์ง ์ œ๊ฑฐ

* delete: ๋”๋ฏธ ์œ ์ € ์ •๋ณด ์ œ๊ฑฐ

* fix: ํƒ€์ž… ์—๋Ÿฌ ์ˆ˜์ •

* feat: login validation (#131)

* feat: login ์„ฑ๊ณต์‹œ ๋ฉ”์ธํŽ˜์ด์ง€๋กœ ์ด๋™

* feat: login input ๋นˆ๊ฐ’ ์ฒดํฌ

* feat: login, signup id์˜ form name ์ˆ˜์ •

* feat: ๋กœ๊ทธ์•„์›ƒ ๊ตฌํ˜„ (#130)

* feat: ๋กœ๊ทธ์•„์›ƒ ๊ตฌํ˜„
๋ฐ›์•„์˜จ ์ฟ ํ‚ค๋กœ ๋กœ๊ทธ์ธ ์ƒํƒœ์ธ์ง€ ํ™•์ธํ•˜๊ณ  ๋กœ๊ทธ์ธ ์ƒํƒœ๋ฉด invalidate()ํ•จ์ˆ˜๋กœ ๋กœ๊ทธ์•„์›ƒ ์ง„ํ–‰

* refactor: exception handling ์„ ํ•ด์ค„ ์ˆ˜ ์žˆ๋Š” ํด๋ž˜์Šค ์ƒ์„ฑ
global/exception ํด๋”์— ํด๋ž˜์Šค ์ƒ์„ฑ

* chore: logback git ignore ์ถ”๊ฐ€

* hotfix: dto getterํ•จ์ˆ˜ ์ถ”๊ฐ€
dto์— getterํ•จ์ˆ˜๊ฐ€ ์—†์œผ๋ฉด 406 response

* feat: ํƒœ๊ทธ ์ถ”๊ฐ€/์‚ญ์ œ ๊ธฐ๋Šฅ (#139)

* feat: ํƒœ๊ทธ id ๊ฐ€์ ธ์˜ค๋Š” ๊ธฐ๋Šฅ

* feat: tagstore ์ƒ์„ฑ

* feat: ํƒœ๊ทธ์ถ”๊ฐ€/์‚ญ์ œ ๊ธฐ๋Šฅ

* feat: ํŒ”๋กœ์šฐ/์–ธํŒ”๋กœ์šฐ ๊ธฐ๋Šฅ ๊ตฌํ˜„ (#138)

* feat: FollowController ํŒ”๋กœ์šฐ/์–ธํŒ”๋กœ์šฐ ๊ธฐ๋Šฅ ๊ตฌํ˜„ ๋ฐ dto ์ถ”๊ฐ€

* feat: ํŒ”๋กœ์šฐ ์—ฌ๋ถ€ ํŒ๋‹จ, ์–ธํŒ”๋กœ์šฐ ๊ธฐ๋Šฅ ์ถ”๊ฐ€

* feat: db ํŒ”๋กœ์šฐ ์ •๋ณด ์ถ”๊ฐ€ ๊ธฐ๋Šฅ ๊ตฌํ˜„

* hotfix: followRepository dataSource ๋ˆ„๋ฝ ๋ฐœ๊ฒฌ ๋ฐ ์ˆ˜์ •

* hotfix: json ํŒŒ์‹ฑ ๋ฌธ์ œ ํ•ด๊ฒฐ
dto์— ๋นˆ ์ƒ์„ฑ์ž ์ถ”๊ฐ€

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

* feat: ํ•ด์‹œํƒœ๊ทธ ๊ฒ€์ƒ‰์˜ ์‘๋‹ต์— ์‚ฌ์šฉํ•  HashtagSearchResponse ์‘๋‹ต ๊ฐ์ฒด ์ƒ์„ฑ

- Builder ํŒจํ„ด ์ ์šฉ
- List<Hashtag> ํƒ€์ž…์˜ ๋ฉค๋ฒ„๋ณ€์ˆ˜ ์ถ”๊ฐ€

* feat: ์ ‘๋‘์–ด๋กœ ํ•ด์‹œํƒœ๊ทธ๋ฅผ ๊ฒ€์ƒ‰ํ•˜๋Š” searchHashtagByPrefix() ๋ฉ”์„œ๋“œ ๊ตฌํ˜„

* feat: HashtagService ํด๋ž˜์Šค ์ƒ์„ฑ ๋ฐ ํ•ด์‹œํƒœ๊ทธ ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ ๊ตฌํ˜„

- searchHashTag(): ์ธ์ž๋กœ ์ฃผ์–ด์ง„ ํ‚ค์›Œ๋“œ๋กœ ์‹œ์ž‘ํ•˜๋Š” ํ•ด์‹œํƒœ๊ทธ๋ฅผ ๊ฒ€์ƒ‰ํ•˜์—ฌ HashtagSearchResponse๋ฅผ ๋ฐ˜ํ™˜

* feat: HashtagController ํด๋ž˜์Šค ์ƒ์„ฑ ๋ฐ ํ•ด์‹œํƒœ๊ทธ ๊ฒ€์ƒ‰ API ๊ตฌํ˜„

- searchHashTag(): ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ฃผ์–ด์ง„ ํ‚ค์›Œ๋“œ๋กœ ์‹œ์ž‘ํ•˜๋Š” ํ•ด์‹œํƒœ๊ทธ๋ฅผ ๊ฒ€์ƒ‰ํ•˜์—ฌ ๊ทธ ๊ฒฐ๊ณผ์— ๋Œ€ํ•œ ์‘๋‹ต์„ ๋ฐ˜ํ™˜

* refactor: SELECT ์ฟผ๋ฆฌ๋ฌธ์—์„œ "*"์„ ์“ฐ์ง€์•Š๊ณ  ์ปฌ๋Ÿผ๋ช…์„ ์ง์ ‘ ์‚ฌ์šฉํ•˜๋„๋ก ๋ณ€๊ฒฝ

* fix: URL์„ ์ธ์ฝ”๋”ฉํ•  ๋•Œ "+"๋ฅผ ๊ณต๋ฐฑ์œผ๋กœ ์ธ์ฝ”๋”ฉํ•˜๊ธฐ ๋•Œ๋ฌธ์—, PostService์˜ searchByTags()์—์„œ ํƒœ๊ทธ ์ด๋ฆ„์„ ๊ตฌ๋ถ„ํ•˜๋Š” ๊ตฌ๋ถ„์ž๋ฅผ "+"์—์„œ ๊ณต๋ฐฑ์œผ๋กœ ๋ณ€๊ฒฝ

- PostService ๋กœ์ง ๋ณ€๊ฒฝ์— ๋”ฐ๋ผ PostServiceTest์˜ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋„ ๋ณ€๊ฒฝ

* feat: ํŒ”๋กœ์ž‰, ํŒ”๋กœ์›Œ ๋ฆฌ์ŠคํŠธ ์กฐํšŒ (#143)

* feat: FollowListResponse dto ์ถ”๊ฐ€
follower, following list  response๋ฅผ ์œ„ํ•œ dto

* feat: UserRepository.getFollowingNicknames ๋ฉ”์†Œ๋“œ ์ถ”๊ฐ€
๋‹‰๋„ค์ž„์œผ๋กœ ํŒ”๋กœ์ž‰ ๋‹‰๋„ค์ž„ ๋ฆฌ์ŠคํŠธ๋ฅผ ์กฐํšŒํ•˜๋Š” ๋ฉ”์†Œ๋“œ

* feat: UserRepository.getFollowerNicknames ๋ฉ”์†Œ๋“œ ์ถ”๊ฐ€
๋‹‰๋„ค์ž„์œผ๋กœ ํŒ”๋กœ์›Œ ๋‹‰๋„ค์ž„ ๋ฆฌ์ŠคํŠธ๋ฅผ ์กฐํšŒํ•˜๋Š” ๋ฉ”์†Œ๋“œ

* feat: FolloweService ๊ธฐ๋Šฅ ์ถ”๊ฐ€
getFollowings: following ๋ชฉ๋ก response๋ฅผ ๋ฐ˜ํ™˜
getFollowers: follower ๋ชฉ๋ก response๋ฅผ ๋ฐ˜ํ™˜

* feat: FollowController ๊ธฐ๋Šฅ ์ถ”๊ฐ€
getFollowers: follower ๋ชฉ๋ก request์— ๋Œ€ํ•œ control
getFollowings: following ๋ชฉ๋ก request์— ๋Œ€ํ•œ control

* fix: GetMapping ์ˆ˜์ •

* fix: SQL ์—๋Ÿฌ ์ˆ˜์ •

* refactor: FollowListResponse ๋นˆ ์ƒ์„ฑ์ž ์ œ๊ฑฐ

* refactor: SELECT ์ฟผ๋ฆฌ๋ฌธ์—์„œ "*"์„ ์“ฐ์ง€์•Š๊ณ  ์ปฌ๋Ÿผ๋ช…์„ ์ง์ ‘ ์‚ฌ์šฉํ•˜๋„๋ก ๋ณ€๊ฒฝ (#144)

* feat: [๋กœ๊ทธ์ธ/ํšŒ์›๊ฐ€์ž…] ๋น„๋ฐ€๋ฒˆํ˜ธ ์•”ํ˜ธํ™” (#147)

* chore: jbcrypt gradle ์ถ”๊ฐ€

* feat: UserService์— encryptPassword ๋ฉ”์†Œ๋“œ ์ถ”๊ฐ€
๋น„๋ฐ€๋ฒˆํ˜ธ ์•”ํ˜ธํ™” ๋ฉ”์†Œ๋“œ

* feat: ๋น„๋ฐ€๋ฒˆํ˜ธ ์•”ํ˜ธํ™” ๊ตฌํ˜„
signupForm ๋น„๋ฐ€๋ฒˆํ˜ธ ์•”ํ˜ธํ™” ํ›„ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ๋“ฑ๋ก
User ์ƒ์„ฑ์ž ์ถ”๊ฐ€

* refactor: User ์ƒ์„ฑ์ž์˜ id ๊ธฐ๋ณธ๊ฐ’ -1 -> 0์œผ๋กœ ๋ณ€๊ฒฝ

* test: ํ•ด์‹œํƒœ๊ทธ ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ (#146)

* test: PostService์˜ ํ•ด์‹œํƒœ๊ทธ ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ์„ ํ…Œ์ŠคํŠธํ•˜๋Š” ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ

* refactor: ์—ฌ๋Ÿฌ ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ณ€๊ฒฝ

* fix: ํƒ€์ž… ์—๋Ÿฌ ์ˆ˜์ •

* docs: ๋ฆฌ๋“œ๋ฏธ ์—…๋ฐ์ดํŠธ

* refactor: ํŒ”๋กœ์šฐ/์–ธํŒ”๋กœ์šฐ ๋ฐฉ์‹ soft delete๋กœ ๋ณ€๊ฒฝ (#155)

* refactor: FollowRepository.addFollow ๋ฐฉ์‹ ๋ณ€๊ฒฝ
์‹ ๊ทœ ํŒ”๋กœ์šฐ์ธ ๊ฒฝ์šฐ insert, ๊ณผ๊ฑฐ ํŒ”๋กœ์šฐํ–ˆ์—ˆ๋˜ ๊ฒฝ์šฐ update ์ˆ˜ํ–‰ํ•˜๋Š” upsert ๋กœ์ง์œผ๋กœ ๋ณ€๊ฒฝ

* refactor: ImageRepository์˜ getImagesOfRecentFollowingPosts ์ฟผ๋ฆฌ ์ˆ˜์ •
is_deleted ํ™•์ธ ์ถ”๊ฐ€

* feat : ํ”„๋กœํ•„ ํŽ˜์ด์ง€ ์ปดํฌ๋„ŒํŠธ ๋ถ„๋ฆฌ (#154)

* feat: ํŒ”๋กœ์šฐ ๋ฒ„ํŠผ ์ปดํฌ๋„ŒํŠธ ๋ถ„๋ฆฌ

* feat: ๋ฉ”๋‰ด, ๊ฒŒ์‹œ๊ธ€๋ฆฌ์ŠคํŠธ, ํŒ”๋กœ์šฐ ๋ฆฌ์ŠคํŠธ ์ปดํฌ๋„ŒํŠธ ๋ถ„๋ฆฌ

* feat: ๊ฒŒ์‹œ๋ฌผ, ํŒ”๋กœ์›Œ, ํŒ”๋กœ์ž‰ ๋ถ€๋ถ„ ๋ˆ„๋ฅด๋ฉด ๋ณด์—ฌ์ฃผ๋Š” ์ฝ˜ํ…์ธ  ๋ณ€๊ฒฝ

* feat: ๋”๋ฏธ๋ฐ์ดํ„ฐ๋“ค๊ณผ ์ปดํฌ๋„ŒํŠธ ์—ฐ๊ฒฐ

* feat: ๋‚ด ํ”„๋กœํ•„ ํŽ˜์ด์ง€์—์„œ ๋ฉ”๋‰ด ๋ˆ„๋ฅด๋ฉด ๋“œ๋กญ๋‹ค์šด ๊ธฐ๋Šฅ

* faet: add image interface

* feat: add follows interface

* feat: ์ด๋ฏธ์ง€ ํด๋ฆญํ•˜๋ฉด ์ƒ์„ธ ํŽ˜์ด์ง€๋กœ ์ด๋™

* refactor: path ์ˆ˜์ •

* refactor: ํŒ”๋กœ์›Œ ๋ˆ„๋ฅผ์‹œ ํ”„๋กœํ•„ ํŽ˜์ด์ง€๋กœ ์ด๋™

* refactor: ํŒ”๋กœ์›Œ๋ฒ„ํŠผ๊ณผ ๋ฉ”๋‰ด ์ปดํฌ๋„ŒํŠธ ํŒŒ์ผ๋กœ ๋ถ„๋ฆฌ

* chore: proxy ์žฌ์„ค์ • (#159)

* Update README.md

api ๋ช…์„ธ์„œ update

* Update README.md

์‹œ์Šคํ…œ ์•„ํ‚คํ…์ณ ์ถ”๊ฐ€

* chore: store ๊ตฌ์กฐ ์ถ”์ƒํ™” (#161)

createStore๋ฅผ ๋ชจ๋“ˆ๋กœ ๋ถ„๋ฆฌํ•˜์˜€์Šต๋‹ˆ๋‹ค

* test: PostService์˜ myProfile(), otherProfile() ๋ฉ”์„œ๋“œ์˜ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ (#156)

- myProfile(): ๋‚˜์˜ ํ”„๋กœํ•„ ํŽ˜์ด์ง€์ธ ๊ฒฝ์šฐ ํ”„๋กœํ•„ ์ •๋ณด(๋‹‰๋„ค์ž„, ์ด๋ฉ”์ผ, ์ž‘์„ฑํ•œ ๊ฒŒ์‹œ๊ธ€, ํŒ”๋กœ์›Œ ์ˆ˜, ํŒ”๋กœ์ž‰ ์ˆ˜)๋ฅผ ์กฐํšŒํ•˜๋Š” ๊ธฐ๋Šฅ์„ ํ…Œ์ŠคํŠธํ•˜๋Š” ์ฝ”๋“œ
- otherProfile(): ํƒ€์ธ์˜ ํ”„๋กœํ•„ ํŽ˜์ด์ง€์ธ ๊ฒฝ์šฐ ํ”„๋กœํ•„ ์ •๋ณด(๋‹‰๋„ค์ž„, ์ด๋ฉ”์ผ, ์ž‘์„ฑํ•œ ๊ฒŒ์‹œ๊ธ€, ํŒ”๋กœ์›Œ ์ˆ˜, ํŒ”๋กœ์ž‰ ์ˆ˜)์™€ ํŒ”๋กœ์šฐ ์—ฌ๋ถ€๋ฅผ ์กฐํšŒํ•˜๋Š” ํ…Œ์ŠคํŠธ ์ฝ”๋“œ
- ํ•ด์‹œํƒœ๊ทธ๋ฅผ ํ†ตํ•œ ๊ฒŒ์‹œ๋ฌผ ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ(searchByTags()) ๋ฆฌํŒฉํ† ๋ง

* feat: ๋ฌดํ•œ ์Šคํฌ๋กค ๊ตฌํ˜„ (#164)

* feat: home css ์ˆ˜์ •

* feat: ํƒœ๊ทธ๊ฒ€์ƒ‰ api์—ฐ๋™

* feat: ๊ฒ€์ƒ‰๋ฆฌ์ŠคํŠธ ์ปดํฌ๋„ŒํŠธ ๋ถ„๋ฆฌ

* feat: css์ˆ˜์ •

* feat: ๋ฌดํ•œ ์Šคํฌ๋กค ๊ตฌํ˜„

* feat: ๋กœ๊ทธ์ธ ์ƒํƒœ ์—ฌ๋ถ€์— ๋”ฐ๋ฅธ ๋ผ์šฐํŒ…

* [FE] [ํ”„๋กœํ•„ ํŽ˜์ด์ง€] : ๋‹‰๋„ค์ž„, ๋น„๋ฐ€๋ฒˆํ˜ธ ๋ชจ๋‹ฌ ๋งˆํฌ์—… ์ถ”๊ฐ€ (#165)

* ๐Ÿ’„design: ์œ ์ € ์ •๋ณด ๋ชจ๋‹ฌ์ฐฝ, ๋ณ€๊ฒฝ ๋ฉ”์„ธ์ง€ ๋ชจ๋‹ฌ ๋งˆํฌ์—…

* ๐Ÿ’„design: ํ”„๋กœํ•„ ํŽ˜์ด์ง€ ์• ๋‹ˆ๋ฉ”์ด์…˜ ์ถ”๊ฐ€

* delete: ์ฃผ์„ ์‚ญ์ œ

* feat: ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€ api ์—ฐ๊ฒฐ (#167)

* feat: ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€ ํšŒ์›๊ฐ€์ž… ๋งํฌ ๋ผ์šฐํŒ…

* feat: ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€ ์„œ๋ฒ„์™€ ํ†ต์‹ ํ›„ validaton ์ฒดํฌ

* feat: ๋กœ๊ทธ์ธ ์„ฑ๊ณต์‹œ ๋ฉ”์ธ ํŽ˜์ด์ง€๋กœ ๋ผ์šฐํŒ…

* delete: console ๋กœ๊ทธ ์‚ญ์ œ

* feat: ๋กœ๊ทธ์ธ ์„ฑ๊ณต์‹œ ์•Œ๋ฆผ ๋ฐฐ๊ฒฝ์ƒ‰ ํŒŒ๋ž€์ƒ‰

* feat: ํšŒ์›๊ฐ€์ž… ํŽ˜์ด์ง€ api ์—ฐ๋™ (#166)

* feat: ํšŒ์›๊ฐ€์ž… ํŽ˜์ด์ง€ ์ค‘๋ณต ์ฒดํฌ

* feat: ํšŒ์›๊ฐ€์ž… ํŽ˜์ด์ง€ ๋กœ๊ทธ์ธ ๋งํฌ ๋ผ์šฐํŒ…

* feat: ํšŒ์›๊ฐ€์ž…  ์„ฑ๊ณต์‹œ ์•Œ๋ฆผ ๋ฐฐ๊ฒฝ์ƒ‰ ํŒŒ๋ž€์ƒ‰

* test: UserController test ์ฝ”๋“œ ์ž‘์„ฑ (#162)

* test: ํšŒ์›๊ฐ€์ž… ํ…Œ์ŠคํŠธ์ฝ”๋“œ ์ถ”๊ฐ€

* feat: ๋กœ๊ทธ์ธ ์‹คํŒจ exception์ถ”๊ฐ€ ๋ฐ ๋กœ๊ทธ์ธ ํ…Œ์ŠคํŠธ์ฝ”๋“œ ์ถ”๊ฐ€

* test: ๋‹‰๋„ค์ž„ ๋ณ€๊ฒฝ ํ…Œ์ŠคํŠธ์ฝ”๋“œ ์ถ”๊ฐ€

* test: ๋น„๋ฐ€๋ฒˆํ˜ธ ๋ณ€๊ฒฝ ํ…Œ์ŠคํŠธ์ฝ”๋“œ ์ถ”๊ฐ€

* test: UserService try catch ๋Œ€์‹  assertThrows ์‚ฌ์šฉ

* refactor: reformat code

* refactor: reformat code

* chore: s3 ์„ค์ • (#169)

* chore: s3 gradle ์„ค์ •

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

* feat: ํ‚ค์›Œ๋“œ์— ๋”ฐ๋ฅธ ์ด๋ฏธ์ง€ ๋ฆฌ์ŠคํŠธ ๋ณด์—ฌ์ฃผ๊ธฐ (#171)

* feat: ํ‚ค์›Œ๋“œ์— ํ•ด๋‹นํ•˜๋Š” postlist ๋ Œ๋”๋ง

* feat: ๋กœ๊ทธ์ธ์— ๋”ฐ๋ฅธ ๋ผ์šฐํŒ… ์ฒ˜๋ฆฌ

* feat: ํŒ”๋กœ์›Œ ์‚ญ์ œ ์š”์ฒญ ๊ตฌํ˜„ (#173)

* feat: FollowController.deleteFollower ์ž‘์„ฑ

* feat: FollowService.deleteFollower ๊ตฌํ˜„
๊ธฐ์กด FollowRepository ๋ฉ”์†Œ๋“œ ์žฌํ™œ์šฉ

* chore: Message ํด๋ž˜์Šค ํŒจํ‚ค์ง€ ๋ณ€๊ฒฝ

* feat: ๊ธ€ ์ž‘์„ฑ ํŽ˜์ด์ง€ ์ปดํฌ๋„ŒํŠธ ๋ถ„๋ฆฌ (#174)

* feat: ํ—ค๋” ์ปดํฌ๋„ŒํŠธ props์„ค์ •

* feat: ํ•ด์‹œํƒœ๊ทธ ํผ ๋ถ„๋ฆฌ

* feat: ์ด๋ฏธ์ง€ํผ ๋ถ„๋ฆฌ

* feat: selection ๋ถ„๋ฆฌ

* feat: textform ๋ถ„๋ฆฌ

* feat: queryselectorAll ํ•จ์ˆ˜ ์ƒ์„ฑ

* feat: form ๋ถ„๋ฆฌ

* feat: ๊ธ€ ์ž‘์„ฑ ํŽ˜์ด์ง€ css ์ˆ˜์ •

* feat: ์ด๋ฏธ์ง€ ๋“ฑ๋ก ๊ธฐ๋Šฅ (#175)

* feat: ์ฐจ๋ชจ๋ธ/์ข…๋ฅ˜ select ๊ธฐ๋Šฅ (#179)

* test: ๊ธฐ์กด ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ˆ˜์ • (#176)

* test: UserService test ์ฝ”๋“œ ์ˆ˜์ •

* test: UserService test ์ฝ”๋“œ ์ˆ˜์ •
WebMvcTest >>> ExtendWith(MockitoExtension.class

* test: PostService test ์ฝ”๋“œ ์ˆ˜์ •

* test: HashtagService test ์ฝ”๋“œ ์ˆ˜์ •

* test: ๋‹‰๋„ค์ž„ ๋ณ€๊ฒฝ ํ…Œ์ŠคํŠธ์ฝ”๋“œ ์ž‘์„ฑ ์ค‘

* test: profileUsernickname Get์œผ๋กœ ๋ฐ›์•„์˜ค๊ฒŒ ์ˆ˜์ •

* hotfix: UserRepository getFollower, following ๋กœ์ง ์ˆ˜์ •

* test: test์ฝ”๋“œ ์ˆ˜์ •

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

* feat: ์ฐจ๋Ÿ‰ ์ข…๋ฅ˜(Type) ํด๋ž˜์Šค ์ƒ์„ฑ

* feat: ์ ‘๋‘์–ด๋กœ ์ฐจ๋Ÿ‰ ์ข…๋ฅ˜๋ฅผ ๊ฒ€์ƒ‰ํ•˜๋Š” searchTypeByPrefix() ๋ฉ”์„œ๋“œ ๊ตฌํ˜„

- ๊ธฐ์กด์˜ tagRowMapper() ๋ฉ”์„œ๋“œ๋ฅผ hashtagRowMapper()๋กœ ์ด๋ฆ„ ๋ณ€๊ฒฝ
- ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋กœ Type ๊ฐ์ฒด๋ฅผ ๋งคํ•‘ํ•˜๋Š” typeRowMapper() ๋ฉ”์„œ๋“œ ์ถ”๊ฐ€

* feat: ์ฐจ๋Ÿ‰ ์ข…๋ฅ˜ ํƒœ๊ทธ ๊ฒ€์ƒ‰์˜ ์‘๋‹ต์— ์‚ฌ์šฉํ•  TypeSearchResponse ์‘๋‹ต ๊ฐ์ฒด ์ƒ์„ฑ

- Builder ํŒจํ„ด ์ ์šฉ
- List<Type> ํƒ€์ž…์˜ ๋ฉค๋ฒ„๋ณ€์ˆ˜ ์ถ”๊ฐ€

* feat: ์ฐจ๋Ÿ‰ ํƒ€์ž… ํƒœ๊ทธ๋ฅผ ๊ฒ€์ƒ‰ํ•˜๋Š” ๊ธฐ๋Šฅ ๊ตฌํ˜„

- searchType(): ์ธ์ž๋กœ ์ฃผ์–ด์ง„ ํ‚ค์›Œ๋“œ๋กœ ์‹œ์ž‘ํ•˜๋Š” ์ฐจ๋Ÿ‰ ์ข…๋ฅ˜ ํƒœ๊ทธ๋ฅผ ๊ฒ€์ƒ‰ํ•˜์—ฌ TypeSearchResponse๋ฅผ ๋ฐ˜ํ™˜

* feat: ์ฐจ๋Ÿ‰ ์ข…๋ฅ˜ ํƒœ๊ทธ ๊ฒ€์ƒ‰ API ๊ตฌํ˜„

- searchType(): ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ฃผ์–ด์ง„ ํ‚ค์›Œ๋“œ๋กœ ์‹œ์ž‘ํ•˜๋Š” ์ฐจ๋Ÿ‰ ์ข…๋ฅ˜ ํƒœ๊ทธ๋ฅผ ๊ฒ€์ƒ‰ํ•˜์—ฌ ๊ทธ ๊ฒฐ๊ณผ์— ๋Œ€ํ•œ ์‘๋‹ต์„ ๋ฐ˜ํ™˜

* feat: ์ฐจ๋Ÿ‰ ๋ชจ๋ธ(Model) ํด๋ž˜์Šค ์ƒ์„ฑ

* feat: ์ ‘๋‘์–ด๋กœ ์ฐจ๋Ÿ‰ ๋ชจ๋ธ์„ ๊ฒ€์ƒ‰ํ•˜๋Š” searchModelByPrefix() ๋ฉ”์„œ๋“œ ๊ตฌํ˜„

- ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋กœ Model ๊ฐ์ฒด๋ฅผ ๋งคํ•‘ํ•˜๋Š” modelRowMapper() ๋ฉ”์„œ๋“œ ์ถ”๊ฐ€

* feat: ํƒœ๊ทธ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ์— ์‚ฌ์šฉ๋  Keword DTO ์ƒ์„ฑ

- ํƒœ๊ทธ์˜ ์•„์ด๋””(id), ํƒœ๊ทธ์˜ ์นดํ…Œ๊ณ ๋ฆฌ(category), ํƒœ๊ทธ์˜ ์ด๋ฆ„(tag)์„ ๋ฉค๋ฒ„๋ณ€์ˆ˜๋กœ ์ƒ์„ฑ
- Type, Model, Hashtag ์—”ํ‹ฐํ‹ฐ๋ฅผ Keyword DTO๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ์ •์  ํŒฉํ† ๋ฆฌ ๋ฉ”์„œ๋“œ ์ถ”๊ฐ€

* feat: ๋ชจ๋“  ํƒœ๊ทธ ๊ฒ€์ƒ‰์˜ ์‘๋‹ต์— ์‚ฌ์šฉํ•  TagSearchResponse ์‘๋‹ต ๊ฐ์ฒด ์ƒ์„ฑ

- Builder ํŒจํ„ด ์ ์šฉ
- List<Keyword> ํƒ€์ž…์˜ ๋ฉค๋ฒ„๋ณ€์ˆ˜ ์ถ”๊ฐ€

* feat: HashtagService์˜ ๋ชจ๋“  ํƒœ๊ทธ๋ฅผ ๊ฒ€์ƒ‰ํ•˜๋Š” ๊ธฐ๋Šฅ ๊ตฌํ˜„

- searchAllTags(): ์ธ์ž๋กœ ์ฃผ์–ด์ง„ ํ‚ค์›Œ๋“œ๋กœ ์‹œ์ž‘ํ•˜๋Š” ๋ชจ๋“  ํƒœ๊ทธ๋ฅผ ๊ฒ€์ƒ‰ํ•˜์—ฌ TagSearchResponse๋ฅผ ๋ฐ˜ํ™˜

* feat: ๋ชจ๋“  ํƒœ๊ทธ ๊ฒ€์ƒ‰ API ๊ตฌํ˜„

- searchAllTags(): ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ฃผ์–ด์ง„ ํ‚ค์›Œ๋“œ๋กœ ์‹œ์ž‘ํ•˜๋Š” ๋ชจ๋“  ํƒœ๊ทธ๋ฅผ ๊ฒ€์ƒ‰ํ•˜์—ฌ ๊ทธ ๊ฒฐ๊ณผ์— ๋Œ€ํ•œ ์‘๋‹ต์„ ๋ฐ˜ํ™˜

* feat: ์“ฐ์ด์ง€ ์•Š๋Š” ๋ถ€๋ถ„ ์ฃผ์„์ฒ˜๋ฆฌ

API ๋ช…์„ธ ์ˆ˜์ •
- ์ฐจ๋Ÿ‰ ์ข…๋ฅ˜ ํƒœ๊ทธ ๊ฒ€์ƒ‰ API๊ฐ€ ์‚ญ์ œ๋˜์–ด HashtagController์˜ "/search/type/" API ์ฃผ์„์ฒ˜๋ฆฌ ๋ฐ HashtagService์˜ searchType() ๋ฉ”์„œ๋“œ ์ฃผ์„์ฒ˜๋ฆฌ

* fix: DB ํ…Œ์ด๋ธ”๋ช… ์˜คํƒ€ ์ˆ˜์ •

- Type ์˜คํƒ€๋ฅผ TYPE์œผ๋กœ ์ˆ˜์ •

* refactor: Keyword ํด๋ž˜์Šค๋ฅผ TagSearchResult๋กœ ์ด๋ฆ„ ๋ณ€๊ฒฝ

Keyword ํด๋ž˜์Šค๋Š” ํƒœ๊ทธ ๊ฒ€์ƒ‰ ์‘๋‹ต์— ์‚ฌ์šฉํ•  DTO ๊ฐ์ฒด์ธ๋ฐ, "Keyword"๋ผ๋Š” ์ด๋ฆ„์€ ํด๋ž˜์Šค์˜ ์—ญํ• ์„ ์ž˜ ๋“œ๋Ÿฌ๋‚˜์ง€ ๋ชปํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์—ฌ ์ด๋ฆ„์„ TagSearchResult๋กœ ๋ณ€๊ฒฝํ–ˆ๋‹ค.

* hotfix: signup return๊ฐ’ ๋ณ€๊ฒฝ

* feat: ํ”„๋กœํ•„ ํŽ˜์ด์ง€ api ์—ฐ๋™ (#182)

* feat: ๊ฒŒ์‹œ๋ฌผ, ํŒ”๋กœ์›Œ, ํŒ”๋กœ์ž‰ ๋ˆ„๋ฅด๋ฉด ํ•ด๋‹นํ•˜๋Š” ๋ฆฌ์ŠคํŠธ ๋ณด์—ฌ์ฃผ๊ธฐ

* feat: ๋‹ค๋ฅธ ์‚ฌ๋žŒ ํ”„๋กœํ•„ ํŽ˜์ด์ง€์—์„œ follow/unfollow

* feat: ๋กœ๊ทธ์•„์›ƒ ๊ธฐ๋Šฅ

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

* feat: ์ฐจ๋Ÿ‰ ์ข…๋ฅ˜ ์ „์ฒด ์กฐํšŒ ๋ฐ ์ฐจ๋Ÿ‰ ๋ชจ๋ธ ์ „์ฒด ์กฐํšŒ ๊ธฐ๋Šฅ ๊ตฌํ˜„ (#185)

* refactor: HashtagSearchResponse์™€ TagSearchResopnse์˜ Builder ํŒจํ„ด ์‚ญ์ œ

๋นŒ๋” ํŒจํ„ด์„ ์Šต๊ด€์ ์œผ๋กœ ์‚ฌ์šฉํ•˜์˜€๋Š”๋ฐ, ๋นŒ๋” ํŒจํ„ด์€ ์ƒ์„ฑ์ž ์ธ์ž๊ฐ€ ์ถฉ๋ถ„ํžˆ ๋งŽ์€ ์ƒํ™ฉ์—์„œ๋งŒ ์ ์šฉ์„ ๊ณ ๋ คํ•ด์•ผํ•˜๋ฏ€๋กœ ์ธ์ž๊ฐ€ ํ•˜๋‚˜์ธ ์‘๋‹ต DTO ๊ฐ์ฒด์—์„œ๋Š” Builder ๊ฐ์ฒด๋ฅผ ์‚ญ์ œํ•˜์˜€๋‹ค.

* feat: ๋ชจ๋“  ์ฐจ๋Ÿ‰ ์ข…๋ฅ˜๋ฅผ ์กฐํšŒํ•˜๋Š” findAllTypes() ๋ฉ”์„œ๋“œ ๊ตฌํ˜„

* refactor: TypeSearchResponse ํด๋ž˜์Šค ์ด๋ฆ„์„ TypesResponse๋กœ ์ด๋ฆ„ ๋ณ€๊ฒฝ

๊ฒ€์ƒ‰๊ฒฐ๊ณผ๊ฐ€ ์•„๋‹Œ ๋‹จ์ˆœ ์กฐํšŒ์ด๋ฏ€๋กœ ์ด๋ฆ„ ๋ณ€๊ฒฝ
์ƒ์„ฑ์ž์˜ ์ธ์ž๊ฐ€ 1๊ฐœ์ด๋ฏ€๋กœ Builder ํŒจํ„ด์ด ๋ถˆํ•„์š”ํ•˜์—ฌ ์‚ญ์ œํ•จ

* feat: HashtagService ํด๋ž˜์Šค์—์„œ ์ฐจ๋Ÿ‰ ์ข…๋ฅ˜๋ฅผ ์ „์ฒด ์กฐํšŒํ•˜๋Š” ๊ธฐ๋Šฅ ๊ตฌํ˜„

- findAllTypes(): ์ฐจ๋Ÿ‰ ์ข…๋ฅ˜ ์ „์ฒด ์กฐํšŒ

* feat: ์ฐจ๋Ÿ‰ ์ข…๋ฅ˜ ์ „์ฒด ์กฐํšŒ API ๊ตฌํ˜„

- getAllTypes(): ๋ชจ๋“  ์ฐจ๋Ÿ‰ ์ข…๋ฅ˜ ์ •๋ณด๋ฅผ ์กฐํšŒํ•˜์—ฌ ๊ทธ์— ๋Œ€ํ•œ ์‘๋‹ต์„ ๋ฐ˜ํ™˜

* feat: ๋ชจ๋“  ์ฐจ๋Ÿ‰ ๋ชจ๋ธ์„ ์กฐํšŒํ•  ๋•Œ ์‘๋‹ต์— ์‚ฌ์šฉํ•  ModelsResponse ์‘๋‹ต ๊ฐ์ฒด ์ƒ์„ฑ

- List<Model> ํƒ€์ž… ๋ฉค๋ฒ„๋ณ€์ˆ˜

* feat: ๋ชจ๋“  ์ฐจ๋Ÿ‰ ๋ชจ๋ธ์„ ์กฐํšŒํ•˜๋Š” findAllTypes() ๋ฉ”์„œ๋“œ ๊ตฌํ˜„

* feat: HashtagService ํด๋ž˜์Šค์—์„œ ์ฐจ๋Ÿ‰ ๋ชจ๋ธ์„ ์ „์ฒด ์กฐํšŒํ•˜๋Š” ๊ธฐ๋Šฅ ๊ตฌํ˜„

- findAllTypes(): ์ฐจ๋Ÿ‰ ๋ชจ๋ธ ์ „์ฒด ์กฐํšŒ

* feat: ์ฐจ๋Ÿ‰ ๋ชจ๋ธ ์ „์ฒด ์กฐํšŒ API ๊ตฌํ˜„

- getAllModels(): ๋ชจ๋“  ์ฐจ๋Ÿ‰ ๋ชจ๋ธ ์ •๋ณด๋ฅผ ์กฐํšŒํ•˜์—ฌ ๊ทธ์— ๋Œ€ํ•œ ์‘๋‹ต์„ ๋ฐ˜ํ™˜

* feat: ํ•ด์‹œํƒœ๊ทธ ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ (#186)

* feat: ๊ณตํ†ต ํ•จ์ˆ˜ ๋ถ„๋ฆฌ

* feat: try-catch๋ฌธ ์ถ”๊ฐ€

* feat: ํ•ด์‹œํƒœ๊ทธ ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ

* feat: ๊ธ€ ์ž‘์„ฑ ํŽ˜์ด์ง€ ๊ตฌํ˜„ (#188)

* feat: ๊ธ€ ์ƒ์„ฑ dto NewPostForm ์ž‘์„ฑ

* feat: PostController.createPost ์ž‘์„ฑ

* feat: PostRepository.addPost ์ถ”๊ฐ€

* feat: PostService.createPost ์ž‘์„ฑ
NewPostForm content์— getter ์ถ”๊ฐ€

* feat: createPost์— imageRepository.addImage ์ถ”๊ฐ€
newPostForm image getter ์ถ”๊ฐ€

* feat: S3 config ์ž‘์„ฑ

* feat: S3Repository ์ƒ์„ฑ
1. ํด๋ผ์ด์–ธํŠธ๋กœ ๋ฐ›์€ ์ด๋ฏธ์ง€๋ฅผ ๋กœ์ปฌ ํŒŒ์ผ๋กœ ์ €์žฅ
2. ๋กœ์ปฌ ํŒŒ์ผ์„ S3๋กœ ์—…๋กœ๋“œ
3. ๋กœ์ปฌ ํŒŒ์ผ ์‚ญ์ œ

* feat: ImageRepository.addImage ๊ตฌํ˜„

* feat: S3 ์—…๋กœ๋“œ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ

* feat: PostController.createPost ๊ตฌํ˜„

* fix: MultipartFile Image valid ์ˆ˜์ •

* fix: RequestBody -> ModelAttribute๋กœ ์ˆ˜์ •
multipart/form-data ํ˜•์‹

* fix: PostRepository.addPost ๋ฒ„๊ทธ ์ˆ˜์ •
insert ์ดํ›„ pk ๊ฐ’ ๋ฐ›์•„์˜ฌ ์ˆ˜ ์žˆ๋„๋ก keyHolder ํ™œ์šฉ

* feat: post ๋ชจ๋ธ์— model_id ์ถ”๊ฐ€

* chore: ๊ธฐ์กด pr merge

* style: hashtag -> tag ๋กœ rename

* style: Hashtag -> Tag rename

* feat: TagRepository.findModelByName ๋ฉ”์†Œ๋“œ ์ถ”๊ฐ€

* feat: PostService์—์„œ tagRepository๋ฅผ ํ†ตํ•ด model_id๋ฅผ ์„ค์ •ํ•˜๋„๋ก ๋ณ€๊ฒฝ

* fix: TagRepository.findModelById ๋ฒ„๊ทธ ์ˆ˜์ •

* fix: PostRepository.addPost sql ๋ฒ„๊ทธ ์ˆ˜์ •

* feat: post ๋“ฑ๋ก์ด transactionalํ•˜๋„๋ก ์ˆ˜์ •

* refactor: ์ด๋ฏธ์ง€ ์ด๋ฆ„์— postid ๋„ฃ๋Š” ์œ„์น˜๋ฅผ makeLocalFile๋กœ ์ˆ˜์ •

* test: ํ”„๋กœํ•„ํŽ˜์ด์ง€ ๊ด€๋ จ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ถ”๊ฐ€ (#187)

* test: UserService test ์ฝ”๋“œ ์ˆ˜์ •

* test: UserService test ์ฝ”๋“œ ์ˆ˜์ •
WebMvcTest >>> ExtendWith(MockitoExtension.class

* test: PostService test ์ฝ”๋“œ ์ˆ˜์ •

* test: HashtagService test ์ฝ”๋“œ ์ˆ˜์ •

* test: ๋‹‰๋„ค์ž„ ๋ณ€๊ฒฝ ํ…Œ์ŠคํŠธ์ฝ”๋“œ ์ž‘์„ฑ ์ค‘

* test: ๋‹‰๋„ค์ž„ ๋ณ€๊ฒฝ ์„ฑ๊ณต ํ…Œ์ŠคํŠธ์ฝ”๋“œ ์ž‘์„ฑ

* test: ๋‹‰๋„ค์ž„ ๋ณ€๊ฒฝ ํ…Œ์ŠคํŠธ- ๋กœ๊ทธ์ธ ์ƒํƒœ ์•„๋‹ ๋•Œ

* test: ๋‹‰๋„ค์ž„ ๋ณ€๊ฒฝ, ๋น„๋ฐ€๋ฒˆํ˜ธ ๋ณ€๊ฒฝ test ์ฝ”๋“œ ์ถ”๊ฐ€ ๋ฐ ๋น„๋ฐ€๋ฒˆํ˜ธ ๋ณ€๊ฒฝ ๋กœ์ง ์ˆ˜์ •

* test: PostController test ์ฝ”๋“œ ์ž‘์„ฑ

* test: test ์ฝ”๋“œ ์ฃผ์„ ์ˆ˜์ •

* test: TagService์˜ ๋ฉ”์„œ๋“œ๋ฅผ ํ…Œ์ŠคํŠธํ•˜๋Š ์ฝ”๋“œ ์ž‘์„ฑ (#190)

- searchAllTags(): ๋ชจ๋“  ํƒœ๊ทธ ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ ํ…Œ์ŠคํŠธ
- findAllTypes(): ๋ชจ๋“  ์ฐจ๋Ÿ‰ ์ข…๋ฅ˜ ์กฐํšŒ ๊ธฐ๋Šฅ ํ…Œ์ŠคํŠธ
- findAllModels(): ๋ชจ๋“  ์ฐจ๋Ÿ‰ ๋ชจ๋ธ ์กฐํšŒ ๊ธฐ๋Šฅ ํ…Œ์ŠคํŠธ

* feat: ๊ธ€ ์ž‘์„ฑ ํŽ˜์ด์ง€ ํ•ด์‹œํƒœ๊ทธ ์ถ”๊ฐ€ (#191)

* feat: TagRepository.addHashtag ์ถ”๊ฐ€

* feat: ๊ฒŒ์‹œ๊ธ€ ๋“ฑ๋ก ์‹œ hashtag๋„ ๋“ฑ๋ก๋˜๋„๋ก ๊ธฐ๋Šฅ ์ถ”๊ฐ€
tagRepository.addPostHashtag ์ถ”๊ฐ€
postService.createPost ์‹œ hashtag ๋“ฑ๋กํ•˜๋„๋ก ์ถ”๊ฐ€

* feat: ๊ธ€ ์ž‘์„ฑ ํŽ˜์ด์ง€ form ๊ธฐ๋Šฅ (#192)

* fix: ๊ฒ€์ƒ‰์–ด ์—†์„ ์‹œ ํƒœ๊ทธ ์ถ”๊ฐ€๋˜๋Š” ๋ฒ„๊ทธ ์ˆ˜์ •

* feat: textarea ์ž…๋ ฅ ๊ธฐ๋Šฅ

* feat: ํƒœ๊ทธ ์‚ญ์ œ ๊ธฐ๋Šฅ ์ถ”๊ฐ€

* feat: textarea ๋””๋ฐ”์šด์Šค ์ ์šฉ

* feat: image ๋“ฑ๋ก ์‹œ ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ data ๋ณ€๊ฒฝ

* feat: key๊ฐ’ ๋ฐฐ์—ด๋กœ ๋งŒ๋“œ๋Š” ํ•จ์ˆ˜ ๋ชจ๋“ˆํ™”

* feat: select์‹œ ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ data ์ˆ˜์ •

* feat: ๋ผ์šฐํŒ… ๊ธฐ๋Šฅ/ form ๋ฐ์ดํ„ฐ ์ €์žฅ ์ฒ˜๋ฆฌ

* Update README.md

* docs: mdํŒŒ์ผ ์ˆ˜์ •

* docs: mdํŒŒ์ผ ์ˆ˜์ •

* fix: ํ”„๋กœํ•„ ํŽ˜์ด์ง€ ๋‹‰๋„ค์ž„ ํ•œ๊ธ€์ผ ๋•Œ 404ํŽ˜์ด์ง€๋กœ ๊ฐ€๋Š” ๋ฒ„๊ทธ ์ˆ˜์ • (#194)

* feat: ๊ธ€ ์ˆ˜์ • ๊ตฌํ˜„ (#195)

* feat: ๊ธ€ ์ˆ˜์ • dto ์ž‘์„ฑ

* feat: ๊ธ€ ์ˆ˜์ • ์š”์ฒญ controller์—์„œ ๊ตฌํ˜„

* feat: postRepository.findPostById ๋ฉ”์†Œ๋“œ ์ถ”๊ฐ€

* feat: ๊ธ€ ์ˆ˜์ •์šฉ Post ์ƒ์„ฑ์ž ์ถ”๊ฐ€

* feat: postrepository.updatePost ์ž‘์„ฑ

* feat: PostService ์ˆ˜์ •์ค‘

* feat: deletePostHashtags ๋ฉ”์†Œ๋“œ ์ถ”๊ฐ€

* feat: ๊ฒŒ์‹œ๊ธ€ ์ˆ˜์ • ์„œ๋น„์Šค ๊ตฌํ˜„

* fix: ๋ฒ„๊ทธ ์ˆ˜์ •
ModifiedPostForm Valid ์ˆ˜์ •
ImageRepository.getImageByPostId ์ฟผ๋ฆฌ ์ˆ˜์ •

* feat: ํ•œ๊ธ€ decode ์„ค์ •

* fix: S3 ์ด๋ฏธ์ง€ ์‚ญ์ œ ์•ˆ๋˜๋Š” ๋ฒ„๊ทธ ์ˆ˜์ •

* chore: ์ฃผ์„์‚ญ์ œ

* feat: ์ž‘์„ฑํ•œ ๊ธ€ ๋ณด๊ธฐ (#196)

* feat: PostController ๋กœ์ง ๊ตฌํ˜„, dto ํด๋ž˜์Šค ์ƒ์„ฑ

* feat: ๊ธ€ ์ƒ์„ธ ํŽ˜์ด์ง€ response ํด๋ž˜์Šค ์ƒ์„ฑ

* feat: PostService ๋กœ์ง ๊ตฌํ˜„

* feat: dao ๋กœ์ง ๊ตฌํ˜„

* fix: imageRepository getImageByPostId IMAGE img ์ถ”๊ฐ€

* feat: date ํ˜•์‹ ๋ณ€๊ฒฝ ๋กœ์ง ์ถ”๊ฐ€

* fix: ๋‚ด๊ฐ€ ์“ด ๊ธ€์ธ์ง€ ๋‚จ์ด ์“ด ๊ธ€์ธ์ง€ ํŒ๋‹จํ•˜๋Š” ๋กœ์ง ์ˆ˜์ •

* feat: ์‹œ๊ฐ„ ํ˜•์‹ 24์‹œ๊ฐ„์œผ๋กœ ๋ณ€๊ฒฝ

* feat: ๋ชจ๋‹ฌ visible ์ฒ˜๋ฆฌ (#200)

* feat: wordLength ์ƒ์ˆ˜ ์ถ”๊ฐ€

* feat: spinner css ์ˆ˜์ •

* feat: loading์‹œ ์ฒ˜๋ฆฌ ๊ธฐ๋Šฅ ์ถ”๊ฐ€

* feat: ๊ธ€์ž ์ˆ˜ ํด ๋•Œ substring ์ฒ˜๋ฆฌ

* feat: ๋ชจ๋‹ฌ visible ์ฒ˜๋ฆฌ ์ถ”๊ฐ€

input.value>0์ด์ƒ์ผ ๋•Œ ๋ณด์ด๋„๋ก

* Feat: ํ”„๋กœํ•„ ํŽ˜์ด์ง€ ๋‹‰๋„ค์ž„, ๋น„๋ฐ€๋ฒˆํ˜ธ ์ˆ˜์ • (#201)

* feat: ์ˆ˜์ • ๋ชจ๋‹ฌ์ฐฝ ์• ๋‹ˆ๋ฉ”์ด์…˜

* feat: ์•„์ด๋”” ๋นˆ๊ฐ’, ๊ธฐ์กด๊ฐ’,  ๋น„๋ฐ€๋ฒˆํ˜ธ ๋นˆ๊ฐ’, ๋น„๋ฐ€๋ฒˆํ˜ธ ํ™•์ธ ์ผ์น˜ ์ฒดํฌ

* feat: ์•„์ด๋”” ์ค‘๋ณต์ฒดํฌ, ๋ณ€๊ฒฝ ๊ธฐ๋Šฅ

* feat: ์•„์ด๋”” ์ค‘๋ณต์ฒดํฌ, ๋ณ€๊ฒฝ ๊ธฐ๋Šฅ

* delete: userstore์‚ญ์ œ

* feat: ์ข‹์•„์š”/์ข‹์•„์š”์ทจ์†Œ ๊ธฐ๋Šฅ ์ถ”๊ฐ€ (#199)

* feat: ์ข‹์•„์š” ์ •๋ณด๋ฅผ ๋ฐ›์„ dto ํด๋ž˜์Šค ์ƒ์„ฑ

* feat: LikeController ๋กœ์ง ๊ตฌํ˜„

* feat: LikeService, LikeRepository ๋กœ์ง ๊ตฌํ˜„

* fix: findPostById ํ•จ์ˆ˜ 2๊ฐœ๋ผ์„œ ํ•˜๋‚˜  ์‚ญ์ œ

* hotfix: dd ์‚ญ์ œ

* hotfix: Expected 3 arguments, but got 2. ์—๋Ÿฌ ์ˆ˜์ •

* fix: ๋ฉ”์ธ ํŽ˜์ด์ง€ ์ „์ฒด ๊ฒ€์ƒ‰ ์•ˆ๋˜๋Š” ๋ฒ„๊ทธ ์ˆ˜์ • (#206)

* feat: ๊ธ€์ž ํฌ๊ธฐ ์ˆ˜์ •

* fix: ์ „์ฒด ๊ฒ€์ƒ‰ ์•ˆ๋˜๋Š” ๋ฒ„๊ทธ ์ˆ˜์ •

* fix: ๊ธ€์ž์ˆ˜ ํด ๋•Œ substring ํ•˜๋Š” ํ•จ์ˆ˜ ๋ชจ๋“ˆํ™”

* fix: ํด๋ฆญ ์‹œ ๋ชจ๋‹ฌ ๋ณด์ด๋„๋ก ๋‹ค์‹œ ์ˆ˜์ •

* feat: ์ฐจ๋Ÿ‰ ์ข…๋ฅ˜์™€ ์ฐจ๋Ÿ‰ ๋ชจ๋ธ ํƒœ๊ทธ๋กœ๋„ ๊ฒŒ์‹œ๋ฌผ ๊ฒ€์ƒ‰์ด ๊ฐ€๋Šฅํ•˜๋„๋ก ์ˆ˜์ • (#208)

* feat: ํ‚ค์›Œ๋“œ๋ฅผ ํ†ตํ•œ ๊ฒŒ์‹œ๋ฌผ ๊ฒ€์ƒ‰ ์‹œ, ์ฐจ๋Ÿ‰ ๋ชจ๋ธ๊ณผ ์ฐจ๋Ÿ‰ ์ข…๋ฅ˜ ํƒœ๊ทธ๋ฅผ ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ฐ›๋„๋ก ์ˆ˜์ •

- PostController์˜ searchPostsByTags() ๋ฉ”์„œ๋“œ์— @RequestParam์œผ๋กœ type, model์„ ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ฐ›๋„๋ก ํ•จ
- ์ปจํŠธ๋กค๋Ÿฌ ์ˆ˜์ •์— ๋”ฐ๋ผ PostControllerTest์˜ searchPostsByTags() ๋ฉ”์„œ๋“œ ์ˆ˜์ •
- PostService์˜ searchByTags() ์ธ์ž๋กœ type, model์„ ๋ฐ›๋„๋ก ํ•จ
- PostServiceTest์— ๊ฒŒ์‹œ๋ฌผ ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ์„ ํ…Œ์ŠคํŠธํ•˜๋Š” searchByTags() ๋ฉ”์„œ๋“œ ์ฃผ์„ ์ฒ˜๋ฆฌ
    - PostService์˜ searchByTags() ๋ฉ”์„œ๋“œ๋Š” ์ˆ˜์ •์‚ฌํ•ญ์ด ๋งŽ์œผ๋ฏ€๋กœ ์ผ๋‹จ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ฃผ์„ ์ฒ˜๋ฆฌํ•จ

* refactor: ๋กœ๊น…ํ•˜๊ธฐ ์œ„ํ•ด ๋กœ๊ทธ๋ฅผ ์„ ์–ธํ•˜๊ณ  ํ˜ธ์ถœํ•˜๋Š” ์ฝ”๋“œ ์ถ”๊ฐ€

* refactor: ํ‚ค์›Œ๋“œ๋ฅผ ํ†ตํ•ด ๊ฒŒ์‹œ๋ฌผ์„ ๊ฒ€์ƒ‰ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ํ•˜๋Š” searchPostsByTags() ๋ฉ”์„œ๋“œ์˜ ์ด๋ฆ„์„ searchPostByTags()๋กœ ๋ณ€๊ฒฝ

* refactor: ๊ฒŒ์‹œ๋ฌผ ๊ฒ€์ƒ‰ ์‘๋‹ต์— ์‚ฌ์šฉ๋˜๋Š” PostsSearchResponse์— ์ ์šฉ๋œ Builder ํŒจํ„ด ์‚ญ์ œ

๋นŒ๋” ํŒจํ„ด์€ ์ƒ์„ฑ์ž ์ธ์ž๊ฐ€ ์ถฉ๋ถ„ํžˆ ๋งŽ์€ ์ƒํ™ฉ์—์„œ๋งŒ ์ ์šฉ์„ ๊ณ ๋ คํ•ด์•ผํ•˜๋ฏ€๋กœ ์ธ์ž๊ฐ€ ํ•˜๋‚˜์ธ PostsSearchResponse ๊ฐ์ฒด์—์„œ Builder ํŒจํ„ด์„ ์‚ญ์ œํ•˜์˜€๋‹ค.

- PostService์— logger ์ถ”๊ฐ€
- cherry-pick ์ถฉ๋Œ ํ•ด๊ฒฐ

* refactor: TagController์— ๋กœ๊น…์„ ์œ„ํ•œ ๋กœ๊ทธ๋ฅผ ์„ ์–ธํ•˜๊ณ  ํ˜ธ์ถœํ•˜๋Š” ์ฝ”๋“œ ์ถ”๊ฐ€

- ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ๋กœ๊ทธ ์ˆ˜์ •

* feat: PostRepository ํด๋ž˜์Šค์—, ํ‚ค์›Œ๋“œ๋ฅผ ํ†ตํ•ด ๊ฒŒ์‹œ๋ฌผ์„ ๊ฒ€์ƒ‰ํ•  ๋•Œ ์‚ฌ์šฉํ•  ๋ฉ”์„œ๋“œ ์ถ”๊ฐ€

- searchByType(): ์ธ์ž๋กœ ์ฃผ์–ด์ง„ ํƒ€์ž…๋ช…์œผ๋กœ ํ•ด๋‹น ์ฐจ๋Ÿ‰ ์ข…๋ฅ˜ ํƒœ๊ทธ๋ฅผ ๊ฐ€์ง„ ๊ฒŒ์‹œ๋ฌผ์„ ์ตœ๊ทผ์ˆœ์œผ๋กœ ๊ฒ€์ƒ‰
- searchByModel(): ์ธ์ž๋กœ ์ฃผ์–ด์ง„ ๋ชจ๋ธ๋ช…์œผ๋กœ ํ•ด๋‹น ์ฐจ๋Ÿ‰ ๋ชจ๋ธ ํƒœ๊ทธ๋ฅผ ๊ฐ€์ง„ ๊ฒŒ์‹œ๋ฌผ์„ ์ตœ๊ทผ์ˆœ์œผ๋กœ ๊ฒ€์ƒ‰
- searchByHashtag(): ์ธ์ž๋กœ ์ฃผ์–ด์ง„ ํƒœ๊ทธ๋ช…์œผ๋กœ ํ•ด๋‹น ํ•ด์‹œํƒœ๊ทธ๋ฅผ ๊ฐ€์ง„ ๊ฒŒ์‹œ๋ฌผ์„ ์ตœ๊ทผ์ˆœ์œผ๋กœ ๊ฒ€์ƒ‰

* feat: ๋™์ผํ•œ ๊ฒŒ์‹œ๊ธ€์ธ์ง€ ํŒ๋‹จํ•˜๊ธฐ ์œ„ํ•ด Post์˜ hashCode()์™€ equals() ๋ฉ”์„œ๋“œ ์˜ค๋ฒ„๋ผ์ด๋“œ

ํ‚ค์›Œ๋“œ๋ฅผ ํ†ตํ•œ ๊ฒŒ์‹œ๋ฌผ ๊ฒ€์ƒ‰ ์‹œ, ํ•ด๋‹น ํƒœ๊ทธ๋ฅผ ๋ชจ๋‘ ๊ฐ€์ง„ ๊ฒŒ์‹œ๋ฌผ๋งŒ ์กฐํšŒํ•˜๊ธฐ ์œ„ํ•ด retainAll()์„ ์‚ฌ์šฉํ•˜์˜€๋Š”๋ฐ, ์ด ๋•Œ id๊ฐ€ ๊ฐ™์œผ๋ฉด ๋™์ผํ•œ ๊ฒŒ์‹œ๊ธ€์ด๋ผ๊ณ  ํŒ๋‹จํ•˜๋„๋ก ํ•˜๊ธฐ ์œ„ํ•ด hashCode()์™€ equals() ๋ฉ”์„œ๋“œ ์˜ค๋ฒ„๋ผ์ด๋“œ
- cherry-pick ์ถฉ๋Œ ํ•ด๊ฒฐ

* feat: PostService์˜ searchByTags() ๋ฉ”์„œ๋“œ์˜ ๋‚ด๋ถ€ ๋กœ์ง ์ˆ˜์ •

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

- cherry-pick ์ถฉ๋Œ ํ•ด๊ฒฐ

* fix: ์ฟผ๋ฆฌ๋ฌธ ์˜คํƒ€ ์ˆ˜์ •

- ๋ถˆํ•„์š”ํ•œ ๋ฉ”์„œ๋“œ ์ฃผ์„์ฒ˜๋ฆฌ

* refactor: searchByTags() ๋ฉ”์„œ๋“œ ๋ถ„๋ฆฌ ๋ฐ ์ฝ”๋“œ ํฌ๋งทํŒ…

- ํ‚ค์›Œ๋“œ๋ฅผ ํ†ตํ•ด ๊ฒŒ์‹œ๋ฌผ์„ ๊ฒ€์ƒ‰ํ•  ๋•Œ, ์ฐจ๋Ÿ‰ ์ข…๋ฅ˜ -> ์ฐจ๋Ÿ‰ ๋ชจ๋ธ -> ํ•ด์‹œํƒœ๊ทธ ์ˆœ์œผ๋กœ ๊ฒŒ์‹œ๋ฌผ์„ ๊ฒ€์ƒ‰ํ•˜๋ฏ€๋กœ, ์ฐจ๋Ÿ‰ ๋ชจ๋ธ ํƒœ๊ทธ๋กœ ๊ฒ€์ƒ‰ํ•˜๋Š” ๋กœ์ง์„ findPostsOfModelTag() ๋ฉ”์„œ๋“œ๋กœ ๋ถ„๋ฆฌํ•˜๊ณ , ํ•ด์‹œํƒœ๊ทธ๋กœ ๊ฒ€์ƒ‰ํ•˜๋Š” ๋กœ์ง์„ findPostsOfHashTag()๋กœ ๋ถ„๋ฆฌํ•จ
- check() ๋ฉ”์„œ๋“œ์˜ ์ด๋ฆ„์„ ์˜๋ฏธ๊ฐ€ ์ž˜ ๋“œ๋Ÿฌ๋‚˜๋„๋ก isNeedToSearch()๋กœ ๋ณ€๊ฒฝ

* feat: ๊ฒŒ์‹œ๋ฌผ ์กฐํšŒ ์ฟผ๋ฆฌ๋ฌธ์— WHERE์ ˆ ์กฐ๊ฑด์œผ๋กœ "is_deleted=false" ์ถ”๊ฐ€

soft delete๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด POST ํ…Œ์ด๋ธ”์— is_deleted ์นผ๋Ÿผ์„ ์ถ”๊ฐ€ํ•จ์— ๋”ฐ๋ผ, ๊ฒŒ์‹œ๋ฌผ์„ ์กฐํšŒํ•˜๋Š” ๋ชจ๋“  ์ฟผ๋ฆฌ๋ฌธ์— WHERE์ ˆ ์กฐ๊ฑด์œผ๋กœ "is_deleted=false" ์ถ”๊ฐ€

* feat: ๊ฒŒ์‹œ๋ฌผ ์กฐํšŒ ์ฟผ๋ฆฌ๋ฌธ์˜ WHERE์ ˆ ์กฐ๊ฑด "is_deleted=false"๋ฅผ "p.is_deleted = false"๋กœ ๋ณ€๊ฒฝ

* feat: isNeedToSearch(String type, int size) ๋ฉ”์„œ๋“œ ์˜ค๋ฒ„๋กœ๋”ฉ

ํƒ€์ž… ํƒœ๊ทธ๊ฐ€ ์žˆ๋Š”๋ฐ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๊ฐ€ 0์ธ ๊ฒฝ์šฐ, ํ•ด๋‹นํ•˜๋Š” ๊ฒŒ์‹œ๋ฌผ์ด ์—†์œผ๋‹ˆ ๋ชจ๋ธ ํƒœ๊ทธ๋กœ ๊ฒ€์ƒ‰ํ•  ํ•„์š”๊ฐ€ ์—†์œผ๋ฏ€๋กœ ํ•ด๋‹น ์กฐ๊ฑด์„ ์ฒดํฌํ•ด์ฃผ๋Š” isNeedToSearch() ๋ฉ”์„œ๋“œ๋ฅผ ์˜ค๋ฒ„๋กœ๋”ฉํ•จ

* feat: ๊ธ€ ์‚ญ์ œ ๊ธฐ๋Šฅ (#209)

* feat: post isdeleted์นผ๋Ÿผ ์ถ”๊ฐ€ ๋ฐ ์˜ˆ์™ธ์ฒ˜๋ฆฌ

* feat: PostController ๋กœ์ง ๊ตฌํ˜„

* feat: 401 response ์ถ”๊ฐ€ ๋ฐ ์˜ˆ์™ธ์ฒ˜๋ฆฌ

* feat: PostService, PostRepository ๊ฒŒ์‹œ๋ฌผ ์‚ญ์ œ ๋กœ์ง ๊ตฌํ˜„

* feat: findPostById ์˜ˆ์™ธ์ฒ˜๋ฆฌ ์ถ”๊ฐ€

* fix: ์ฐจ ๋ชจ๋ธ/์ข…๋ฅ˜ ์„ ํƒ ์•ˆ๋˜๋Š” ๋ฒ„๊ทธ ์ˆ˜์ • (#211)

* fix: form ์ „์†ก ์•ˆ๋˜๋Š” ๋ฒ„๊ทธ ์ˆ˜์ •

* feat: ์—๋Ÿฌ๋ฉ”์‹œ์ง€ ์ถ”๊ฐ€

* feat: api ํ—ค๋” ์ˆ˜์ •

* feat: home ๊ธ€์”จ ๋‘ ์ค„ ์•ˆ๋˜๊ฒŒ ์ˆ˜์ •

* feat: ํ•„์ˆ˜ ์ž…๋ ฅ * ํ‘œ์‹œ ์ถ”๊ฐ€

* feat: ๊ธ€์ž ์ˆ˜ ์กฐ์ •

* test: ๊ธ€ ์ƒ์„ธ ํŽ˜์ด์ง€ ๊ด€๋ จ ํ…Œ์ŠคํŠธ์ฝ”๋“œ ์ž‘์„ฑ (#213)

* test: ๊ธ€ ์ƒ์„ธ ํŽ˜์ด์ง€ Controller๋‹จ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ

* test: ๊ธ€ ์ƒ์„ธ ํŽ˜์ด์ง€ Service๋‹จ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ

* feat: ํŒ”๋กœ์šฐ ๋ฆฌ์ŠคํŠธ์—์„œ ์‚ญ์ œ (#214)

* fix: ๋กœ๊ทธ์•„์›ƒ ํ•˜๊ณ  ํ”„๋กœํ•„ ํŽ˜์ด์ง€ ๋ˆŒ๋ €์„๋•Œ ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€๋กœ ์•ˆ๊ฐ€๋Š” ๋ฒ„๊ทธ ํ•ด๊ฒฐ

* feat: ํŒ”๋กœ์›Œ, ํŒ”๋กœ์ž‰๋ฆฌ์ŠคํŠธ์—์„œ ๋‹‰๋„ค์ž„ ํด๋ฆญํ–ˆ์„๋•Œ ํ•ด๋‹นํ•˜๋Š” ํ”„๋กœํ•„ํŽ˜์ด์ง€๋กœ ์ด๋™

* feat: follower, following ์‚ญ์ œ ๊ธฐ๋Šฅ

* refactor: followlist eventhandler ํ•จ์ˆ˜๋กœ ๋ถ„๋ฆฌ

* test: ํ‚ค์›Œ๋“œ๋ฅผ ํ†ตํ•œ ๊ฒŒ์‹œ๋ฌผ ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ (#215)

* test: ํ‚ค์›Œ๋“œ๋ฅผ ํ†ตํ•œ ๊ฒŒ์‹œ๋ฌผ ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ

- searchByTagsWithHashtagsAndTypeAndModel(): ํ•ด์‹œํƒœ๊ทธ, ํƒ€์ž…, ๋ชจ๋ธ ํƒœ๊ทธ๋กœ ๊ฒŒ์‹œ๋ฌผ์„ ๊ฒ€์ƒ‰ํ•œ ๊ฒฝ์šฐ ํ…Œ์ŠคํŠธ
- searchByTagsWithHashtagsAndModel(): ํ•ด์‹œํƒœ๊ทธ, ๋ชจ๋ธ ํƒœ๊ทธ๋กœ ๊ฒŒ์‹œ๋ฌผ์„ ๊ฒ€์ƒ‰ํ•œ ๊ฒฝ์šฐ ํ…Œ์ŠคํŠธ
- searchByTagsWithHashtagsAndType(): ํ•ด์‹œํƒœ๊ทธ, ํƒ€์ž… ํƒœ๊ทธ๋กœ ๊ฒŒ์‹œ๋ฌผ์„ ๊ฒ€์ƒ‰ํ•œ ๊ฒฝ์šฐ ํ…Œ์ŠคํŠธ
- searchByTagsWithHashtags(): ํ•ด์‹œํƒœ๊ทธ๋กœ๋งŒ ๊ฒŒ์‹œ๋ฌผ์„ ๊ฒ€์ƒ‰ํ•œ ๊ฒฝ์šฐ ํ…Œ์ŠคํŠธ
- searchByTagsWithNoResult(): ํ•ด์‹œํƒœ๊ทธ, ํƒ€์ž…, ๋ชจ๋ธ ํƒœ๊ทธ๋กœ ๊ฒŒ์‹œ๋ฌผ์„ ๊ฒ€์ƒ‰ํ–ˆ๋Š”๋ฐ ์•„๋ฌด ๊ฒฐ๊ณผ๋„ ์–ป์ง€ ๋ชปํ•œ ๊ฒฝ์šฐ ํ…Œ์ŠคํŠธ

* refactor: ๋ณ€์ˆ˜๋ช… expectedResult๋ฅผ imagesEightAndSix๋กœ ๋ณ€๊ฒฝ

* refactor: ๋ถˆํ•„์š”ํ•œ ๋กœ์ปฌ๋ณ€์ˆ˜๋ฅผ ์‚ญ์ œํ•˜๊ณ , ํด๋ž˜์Šค์— ์„ ์–ธ๋œ images ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ๋ณ€๊ฒฝ

* test: ์ข‹์•„์š”, ์ข‹์•„์š” ์ทจ์†Œ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ (#218)

* test: LikeController test

* test: LikeService test

* test: end of line ์ถ”๊ฐ€

* test: TagController ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ (#219)

* test: TagController ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ

- searchAllTags(): ๋ชจ๋“  ํƒœ๊ทธ ๊ฒ€์ƒ‰ ํ…Œ์ŠคํŠธ
- searchHashtag(): ํ•ด์‹œํƒœ๊ทธ ๊ฒ€์ƒ‰ ํ…Œ์ŠคํŠธ
- getAllTypes(): ์ฐจ๋Ÿ‰ ์ข…๋ฅ˜ ์ „์ฒด ์กฐํšŒ ํ…Œ์ŠคํŠธ
- getAllModels(): ์ฐจ๋Ÿ‰ ํƒ€์ž… ์ „์ฒด ์กฐํšŒ ํ…Œ์ŠคํŠธ

* refactor: TagServiceTest ํด๋ž˜์Šค์˜ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ๋ฆฌํŒฉํ† ๋ง

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

* test: ๊ฒŒ์‹œ๊ธ€ ์ž‘์„ฑ/์ˆ˜์ • ํ…Œ์ŠคํŠธ (#222)

* chore: pr๋ณ‘ํ•ฉ

* chore: pr ๋ณ‘ํ•ฉ

* chore: pr ๋ณ‘ํ•ฉ

* test: ๊ฒŒ์‹œ๊ธ€ ์ˆ˜์ • ์„ฑ๊ณต ์„œ๋น„์Šค ํ…Œ์ŠคํŠธ ์ž‘์„ฑ

* feat: invalidPostAccess ๋ฉ”์†Œ๋“œ ๋ถ„๋ฆฌ

* test: postService ๊ฒŒ์‹œ๊ธ€ ์ˆ˜์ • ํ…Œ์ŠคํŠธ

* test: ๊ฒŒ์‹œ๊ธ€ ์ˆ˜์ • ์‹คํŒจ ์„œ๋น„์Šค ํ…Œ์ŠคํŠธ ์ž‘์„ฑ

* test: ํŒ”๋กœ์šฐ ๊ด€๋ จ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ (#224)

* test: FollowController test

* test: FollowService test

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

* fix: ๊ธ€ ์ƒ์„ธ ํŽ˜์ด์ง€ api ๋ฆฌํ„ด๊ฐ’ ์ˆ˜์ • (#225)

* fix: ๊ธ€ ์ƒ์„ธ ํŽ˜์ด์ง€ api ๋ฆฌํ„ด๊ฐ’ ์ˆ˜์ •

* rename: hashtags >> hashtag

* feat: findHashtagsByPostId ๋ณ„์นญ ์„ค์ •

* docs: ์ฃผ์„ ์‚ญ์ œ

* feat: ์ƒ์„ธ ํŽ˜์ด์ง€ ์กฐํšŒ ์‹œ ์ข‹์•„์š” ์—ฌ๋ถ€๋„ ์‘๋‹ต

* feat : ์ƒ์„ธ ํŽ˜์ด์ง€ ์ปดํฌ๋„ŒํŠธ๋กœ ๋ถ„๋ฆฌ (#226)

* feat: ๋ฉ”๋‰ด๋ฅผ ๋ˆ„๋ฅผ๋•Œ๋งˆ๋‹ค ๋ฉ”๋‰ด visible ๋ณ€ํ•˜๋„๋ก ์ˆ˜์ •

* feat: ๋‚ด ๊ฒŒ์‹œ๊ธ€์—์„œ๋งŒ ์ˆ˜์ •, ์‚ญ์ œ ๊ฐ€๋Šฅ

* feat: ๊ธ€ ์ƒ์„ธ ํŽ˜์ด์ง€ ์ปดํฌ๋„ŒํŠธ๋กœ ๋ถ„๋ฆฌ

* delete: console.log ์‚ญ์ œ

* feat: ๊ธ€ ์ˆ˜์ • ๊ธฐ๋Šฅ  (#227)

* feat: ํ•ด์‹œํƒœ๊ทธ๊ฐ์ฒด ํ•จ์ˆ˜ ๋ชจ๋“ˆํ™”

* feat: ํ•ด์‹œํƒœ๊ทธ min-width์„ค์ •

* feat: post ์ดˆ๊ธฐ๊ฐ’ ์ƒ์ˆ˜ ๋ถ„๋ฆฌ

* feat: urlํ•จ์ˆ˜ ๋นˆ ๊ฐ’์ผ ๋•Œ ์ฒ˜๋ฆฌ

* feat: ์ˆ˜์ • ์‹œ ๋ฐ์ดํ„ฐ ๋ฐ›์•„์˜ค๋„๋ก ์ˆ˜์ •

* feat: ๊ฒ€์ƒ‰์–ด ์ธ์ฝ”๋”ฉ ์ฒ˜๋ฆฌ

* feat: div ํƒœ๊ทธ ์ถ”๊ฐ€

* feat: postId ๋ฐ›์•„์˜ค๋Š” ํ•จ์ˆ˜ ๋ถ„๋ฆฌ

* feat: ์ดˆ๊ธฐ๊ฐ’ ๋ถ„๋ฆฌ

* feat: post ํƒ€์ž… ์ถ”๊ฐ€

* fix: ๊ฒ€์ƒ‰์–ด๋กœ ์ฟผ๋ฆฌ๋ฌธ์— ์‚ฌ์šฉ๋˜๋Š” ํŠน์ˆ˜๋ฌธ์ž๊ฐ€ ์‚ฌ์šฉ๋˜๋Š” ๊ฒฝ์šฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์ฟผ๋ฆฌ๋ฌธ ์ˆ˜์ • (#231)

'%'๊ฐ€ ๊ฒ€์ƒ‰์–ด๋กœ ๋“ค์–ด์˜ฌ ๊ฒฝ์šฐ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๊ฐ€ ์ถœ๋ ฅ๋˜๋ฏ€๋กœ, ์ด๋ฅผ ์‹ค์ œ ๋ฌธ์ž๋กœ ์ธ์‹์‹œํ‚ค๊ธฐ ์œ„ํ•ด ์ฟผ๋ฆฌ๋ฌธ์„ ์ˆ˜์ •ํ•˜์˜€๋‹ค.

- TagRepository์˜ ์ฟผ๋ฆฌ๋ฌธ ์ˆ˜์ •
- TagService์— ๋กœ๊ทธ ์ถœ๋ ฅ์„ ์œ„ํ•œ logger ์„ ์–ธ ๋ฐ ์‚ฌ์šฉ
- TagServiceTest ํ…Œ์ŠคํŠธ ๋ฉ”์„œ๋“œ ์ถ”๊ฐ€
    - searchAllTagsWithNoResult(): ๋ชจ๋“  ํƒœ๊ทธ ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ ํ…Œ์ŠคํŠธ - ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ
    - searchHashTagWithNoResult(): ํ•ด์‹œํƒœ๊ทธ ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ ํ…Œ์ŠคํŠธ - ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ

* fix: ๊ฒ€์ƒ‰์–ด๋กœ SQL ์ฟผ๋ฆฌ๋ฌธ์˜ ํŠน์ˆ˜ ๋ฌธ์ž๊ฐ€ ์‚ฌ์šฉ๋˜๋Š” ๊ฒฝ์šฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์ฟผ๋ฆฌ๋ฌธ 2์ฐจ ์ˆ˜์ • (#235)

* fix: ๊ฒ€์ƒ‰์–ด๋กœ SQL ์ฟผ๋ฆฌ๋ฌธ์˜ ํŠน์ˆ˜ ๋ฌธ์ž๊ฐ€ ์‚ฌ์šฉ๋˜๋Š” ๊ฒฝ์šฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์ฟผ๋ฆฌ๋ฌธ 2์ฐจ ์ˆ˜์ •

LIKE ์ ˆ์˜ ์™€์ผ๋“œ ๋ฌธ์ž๋Š” '%'์™€ '_'์ด๋ฏ€๋กœ ์ด ๋‘ ๋ฌธ์ž๊ฐ€ ๊ฒ€์ƒ‰์–ด๋กœ ๋“ค์–ด์˜ฌ ๊ฒฝ์šฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์ฟผ๋ฆฌ๋ฌธ์„ ์ˆ˜์ •ํ•˜์˜€๋‹ค.
์™€์ผ๋“œ ๋ฌธ์ž๋ฅผ ์‹ค์ œ ๋ฌธ์ž๋กœ ์ธ์‹ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๊ฒ€์ƒ‰์–ด ์ „์ฒด๊ฐ€ ์•„๋‹ˆ๋ผ ์™€์ผ๋“œ ๋ฌธ์ž๊ฐ€ ๋“ค์–ด๊ฐ€๋Š” ๋ถ€๋ถ„๋งŒ '[]'๋กœ ๊ฐ์‹ธ์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— convertWildCharToRealChar()์„ ์„ ์–ธํ•˜์—ฌ ์™€์ผ๋“œ ๋ฌธ์ž๊ฐ€ ์‹ค์ œ๋ฌธ์ž๋กœ ์ธ์‹๋˜๋„๋ก ์ฟผ๋ฆฌ๋ฌธ์„ ๋‹ค์‹œ ์ˆ˜์ •ํ•˜์˜€๋‹ค.

- TagRepository์˜ ์ฟผ๋ฆฌ๋ฌธ ์ˆ˜์ •
- convertWildCharToRealChar(): LIKE ์ ˆ์˜ ์™€์ผ๋“œ ๋ฌธ์ž '%'์™€ '_'๊ฐ€ ์ฟผ๋ฆฌ๋ฌธ์—์„œ ์‹ค์ œ ๋ฌธ์ž๋กœ ์ธ์‹๋˜๋„๋ก, ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋“ค์–ด์˜จ ๋ฌธ์ž์—ด์„ ์ˆ˜์ •ํ•˜์—ฌ ๋ฐ˜ํ™˜

* feat: convertWildCharToRealChar() ๋‚ด๋ถ€ ๋กœ์ง ์ˆ˜์ •

* fix: ๋กœ๊ทธ์ธ, ํšŒ์›๊ฐ€์ž… ํŽ˜์ด์ง€ ๋ ˆ์ด์•„์›ƒ ์ˆ˜์ • (#237)

* fix: ํšŒ์›๊ฐ€์ž… ํŽ˜์ด์ง€ ๋ ˆ์ด์•„์›ƒ ์ˆ˜์ •

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

* fix: ๊ธ€ ์“ด ์‚ฌ๋žŒ์˜ ๋‹‰๋„ค์ž„ ์ „๋‹ฌํ•˜๋„๋ก ์ˆ˜์ • (#239)

* hotfix: test ์ฝ”๋“œ ์ˆ˜์ • (#241)

* fix: ๊ธ€ ์“ด ์‚ฌ๋žŒ์˜ ๋‹‰๋„ค์ž„ ์ „๋‹ฌํ•˜๋„๋ก ์ˆ˜์ •

* hotfix: test์ฝ”๋“œ ์ˆ˜์ •

* feat: ์ƒ์„ธ ํŽ˜์ด์ง€ ์—ฐ๊ฒฐ (#242)

* feat: ๊ธ€ ์ž‘์„ฑ์ž ๋ˆ„๋ฅด๋ฉด ํ”„๋กœํ•„๋กœ ์ด๋™

* feat: ๋’ค๋กœ๊ฐ€๊ธฐ ๋ฒ„ํŠผ ๊ธฐ๋Šฅ ์ถ”๊ฐ€

* feat: ์ด๋ฏธ์ง€ ์—ฐ

* feat: ์ด๋ฏธ์ง€ ์—ฐ

* refactor: fetchํ•จ์ˆ˜ ์ˆ˜์ •

* test: UserRepository test ์ฝ”๋“œ ์ž‘์„ฑ (#244)

* test: UserRepository ํด๋ž˜์Šค ์ƒ์„ฑ

* test: UserRepository test ์ฝ”๋“œ ์ž‘์„ฑ

* hotfix: ์ข‹์•„์š” ์กฐํšŒ ๊ธฐ๋Šฅ ๋ฒ„๊ทธ ์ˆ˜์ •

* fix: TagRepository์˜ ํƒœ๊ทธ ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ์— ์“ฐ์ด๋Š” ๋ชจ๋“  ์ฟผ๋ฆฌ๋ฌธ ์ˆ˜์ • ๋ฐ TagRepository ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ (#246)

* test: TagRepository ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ

- findHashtagByName(): ํƒœ๊ทธ ์ด๋ฆ„์œผ๋กœ ํ•ด์‹œํƒœ๊ทธ ์กฐํšŒ
- findHashtagByNameWithNoHashtag(): ํƒœ๊ทธ ์ด๋ฆ„์œผ๋กœ ํ•ด์‹œํƒœ๊ทธ ์กฐํšŒ - ์กฐํšŒ ๊ฒฐ๊ณผ๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ
- searchHashtagByPrefix(): ํ‚ค์›Œ๋“œ๋ฅผ ์ ‘๋‘์–ด๋กœ ํ•˜์—ฌ ํ•ด์‹œํƒœ๊ทธ๋ฅผ ์กฐํšŒ

* fix: TagRepository์˜ ํƒœ๊ทธ ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ์— ์“ฐ์ด๋Š” ๋ชจ๋“  ์ฟผ๋ฆฌ๋ฌธ ์ˆ˜์ •

TagRepository ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋˜ ์ค‘, SQL ์ฟผ๋ฆฌ์˜ LIKE ์กฐ๊ฑด์ ˆ์— ์“ฐ์ด๋Š” ์™€์ผ๋“œ ๋ฌธ์ž๊ฐ€ ๊ฒ€์ƒ‰์–ด์— ํฌํ•จ๋  ๊ฒฝ์šฐ ์ œ๋Œ€๋กœ ์กฐํšŒ๊ฐ€ ๋˜์ง€ ์•Š๋Š” ์˜ค๋ฅ˜๋ฅผ ๋ฐœ๊ฒฌํ•˜์—ฌ, TagRepository์˜ ์ฟผ๋ฆฌ๋ฌธ์˜ LIKE ์กฐ๊ฑด์ ˆ์—์„œ ESCAPE ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜๋„๋ก ์ˆ˜์ •ํ•˜์˜€๋‹ค.

- convertWildCharToRealChar() ๋‚ด๋ถ€ ๋กœ์ง ์ˆ˜์ •
- TagRepositoryTest ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ
    - searchHashtagByPrefixWithWildCharPercentage(): '%'๋ฌธ์ž๋ฅผ ์ ‘๋‘์–ด๋กœ ํ•˜์—ฌ ํ•ด์‹œํƒœ๊ทธ๋ฅผ ์กฐํšŒ
    - searchHashtagByPrefixWithWildCharUnderBar(): '_'๋ฅผ ์ ‘๋‘์–ด๋กœ ํ•˜์—ฌ ํ•ด์‹œํƒœ๊ทธ๋ฅผ ์กฐํšŒ

* feat: ๊ธ€ ์ˆ˜์ • ๊ธฐ๋Šฅ (#248)

* feat: ์ข‹์•„์š”/์ข‹์•„์š” ์ทจ์†Œ ๊ธฐ๋Šฅ ๊ตฌํ˜„ (#249)

* feat: ์ข‹์•„์š”/์ข‹์•„์š” ์ทจ์†Œ ๊ธฐ๋Šฅ ๊ตฌํ˜„

* fix: ํƒ€์ž…์—๋Ÿฌ ์ˆ˜์ •

* Fix : ํ”„๋กœํ•„ํŽ˜์ด์ง€์—์„œ ๋‹ค๋ฅธ ์œ ์ € ํ”„๋กœํ•„๋กœ ์ด๋™ํ• ๋•Œ state์ดˆ๊ธฐํ™” ์•ˆ๋˜๋Š” ๋ฒ„๊ทธ (#251)

* fix: ํ”„๋กœํ•„ ํŽ˜์ด์ง€ ๋ฒ„๊ทธ ์ˆ˜์ •

* fix: ํƒ€์ž… ์—๋Ÿฌ ์ˆ˜์ •

* fix:๋””ํ…Œ์ผ ํŽ˜์ด์ง€ ๋ฒ„๊ทธ ์ˆ˜์ • (#252)

* Update README.md

๋ฐฐํฌ ์•„ํ‚คํ…์ณ ์—…๋กœ๋“œ

* hotfix: ์ทจ์†Œ ์‹œ ๋’ค๋กœ์•ˆ๊ฐ€๋Š” ๋ฒ„๊ทธ ์ˆ˜์ •

* Update README.md

* fix: ๋ฉ”์ธ ํŽ˜์ด์ง€ state ์ดˆ๊ธฐํ™” ์•ˆ๋˜๋Š” ๋ฒ„๊ทธ ์ˆ˜์ • (#255)

* fix: ์ด๋ฒคํŠธ ์Œ“์ด๋Š” ๋ฒ„๊ทธ ์ˆ˜์ •

* fix: ์•Œ๋žŒ ์ฒ˜๋ฆฌ

* remove: ๋กœ๊ทธ ์ œ๊ฑฐ

* fix: ๋กœ๊ทธ์ธ ์ƒํƒœ ๋กœ์ปฌ ์Šคํ† ๋ฆฌ์ง€์— ์ €์žฅ

* feat: isLogin API ๊ตฌํ˜„ (#256)

* Update README.md

* Update README.md

* feat: isLogin ๋ชจ๋“ˆ ์ถ”๊ฐ€/ ํŽ˜์ด์ง€๊ฐ„ ์ด๋ฒคํŠธ ์Œ“์ด๋Š” ๋ฌธ์ œ ์ˆ˜์ • (#260)

* feat: isLogin ๋ชจ๋“ˆ ์ถ”๊ฐ€

* fix: ํŽ˜์ด์ง€๊ฐ„ ์ด๋ฒคํŠธ ์Œ“์ด๋Š” ๋ฌธ์ œ ์ˆ˜์ •

* hoxfix: ์ด๋ฒคํŠธ ์Œ“์ด๋Š” ๋ฌธ์ œ ํ•ด๊ฒฐ

* chore: create_data.sql ์ž‘์„ฑ (#267)

* feat: ๊ธ€ ์ƒ์„ธ ํŽ˜์ด์ง€ ๊ฒŒ์‹œ๊ธ€ ์‚ญ์ œ ๊ธฐ๋Šฅ (#270)

* feat: ๊ฒŒ์‹œ๊ธ€ ์‚ญ์ œ ๊ธฐ๋Šฅ

* feat: ๊ฒŒ์‹œ๊ธ€ ์‚ญ์ œ ์•Œ๋ฆผ ๋ชจ๋‹ฌ ์ถ”๊ฐ€

* desing: ์•Œ๋ฆผ ๋ชจ๋‹ฌ ๋ฐฐ๊ฒฝ์ƒ‰ ๋ณ€๊ฒฝ

* delete: ๋กœ๊ทธ, ์ฃผ์„ ์‚ญ์ œ

* test: FollowRepositoryTest ์ฝ”๋“œ ์ž‘์„ฑ (#269)

* test: FollowRepositoryTest ์ฝ”๋“œ ์ž‘์„ฑ

* test: DisplayName ์ถ”๊ฐ€

* test: TagRepositoryTest ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ ๋ฐ ๋ฆฌํŒฉํ† ๋ง (#268)

* test: TagRepositoryTest ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ ๋ฐ ๋ฆฌํŒฉํ† ๋ง

- findHashtagsByPostId(): ๊ฒŒ์‹œ๋ฌผ id๋กœ ํ•ด์‹œํƒœ๊ทธ ์กฐํšŒ ํ…Œ์ŠคํŠธ
- findModelByName(): ๋ชจ๋ธ ์ด๋ฆ„์œผ๋กœ ๋ชจ๋ธ ํƒœ๊ทธ ์กฐํšŒ ํ…Œ์ŠคํŠธ

* refactor: ํ…Œ์ŠคํŠธ ์ด๋ฆ„ ๋ณ€๊ฒฝ

* refactor: ๋ถˆํ•„์š”ํ•œ PostRepository ๋ฉค๋ฒ„๋ณ€์ˆ˜ ์‚ญ์ œ

* feat: ํ•ด์‹œํƒœ๊ทธ id๋กœ ํ•ด์‹œํƒœ๊ทธ๋ฅผ ์กฐํšŒํ•˜๋Š” ๋ฉ”์„œ๋“œ ์ถ”๊ฐ€

* test: TagRepository ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ถ”๊ฐ€

- addHashtag(): ํ•ด์‹œํƒœ๊ทธ ์ถ”๊ฐ€ ํ…Œ์ŠคํŠธ
- addPostHashtag(): ๊ฒŒ์‹œ๋ฌผ์— ํ•ด์‹œํƒœ๊ทธ ์ถ”๊ฐ€ ํ…Œ์ŠคํŠธ
- deletePostHashtag(): ๊ฒŒ์‹œ๋ฌผ์— ํ•ด์‹œํƒœ๊ทธ ์‚ญ์ œ ํ…Œ์ŠคํŠธ

* test: ImageRepository ํ…Œ์ŠคํŠธ์ฝ”๋“œ ์ž‘์„ฑ (#271)

* test: ImageRepositoryTest ์ž‘์„ฑ์ค‘

* refactor: test ์ฝ”๋“œ๋ฅผ ์œ„ํ•ด PostRepository์˜ keyholder ๋ถ€๋ถ„ ์ˆ˜์ •

* test: getImageByPostId ํ…Œ์ŠคํŠธ ์ž‘์„ฑ
test: getImagesOfRecentPosts ํ…Œ์ŠคํŠธ ์ž‘์„ฑ

* test: getImagesOfRecentFollowingPosts ํ…Œ์ŠคํŠธ ์ž“์–ด

* test: findImagesByNickname ํ…Œ์ŠคํŠธ ์ž‘์„ฑ
refactor: findImagesByNickname ๋ฉ”์†Œ๋“œ sql ์˜ˆ์•ฝ์–ด ์ฒ˜๋ฆฌ

* refactor: Display ์ž‘์„ฑ

* test: image ์ €์žฅ ํ…Œ์ŠคํŠธ ์ž‘์„ฑ

* refactor: ์•ˆ์“ฐ๋Š” ๋ฉ”์†Œ๋“œ deprecated ์ฒ˜๋ฆฌ

* test: Image ์ˆ˜์ • ํ…Œ์ŠคํŠธ ์ž‘์„ฑ

* refactor: ํ•„์š”์—†๋Š” ์ฝ”๋“œ ์‚ญ์ œ

* test: LikeRepository ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ถ”๊ฐ€ (#272)

* test: findUserById ์œ ์ €๊ฐ€ ์—†์„ ๊ฒฝ์šฐ ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€

* test: isLogin api test ์ฝ”๋“œ ์ž‘์„ฑ

* test: LikeRepository test ์ฝ”๋“œ ์ถ”๊ฐ€

* refactor: ์“ฐ์ง€ ์•Š๋Š” Follow model ํด๋ž˜์Šค ์‚ญ์ œ

* test: PostRepository ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ (#273)

* test: PostRepository์˜ ๊ฒŒ์‹œ๊ธ€ ์ถ”๊ฐ€ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ

* test: PostRepository์˜ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ถ”๊ฐ€

* style: ์ฃผ์„ ์ถ”๊ฐ€

* test: bean ๊ด€๋ จ ํ…Œ์ŠคํŠธ์ฝ”๋“œ ์ถ”๊ฐ€ (#274)

* test: bean ๊ด€๋ จ ํ…Œ์ŠคํŠธ์ฝ”๋“œ ์ถ”๊ฐ€

* refactor: end of line ์ถ”๊ฐ€

* Fix: ํ”„๋กœํ•„ ํŽ˜์ด์ง€ ๋ฒ„๊ทธ ์ˆ˜์ • (#275)

* fix: ๋‹‰๋„ค์ž„ ์ˆ˜์ •์ฐฝ ์‚ฌ๋ผ์งˆ๋•Œ ๋น„๋ฐ€๋ฒˆํ˜ธ ์ˆ˜์ •์ฐฝ ๋ณด์ด๋Š” ๋ฒ„๊ทธ ์ˆ˜์ •

* fix: ๋ฉ”๋‰ด ์•„์ดํ…œ์ด ๋’ค์— ์žˆ๋˜ ๊ฒƒ ์ˆ˜์ •

* fix: ๊ธฐ์กด ๋น„๋ฐ€๋ฒˆํ˜ธ ํ‹€๋ ธ์„๋•Œ ์˜ค๋ฅ˜์ถœ๋ ฅ, ๊ธฐ์กด ๋น„๋ฐ€๋ฒˆํ˜ธ์™€ ๋ณ€๊ฒฝํ•  ๋น„๋ฐ€๋ฒˆํ˜ธ์™€ ์ค‘๋ณต ์ฒดํฌ

* feat: ๋น„๋ฐ€๋ฒˆํ˜ธ ์„ฑ๊ณต์‹œ ์•Œ๋ฆผ์ฐฝ ๋ฐฐ๊ฒฝ ๋ฐ”๊ฟˆ

* feat: ๋น„๋ฐ€๋ฒˆํ˜ธ ๋ณ€๊ฒฝ ์ฐฝ์— ์ •๋ณด ๋‚จ์•„ ์žˆ๋Š” ๊ฒƒ ์ˆ˜์ •

* Update README.md

* Fix: ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€ ๋ฒ„๊ทธ (#276)

* fix: ๋กœ๊ทธ์ธ, ํšŒ์›๊ฐ€์ž… ํŽ˜์ด์ง€ ์ปจํ…Œ์ด๋„ˆ ํฌ๊ธฐ ์ˆ˜์ •

* fix: ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€ ๋น„๋ฐ€๋ฒˆํ˜ธ ์˜ค๋ฅ˜ ์ฒดํฌ

* feat: ํŒ”๋กœ์›Œ, ํŒ”๋กœ์ž‰ ์‚ญ์ œ์‹œ ์ˆซ์ž ์—ฐ๋™ (#278)

* fix: ํƒœ๊ทธ ์‚ญ์ œ์‹œ ๋ Œ๋”๋ง ์•ˆ๋˜๋Š” ๋ฒ„๊ทธ ์ˆ˜์ • (#281)

* Update README.md

ERD update

* feat: ๋ฌดํ•œ ์Šคํฌ๋กค์„ ์œ„ํ•œ ์ฟผ๋ฆฌ ์ˆ˜์ • (#284)

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

* feat: ๋ฌดํ•œ์Šคํฌ๋กค์„ ์œ„ํ•œ ์ฟผ๋ฆฌ ์ˆ˜์ •

* feat: ์ดˆ๊ธฐ postId ์„ค์ • ๋กœ์ง ์ถ”๊ฐ€

* feat: ๋ฌดํ•œ ์Šคํฌ๋กค์„ ์œ„ํ•œ PostService ๋กœ์ง ์ˆ˜์ • (#285)

* feat: ํƒœ๊ทธ๋กœ ๊ฒŒ์‹œ๋ฌผ ๊ฒ€์ƒ‰ ์‹œ, ๊ธฐ์กด์˜ index ๋Œ€์‹  postId๋ฅผ ๋ฐ›์•„์„œ, postId๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๊ฒŒ์‹œ๋ฌผ์„ ์กฐํšŒํ•˜๋„๋ก ์ˆ˜์ •

๋ฌดํ•œ ์Šคํฌ๋กค์—์„œ ์ค‘๋ณต ๋ฐ ๋ˆ„๋ฝ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด ๊ธฐ์กด์˜ index์—์„œ postId๋ฅผ ํ™œ์šฉํ•˜๋„๋ก ๋กœ์ง์„ ์ˆ˜์ •ํ•˜์˜€๋‹ค.
- searchByTags(): ํŒŒ๋ผ๋ฏธํ„ฐ ๋ณ€์ˆ˜ index๋ฅผ postId๋กœ ์ด๋ฆ„ ๋ณ€๊ฒฝ
- postId๊ฐ€ 0์ผ ๊ฒฝ์šฐ ์ •์ˆ˜ ์ตœ๋Œ€๊ฐ’์œผ๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ๋กœ์ง ์ถ”๊ฐ€
- findImagesOfPostsStartsWithIndex() ๋ฉ”์„œ๋“œ ์ด๋ฆ„์„ findImagesOfPostsFromPostId()๋กœ ๋ณ€๊ฒฝ
- findImagesOfPostsFromPostId() ๋กœ์ง ๋ณ€๊ฒฝ
    - offset ๋Œ€์‹  ์ด์ „ ์‘๋‹ต์œผ๋กœ ๋ณด๋‚ธ ๊ฒŒ์‹œ๊ธ€ ์ค‘ ๋งˆ์ง€๋ง‰ ๊ฒŒ์‹œ๊ธ€์˜ id๋ฅผ ์š”์ฒญ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ฐ›๊ธฐ ๋•Œ๋ฌธ์—, ํ˜„์žฌ ์กฐํšŒํ•œ ๊ฒŒ์‹œ๊ธ€์—์„œ postId๋ณด๋‹ค ์ž‘์€ ์•„์ด๋””๋ฅผ ๊ฐ€์ง„ Post๋ฅผ ์ฐพ์€ ํ›„, ๊ทธ post๋ถ€ํ„ฐ POST_COUNT ๋งŒํผ์˜ ๊ฐœ์ˆ˜์˜ ์ด๋ฏธ์ง€๋ฅผ ์‘๋‹ต์œผ๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

* refactor: initPostId()๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ค‘๋ณต๋˜๋Š” postId ์ดˆ๊ธฐํ™” ๋กœ์ง ์‚ญ์ œ

* refactor: ํŒŒ๋ผ๋ฏธํ„ฐ ๋ณ€์ˆ˜ index๋ฅผ postId๋กœ ์ด๋ฆ„ ๋ณ€๊ฒฝ

* feat: ๊ธ€ ์ž‘์„ฑํŽ˜์ด์ง€ input validation (#286)

* feat: ๋ฉ”์ธ ํŽ˜์ด์ง€ index -> postId๋กœ ๋ณ€๊ฒฝ (#288)

* feat: index postId๋กœ ๋ณ€๊ฒฝ

* remove: ๋กœ๊ทธ์‚ญ์ œ

* test: postId๋ฅผ ํ™œ์šฉํ•œ ํ…Œ์ŠคํŠธ์ฝ”๋“œ ์ž‘์„ฑ (#293)

* test: getImagesOfRecentPosts Test ์ˆ˜์ •

* test: getImagesOfRecentFollowingPosts Test ์ˆ˜์ •

* test: PostServiceTest ์ˆ˜์ •

* chore: test ์ด๋ฆ„ ๋ณ€๊ฒฝ

* fix: post key ๋ชป๊ฐ€์ ธ์˜ค๋Š” ๋ฒ„๊ทธ ์ˆ˜์ •

* fix: ๋ฉ”์ธํŽ˜์ด์ง€ ๋ฒ„๊ทธ ์ˆ˜์ • (#295)

* fix: ํ•ด์‹œํƒœ๊ทธ ๋ชจ๋‹ฌ ์•ˆ๋œจ๋Š” ๋ฒ„๊ทธ ์ˆ˜์ •

* Feat: ๋กœ๊ณ  ํด๋ฆญ์‹œ ๋ฉ”์ธ์œผ๋กœ

* fix: ๋ฆฌ์ŠคํŠธ0์ผ ๋•Œ ์ฒ˜๋ฆฌ

* fix: skeleton์•ˆ์—†์–ด์ง€๋Š” ๋ฒ„๊ทธ ์ˆ˜์ •

* feat : ๊ธ€ ์ƒ์„ธ ํŽ˜์ด์ง€์—์„œ ์ด๋ฏธ์ง€ ํด๋ฆญ์‹œ ์›๋ณธ ๋ณด์—ฌ์ฃผ๊ธฐ (#297)

* feat: ์ด๋ฒคํŠธ ์œ„์ž„ setup์œผ๋กœ ์˜ฎ๊น€

* feat: ์ข‹์•„์š” ์• ๋‹ˆ๋ฉ”์ด์…˜, ์ด๋ฏธ์ง€ ํด๋ฆญ์‹œ ์ด๋ฏธ์ง€ ๋ชจ๋‹ฌ ๋ณด์—ฌ์คŒ

* design: ๋ชจ๋ธ, ์ข…๋ฅ˜ ํฐํŠธ ๋ณ€๊ฒฝ

* fix: form ์ด๋ฏธ์ง€ ์ดˆ๊ธฐํ™” ์•ˆ๋˜๋Š” ๋ฒ„๊ทธ ์ˆ˜์ • (#298)

* chore: setState state ๋น„๊ต ๋กœ์ง ์ถ”๊ฐ€ (#301)

* chore: setstate ์—์„œ prevstate, nextstate ๋น„๊ต ํ›„ ๋ Œ๋”๋ง

* chore:์Œ๋”ฐ์˜ดํ‘œ ๋”ฐ์˜ดํ‘œ๋กœ ๋ณ€๊ฒฝ

* feat: interceptor๋ฅผ ํ™œ์šฉํ•ด ๋กœ๊ทธ์ธ ์—ฌ๋ถ€ ์ฒ˜๋ฆฌ (#303)

* feat: interceptor ์ ์šฉ์ค‘

* feat: interceptor๋กœ ๋กœ๊ทธ์ธ์—ฌ๋ถ€ ํ™•์ธ ์ฒ˜๋ฆฌ ๊ตฌํ˜„

* feat: /search api uri ์ˆ˜์ •

---------

Co-authored-by: jaehunLee-dev <[email protected]>

* feat: ๋ฉ”์ธ ํŽ˜์ด์ง€ ์œ„๋กœ๊ฐ€๋Š” ์Šคํฌ๋กค ์ถ”๊ฐ€ (#304)

* feat: ์œ„๋กœ๊ฐ€๊ธฐ ๋ฒ„ํŠผ ์ถ”๊ฐ€

* feat: meta ํƒœ๊ทธ, ํŒŒ๋น„์ฝ˜ ์ถ”๊ฐ€

* Fix: ํ”„๋กœํ•„ ํŽ˜์ด์ง€ ๊ตฌํ˜„ (#306)

* feat: home button, ํ”„๋กœํ•„ ํŽ˜์ด์ง€ ์ƒˆ๋กœ๊ณ ์นจ ๊ธฐ๋Šฅ ์ถ”๊ฐ€

* fix: ํŒ”๋กœ์›Œ, ํŒ”๋กœ์ž‰ ๋ˆ„๋ฅผ์‹œ ํ”„๋กœํ•„๋กœ ์ด๋™ํ•˜์ง€ ์•Š๋˜ ๋ฒ„๊ทธ ์ˆ˜์ •

* fix: ํ”„๋กœํ•„ ํŽ˜์ด์ง€, ๊ธ€ ์ƒ์„ธ ํŽ˜์ด์ง€ ์„ธ์…˜ ๋งŒ๋ฃŒ ์ฒดํฌ

* fix: ๊ธ€ ์ƒ์„ธ ํŽ˜์ด์ง€ ๋กœ๋”ฉ ํ• ๋–„ undefine ๋ณด์ด๋Š”๊ฑฐ ์ˆ˜์ •

* fix: ๊ธ€ ์ƒ์„ธ ํŽ˜์ด์ง€์—์„œ ๋’ค๋กœ๊ฐ€๊ธฐ ๋ฒ„ํŠผ ๋ณด์ด์ง€ ์•Š๋Š” ๊ฒƒ ์ˆ˜์ • (#312)

* fix: ํƒœ๊ทธ ๋ฒ„๊ทธ, ์ด๋ฏธ์ง€ ๊ด€๋ จ ๋ฒ„๊ทธ ์ฒ˜๋ฆฌ (#311)

* fix: ์นดํ…Œ๊ณ ๋ฆฌ ์žฌ์„ ํƒ ์•ˆ๋˜๋Š” ๋ฒ„๊ทธ ์ˆ˜์ •

* feat: ์—๋Ÿฌ๋ฉ”์‹œ์ง€์— ๋”ฐ๋ฅธ alert์ฒ˜๋ฆฌ

* feat: ์šฉ๋Ÿ‰์— ๋”ฐ๋ฅธ ์—๋Ÿฌ ํ•ธ๋“ค๋ง

* feat: ์ด์ „ ๋ฐ์ดํ„ฐ ์บ์‹ฑํ•˜์—ฌ ํŽ˜์ด์ง€ ์ด๋™์‹œ ๋ฐ์ดํ„ฐ ์œ ์ง€ (#315)

* Refactor: ํ•จ์ˆ˜ ๋ฆฌํŒฉํ† ๋ง (#316)

* fix: ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€ pc๋ฒ„์ „ ๋ ˆ์ด์•„์›ƒ ์ˆ˜์ •

* feat: clear tag ์ถ”๊ฐ€

* feat: ๊ฒŒ์‹œ๋ฌผ ์—†์„ ๋•Œ ์ข‹์•„์š” ์ˆœ ๊ฒŒ์‹œ๋ฌผ ๋ณด์—ฌ์ฃผ๋Š” ๊ธฐ๋Šฅ (#321)

* feat: ๋กœ๊ทธ์ธ ์‹œ ๋กœ์ปฌ์Šคํ† ๋ฆฌ์ง€ ๋น„์›€

* feat: ์ข‹์•„์š” ์ˆœ ๋ณด์—ฌ์ฃผ๋Š” ๋กœ์ง ์ถ”๊ฐ€

* feat: ์ข‹์•„์š” ๊ฐœ์ˆ˜ ๋ฐ˜์ •๊ทœํ™” ์ง„ํ–‰ ๊ตฌํ˜„ (#320)

* feat: ์ตœ๊ทผ ์ผ์ฃผ์ผ๊ฐ„์˜ ํŒ”๋กœ์šฐ ๊ฒŒ์‹œ๊ธ€ ์กฐํšŒ (#323)

* feat: ์ตœ๊ทผ ์ผ์ฃผ์ผ๊ฐ„์˜ ํŒ”๋กœ์šฐ ๊ฒŒ์‹œ๊ธ€๋งŒ ๊ฐ€์ ธ์˜ค๋„๋ก ์ˆ˜์ •
๊ธฐ๋Šฅ ์ˆ˜์ •์— ๋”ฐ๋ผ test sql ์ˆ˜์ •

* fix: sql ๋ฒ„๊ทธ ์ˆ˜์ •

* feat: ๊ธ€ ์ƒ์„ธ ํŽ˜์ด์ง€์—์„œ ํƒœ๊ทธ ๋ˆ„๋ฅด๋ฉด ๋ฉ”์ธํŽ˜์ด์ง€์—์„œ ํ•„ํ„ฐ๋ง ๋œ ๊ฒŒ์‹œ๊ธ€ ๋ณด์—ฌ์คŒ (#324)

* feat: ๊ธ€ ์ƒ์„ธ ํŽ˜์ด์ง€์—์„œ ํƒœ๊ทธ ๋ˆ„๋ฅด๋ฉด ๋ฉ”์ธํŽ˜์ด์ง€์—์„œ ํ•„ํ„ฐ๋ง ๋œ ๊ฒŒ์‹œ๊ธ€ ๋ณด์—ฌ์คŒ

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

* feat: ์ตœ๊ทผ ์ผ์ฃผ์ผ๊ฐ„์˜ ์ธ๊ธฐ๊ธ€ ์กฐํšŒ (#325)

* feat: ์ธ๊ธฐ๊ธ€ ์กฐํšŒ API ๊ตฌํ˜„

๊ธฐ์กด์—๋Š” ๋กœ๊ทธ์ธํ•œ ์‚ฌ์šฉ์ž์˜ ๊ฒฝ์šฐ ๋ฉ”์ธํŽ˜์ด์ง€์—์„œ ํŒ”๋กœ์šฐํ•œ ์‚ฌ๋žŒ์˜ ๊ฒŒ์‹œ๊ธ€๋งŒ ๋ณด์ด๋„๋ก ํ•˜์˜€๋Š”๋ฐ, ํŒ”๋กœ์šฐํ•œ ์‚ฌ๋žŒ์ด ์—†๋Š” ์‹ ๊ทœ ์‚ฌ์šฉ์ž์˜ ๊ฒฝ์šฐ ์•„๋ฌด ๊ฒŒ์‹œ๊ธ€๋„ ๋ณด์ด์ง€ ์•Š๋Š”๋‹ค. ์ด๋ฅผ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•ด ๋กœ๊ทธ์ธํ•œ ์‚ฌ์šฉ์ž์˜ ๊ฒฝ์šฐ ๋ฉ”์ธํŽ˜์ด์ง€์—์„œ ํŒ”๋กœ์šฐํ•œ ์‚ฌ๋žŒ์˜ ๊ฒŒ์‹œ๊ธ€์„ ๋‹ค ๋ณด๋ฉด ์ธ๊ธฐ๊ธ€์ด ๋ณด์ด๋„๋ก ๋ณ€๊ฒฝํ•˜์˜€๋‹ค.
์ธ๊ธฐ๊ธ€์˜ ๊ธฐ์ค€์€ ์ผ์ฃผ์ผ ๋‚ด์— ์ž‘์„ฑํ•œ ๊ฒŒ์‹œ๊ธ€ ์ค‘ ์ข‹์•„์š”๊ฐ€ ๋งŽ์€ ์ˆœ์„œ์ด๋‹ค.

* test: PostController ์ธ๊ธฐ๊ธ€ ์กฐํšŒ ํ…Œ์ŠคํŠธ

* test: PostService ์ธ๊ธฐ๊ธ€ ์กฐํšŒ ํ…Œ์ŠคํŠธ

* test: PostService ์ธ๊ธฐ๊ธ€ ์กฐํšŒ ํ…Œ์ŠคํŠธ ์ˆ˜์ •

* test: ImageRepository ์ธ๊ธฐ๊ธ€ ์กฐํšŒ ํ…Œ์ŠคํŠธ ์ž‘์„ฑ

* feat: api ํ˜ธ์ถœ ์ตœ์†Œํ™”ํ•˜๋Š” ๋กœ์ง ์ถ”๊ฐ€ (#331)

* fix: ์ธ๊ธฐ๊ธ€ ์กฐํšŒ ๋กœ์ง ์ˆ˜์ • (#330)

- PostRepository์˜ findPopularPostsDuringWeek() ๋ฉ”์„œ๋“œ ์ถ”๊ฐ€
    - ์ตœ๊ทผ ์ผ์ฃผ์ผ๋™์•ˆ ์ž‘์„ฑํ•œ ๊ฒŒ์‹œ๋ฌผ์„ ์ข‹์•„์š”๊ฐ€ ๋งŽ์€ ์ˆœ์„œ๋Œ€๋กœ ์ •๋ ฌํ•œ ๊ฒŒ์‹œ๋ฌผ ๋ฆฌ์ŠคํŠธ ๋ฐ˜ํ™˜
- PostService์˜ getPopularPostsDuringWeek() ๋ฉ”์„œ๋“œ ๋กœ์ง ์ˆ˜์ •
    - postRepository.findPopularPostsDuringWeek()๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๊ฐ€์ ธ์˜จ ๊ฒŒ์‹œ๋ฌผ ๋ฆฌ์ŠคํŠธ์—์„œ, ํ”„๋ก ํŠธ๊ฐ€ ๋ณด๋‚ธ ๊ฒŒ์‹œ๋ฌผ id์— ํ•ด๋‹นํ•˜๋Š” ๊ฒŒ์‹œ๋ฌผ์„ ์ฐพ์•„์„œ ๊ทธ ๋‹ค์Œ์˜ ๊ฒŒ์‹œ๋ฌผ๋“ค์˜ ์ด๋ฏธ์ง€๋ฅผ ๋ฐ˜ํ™˜
- ImageRepository์˜ getImagesOfPopularPostsDuringWeek() ๋ฉ”์„œ๋“œ ์‚ญ์ œ

* hoxfix: ๋กœ์ปฌ์Šคํ† ๋ฆฌ์ง€ ๋น„์šฐ๋Š” ๋กœ์ง ์ถ”๊ฐ€

* fix: image modal uri ์ˆ˜์ • (#335)

* hotfix: ๋กœ์ปฌ์Šคํ† ๋ฆฌ์ง€ ๋ฒ„๊ทธ ์ˆ˜์ •

* remove: ๋กœ์ปฌ์Šคํ† ๋ฆฌ์ง€ ๊ธฐ๋Šฅ ์‚ญ์ œ..

* Update README.md

---------

Co-authored-by: jhchoi57 <[email protected]>
Co-authored-by: Dongja <[email protected]>
Co-authored-by: ์ด์žฌํ›ˆ <[email protected]>
Co-authored-by: Dongja <[email protected]>
Co-authored-by: jaehunLee-dev <[email protected]>
Co-authored-by: Soomin-Lim <[email protected]>
Co-authored-by: jhchoi57 <[email protected]>
Co-authored-by: Soomin Lim <[email protected]>