이전 게시물이었던 "비지니스 요구사항"을 바탕으로 구현을 한다.
먼저, Member.java에 회원의 id와 name를 담는 객체를 생성하고 getter/setter를 만든다.
hello-spring/src/main/java/hello/hellospring/domain/Member.java
package hello.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;
}
}
회원의 id와 name 값을 담는 MemberRepository를 인터페이스 파일로 만든다.
hello-spring/src/main/java/hello/hellospring/repository/MemberRepository.java
package hello.hellospring.repository;
import hello.hellospring.domain.Member;
import java.util.List;
import java.util.Optional;
public interface MemberRepository {
Member save(Member member); //회원 저장
Optional<Member> findById(Long id); //회원 id 찾아옴
Optional<Member> findByName(String name); //회원 name을 찾아옴
List<Member> findAll(); //저장된 모든 리스트를 반환함
}
*Optional<>
=> 자바 8 부터 들어간 기능으로, 반환되는 객체가 null일 가능성이 있을 경우 사용됨.
hello-spring/src/main/java/hello/hellospring/repository/MemoryMemberRepository.java
package hello.hellospring.repository;
import hello.hellospring.domain.Member;
import org.springframework.stereotype.Repository;
import java.util.*;
public class MemoryMemberRepository implements MemberRepository {
private static Map<Long, Member> store = new HashMap<>();
private static long sequence = 0L;
@Override
public Member save(Member member) {
member.setId(++sequence);
store.put(member.getId(), member);
return member;
}
@Override
public Optional<Member> findById(Long id) {
return Optional.ofNullable(store.get(id));
}
@Override
public Optional<Member> findByName(String name) {
return store.values().stream()
.filter(member -> member.getName().equals(name))
.findAny();
}
@Override
public List<Member> findAll() {
return new ArrayList<>(store.values());
}
}
private static Map<Long, Member> store = new HashMap<>();
=> 아이디와 member의 값을 저장할 Map객체 생성
*@Override
=> 상속받은 메서드를 재정의할 때 메서드 이름이 틀리지 않게 쓰기 위한 어노테이션
*sequence
=> 0, 1, 2, ... 와 같은 키 값을 생성함.
member.setId(++sequence);
=> sequence에 1을 더한 값을 id로 지정함.
findById(Long id)
=> store에서 아이디 값을 가지고 member를 꺼냄.
return Optional.ofNullable(store.get(id));
=> 아이디에 해당하는 회원이 없을 경우 null 값이 나올 수 있으므로, ofNullable로 감싸줌.
return store.values().stream()
.filter(member -> member.getName().equals(name))
=> lambda와 stream을 이용해 루프를 돌려서 member의 이름이 파라미터로 넘어온 name과 같은지 비교 후 같은 경우에만 필터링 함.
return new ArrayList<>(store.values());
=> 값 저장은 map에 하지만 루프를 돌리기 더 편리하기 위해서 반환은 List로 함.