[백엔드 첫 걸음] 회원 도메인 리포지토리 만들기-(회원 관리 예제)

khyojun·2022년 7월 14일
0

Spring 시작

목록 보기
7/15

1. 회원 도메인 설정

📂domain/Member

package com.example.demo_practice.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;
    }
}

2. 회원 리포지토리, 저장소 설정

📂repository/MemberRepository

package com.example.demo_practice.repository;



import com.example.demo_practice.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();
}

📂repository/MemoryMemberRepository

package com.example.demo_practice.repository;


import com.example.demo_practice.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. Optional이라는 것을 MemoryMemberRepository에서 작성을 하였는데 NPE가 발생할것을 방지하기 위하여 사용한 것이다.
  2. store.values().stream().filter(member -> member.getName().equals(name)).findAny()은 하나씩 파헤쳐보면

stream?

자바 8에서 추가한 스트림(Streams)은 람다를 활용할 수 있는 기술 중 하나입니다. 자바 8 이전에는 배열 또는 컬렉션 인스턴스를 다루는 방법은 for 또는 foreach 문을 돌면서 요소 하나씩을 꺼내서 다루는 방법이었습니다. 간단한 경우라면 상관없지만 로직이 복잡해질수록 코드의 양이 많아져 여러 로직이 섞이게 되고, 메소드를 나눌 경우 루프를 여러 번 도는 경우가 발생합니다.
스트림은 '데이터의 흐름’입니다. 배열 또는 컬렉션 인스턴스에 함수 여러 개를 조합해서 원하는 결과를 필터링하고 가공된 결과를 얻을 수 있습니다. 또한 람다를 이용해서 코드의 양을 줄이고 간결하게 표현할 수 있습니다. 즉, 배열과 컬렉션을 함수형으로 처리할 수 있습니다.
또 하나의 장점은 간단하게 병렬처리(multi-threading)가 가능하다는 점입니다. 하나의 작업을 둘 이상의 작업으로 잘게 나눠서 동시에 진행하는 것을 병렬 처리(parallel processing)라고 합니다. 즉 쓰레드를 이용해 많은 요소들을 빠르게 처리할 수 있습니다.

즉 간결하게 데이터의 흐름을 알아보고 싶을때 사용한다고 한다.

스트림은 크게 3가지로 나눌 수 있다고 한다.

  1. 생성하기 : 스트림 인스턴스 생성.
  2. 가공하기 : 필터링(filtering) 및 맵핑(mapping) 등 원하는 결과를 만들어가는 중간 작업(intermediate operations).
  3. 결과 만들기 : 최종적으로 결과를 만들어내는 작업(terminal operations).

그래서 위에서는 Hashmap에 있는 흐름을 보기위해 stream을 사용하여 filtering을 걸쳐 findByName안의 로직을 구성했다.
람다식은 아예 따로 시간을 내서 더 블로그에 작성해서 올려가며 공부해봐야겠다.

profile
코드를 씹고 뜯고 맛보고 즐기는 것을 지향하는 개발자가 되고 싶습니다

0개의 댓글