데이터 : 회원 ID , 이름
기능 : CRUD
DBMS 선정 x ( 가상의 시나리오 NoSQL , RDBMS .. etc)
-> 초기단계는 가벼운 메모리 기반의 데이터 저장소를 사용
Member class
package com.example.hellospring.domain;
public class Member {
private Long id;
private String name;
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;
}
}
인터페이스 설계
package com.example.hellospring.repositroy;
import java.util.List;
import java.util.Optional;
import com.example.hellospring.domain.Member;
public interface MemberRepositroy {
/* 기능목록 */
Member Save(Member member);
Optional<Member> findId(Long id);
Optional<Member> findName(String name);
List<Member>findAll();
/*
* Optional은 주로 "결과 없음"을 표시해야 하는 명확한 필요성이 있고 null을 사용하면 오류가 발생할 가능성이 있는 경우 메서드 반환 유형으로 사용하기 위한 것입니다.
* 유형이 Optional인 변수는 그 자체가 null이 되어서는 안 됩니다.
* 항상 Optional 인스턴스를 가리켜야 합니다.
*
*
*/
}
package com.example.hellospring.repositroy;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import com.example.hellospring.domain.Member;
public class MemoryMemberRepository implements MemberRepositroy {
private Map<Long, Member> store = new HashMap<>();
private static long sequence = 0L;
@Override
public Member Save(Member member) {
member.setId(++sequence); // Seq id 1씩 증가
store.put(member.getId(), member);
return member;
}
@Override
public Optional<Member> findId(Long id) {
return Optional.ofNullable(store.get(id)); // null이어도 감쌀 수 있음
}
@Override
public Optional<Member> findName(String name) {
return
store.values().stream()
.filter(Member -> Member.getName().equals(name)) // getName을 통해 동일한 이름 찾음
.findAny(); // loop다 돌았는데 null이 포함되어서 반환
}
@Override
public List<Member> findAll() {
// Map to List
return new ArrayList<>(store.values());
}
}
Junit file name은 관례적으로 구현부 class +Tests 로 작성한다.



