From 0ff411354d5ae3ccf6dcae6fa9cb24d5029c84b7 Mon Sep 17 00:00:00 2001 From: mkkim21 Date: Sun, 2 Nov 2025 21:50:30 +0900 Subject: [PATCH 1/3] =?UTF-8?q?docs:=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 0000000..9851326 --- /dev/null +++ b/README.md @@ -0,0 +1,5 @@ +# 프로젝트 + +- 개인 프로젝트 +- spring으로 게시판 만들기 +- 새로운 기술 적용해 계속 발전시키는 중 \ No newline at end of file From cf4595c48918f7a587eadfa33c56dd685ddca207 Mon Sep 17 00:00:00 2001 From: mkkim21 Date: Sat, 21 Feb 2026 15:34:33 +0900 Subject: [PATCH 2/3] =?UTF-8?q?refactor:=20DB=EC=84=A4=EA=B3=84=20?= =?UTF-8?q?=EC=88=98=EC=A0=95(BoardEntity=20Member=20FK=EC=84=A4=EC=A0=95)?= =?UTF-8?q?=20=EB=B0=8F=20=EC=BD=94=EB=93=9C=20=EB=A6=AC=ED=8C=A9=ED=86=A0?= =?UTF-8?q?=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../like/controller/LikeController.java | 42 ++++++----- .../like/repository/LikeRepository.java | 1 + .../springboard/like/service/LikeService.java | 1 - .../like/service/LikeServiceImpl.java | 16 +---- .../kms/springboard/member/dto/MemberDto.java | 3 + .../member/entity/MemberEntity.java | 7 +- .../member/service/MemberServiceImpl.java | 1 + src/main/resources/http/RequestTest.http | 71 +++++++++++++++++++ 8 files changed, 108 insertions(+), 34 deletions(-) create mode 100644 src/main/resources/http/RequestTest.http diff --git a/src/main/java/com/kms/springboard/like/controller/LikeController.java b/src/main/java/com/kms/springboard/like/controller/LikeController.java index e9be0e0..cef457d 100644 --- a/src/main/java/com/kms/springboard/like/controller/LikeController.java +++ b/src/main/java/com/kms/springboard/like/controller/LikeController.java @@ -8,48 +8,45 @@ import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; -import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; -import org.springframework.security.authentication.AnonymousAuthenticationToken; import org.springframework.security.core.Authentication; import org.springframework.web.bind.annotation.*; @RestController @RequiredArgsConstructor -@RequestMapping("/api/boards/{boardId}") +@RequestMapping("/api/boards") public class LikeController { private final LikeService likeService; - @PostMapping("/like") + @PostMapping("/{boardId}/like") public ResponseEntity> like( @PathVariable Long boardId, Authentication auth){ - - String userId = auth.getName(); - boolean isLiked = likeService.isLikeByUserId(boardId, userId); - String message = isLiked ? "좋아요 누름" : "좋아요 취소"; - + boolean isliked = likeService.toggleLike(boardId, userId); + + String message; + if(isliked){ + message = "좋아요를 눌렀습니다."; + }else{ + message = "좋아요를 취소했습니다."; + } return ResponseEntity.ok(ApiResponse.success(message,null)); } - @GetMapping("/like/count") + @GetMapping("/{boardId}/like/count") public ResponseEntity> getLikeCount( @PathVariable Long boardId){ - Long likeCount = likeService.getLikeCount(boardId); return ResponseEntity.ok(ApiResponse.success("좋아요 개수 조회", likeCount)); } - @GetMapping("/like/users") + @GetMapping("/like/{boardId}") public ResponseEntity>> getLikeUsers( @PathVariable Long boardId, @RequestParam(defaultValue = "0") int page, - @RequestParam(defaultValue = "20")int size, - Authentication auth){ - - + @RequestParam(defaultValue = "20")int size){ Pageable pageable = PageRequest.of(page, size); Page users = likeService.getLikeUsers(boardId, pageable); @@ -57,5 +54,18 @@ public ResponseEntity>> getLikeUsers( } + @GetMapping("/like/{userId}") + public ResponseEntity>> getLikeBoards( + @PathVariable String userId, + @RequestParam(defaultValue = "0") int page, + @RequestParam(defaultValue = "20") int size){ + Pageable pageable = PageRequest.of(page, size); + Page userLikeBoards = likeService.getUserLikeBoards(userId, pageable); + + return ResponseEntity.ok(ApiResponse.success("사용자가 좋아요 누른 게시글", userLikeBoards)); + } + + + } diff --git a/src/main/java/com/kms/springboard/like/repository/LikeRepository.java b/src/main/java/com/kms/springboard/like/repository/LikeRepository.java index 2dab543..182fdc2 100644 --- a/src/main/java/com/kms/springboard/like/repository/LikeRepository.java +++ b/src/main/java/com/kms/springboard/like/repository/LikeRepository.java @@ -2,6 +2,7 @@ import com.kms.springboard.like.entity.LikeEntity; +import java.util.Optional; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; diff --git a/src/main/java/com/kms/springboard/like/service/LikeService.java b/src/main/java/com/kms/springboard/like/service/LikeService.java index f2d56ff..13a0849 100644 --- a/src/main/java/com/kms/springboard/like/service/LikeService.java +++ b/src/main/java/com/kms/springboard/like/service/LikeService.java @@ -7,7 +7,6 @@ public interface LikeService { boolean toggleLike(Long boardId, String userId); Long getLikeCount(Long boardId); - boolean isLikeByUserId(Long boardId, String userId); Page getLikeUsers(Long boardId, Pageable pageable); Page getUserLikeBoards(String userId, Pageable pageable); } diff --git a/src/main/java/com/kms/springboard/like/service/LikeServiceImpl.java b/src/main/java/com/kms/springboard/like/service/LikeServiceImpl.java index 5a35604..67683f3 100644 --- a/src/main/java/com/kms/springboard/like/service/LikeServiceImpl.java +++ b/src/main/java/com/kms/springboard/like/service/LikeServiceImpl.java @@ -36,7 +36,6 @@ public class LikeServiceImpl implements LikeService { @Override public boolean toggleLike(Long boardId, String userId) { - boolean exists = likeRepository.existsByBoardIdAndUserId(boardId, userId); if (exists) { @@ -63,20 +62,6 @@ public Long getLikeCount(Long boardId) { return count; } - @Override - public boolean isLikeByUserId(Long boardId, String userId) { - String cacheKey = USER_LIKED_PREFIX + boardId + ":" + userId; - String cached = redisTemplate.opsForValue().get(cacheKey); - - if(cached != null) { - return Boolean.parseBoolean(cached); - } - boolean isLiked = likeRepository.existsByBoardIdAndUserId(boardId, userId); - cacheUserLiked(boardId,userId,isLiked); - - return isLiked; - } - @Override @Transactional(readOnly = true) public Page getLikeUsers(Long boardId, Pageable pageable) { @@ -89,6 +74,7 @@ public Page getUserLikeBoards(String userId, Pageable pageable) { Page likes = likeRepository.findByUserId(userId,pageable); return likes.map(LikeDto::convertToDto); } + private void addLike(Long boardId, String userId) { BoardEntity board = boardRepository.findById(boardId) .orElseThrow(() -> new EntityNotFoundException("게시글을 찾을 수 없습니다")); diff --git a/src/main/java/com/kms/springboard/member/dto/MemberDto.java b/src/main/java/com/kms/springboard/member/dto/MemberDto.java index 75b4004..753c071 100644 --- a/src/main/java/com/kms/springboard/member/dto/MemberDto.java +++ b/src/main/java/com/kms/springboard/member/dto/MemberDto.java @@ -22,6 +22,9 @@ public class MemberDto { @NotBlank(message = "이름을 입력해주세요") private String username; + @NotBlank(message = "닉네임을 입력해주세요") + private String nickname; + @NotBlank(message = "이메일을 입력해주세요") @Email(message = "이메일 형식이 올바르지 않습니다") @Size(max = 255, message = "이메일은 255자 이하여야 합니다") diff --git a/src/main/java/com/kms/springboard/member/entity/MemberEntity.java b/src/main/java/com/kms/springboard/member/entity/MemberEntity.java index ac34f0f..fc5da63 100644 --- a/src/main/java/com/kms/springboard/member/entity/MemberEntity.java +++ b/src/main/java/com/kms/springboard/member/entity/MemberEntity.java @@ -24,13 +24,13 @@ public class MemberEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) - @Column(name = "memberId") + @Column(name = "member_id") private Long id; @Column(name = "username", nullable = false, length = 100) private String username; - @Column(name = "userId", nullable = false, length = 50) + @Column(name = "user_id", nullable = false, length = 50) private String userId; @Column(name = "password", nullable = false) @@ -39,6 +39,9 @@ public class MemberEntity { @Column(name = "email" ,nullable = false, length = 255) private String email; + @Column(name = "nickname",nullable = false, unique = true) + private String nickname; + diff --git a/src/main/java/com/kms/springboard/member/service/MemberServiceImpl.java b/src/main/java/com/kms/springboard/member/service/MemberServiceImpl.java index acc51e5..fb3482b 100644 --- a/src/main/java/com/kms/springboard/member/service/MemberServiceImpl.java +++ b/src/main/java/com/kms/springboard/member/service/MemberServiceImpl.java @@ -36,6 +36,7 @@ public MemberEntity saveDto(MemberDto memberDto) { MemberEntity member = MemberEntity.builder() .userId(normalizedUserId) .username(memberDto.getUsername()) + .nickname(memberDto.getNickname()) .email(normalizedEmail) .password(encoded) .build(); diff --git a/src/main/resources/http/RequestTest.http b/src/main/resources/http/RequestTest.http new file mode 100644 index 0000000..8e1fc12 --- /dev/null +++ b/src/main/resources/http/RequestTest.http @@ -0,0 +1,71 @@ +@baseUrl = http://localhost:8080 + +### 회원가입 +POST {{baseUrl}}/api/users/register +Content-Type: application/json + +{ + "username": "김민석", + "email": "dgd5980@naver.com", + "userId": "alstjr", + "password": "que", + "nickname": "민석" +} + +### 로그인 +POST {{baseUrl}}/api/auth/login +Content-Type: application/json + +{ + "userId" : "alstjr", + "password" : "que" +} + +> {% + client.global.set("accessToken", response.body.data.accessToken); + %} + + +### 회원조회 +GET {{baseUrl}}/api/users/alstjr +Authorization: Bearer {{accessToken}} + + +### 게시글 조회 +GET {{baseUrl}}/api/boards +Authorization: Bearer {{accessToken}} + +### 게시글 생성 +POST {{baseUrl}}/api/boards +Content-Type: application/json +Authorization: Bearer {{accessToken}} + +{ + "content": "게시글 내용", + "title": "게시글 제목", + "postPassword": "1234" +} + +### 게시글 수정 +PUT {{baseUrl}}/api/boards/1 +Content-Type: application/json +Authorization: Bearer {{accessToken}} + +{ + "content": "게시글 내용 수정" , + "postPassword": "1234" +} + +### 게시글 삭제 +DELETE {{baseUrl}}/api/boards/1 +Authorization: Bearer {{accessToken}} + + +### 게시글 좋아요 누름 +POST {{baseUrl}}/api/boards/5/like +Content-Type: application/json +Authorization: Bearer {{accessToken}} + + + + From 12c2579498a6ea6bfc068e0f5e323664777cb39f Mon Sep 17 00:00:00 2001 From: kimminseok <105479136+kminseok-dev@users.noreply.github.com> Date: Sat, 21 Feb 2026 16:00:10 +0900 Subject: [PATCH 3/3] Delete src/main/resources/http directory --- src/main/resources/http/RequestTest.http | 71 ------------------------ 1 file changed, 71 deletions(-) delete mode 100644 src/main/resources/http/RequestTest.http diff --git a/src/main/resources/http/RequestTest.http b/src/main/resources/http/RequestTest.http deleted file mode 100644 index 8e1fc12..0000000 --- a/src/main/resources/http/RequestTest.http +++ /dev/null @@ -1,71 +0,0 @@ -@baseUrl = http://localhost:8080 - -### 회원가입 -POST {{baseUrl}}/api/users/register -Content-Type: application/json - -{ - "username": "김민석", - "email": "dgd5980@naver.com", - "userId": "alstjr", - "password": "que", - "nickname": "민석" -} - -### 로그인 -POST {{baseUrl}}/api/auth/login -Content-Type: application/json - -{ - "userId" : "alstjr", - "password" : "que" -} - -> {% - client.global.set("accessToken", response.body.data.accessToken); - %} - - -### 회원조회 -GET {{baseUrl}}/api/users/alstjr -Authorization: Bearer {{accessToken}} - - -### 게시글 조회 -GET {{baseUrl}}/api/boards -Authorization: Bearer {{accessToken}} - -### 게시글 생성 -POST {{baseUrl}}/api/boards -Content-Type: application/json -Authorization: Bearer {{accessToken}} - -{ - "content": "게시글 내용", - "title": "게시글 제목", - "postPassword": "1234" -} - -### 게시글 수정 -PUT {{baseUrl}}/api/boards/1 -Content-Type: application/json -Authorization: Bearer {{accessToken}} - -{ - "content": "게시글 내용 수정" , - "postPassword": "1234" -} - -### 게시글 삭제 -DELETE {{baseUrl}}/api/boards/1 -Authorization: Bearer {{accessToken}} - - -### 게시글 좋아요 누름 -POST {{baseUrl}}/api/boards/5/like -Content-Type: application/json -Authorization: Bearer {{accessToken}} - - - -