전체 패키지 구조는 다음과 같다.
repository는 데이터베이스와 데이터를 주고 받기 위한 인터페이스를 정의한 부분이다.
실제 데이터를 저장하고 있는 클래스가 아니라, 데이터를 주고 받는 인터페이스인 점을 기억하자.
JPA repository 인터페이스를 상속받아 작성하였다. 제네릭의 경우 DB 테이블과 연결될 객체인 TodoEntity 타입과 해당 객체의 id 필드인 Long 타입으로 정의해준다.
package todolist.repository;
import org.springframework.data.jpa.repository.JpaRepository;
import todolist.entity.TodoEntity;
public interface TodoRepository extends JpaRepository<TodoEntity, Long> {
}
Interface 로 save, findBySeq, findById, findAll, clearStore 메소드를 선언한다.
package todolist.repository;
import todolist.entity.MemberEntity;
import java.util.List;
import java.util.Optional;
public interface MemberRepository {
MemberEntity save(MemberEntity memberEntity);
Optional<MemberEntity> findBySeq(Long seq);
Optional<MemberEntity> findById(String id);
List<MemberEntity> findAll();
void clearStore();
}
MemberReporitory를 상속 받아서 앞서 선언한 메소드를 구현한다.
package todolist.repository;
import todolist.entity.MemberEntity;
import java.util.*;
public class MemoryMemberRepository implements MemberRepository {
private static Map<Long, MemberEntity> store = new HashMap<>();
private static Long sequence = 0L;
@Override
public MemberEntity save(MemberEntity memberEntity) {
memberEntity.setSeq(++sequence);
store.put(memberEntity.getSeq(), memberEntity);
return memberEntity;
}
@Override
public Optional<MemberEntity> findBySeq(Long seq) {
return Optional.ofNullable(store.get(seq));
}
@Override
public Optional<MemberEntity> findById(String id) {
return store.values().stream()
.filter(memberEntity -> memberEntity.getId().equals(id))
.findAny();
}
@Override
public List<MemberEntity> findAll() {
return new ArrayList<>(store.values());
}
@Override
public void clearStore() {
store.clear();
}
}