티스토리 뷰

모두어리 도메인/레포지토리 코드를 짠 후, 간단한 테스트 케이스를 작성하던 중에 제목의 예외와 부딪혔다

도메인 간 양방향 매핑에서 CASCADE 설정을 바꿔주면 된다는 말이 많았는데, 

CASCADE와 관련 없는 단일 도메인 테스트 중 나타난 경우라 당황스러웠다

 

테스트 대상이었던 엔티티 클래스의 코드이다

@Entity
@Getter
@AllArgsConstructor
@NoArgsConstructor
public class Member{
	
    @Id
    @GeneratedValue
    @Column(name = "MEMBER_ID")
    private Long id;
    
    private String name;
    private String email;
    private String password;
}

보시다시피 엔티티에 전이와 관련된 내용이 없었다 

 

레포지토리의 코드와 실패한 테스트 코드는 아래와 같았다

@Repository
@RequiredArgsConstructor
public class MemberRepository {

	private final EntityManager em;
    
    //회원 정보 저장
    public void save(Member member){
    	em.persist(member);
    }
    
    //단일 회원 조회
    public Member findone(Long id){
    	return em.find(Member.class, id);
    }
}
@Test
@Rollback(false)
public void 회원가입과_조회() {
	Member member = new Member(1L, "cat", "cat@gmail.com", "graycat");
    Long savedId = memberService.join(member);
    
    Assert.assertEquals(member, memberRepository.findOne(savedId);
}

memberService에는 레포지토리의 save를 호출하고 id값을 반환받는 코드가 있었다

예외가 발생하기에는 너무 단순한 코드라 당황했는데, 

@GeneratedValue로 자동생성한 값을 테스트 케이스에서 생성할 때 직접 입력한 것이 문제였다

 

member 객체를 new Member()로 생성하면 해결이 되었으나,

필드값을 지정해서 실제로 DB에 저장되는 것을 보고싶었다 

하지만 이 프로젝트에서 public으로 열린 setter 메소드를 사용하지 않기로 정했기 때문에, 

Member 클래스와 테스트의 생성문을 아래와 같이 수정해서 해결했다 

 

//어노테이션 생략
public class Member{
	
    @Id
    @GeneratedValue
    @Column(name = "MEMBER_ID")
    private Long id;
    
    private String name;
    private String email;
    private String password;
    
    private void setMemberInfo(String name, String email, String password){
    	this.name = name;
        this.email = email;
        this.password = password;
    }
    
    public static Member createMember(String name, String email, String password){
    	Member member = new Member();
        member.setMemberInfo(name, email, password);
        return member;
    }
}
Member member = Member.createMember("cat", "cat@gmail", "1234");

이렇게 하면 멤버 객체를 생성할 때가 아니면 필드값을 수정할 수 없다 

 

 

코드를 수정하고 테스트를 실행하니 다행히 초록불이 잘 들어오고, DB에 데이터가 들어가는 것도 확인됐다다

기초적인 사항 같은데 잘 몰랐구나 하고 머쓱한 한편, 역시 깨지면서 찾아보고 배우는 게 잘 남아서 기쁘기도 하다 

 

 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글