스프링 부트/스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술

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

sungw00 2023. 3. 7. 15:57
728x90

1. 회원 

hello.hellospring.domain 패키지 생성, Member 클래스 파일 작성

package hello.hellospring.domain;

public class Member {

    private Long id;
    private String name;


	// getter/setter 생성
    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;
    }

}

 

2. 회원 객체를 저장하는 hello.hellospring.repository 패키지 생성, MemberRepository 인터페이스 파일 작성

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); // 저장소에서 이름으로 찾아오기
    List<Member> findAll(); // 지금까지 저장된 회원을 리스트로 반환
}

 

 

 

MemoryMemberRepository 구현체 생성

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.put(member.getId(), member); // store에 저장
        return member; // 저장된 결과 반환
    }

    @Override
    public Optional<Member> findById(Long id) {
        return Optional.ofNullable(store.get(id)); // store에서 id를 가져오는데 null이 반환될 수 있게 함
    }

    @Override
    public Optional<Member> findByName(String name) {
        return store.values().stream() // 람다를 사용
                .filter(member -> member.getName().equals(name)) // member.getName이 파라미터로 넘어온 name과 같은 지 확인
                .findAny(); // 찾으면 반환 못찾으면 Optional에 null을 포함하여 반환
    }

    @Override
    public List<Member> findAll() {
        return new ArrayList<>(store.values()); // store의 values(멤버)들을 반환
    }

    public void clearStore() {
        store.clear();
    }
}

실무에서는 동시성 문제가 있어 공유되는 변수일때는 ConcurrentHashMap, AtomicLong을 사용해야 함

728x90