본문 바로가기
SpringBoot

Spring Boot Project(in★ gram) 03. 팔로우-팔로잉 확인하는 SQL 작성

by 김마리님 2020. 8. 24.

세 사람을 임의로 생성한다.

 

테스트 컨트롤러를 따로 만들고, 다음과 같이 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;

반응형