TIL)23.07.05(Spring 숙련 팀과제)

주민·2023년 7월 5일
0

TIL

목록 보기
33/84

팀 과제

문제

회의를 하면서 담당한 폴더 코드 중 API를 user_id 받는 방식으로 수정, requestDto를 List에서 단건으로 수정 요청을 주셔서 맞춰서 Controller, Service, Repository 를 수정했는데 Repository에서 오류가 나고 실행이 안됐다.

  • 기존에 user로 받던 걸 user_id로 변경하고 requestDto의 folderNames를 List에서 그냥 String으로 변경했다.
Repository
* 기존 코드
List<Folder> findAllByUserAndTitleIn(User user, List<String> folderNames);
List<Folder> findAllByUser(User user);

* 변경 코드
List<Folder> findAllByUserAndTitleIn(User user, String folderName);
List<Folder> findAllByUser(Long userId);

문제 풀기 & 해결

여러모로 찾아봤지만 모르겠어서 튜터님께 질문드렸다..

우선 Jpa 쿼리문에서는 정해진 양식/규칙이 있어 이걸 맞춰줘야 하고 지금처럼 매개변수가 맞지 않는 경우에는 Controller 나 Service에서 바꿔줘야 한다.

  • 양식변경
  1. findAllByUserAndTitleIn
    (쿼리문 예시) select * from folder where user_id = 1 and title in ('1','2','3');
    => In은 2개 이상의 데이터를 가져와 조회를 하는 것이기 때문에 List를(ex. List<String.>, Collection<String.> 등) 사용하는 것이 규칙에 맞으며 String folderName으로만 조회를 할 거라면 In을 지우고 사용하면 된다.
1) List<Folder> findAllByUserAndTitleIn(User user, List<String>);
2) List<Folder> findAllByUserAndTitle(User user, String folderName);
  1. findAllByUser
    => 관련된 Entity를 지정해야 입력한 user에 데이터를 조회 할 수 있다.
    수정 코드와 같이 입력할 경우 intelliJ 에서 아래와 같은 문구를 띄워준다.
* 다시 수정
List<Folder> findAllByUser(User user);

Repository를 위에처럼 수정하면 이제 Service와 맞지 않으니 데이터를 user로 가져올 수 있도록 수정 해줘야 한다.

* 기존 코드
@Transactional(readOnly = true)
public List<FolderResponseDto> getFolders(Long userId){
	return folderRepository.findAllByUser(userId).stream().map(FolderResponseDto::new).toList();
    }

* 변경 
 => 매개변수는 그대로(Long user_id) 받고 return 전에 user에 정보를 담아주고
 User user = userRepository.findById(user_id);
 
 => 이렇게 하면 Null이 나올수도 있다고 또 오류가 나는데 orElseThrow을 이용하여 값이 없는 경우를 설정해 주면 된다.
 
User user = userRepository.findById(user_id).orElseThrow(
	() -> new IllegalArgumentException("존재하지 않는 사용자입니다.")); 

알게된 점

Jpa사용 예시

참고블로그
참고블로그2

  • 전체 조회 : findAll()
  • 조건 검색 :
    => findByUser or Username
  • 괄호안에 데이터 포함된 값 찾기 : findByNameLike(텍스트)
    <=> NoLike
    ** 조건을 추가하고 싶다면 And 나 Or 사용

?(조건)에 들어갈 값을 매개변수로 넣어주면된다.

findFirst5ByLastnameAndFirstnameOrderByUserIdDesc("ori", "kim");

  • 쿼리문
    select *
    from user
    where last_name=?
    and first_name=?
    order by user_id desc limit 5

0개의 댓글

관련 채용 정보