자바 스프링 좋아요 기능 구현

자바 스프링 좋아요 기능 구현

작성일 2024.04.14댓글 1건
    게시물 수정 , 삭제는 로그인 필요

안녕하십니까, 자바 스프링 공부중인 한 학생입니다.

다름이 아니라 좋아요 기능을 구현하고 있는데 막혀서 이렇게 문의남깁니다.

먼저 한 아이디 당 한 게시물에 좋아요 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;
}


#자바 스프링 #자바 스프링 공부 순서 #자바 스프링부트 #자바 스프링 프레임워크 #자바 스프링 강의 #자바 스프링이란 #자바 스프링 공부 #자바 스프링 프로젝트 #자바 스프링 책 #자바 스프링 백엔드

profile_image 익명 작성일 -

**오류 해결:**

* **Repository Bean 주입 오류:** Like 클래스의 `@Entity` 애노테이션이 누락되어 있습니다.

* **다른 오류:** LikeService의 생성자에서 `PostRepository` 대신 `PostsRepository`를 사용하고 있습니다

.

**맞춤형 예외 정의:**

```java

@ResponseStatus(HttpStatus.NOT_FOUND)

public class NotFoundException extends RuntimeException {

public NotFoundException(String message) {

super(message);

}

}

```

**수정된 코드:**

① **Like Entity:**

```java

@Entity

@Table(name = "likes")

public class Like {

@Id

@GeneratedValue

private Long likeNum;

private int userId;

private int postNum;

// ... getters and setters

}

```

② **Like Repository:**

```java

public interface LikeRepository extends JpaRepository<Like, Long> {

boolean existsByUserIdAndPostNum(int userId, int postNum);

void deleteByUserIdAndPostNum(int userId, int postNum);

int countByPostNum(int postNum);

}

```

③ **Like Service:**

```java

@Service

public class LikeService {

private final PostRepository postRepository;

private final LikeRepository likeRepository;

public LikeService(PostRepository postRepository, LikeRepository likeRepository) {

this.postRepository = postRepository;

this.likeRepository = likeRepository;

}

@Transactional

public PostLikeRequest addLike(LikeRequest likeRequest) {

Optional<Posts> optionalPosts = postRepository.findById(likeRequest.getPostNum());

if (!optionalPosts.isPresent()) {

throw new NotFoundException("게시물을 찾을 수 없습니다.");

}

Like like = Like.builder()

.userId(likeRequest.getUserId())

.postNum(likeRequest.getPostNum())

.build();

likeRepository.save(like);

int likeCount = likeRepository.countByPostNum(like.getPostNum());

return PostLikeRequest.builder()

.posts(optionalPosts.get())

.likeRequest(likeRequest)

.like(likeCount)

.build();

}

public void unlikePost(int userId, int postNum) {

Optional<Like> likeOpt = likeRepository.findByUserIdAndPostNum(userId, postNum);

if (!likeOpt.isPresent()) {

throw new NotFoundException("좋아요 정보를 찾을 수 없습니다.");

}

likeRepository.delete(likeOpt.get());

}

public int getLikeCount(int postNum) {

return likeRepository.countByPostNum(postNum);

}

}

```

**컨트롤러 및 요청/응답 객체:**

수정된 코드는 제공하신 기존 코드와 유사합니다.

**주의 사항:**

* `Posts` 클래스의 `postNum` 필드는 `int` 형이 아니라 `Long` 형일 수 있습니다.

* 요청 및 응답 객체는 여러분의 실제 모델에 맞게 수정해야 합니다.

* `@RequiredArgsConstructor` 애노테이션은 Java 13 이상에서만 지원됩니다.

자바 스프링 좋아요 기능 구현

좋아요 기능구현하고 있는데 막혀서 이렇게 문의남깁니다. 먼저 한 아이디 당 한 게시물에 좋아요 1번 가능하며 좋아요를 한 상태에서 다시 누를 시 좋아요가...

자바 스프링 책 추천

... 스프링 부트와 AWS로 혼자 구현하는 웹 서비스 - 이동욱 지음 - 이 책은 스프링... 책은 스프링 5의 다양한 기능과 사용법을 레시피 형식으로 제공합니다. Mac OS에서의...

자바 스프링프레임워크 코딩 질문...

... 스프링 프레임워크를 사용하여 카카오톡 알림을 보내는 기능구현하려고 합니다. 매일 돌아가는 스케줄러를 사용하여 알림을 보내야 하며, 알림을 받을 대상은 N명이며...