인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

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

한영키님의 프로필 이미지
한영키

작성한 질문수

스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술

회원 도메인과 리포지토리 만들기

findById와 findByName 구현 차이

작성

·

261

0

안녕하세요! 수업 정말 잘 듣고 있습니다.

MemoryMemberRepository 구현하는 데서, ID로 찾을 때는 단순히 Optional.ofNullable(store.get(id));를 활용해서 찾아서

name을 통해 찾을 때도 마찬가지로, Optional.ofNullable(store.get(name));으로 찾을 줄 알았습니다.

왜 name을 찾을 때는 전체를 돌면서 찾아야 하는 걸까요..!?

부족한 질문이지만 답변 부탁드리겠습니다 !

답변 2

1

한영키님의 프로필 이미지
한영키
질문자

@codeweaver

친절한 답변 정말 감사합니다!

그런데, 답변에 대한 질문이 있습니다.

1.  여기서 설정한 ID는 저희가 직접 sequence를 이용해서 Long으로 선언한 id인데, 그 아이디로 JPA에서 관리하는 것이 맞나요..?!

2.  만약 회원 생성을 할 때, 중복 이름을 가입하지 못하게 막는다고 하면(이름이 아닌 별명 등으로 생각), 그냥 Optional.ofNullable(store.get(id));를 사용해도 될까요!?

1. 넵 도메인 작성하실때 private long id; 상단에 @Id 에노테이션을 붙이셨을 겁니다. 그렇게 되면 그 필드를 키로 사용하게 됩니다. :)

2. 1의 답변과 마찬가지로 아이디 중복을 막는다 해도, 도메인에서 키로 선언한 필드만 바로 조회할 수 있습니다.

한영키님의 프로필 이미지
한영키
질문자

@codesweaver

오 정말 감사합니다!!!

마지막으로, 그럼 혹시 DB에서 Primary Key를 name으로 설정하는 것은 key를 id로 설정한 것과 무관한 것일까요?!

질문 수준이 낮아 죄송합니다ㅠㅠ

네. JPA를 통해 테이블을 생성할 경우 기본적으로 ID가 프라이머리로 잡히긴 하나,

데이터베이스에서 직접 키를 별도로 설정할수 있겠죠?

그런경우에는 JPA와는 무관하게 키로 사용하실 수 있습니다만, JPA에서는 그 키를 인식하지 않습니다.

0

간단히 답변드리면, '키는 유일한 값'이고 이름은 중복이 가능한 값이기 때문에 그렇습니다.

그리고 JPA에서는 키(id)로 개체를 관리하기 때문에 키값이 있으면 손쉽게 개체를 찾을 수 있습니다.

주민번호를 가지고 사람을 찾는것과, '홍길동' 이름만 가지고 사람을 찾는것 같은 차이가 있습니다.

한영키님의 프로필 이미지
한영키

작성한 질문수

질문하기