김영한님의 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술을 보면서 공부한 내용입니다.
비즈니스 도메인 객체, 예) 회원, 주문, 쿠폰 등등 주로 데이터베이스에 저장하고 관리됨
⇒ 도메인 패키지를 만들어 관리하고, Member class 생성
package hello.hellospring.domain;
public class Member {
private Long id; // 임의의 값 => 시스템이 저장하는 아이디
private String name;
// 인텔리제이 단축키 : Alt + Insert
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;
}
}
데이터베이스에 접근, 도메인 객체를 데이터베이스에 저장하고 관리
⇒ 리포지토리 패키지를 만들어 저장소를 만들고 Member객체를 저장할 리포지토리를 생성한다.
package hello.hellospring.repository;
import hello.hellospring.domain.Member;
import java.util.List;
import java.util.Optional;
public interface MemberRepository { // 저장소
Member save(Member member); // save를 통해 회원이 저장소에 저장됨
Optional<Member> findById(Long id);
Optional<Member> findByName(String name);
List<Member> findAll(); // findAll : 지금까지 저장된 모든 회원 List를 반환
}
💡 **Optional이란?** null이 올 수 있는 값을 감싸는 Wrapper 클래스로 findById나 Name의 값이 null이더라도 바로 NPE(NullPointerException)가 발생하지 않도록 도와준다.
단순하게 메모리를 넣었다 뺄 수 있음
⇒ MemberRepository를 상속받아 구현하는 MemberRepository 클래스를 생성하여 코드를 작성한다
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<>();
private static long sequence = 0L;
@Override
public Member save(Member member) {
member.setId(++sequence); // store에 값을 넣기 전에 sequence(id)값 세팅
store.put(member.getId(), member);
return member;
}
@Override
public Optional<Member> findById(Long id) {
return Optional.ofNullable(store.get(id)); // NPE를 방지하기 위해 Optional사용
}
@Override
public Optional<Member> findByName(String name) {
return store.values().stream()
.filter(member -> member.getName().equals(name))
// parameter로 넘어온 name이랑 같은지 확인
// 같은 경우에만 필터링됨
.findAny(); // findAny : 하나라도 찾기
}
@Override
public List<Member> findAll() {
return new ArrayList<>(store.values()); // Member들이 모두 반환됨
}
}