[Spring 입문] - 3. 도메인 / 리포지토리 생성

heyhey·2023년 1월 17일
0

Spring

목록 보기
3/23

프로젝트를 생성해보며 스프링 구조에 대해서 알아보자

비지니스 요구사항 정리

  • 데이터 : 회원ID,이름
  • 기능 : 회원 등록, 조회
  • 아직 데이터 저장소가 선정되지 않았음 (DB)

일반적인 웹 애플리케이션 계층 구조

  • 컨트롤러 : 웹 MVC의 컨트롤러 역할
  • 서비스 : 핵심 비즈니스 로직 구현
  • 리포지토리 : DB에 접근, 도메인 객체를 DB에 저장하고 관리
  • 도메인 : 비즈니스 도메인 객체
    • 예) 회원,주문, 등등 주로 DB에 저장하고 관리되는 데이터

회원 도메인과 리포지토리 생성

다시한번 도메인 이란?
도메인은 무언가 주체적으로 비즈니스 로직을 수행하는 객체
도메인모델 이란?
도메인에 대한 지식을 선택적으로 단순화하고 의식적으로 구조화한 형태

도메인 생성하기

우리가 필요한 값은 id, name 두개이고, 각자의 getter/setter를 생성한다.
java/hello.springgood/domain/Member (클래스)

package hello.springgood.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;
    }
}

리포지토리 생성

리포지토리는 DB에 저장하고 관리하는 로직이다.
아직은 DB가 없기 때문에 일단은 메모리에 저장하는 방식으로 진행한다.

리포지토리를 생성하기 위해 우선 interface를 먼저 생성해준다.
java/hello.springood/repository/MemberRepository (인터페이스)

package hello.springgood.repository;
import hello.springgood.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();
}
  • save : 데이터를 저장하고 Member 객체를 return한다
  • Optional<Member> : 찾으면 Memeber를,없다면 null을 return 해주게 한다.
  • List<Member> : Member 리스트 (Member[])

이 인터페이스를 이용해 리포지토리 로직을 작성한다.
DB 대신 store 라는 hashmap을 사용한다.
sequence 를 이용해 id를 순차적으로 생성해준다.

package hello.springgood.repository;
import hello.springgood.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());
    }
}

implements를 사용해 MemberRepository를 불러온다. 여기서 단축키 option + Enter를 이용해 전체를 불러올 수 있다.

save()

public Member save(Member member) {
    member.setId(++sequence);
    store.put(member.getId(),member);
    return member;
}

member의 아이디를 sequence의 값+1로 중복을 피한다.
storememberIdmember 객체로 넣어준다 ({1:Member})
member를 return 해준다

findById()

public Optional<Member> findById(Long id) {
    return Optional.ofNullable(store.get(id));
}
  • store.get(id) : id를 이용해서 store에서 값을 찾는데 없을 때는 null을 보내줄 수 있게 Optional.ofNullable()로 묶어준다.
  • return 값이 null 일수도 , Member일수도 있기 때문에 Optional<Member>를 사용한다.

findByName()

public Optional<Member> findByName(String name) {
   return store.values().stream()
        	.filter(member -> member.getName().equals(name))
        	.findAny();
}

이런 문법은 처음 본다.. 허허
store의 values => 즉 member 객체들을stream() ?
filter를 이용해 member의 이름이 파라미터로 들어온 이름이랑 같은지 찾아준다.
findAny() : 하나라도 찾는 것

profile
주경야독

0개의 댓글