domain 패키지를 만들고 Member 클래스를 만듭니다.
package hello.hellospring.domain;
public class Member {
private Long id; //...1
private String name; //...2
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
회원 리포지토리 인터페이스를 만듭니다. repository 패키지를 만들고 인터페이스로 MemberRepository를 만듭니다.
package hello.hellospring.repository;
import hello.hellospring.domain.Member;
import java.util.List;
import java.util.Optional;
public interface MemberRepository {
Member save(Member member); //...1
Optional<Member> findById(Long id); //...2
Optional<Member> findByName(String name); //...3
List<Member> findAll(); //...4
}
회원을 저장소에 저장합니다.
id로 회원을 찾습니다.
<aside> ❗ Long을 사용한 이유?
new Member() 처럼 Member 객체를 생성하는 시점에는 id 값이 없어야 합니다. 그래서 없다는 표현을 null로 하는 것이 좋습니다.
그런데 long을 사용하면 null을 입력할 수 없고, 0이라는 값을 넣어두어야 합니다.
</aside>
이름으로 회원을 찾습니다.
지금까지 저장된 모든 회원 리스트를 반환해줍니다.
<aside> 💡 Optional이란?
findById나 findByName으로 가져오는데 null 일 수 있습니다. 없으면 null이 반환됩니다.
요즘에는 null을 그냥 반환하는 방식 보다는 Optional로 null을 감싸서 반환하는 방식을 선호합니다.
</aside>
MemoryMemberRepository 클래스를 만들어줍니다.
package hello.hellospring.repository;
import hello.hellospring.domain.Member;
import java.util.*;
public class MemoryMemberRepository implements MemberRepository{
private static Map<Long, Member> store = new HashMap<>(); //...1
private static long sequence = 0L; //...2
//...3
@Override
public Member save(Member member) {
member.setId(++sequence);
store.put(member.getId(), member);
return member;
}
//...4
@Override
public Optional<Member> findById(Long id) {
return Optional.ofNullable(store.get(id));
}
//...5
@Override
public Optional<Member> findByName(String name) {
return store.values().stream()
.filter(member -> member.getName().equals(name))
.findAny();
}
//...6
@Override
public List<Member> findAll() {
return new ArrayList<>(store.values());
}
}
save를 할 때 어딘가에 저장을 해야합니다. 여기서 Map을 사용하겠습니다.
sequence는 0, 1, 2 이런 식으로 키 값을 생성해주는 것이라고 보면 됩니다.
save
findById
return store.get(id));
을 했습니다. 이 때 결과가 없으면 null일 것 입니다.retuen Optional.ofNullable(store.get(id));
로 해주면 null이여도 감쌀 수 있습니다.findByName
자바8의 람다를 쓰겠습니다.
stream()
filter()
findAny()
findAll
<aside> 🌟 [TIP]
implements 후에 Option + Enter
하면 바로 메서드를 오버라이드 할 수 있습니다.
</aside>