inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

실전! 스프링 데이터 JPA

공통 인터페이스 적용

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

309

ejdrlejdrlejr

작성한 질문수 3

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> {
} 

 입니다.

 

 

java spring spring-boot jpa

답변 1

0

OMG

안녕하세요. 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의 동일성을 보장 받지 못하여 새로운 객체가 생성하여 테스트 실패하며, 강의와 다른 점 또한 이 부분(자동 키 생성전략 사용 유무) 입니다.

 

감사합니다.

0

ejdrlejdrlejr

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

0

OMG

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

0

ejdrlejdrlejr

감사합니다 :)

existsByUserIdAndProjectId vs existsByUserAndProject 중 어떤 방식이 적절할까요?

0

69

1

existsByUserIdAndProjectId vs existsByUserAndProject 중 어떤 방식이 적절할까요?

0

107

3

MemberRepository 구현체

0

57

1

pdf 표현 질문드립니다.

0

62

1

로그가 남지 않는 문제.

0

81

1

테스트 라이브러리가 강의는 junit4가 맞나요??

0

70

2

pdf 파일과 차이점이 있는 것같은데 문제 없나요?

0

72

2

@PrePersist, @PreUpdate 호출 시점 질문드립니다.

0

91

2

Sort 인터페이스는 잘 사용 안하나요?

0

52

1

스캔대상 질문드립니다.

0

46

1

하이버네이트6에서의 최적화에 이은 질문

0

85

1

save() vs saveAndFlush DB 통신 횟수

0

53

1

순수 JPA 리포지토리 코드 수정부분

0

86

2

bulk연산 후 flush하는 이유를 모르겠어요

0

152

3

bulk insert 질문입니다.

0

178

2

교만했던 것 같아요.

0

147

1

RESTful 강의는 안하시는 건지 궁금합니다.

0

147

2

동적 테이블에 대한 질문

0

85

1

영속성 전이와 연관관계

0

130

2

강의 10:25 질문

0

74

1

단건 update 질문

0

95

2

엔티티 와 도메인의 경계

0

127

1

UsernameOnlyDto 타입 type mismatch 오류

0

119

1

Projection 개념과 데이터 전달과정에 대해 질문 있습니다.

0

136

1