본문 바로가기
Spring Practice

[#9] Spring 파헤치기 : 회원 도메인과 리포지토리 만들기

by 박은유 2022. 3. 2.
반응형

1. 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;
    }
}

 

name은 사용자가 입력하고, id는 서버에서 name을 구분하기위해 자동으로 생성한다.

 

2. 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);
    List<Member> findAll();
}

 

member를 저장해주는 save 메서드, id로 조회가능한 findById 메서드, name으로 조회가능한 findbyName 메서드, 모든 회원목록이 조회가능한 findAll 메서드를 생성한다.

 

위에 코드중 Optional로 Member를 감싼걸 볼 수 있다.

 

Optional이란?

 

 : null이 올 수 있는 값을 감싸는 Wrapper클래스로, 참조하더라도 NPE(NullPointerException)가 발생하지 않도록 해준다.

 

3. repository 패키지에 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);

        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());
    }
}

 

1) MemberRepository를 implements한다.

2) member를 저장할 수 있는 Map을 생성한다.

3) 0부터 id를 1씩 추가해 생성해주는 sequence를 생성한다.

4) save메서드

: - member에 id값을 sequence에 1씩 올려 넣어준다.

  - store에 id를 member란 이름으로 넣어준다.

  - member를 return한다.

 

5) findById메서드

: - store.get(id)를 반환해주면 되지만, 없으면 null이 되기때문에 Optional.ofNullable로 감싸고 넣어주면 클라이언트쪽에서 변경이 가능하다. (뒤에서 설명)

 

6) findByName메서드

: - store에서 filter를 거치는데, 람다식으로 파라미터에서 가져온 name과 equals를 통해 member의 name과 비교해서 같은게 있으면 반환한다.

 - 위 작업을 루프를 돌려 쭉 실행시킨다.

 - 끝까지 돌렸는데 없으면 null을 반환한다.

 

7) findAll메서드

: - store의 values(member)를 ArrayList 객체로 반환한다.

 

 

 

다음으로 위의 코딩이 제대로 작동되는지 테스트케이스를 작성해보자.

반응형