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

우선 domain 패키지에 Member 클래스를 만들자.

[hello.hellospring.domain의 Member클래스]

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 인터페이스를 만들자.

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);
    Optional<Member> findByName(String name); // Optional 은 자바 8에 추가된 문법임
                                              // findBy로 값을 가져올때 null일 수 있다.
                                              // 이때 null을 그대로 반환하지 않고 Optional로                                                 
                                              // null까지 감싸서 반환 받는다.
    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<>();
    // 실무에서는 동시성 문제가 있어서 이렇게 공유되는 변수일때는 ConcurrentHashMap을 써야하는데
    // 예제니까 단순히 HashMap을 쓰도록 한다.

    private static long sequence = 0L; // 0,1,2 ... 키값을 생성해줌
    // 얘도 실무에서는 long이라고 하기보다는 동시성문제를 해결하기 위해 atomlong 등을 써야하는데
    // 여기서는 가장 단순하게 하자!

    @Override
    public Member save(Member member) {
        member.setId(++sequence);
        store.put(member.getId(), member);
        return member; // store(자료형 Map)에 id랑 member를 저장해준다.
    }

    @Override
    public Optional<Member> findById(Long id) {
        // return store.get(id);
        // 위처럼 하면 null이 반환될 수 있다.
        return Optional.ofNullable(store.get(id));
        // 그래서 Optional.ofNullable을 이용하면 store에서 반환하는 값이 null이여도
        // 감쌀 수 있다. 감싸서 반환해주면 클라이언트에서 뭐를 할 수가 있다. (뒤에 설명)
    }

    @Override
    public Optional<Member> findByName(String name) {
        // 이것도 자바 8의 람다를 사용한다.
        return store.values().stream() // 얘를 루프를 돌린다.
                .filter(member -> member.getName().equals(name)) 
                 // filter, 람다를 사용함. member에서 가져온 이름이 파라미터 name과
                 // 같은 경우에만 필터링 됨
                .findAny(); 
                 // 그리고 찾으면(필터링되면) 그대로 반환해 준다. 
                 // (하나라도 찾으면 결과로 Optional이 반환됨)
                 // Map을 루프를돌면서 하나를 찾으면 그냥 걔를 반환한다. 
                 // 근데 끝까지 없으면 Optional에 null이 포함되서 반환함.
    }

    @Override
    public List<Member> findAll() { // 실무에서 자바할때 List를 많이 씀. (루프 돌리기가 편함)
        return new ArrayList<>(store.values()); // 여기서 values는 멤버들을 의미함.
    }
}

이거를 어떻게 검증하냐? 제대로동작하는지 검증해야한다.
이거를 확인하는 기가막힌 방법이 테스트 케이스를 작성하는 거다.

 

출처 : 인프런의 김영한 선생님 강의를 정리한 글입니다.
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%EC%9E%85%EB%AC%B8-%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8/dashboard

'Java > 스프링 입문' 카테고리의 다른 글

12. 회원 서비스 개발  (0) 2021.06.04
11. 회원 리포지토리 테스트 케이스 작성  (0) 2021.06.04
9. 비즈니스 요구사항 정리  (0) 2021.06.04
8. API  (0) 2021.06.04
7. MVC와 템플릿 엔진  (0) 2021.06.04

댓글

Designed by JB FACTORY