2023. 5. 1. 03:49ㆍ카테고리 없음
구조
도메인 : 비즈니스 도메인 객체 예) 회원, 주문, 쿠폰 등등 주로 데이터베이스에 저장하고 관리됨
컨트롤러 : 웹 MVC의 컨트롤러 역할
서비스 : 핵심 비즈니스 로직 구현
레퍼지토리 : 데이터베이스에 접근, 도메인 객체를 DB에 저장하고 관리
클래스 의존 관계
MemberService -> MemberRepository <- MemoryMemberRepository
멤버 클래스
레퍼지토리
아까 위에 Member클래스의 있는 id와 name을 쓸 수 있도록 import를 해준다. 그리고 Optional을 사용해서 null값을 나올 것을 방지하여 Optional로 감싸서 가져올수있도록 하는거고, List는 지금까지 저장된 모든 객체들을 가져오는 것을 뜻한다.
메모리멤버레퍼지토리
package com.example.demo.Repository;
import com.example.demo.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.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());
}
public void clearStore() {
store.clear();
}
}
위 코드는 인터페이스인 멤버레퍼지토리를 상속받아서 클래스의 형태로 만들어 기본적인 기능을 하나씩 만들어갈수
있게 되는 것이다. map을 써서 멤버의 정보를 저장 할 곳을 만들어주기 위하여 HashMap을 써주고, sequence는 map에서 사용되는 Key값들을 만들어주는 함수라고 생각하면 된다.
save() : member에 있는 name과 id가 있는데 name과 id를 입력을 하면 store에 그 아이디를 저장(Map에)을 하게 된다.
findById() : id를 입력했을때 이제 그 값을 입력 받을텐데, 그 값이 만약 null인 상태로 나올수 있으니 그 가능성도 배제하지 않게 하기 위해 Optional이라는 함수를 사용해서 반환될수 있게끔 만들어주었다.
findByname() : 여기에는 사람의 실제 이름이 들어오는 곳이기 때문에, 스트림 함수로 그 배열에서 어떤 것들의 값을 필터링을 하든 만져주기 위해서 stream을 쓰고, filter로 멤버에서 입력받은 이름과 매개변수로 넘어온 이곳의 이름과 같은지, 그리고 그 이름이 같다면 필터링이 되고, 그 값을 찾으면 반환해주기 위해 return이 제일 앞에 나온 것을 볼 수 있다.
findAll(): 우리가 처음에 배열을 쓸땐 map으로 했는데 지금 findAll을 보게 되면 List로 받았다. 그리고 그 안에 ArrayList를 사용하여 store.values, store에 저장된 value, 즉, member를 뜻하는데 이 값들을 나타내는 것이다.