작성
·
253
·
수정됨
0
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.
1. 강의 내용과 관련된 질문을 남겨주세요.
2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.
(자주 하는 질문 링크: https://bit.ly/3fX6ygx)
3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.
(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)
질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.
=========================================
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예/아니오)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)
[질문 내용]
여기에 질문 내용을 남겨주세요.
강의 내용을 듣고 제가 따로 프로젝트를 만들어서 비교를 해 보았는데
@Entity
@DynamicInsert
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class User {
@Id
private String id; // 이메일 형식
@Column(nullable = false)
private String password;
@Column(nullable = false)
private String name;
@Column(nullable = false, unique = true)
private String nickname;
@Column(nullable = false, unique = true)
private String phone;
@CreationTimestamp
@Column(nullable = false)
private LocalDateTime createAt;
@Enumerated(EnumType.STRING)
@ColumnDefault("'NORMAL'")
private UserStatus status;
// 이미지 변수 (프로필 사진)
public User(String id, String password, String name, String nickname, String phone) {
this.id = id;
this.password = password;
this.name = name;
this.nickname = nickname;
this.phone = phone;
}
}
@Test
public void basicCRUD() {
User user1 = new User("user1","123","kk","sssss","123213213");
User user2 = new User("user2","1321","dd","dddd","21312412412421");
userRepository.save(user1);
userRepository.save(user2);
//단건 조회 검증
User findUser1 = userRepository.findById(user1.getId()).get();
User findUser2 = userRepository.findById(user2.getId()).get();
assertThat(findUser1).isEqualTo(user1);
assertThat(findUser2).isEqualTo(user2);
테스트를 실행 시켜보니
Expected :com.clickpick.domain.User@51577fc8
Actual :com.clickpick.domain.User@4dbeae45
오류가 발생하였습니다.
강사님의 강의를 따라했을 땐 동일하다고 하였는데 저의 예시로 해보니 동일하지 않다고 나오는데 어느부분에서 차이점이 생긴지 알고싶습니다
참고로 repository는
public interface UserRepository extends JpaRepository<User, String> {
}
입니다.
답변 1
0
안녕하세요. ejdrlejdrlejr님, 공식 서포터즈 OMG입니다.
올리신 코드를 바탕으로 테스트한 결과를 첨부합니다.
공통
직접 key 생성한 코드 및 테스트
UserRepository
User
UserRepositoryTest
테스트 실행결과(직접 key생성: 동일성 보장실패)
코드 변경 후(자동 키 생성 전략 사용)
User
@GeneratedValue 추가, id Long으로 변경, 생성자 수정
UserRepository
Type Long으로 변경
UserRepositoryTest
Key 생성을 DB에 위임 및 생성자 id 제거
테스트결과
테스트 실행 결과를 보시면 아시겠지만, 직접 식별자를 생성하는 경우 JPA의 동일성을 보장 받지 못하여 새로운 객체가 생성하여 테스트 실패하며, 강의와 다른 점 또한 이 부분(자동 키 생성전략 사용 유무) 입니다.
감사합니다.
네 맞습니다. 영속성컨텍스트에서 동일성을 보장하지 않기 때문에 별도로 재정의하는 처리가 필요할 것 같아요. 되도록이면 JPA의 기능을 이용하는 것을 권장드립니다. 기술 차원에서 제공하는 기능이니까요.
그런경우에는 equals와 hash를 재정의하여 비교하면 되는것인가요?