package hello.hellospring.domain;
public class Member {
private Long id; //시스템이 저장하는 아이디
private String name;
// private 변수에 대한 getter setter
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;
}
}
여기까지는 그렇게 어렵진 않았다. 다만 그동안 JAVA를 배울 때는 Long 자료형을 안써서 생소할뿐...
package hello.helllospring.repository;
import hello.helllospring.domain.Member;
import java.util.List;
import java.util.Optional;
public interface MemberRepository {
Member save (Member member); //회원을 저장소에 저장
Optional<Member> findById(Long id); // id로 회원을 찾는다.(Optional사용)
Optional<Member> findByName(String name); //이름으로 회원을 찾는다.(Optional사용)
List<Member> findAll(); //지금까지 저장된 모든 리스트들을 반환
}
Optional이 null로 반환될 수 있으니까 Optional로 감싸서 반환하는걸 처음보았다.
package hello.hellospring.repository;
import hello.hellospring.domain.Member;
import org.springframework.stereotype.Repository;
import java.util.*;
@Repository
public class MemoryMemberRepository implements MemberRepository {
// 만들었던 MemberRepository interface를 implements -> 아래에 MemberRepository의 메서드 틀들을 가져옴. 여기선 모두 가져옴
// Member를 저장해주기 위해 Map 사용, 실무에서는 동시성 문제로 concurrent HashMap(?) 씀. 여기선 단순히 HashMap
// Key 타입은 Long, Value 타입은 Member,따라서 K타입 파라미터는 Long,V타입 파라미터는 Member이 된다.
private static Map<Long, Member> store = new HashMap<>();
// 0, 1, 2... 이렇게 key값 생성용, 실무에선 동시성 문제로 atom long..(?)해주긴함
private static long sequence = 0L;
@Override
public Member save(Member member) {
member.setId(++sequence); // member가 입력될때마다 sequence가 1씩 증가
store.put(member.getId(), member); //store에 객체 추가
return member;
}
@Override
public Optional<Member> findById(Long id) {
// 결과가 없는 경우 (null)을 위해 Optional로 감쌈 -> 클라이언트에서 어떻게 처리가 가능하게 됨.
return Optional.ofNullable(store.get(id));
}
@Override
public Optional<Member> findByName(String name) {
return store.values().stream()
.filter(member -> member.getName().equals(name))
.findAny(); // findAny =루프 돌다가 하나라도 찾으면 반환, 결과가 Optinal로 반환됨
// stream과 람다식은 추후 다시 공부한걸 올려야겠다.
}
@Override
public List<Member> findAll() {
return new ArrayList<>(store.values()); // store에 있는 values(Member)를 전부 반환
}
// 테스트시 각자의 테스트가 서로에 영향을 끼치지 않게 하기 위해 메모리를 클리어해줌
public void clearStore() {
store.clear();
}
}