Just Do IT!

Query did not return a unique result: 2 results were returned 오류 해결 본문

개발 공부/Error

Query did not return a unique result: 2 results were returned 오류 해결

MOON달 2025. 3. 21. 12:36
728x90
반응형

지금 KERNEL 360에서 기업 연계 프로젝트(=파이널 프로젝트)를 진행하고 있다.

이제 기획은 완료했고 개발 단계로 넘어갔는데, 직접 API를 개발하면서 오류가 생겨서 기록하려고 한다.

 

 

프로젝트 생성하는 기능을 만들고, 전체 프로젝트 조회를 하려고 하는데 이런 오류가 생겼다.

 

 

@Repository
public interface CompanyProjectRepository extends JpaRepository<CompanyProject, Long> {

    Optional<CompanyProject> findByProjectAndCompanyProjectRole(Project project, CompanyProjectRole companyProjectRole);
}

 

이 method를 통해 해당 프로젝트와, 프로젝트를 담당하는 개발사/고객사를 찾기 위한 것인데

unique하지 않고 결과가 여러 개가 나와서 오류가 난다는 것이었다.

그래서 Optional로 받지 말고 List로 받으면 오류가 해결되지만, 나는 애초에 생성할 때 설계를 잘못했기에 생성 단계에서 코드를 좀 수정하여 해결하였다.

 

원래는 고객사/개발사를 지정하면 한 번만 company_project 에 저장되어야 하는 거였다.

그런데 고객사 담당자/일반 참여자 이런 식으로 2번씩 저장하게 되어서 중복이 발생하여 unique하지 않다는 오류가 생겼다.

 

그래서 그 로직을 수정하여 해결하였다.

저장하기 전에 해당 프로젝트와 회사가 연결된 id가 존재하는지 먼저 확인하고 있으면 저장하지 않고, 없으면 저장하는 걸로.

 

 // 기존에 해당 회사와 해당 프로젝트가 연결되어 있는지 확인
        boolean isCompanyProjectExisting = companyProjectRepository.existsByCompanyAndProject(company, project);
        if(!isCompanyProjectExisting) {
            CompanyProjectDTO companyProjectDTO = CompanyProjectDTO.builder()
                    .companyId(company.getId())
                    .projectId(project.getId())
                    .companyProjectRole(companyRole)
                    .build();

            CompanyProject companyProject = companyProjectDTO.toEntity(company, project, companyRole);
            companyProjectRepository.save(companyProject);
        }

 

코드가 길고 아직 PR도 날리지 않아서 일부만 잘랐다.

위처럼 boolean으로 존재 여부를 묻고 다음에 저장하니까 두번 저장되는 오류를 해결할 수 있었다.

 

그렇게 되니

Optional로 찾아도 하나만 나와서 위 오류를 해결할 수 있었다.

728x90