세 사람을 임의로 생성한다.
테스트 컨트롤러를 따로 만들고, 다음과 같이 url를 만든다.
@RestController
public class TestApiController {
@Autowired
private UserRepository userRepository;
@Autowired
private ImageRepository imageRepository;
@Autowired
private TagRepository tagRepository;
@Autowired
private FollowRepository followRepository;
@Autowired
private LikesRepository likesRepository;
@PostMapping("test/api/join")
public User join(@RequestBody User user) {
user.setRole(UserRole.USER);
System.out.println("유저 정보 인서트");
User userEntity = userRepository.save(user);
return userEntity;
}
}
Postman앱을 통해 데이터를 넣어본다. 대충.. username과 패스워드만 넣으면 될 것 같다. 한 세 명쯤 넣자.
다음, 팔로우- 팔로잉 url을 만들자.
@PostMapping("test/api/follow/{fromUserId}/{toUserId}")
public String Follow(
@PathVariable int fromUserId, @PathVariable int toUserId) {
User fromUserEntity=userRepository.findById(fromUserId).get();
User toUserEntity=userRepository.findById(toUserId).get();
Follow follow=Follow.builder()
.fromUser(fromUserEntity)
.toUser(toUserEntity)
.build();
followRepository.save(follow);
return fromUserEntity.getUsername()+"이 "+toUserEntity.getUsername()+"을 팔로우 하였습니다.";
}
한.. 네개쯤 만들어보자.
이 상황에서는 맞팔을 확인할 수 없다. 따라서, 이럴 때는 서브쿼리 등을 이용해서 컬럼을 하나 더 만들어 참조하는 형태로 만들어야 한다.
첫 번째 방법 : self-Join 이용
select f1.id, f1.fromUserId, f1.toUserId, f1.createDate, if(f2.fromUserId is null, false, true) "matpal"
from follow f1 left outer join follow f2
on f1.fromUserId=f2.toUserId and f1.toUserId= f2.fromUserId
order by f1.id;
조인 함수를 이용해서 값을 뒤집고, 서로의 값이 있는지 확인한다. if문을 이용해서 값이 비었는지, 비지 않았는지 확인하여 1과 0으로 나눈다. 이를 이용해서 맞팔 여부를 확인한다
두 번째 방법 : 스칼라 서브쿼리 사용
select f1.id, f1.fromUserId, f1.toUserId, f1.createDate,
(
select 1 from follow f2
where f1.fromUserId = f2.toUserId
and f1.toUserId=f2.fromUserId
) "matpal"
from follow f1;
서브쿼리 내부에서 from과 to를 뒤집어 값을 확인한다. 결과값이 있는 경우만 1을 부여하고, 없는 경우 1을 부여하지 않는다. 따라서, 맞팔이면 값이 있고, 없으면 값이 없게 된다.
이를 이용하여 사진 당 부여된 좋아요 수도 확인할 수 있다.
@PostMapping("test/api/image")
public Image image(@RequestBody Image image) {
System.out.println("이미지 인서트");
Image imageEntity = imageRepository.save(image);
return imageEntity;
}
@PostMapping("test/api/likes/{userId}/{imageId}")
public String likes(
@PathVariable int userId, @PathVariable int imageId) {
User userEntity=userRepository.findById(userId).get();
Image imageEntity=imageRepository.findById(imageId).get();
Likes likes=Likes.builder()
.user(userEntity)
.image(imageEntity)
.build();
likesRepository.save(likes);
return userEntity.getUsername()+"이 "+imageEntity.getImageUrl()+"을 좋아합니다.";
}
쿼리(스칼라 서브쿼리 이용)
select image.id, image.imageUrl,
(
select count(*)
from likes
where image.id=likes.image_id
) "좋아요"
from image
order by id;
반응형
'SpringBoot' 카테고리의 다른 글
.mustache 파일에 컨텐츠 어시스트 적용방법 (0) | 2020.08.28 |
---|---|
Spring Boot Project(in★ gram) 02. 데이터 모델 세팅하기 (0) | 2020.08.24 |
Spring Boot Project(in★ gram) 01. 환경세팅하기 (0) | 2020.08.24 |
Spring-Boot Blog Project 10. 삭제에 작성자 확인해서 권한 부여하기 (0) | 2020.07.27 |
Spring-Boot Blog Project 9. 상세페이지 구현, 수정 삭제 구현 (0) | 2020.07.27 |