비즈니스 요구사항 정리

image.png


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

회원 객체 <domain/Menber.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;
    }
 }

회원 리포지토리 인터페이스 <repository/MemberRepository.java>

package hello.hello_spring.repository;

import hello.hello_spring.domain.Member;

import java.util.List;
import java.util.Optional;

public interface MemberRepository {
    Member save(Member member);
    Optional<Member> findById(Long id);
    Optional<Member> findByName(String name);
    List<Member> findAll();
}

회원 리포지토리 메모리 구현체

package hello.hellospring.repository;   // 이 파일의 주소(폴더 경로)

import hello.hellospring.domain.Member; // '회원' 도메인 클래스
import java.util.*;                      // Map, List, Optional 등 표준 컬렉션들

/**
 * 동시성 문제가 고려되어 있지 않음, 실무에서는 ConcurrentHashMap, AtomicLong 사용 고려
 */
public class MemoryMemberRepository implements MemberRepository {
    // └ 이 클래스는 'MemberRepository'라는 인터페이스(메뉴판)를 구현(implements)한다는 뜻
    //   → 메뉴판에 있는 메서드들을 반드시 만들어야 함(@Override로 표시)

    // ====== “가짜 DB” 역할을 하는 메모리 저장소 ======

    // store: 회원을 넣어둘 서랍장
    //  - key: Long (회원 번호 id)
    //  - value: Member (회원 데이터)
    private static Map<Long, Member> store = new HashMap<>();
    // static → 클래스 전체에서 '딱 1개' 공유. 테스트/연습에 편함.

    // sequence: id 자동 증가기 (1,2,3..)
    private static long sequence = 0L;

    @Override
    public Member save(Member member) {
        // 새 id 발급(++: 먼저 1 증가시키고 그 값을 씀)
        member.setId(++sequence);

        // 서랍장에 보관: key=id, value=member
        store.put(member.getId(), member);

        // 저장한 결과를 그대로 돌려줌
        return member;
    }

    @Override
    public Optional<Member> findById(Long id) {
        // store.get(id)가 null일 수도 있으니 Optional로 감싸서 반환
        return Optional.ofNullable(store.get(id));
    }

    @Override
    public List<Member> findAll() {
        // 현재 저장된 모든 회원 목록을 '복사본 리스트'로 반환
        return new ArrayList<>(store.values());
    }

    @Override
    public Optional<Member> findByName(String name) {
        // 모든 회원들 중에서 이름이 같은 한 명을 찾아 Optional로 반환
        return store.values().stream()
                .filter(member -> member.getName().equals(name))
                .findAny(); // 하나라도 찾으면 반환, 없으면 Optional.empty()
    }

    // 테스트용: 저장소 전체 비우기
    public void clearStore() {
        store.clear();
    }
}