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]>