자바 스프링 좋아요 기능 구현
-
게시물 수정 , 삭제는 로그인 필요
안녕하십니까, 자바 스프링 공부중인 한 학생입니다.
다름이 아니라 좋아요 기능을 구현하고 있는데 막혀서 이렇게 문의남깁니다.
먼저 한 아이디 당 한 게시물에 좋아요 1번 가능하며
좋아요를 한 상태에서 다시 누를 시 좋아요가 취소되어야합니다ㅠㅠ
그리고 게시물의 전체 좋아요 수도 노출시키려고 합니다..
어디서부터 잘못되었는지 모르겠습니다ㅠㅠ
혹시 도와주실수 있으실까요?
(현재는 annotation 각 클래스에 다 주입했는데도 불구하고 repository bean 주입 오류가 뜹니다ㅠㅠ 이 외에도 다른 오류가 있을 것 같아 이렇게 도움을 요청합니다! ㅠㅠ
답변 남겨주시면 코드 정리하여 메일로 전달드리도록 하겠습니다ㅠㅠ)
① mysql db
CREATE TABLE likes (
like_num INT AUTO_INCREMENT PRIMARY KEY,
user_id INT,
post_num INT,
FOREIGN KEY (user_id) REFERENCES users(user_id),
FOREIGN KEY (post_num) REFERENCES posts(post_num)
);
② java likeEntity
@Entity
@Getter
@Setter
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Table(name = "likes")
public class Like {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
@Column(name = "user_id", nullable = false)
private int userId;
@Column(name = "post_num", nullable = false)
private int postNum;
public void setLike(User user){
this.userId = userId;
}
}
③ likeRepository
@Repository
public interface LikeRepository extends JpaRepository<Like, Integer> {
//있는지 없는지 검토
boolean existsByUserIdAndPostNum(int userId, int postNum);
//삭제
void deleteByUserIdAndPostNum(int userId, int postNum);
int countByPostNum(int postNum);
}
④ likeService
@Slf4j
@Service
public class LikeService {
private final PostRepository postRepository;
private final LikeRepository likeRepository;
private final UserRepository userRepository;
@Autowired
public LikeService(PostRepository postRepository, LikeRepository likeRepository, UserRepository userRepository) {
this.postRepository = postRepository;
this.likeRepository = likeRepository;
this.userRepository = userRepository;
}
@Transactional
public PostLikeRequest addLike(LikeRequest likeRequest){
System.out.println(userRepository.findById(likeRequest.getPostNum()));
Optional<UserEntity> optionalUserEntity = userRepository.findById(likeRequest.getUserId());
optionalUserEntity.orElseThrow(() -> new NotFoundException("유저를 찾을 수 없습니다."));
Optional<Posts> optionalPosts = postRepository.findById(likeRequest.getUserId());
Posts posts = optionalPosts.orElseThrow(() -> new NotFoundException("게시물을 찾을 수 없습니다."));
Like like = Like.builder()
.userId(optionalUserEntity.get().getUserId())
.postNum(optionalPosts.get().getPostNum())
.build();
likeRepository.save(like);
int likeCount = likeRepository.countByPostNum(like.getPostNum());
PostLikeRequest postLikeRequest = PostLikeRequest.builder()
.posts(posts)
.likeRequest(likeRequest)
.like(likeCount)
.build();
return postLikeRequest;
}
public void unlikePost(int userId, int postNum) throws IOException {
Optional<Like> likeOpt = likeRepository.findByUserIdAndPostNum(userId, postNum);
if (!likeOpt.isPresent()){
throw new IOException("좋아요 정보를 찾을 수 없습니다.");
}
likeRepository.delete(likeOpt.get());
}
public int getLikeCount(Posts postNum){
return likeRepository.countByPostNum(postNum.getPostNum());
}
}
⑤likeController
@RestController
@RequiredArgsConstructor
@RequestMapping("/api/likes")
public class LikeController {
private final LikeService likeService;
@PostMapping("/like")
public ResponseEntity<PostLikeRequest> addLike(@RequestBody LikeRequest likeRequest){
PostLikeRequest result = likeService.addLike(likeRequest);
return new ResponseEntity<>(result, HttpStatus.CREATED);
}
@PostMapping("/unlike")
public ResponseEntity<?> unlikePost(@RequestParam int userId, @RequestParam int postNum){
return ResponseEntity.ok().build();
}
@PostMapping("/count")
public ResponseEntity<?> getLikeCount(@RequestParam Posts postNum){
return ResponseEntity.ok(likeService.getLikeCount(postNum));
}
}
⑥likeRequest
@Getter
@Setter
@NoArgsConstructor
public class LikeRequest {
private int postNum;
private int userId;
}
⑦postRequest
@Getter
@Setter
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class PostLikeRequest {
private Posts posts;
private LikeRequest likeRequest;
private int like;
}
@Entity
@Getter
@Setter
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Table(name = "likes")
public class Like {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
@Column(name = "user_id", nullable = false)
private int userId;
@Column(name = "post_num", nullable = false)
private int postNum;
public void setLike(User user){
this.userId = userId;
}
}
@Repository
public interface LikeRepository extends JpaRepository<Like, Integer> {
//있는지 없는지 검토
boolean existsByUserIdAndPostNum(int userId, int postNum);
//삭제
void deleteByUserIdAndPostNum(int userId, int postNum);
int countByPostNum(int postNum);
}
@Slf4j
@Service
public class LikeService {
private final PostRepository postRepository;
private final LikeRepository likeRepository;
private final UserRepository userRepository;
@Autowired
public LikeService(PostRepository postRepository, LikeRepository likeRepository, UserRepository userRepository) {
this.postRepository = postRepository;
this.likeRepository = likeRepository;
this.userRepository = userRepository;
}
@Transactional
public PostLikeRequest addLike(LikeRequest likeRequest){
System.out.println(userRepository.findById(likeRequest.getPostNum()));
Optional<UserEntity> optionalUserEntity = userRepository.findById(likeRequest.getUserId());
optionalUserEntity.orElseThrow(() -> new NotFoundException("유저를 찾을 수 없습니다."));
Optional<Posts> optionalPosts = postRepository.findById(likeRequest.getUserId());
Posts posts = optionalPosts.orElseThrow(() -> new NotFoundException("게시물을 찾을 수 없습니다."));
Like like = Like.builder()
.userId(optionalUserEntity.get().getUserId())
.postNum(optionalPosts.get().getPostNum())
.build();
likeRepository.save(like);
int likeCount = likeRepository.countByPostNum(like.getPostNum());
PostLikeRequest postLikeRequest = PostLikeRequest.builder()
.posts(posts)
.likeRequest(likeRequest)
.like(likeCount)
.build();
return postLikeRequest;
}
public void unlikePost(int userId, int postNum) throws IOException {
Optional<Like> likeOpt = likeRepository.findByUserIdAndPostNum(userId, postNum);
if (!likeOpt.isPresent()){
throw new IOException("좋아요 정보를 찾을 수 없습니다.");
}
likeRepository.delete(likeOpt.get());
}
public int getLikeCount(Posts postNum){
return likeRepository.countByPostNum(postNum.getPostNum());
}
}
@RestController
@RequiredArgsConstructor
@RequestMapping("/api/likes")
public class LikeController {
private final LikeService likeService;
@PostMapping("/like")
public ResponseEntity<PostLikeRequest> addLike(@RequestBody LikeRequest likeRequest){
PostLikeRequest result = likeService.addLike(likeRequest);
return new ResponseEntity<>(result, HttpStatus.CREATED);
}
@PostMapping("/unlike")
public ResponseEntity<?> unlikePost(@RequestParam int userId, @RequestParam int postNum){
return ResponseEntity.ok().build();
}
@PostMapping("/count")
public ResponseEntity<?> getLikeCount(@RequestParam Posts postNum){
return ResponseEntity.ok(likeService.getLikeCount(postNum));
}
}
@Getter
@Setter
@NoArgsConstructor
public class LikeRequest {
private int postNum;
private int userId;
}
@Getter
@Setter
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class PostLikeRequest {
private Posts posts;
private LikeRequest likeRequest;
private int like;
}
#자바 스프링 #자바 스프링 공부 순서 #자바 스프링부트 #자바 스프링 프레임워크 #자바 스프링 강의 #자바 스프링이란 #자바 스프링 공부 #자바 스프링 프로젝트 #자바 스프링 책 #자바 스프링 백엔드