문제 생겼던것과 해결점

JIWOO YUN·2024년 5월 14일
0

GramGram

목록 보기
2/11
post-custom-banner

회원가입 및 로그인 처리 테스트시 JoinForm 매개변수 오류(05-14)

  • 회원가입 테스트를 하려고했는데 JoinForm을 찾지 못하는 오류가 발생

  • 검색을 통하여 왜 이런 오류가 발생하는지 찾아봤더니 이러한 문제가 있었다.

    • 생성자 바인딩 이슈

      • Spring FrameWork 6.1 버전으로 업그레이드 되면서 LocalVariableTableParameterNameDiscoverer 를 사용하지 않게되면서 이로 인해 발생할 수 있는 매개 변수 관련 이슈는 -parameter 옵션을 complier에서 활성화 시켜줘야함.

      • Complier -> java Compiler -> Additional command line parameters

        -parameters 추가하기.

5-31

양방향 관계를 설정하고 likeablePerson과 instaMember와 연관관계까지 전에 설정을 했었는데 해당 부분에서 잊어 아주 중요한 놓친 부분이 있었다.

  • like를 표시시에 해당하는 insta객체에 from 과 to를 넣어주지 않은 부분

    • 별 문제가 없어 보이지만 테스트 부분에서 문제가 발생한다는 걸 깨달았다.
    1. 테스트 케이스 작성시에 JPA를 사용하지않은 순수한 자바 상태로 진행될 경우 문제가 발생할 수있다.

      jpa에서는 알아서 매핑을 해서 데이터를 넣어주지만 JPA를 사용하지 않은 순수한 객체로 진행하는 경우 LikeablePerson.fromInstaMember 와 LikeablePerson.ToInstaMember 두 개는 제대로 나오겠지만 반대 연관관계인 instamember.fromLikeablePeople에는 값이 설정되지 않았기 때문에 해당 부분에서 데이터가 없다고 나오기 때문이다.
      - 이런 이유 때문에 순수한 객체까지 고려한 반대 방향에 리스트에도 값을 넣어주는 방식을 사용해줘야함.
      
      양쪽에 값을 설정하지 않고서 JPA 를 통해 객체를 추가시 DB에 바로 insert 되는 것이 아니라 영속성 컨텍스트의 1차 캐시에저장되고, 자식 엔티티 객체를 추가한 후에 이를 반영하지 않은 상태에서 부모 엔티티 객체를 조회하게 되면 추가 했던 자식 엔티티 객체는 아직 DB에 추가되지 않았기 때문에 새로운 자식 엔티티 객체를 제외한 값들만 가지게 되는 문제
public RsData<LikeablePerson> like(Member member, String username, int attractiveTypeCode) {
    InstaMember fromInstaMember = member.getInstaMember();
    InstaMember toInstaMember = instaMemberService.findByUsernameOrCreate(username);

    if (member.getInstaMember().getUsername().equals(username)) {
        return RsData.of("F-1", "본인은 호감상대로 저장할 수 없습니다.");
    }

    LikeablePerson likeablePerson = LikeablePerson.builder()
            .fromInstaMember(fromInstaMember)
            .fromInstaMemberUsername(fromInstaMember.getUsername())
            .toInstaMember(toInstaMember)
            .toInstaMemberUsername(toInstaMember.getUsername())
            .attractiveTypeCode(attractiveTypeCode)
            .build();

    likeablePersonRepository.save(likeablePerson);

    return RsData.of("S-1", "입력하신 인스타 유저(%s)를 호감상대로 등록되었습니다.".formatted(username), likeablePerson);

}
  • 실수가 발생한 부분
    • 현재 likeablePerson 객체를 저장하면서 다른 연관관계인 instaMember에는 값을 넣어 놓지 않는 방식을사용하여 jpa를 사용하는 경우에는 문제가 없지만 jpa없는 테스트 상황이라던가 그러한 상황에서는 오류를 발생 시킬수 있다.
    fromInstaMember.addFromLikeablePerson(likeablePerson);
    toInstaMember.addToLikeablePerson(likeablePerson);
  • 이부분을 밑에 꼭 추가해 주자. -> 양방향의 값 연결해주기.
  • 마찬가지로 삭제시에도 안해줬는데 삭제시에도 해당 컬렉션에 값을 지워줘야한다.

관련 참조 : https://ppusda.tistory.com/78

참고한 블로그

https://colabear754.tistory.com/142

참고한 강의

https://www.inflearn.com/course/ORM-JPA-Basic/

-- 지속적으로 생기면 추가 예정 --

profile
열심히하자
post-custom-banner

0개의 댓글