09 회원 도메인과 리포지토리 만들기

bourbon·2021년 12월 19일
0

Spring

목록 보기
10/14
post-thumbnail
post-custom-banner

이전 게시물이었던 "비지니스 요구사항"을 바탕으로 구현을 한다.

먼저, Member.java에 회원의 idname를 담는 객체를 생성하고 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;
    }
}

회원의 idname 값을 담는 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로 함.


profile
Do things that don't scale
post-custom-banner

0개의 댓글