티스토리 뷰

모델 만들기

우선 모델을 만들어보자

domain.likes.Likes.java

package com.cos.photogramstart.domain.likes;

@Builder 
@AllArgsConstructor
@NoArgsConstructor
@Data
@Entity 

// 두개를 복합적으로 유니크를 줄때
@Table(
		uniqueConstraints = {
			@UniqueConstraint(
				name = "like_uk",
				columnNames= {"ImageId","userId"}
			)
		}
        // 한사람은 하나의 이미지만 좋아요가능하기때문에 위와같이 유니크 제약조건 추가
)
public class Likes { // N 좋아요의 입장으로 봤을때 여러개의 이미지와 유저를 가질수 있으므로 n

	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY) 
	private int id;
	
	@JoinColumn(name="imageId")
	@ManyToOne
	private Image image; // 1
    // 좋아요는 이미지를 한개만 가질수 있다 
	
	@JoinColumn(name="userId")
	@ManyToOne
	private User user; // 1
	
	private LocalDateTime createDate;

	
}

클래스이름은 likes인 이유는 테이블생성시에 like는 sql 함수이기때문에 못읽어 likes라고 클래스명을 주었습니다.

 

@PrePersist

	private LocalDateTime createDate;
	
	@PrePersist
	public void createDate() {
		this.createDate =  LocalDateTime.now();
	}

위 형태로 우리가 유저를 만들때 사용하였지만 현재 사용할 좋아요를 DB에 기입할때 네이티브 쿼리를 이용할거라 필요가 없다 네이티브 쿼리가이닌 객체에 담아 DB에 전달할것이면 위와 같은 코드가 필요하고 네이티브쿼리라면 없이 쿼리에 바로 now()함수를 이용해 기입하자.

 

컨트롤러 만들기

web.api.ImageApiController.java

	private final LikeService likeService;

	@PostMapping("/api/image/{imageId}/likes")
	public ResponseEntity<?> likes(@PathVariable int imageId,@AuthenticationPrincipal PrincipalDetails principalDetails){
		likeService.좋아요(imageId,principalDetails.getUser().getId());
		return new ResponseEntity<>(new CMRespDto<>(1,"좋아요성공",null),HttpStatus.CREATED);
	}
	
	@DeleteMapping("/api/image/{imageId}/likes")
	public ResponseEntity<?> unLikes(@PathVariable int imageId,@AuthenticationPrincipal PrincipalDetails principalDetails){
		likeService.좋아요취소(imageId,principalDetails.getUser().getId());
		return new ResponseEntity<>(new CMRespDto<>(1,"좋아요취소성공",null),HttpStatus.OK);
	}

httpStatus.CREATE 는 DB에 데이터가 입력되었다는 뜻이 있어 CREATE를 사용하였고

httpStatus.OK 는 성공적으로 삭제 했다는 뜻으로 했습니다. 

이때가지 성공했다면 OK만 사용하였는데 좀더 디테일적으로 표현하면 위와 같습니다.

 

서비스 만들기

service.LikeService.java

package com.cos.photogramstart.service;

@RequiredArgsConstructor
@Service
public class LikeService {
	private final LikeRepository likeRepository;
	@Transactional
	public void 좋아요(int imageId, int principalId) {
		likeRepository.mLikes(imageId, principalId);
	}
	@Transactional
	public void 좋아요취소(int imageId, int principalId) {
		likeRepository.mUnLikes(imageId, principalId);
	}
}

위에서 보시면 like객체를 만들어 객체를 전달하지 않고 하나의 값만을 매개변수에 2개 넣어 전달하게된다

즉 저장소에서 네이티브 쿼리로 실행하겠다는 뜻이된다

@Transctional DB에 데이터가 변경되는 서비스이니 잊지말고 기입해줍시다.

 

저장소 만들기

domain.likes.LikeRepository.java

package com.cos.photogramstart.domain.likes;

public interface LikeRepository extends JpaRepository<Likes, Integer>{

	@Modifying
	@Query(value="INSERT INTO likes(imageId,userId,createDate) VALUES(:imageId,:principalId,now())",nativeQuery = true)
	int mLikes(int imageId,int principalId);
	
	@Modifying
	@Query(value="DELETE FROM likes WHERE imageId = :imageId AND userId = :principalId",nativeQuery = true)
	int mUnLikes(int imageId,int principalId);
}

 

위와같이 간단하게 작성하면 저장소까지 완성하게된다.

 

다음글에선 좋아요가 된 여부에따라 렌더링을 해보자

 

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2025/07   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함