처음 유저가 4명이 모여 게임 시작을 해 역할 선택으로 넘어가기 직전까지
서브쿼리의 중요성
SELECT team_id FROM user_team
WHERE user_id IN (1, 2, 3, 4)
GROUP BY team_id
HAVING count(team_id) = 4
SELECT team_seq FROM (
SELECT team_seq, COUNT(team_seq) cnt FROM tbl_team_user WHERE user_seq IN (1, 2, 3, 4) GROUP BY team_seq
) X
WHERE cnt = 4
고려했던 점
초기 모험 시작을 눌렀을 때(controller에 있는 함수 중 1)
// team/repository/UserTeamRepositoryImpl.java
// 모든 멤버가 들어 있는
@Override
public List<Integer> checkTeam(List<Integer> userId) {
List<Integer> ans = jpaQueryFactory
.select(userTeam.team.teamId)
.from(userTeam)
.where(userTeam.user.userId.in(userId))
.groupBy(userTeam.team.teamId)
.having(userTeam.team.teamId.count().goe(4))
.fetch();
return ans;
}
// team/service/TeamService.java
public Team findTeam(List<Integer> users){
List<Integer> teamId = userTeamRepositoryCustom.checkTeam(users);
if(teamId.size() == 0) return null;
Optional<Team> team = teamRepository.findByTeamId(teamId.get(0));
return team
.orElseThrow(() -> new RuntimeException("findTeam 에러"));
}
이름을 정해서 시작했을 때(컨트롤러의 함수 중 2)
팀명이 존재한다면 → 위의 팀 조합 확인을 다시 함
// team/service/TeamService.java
// 팀명 중복 체크
public Team checkTeamName(RegistTeamDto registTeamDto) {
if(teamRepository.existsByTeamName(registTeamDto.getTeamName())){
Team team = findTeam(registTeamDto.getUsers());
if(team.getTeamName().equals(registTeamDto.getTeamName())){
return team;
}else throw new RuntimeException("중복된 팀명입니다");
}else{
return teamSave(registTeamDto);
}
}
팀명이 존재하지 않는다면 teamSave라는 메서드 접근
// team/service/TeamService.java
// 팀 만들기
@Transactional
public Team teamSave(RegistTeamDto registTeamDto){
Team team = findTeam(registTeamDto.getUsers());
if(team == null) team = new Team();
team.setTeamName(registTeamDto.getTeamName());
teamRepository.save(team);
team = teamRepository.findByTeamName(team.getTeamName()).orElseThrow(() -> new RuntimeException());
userTeamSave(registTeamDto, team);
return team;
}
위의 단계 이후 team의 일련번호를 받아와 userTeamSave 메서드 접근
// team/service/TeamService.java
// 유저 팀 만들기
@Transactional
public void userTeamSave(RegistTeamDto registTeamDto, Team team){
List<Integer> userList = registTeamDto.getUsers();
for(Integer userId : userList){
User user = userRepository.findById(userId).orElseThrow(() -> new RuntimeException());
UserTeam userTeam = UserTeam.builder().user(user).team(team).build();
userTeamRepository.save(userTeam);
}
}
위 함수의 문제점
한모씨의 mapper를 훔쳐서 써 보고 싶어서 이해하려고 해 보았으나 어떤 식으로 구현을 해야 할지 모르겠어서 미뤘음