인프런 커뮤니티 질문&답변

ejdrlejdrlejr님의 프로필 이미지
ejdrlejdrlejr

작성한 질문수

실전! 스프링 데이터 JPA

공통 인터페이스 적용

강의 수강 중 질문이 있습니다.

작성

·

259

·

수정됨

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입니다.

올리신 코드를 바탕으로 테스트한 결과를 첨부합니다.

 

공통

application.properties

image

직접 key 생성한 코드 및 테스트

UserRepository

imageUser

imageUserRepositoryTest

image

 

테스트 실행결과(직접 key생성: 동일성 보장실패)

image

코드 변경 후(자동 키 생성 전략 사용)

User

@GeneratedValue 추가, id Long으로 변경, 생성자 수정

image

UserRepository

Type Long으로 변경

image

UserRepositoryTest

Key 생성을 DB에 위임 및 생성자 id 제거

image

테스트결과

image


테스트 실행 결과를 보시면 아시겠지만, 직접 식별자를 생성하는 경우 JPA의 동일성을 보장 받지 못하여 새로운 객체가 생성하여 테스트 실패하며, 강의와 다른 점 또한 이 부분(자동 키 생성전략 사용 유무) 입니다.

 

감사합니다.

ejdrlejdrlejr님의 프로필 이미지
ejdrlejdrlejr
질문자

그런경우에는 equals와 hash를 재정의하여 비교하면 되는것인가요?

네 맞습니다. 영속성컨텍스트에서 동일성을 보장하지 않기 때문에 별도로 재정의하는 처리가 필요할 것 같아요. 되도록이면 JPA의 기능을 이용하는 것을 권장드립니다. 기술 차원에서 제공하는 기능이니까요.

ejdrlejdrlejr님의 프로필 이미지
ejdrlejdrlejr
질문자

감사합니다 :)

ejdrlejdrlejr님의 프로필 이미지
ejdrlejdrlejr

작성한 질문수

질문하기