로그인 쿠키,세션에 대해 알아보기전에 좀 공부해야할 것이 있다.

JPA가 손쉽게 제공해주겠지만, 우리는 공부단계이니 아래와 아이디별 유저 찾기, 전부 찾기를 순수 JDBC로 만들었다.

    public Optional<Member> findByLoginId(String loginId) {
        return findAll().stream()
                .filter(m -> m.getLoginId().equals(loginId))
                .findFirst();
    }

    public List<Member> findAll() {
        return new ArrayList<>(store.values());
    }

근데 자바 8에서는 stream()과 람다식을 적극 권장하고 안쓰면 호구다!! 익숙치 않아서 간단하게 정리해보려고 한다.

findAll()이 그냥 모든 member들을 List형식으로 반환한다. 이거를 스트림과 람다식을 안쓰고 아이디별 멤버 찾기를 구현하게 되면 어떻게 될까? → 우선 람다를 안쓰면 아래와 같이 멤버를 new 연산자로 뽑아서 test하는 함수도 써서 비교해준다음 반환해줘야 하는 식의 로직이 매우 길어진다.

return findAll().stream()
        .filter(new Predicate<Member>() {
            @Override
            public boolean test(Member m) {
                return m.getLoginId().equals(loginId);
            }
        })
        .findFirst();

그리고 스트림을 열지 않는다면 비교하는 로직을 따로 빼서 해야하는 등의 함수를 더 만들어야 할 것이다.

스트림을 열어서 안에서 List의 원소를 하나씩 뺴며 비교하거나 추가하는 등 여러가지 로직을 추가할 수 있다.

위의 로직을 해석하자면 아래와 같다.

findAll()이 List<member>를 반환하니까 stream을 열어서 그 스트림에서 member객체 하나씩을 꺼내서 매개변수의 id와 같은지 확인하고 같으면 첫번째꺼를 반환하면서 끝나는 흐름

그리고 맨위의 람다의 m은 (객체).stream()로 연 것, 즉 스트림으로 연 자료구조에서 꺼낸 객체 하나와 같다. 위에서는 member가 해당된다. (처음에 m이 띠용 나와서 매우 당황!)

스트림은 보통 어디에 쓰나?