article thumbnail image
Published 2022. 3. 22. 00:51

Description

  • User Service API 구현 챕터

Progress

UserDaoService.class

package com.example.restfulwebservice.user;

import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

public class UserDaoService {
    private static List<User> users = new ArrayList<>();

    private static int userCount = 3;

    static {
        users.add(new User(1, "Kenneth", new Date()));
        users.add(new User(1, "Alice", new Date()));
        users.add(new User(1, "Elena", new Date()));
    }

    public List<User> findAll() {
        return users;
    }

    public User save(User user) {
        if (user.getId() == null) {
            user.setId(++userCount);
        }

        users.add(user);
        return user;
    }

    public User findOne(int id) {
        return users.stream()
                .filter(user -> user.getId().equals(id))
                .findAny() // optional로 래핑된 조건과 일치하는 첫 번째 요소를 반환
                .orElse(null);
    }

    public User findOne(int id) {
        for (User user : users) {
            if (user.getId() != id) continue;

            return user;
        }
        return null;
    }

    public User findOne(int id) {
        for (User user : users) {
            if (user.getId() == id) {
                            return user;
                        }

            return null;
        }
    }
}

findOne

여태까지 자바스크립트계열의 프레임워크를 주로 다뤄왔기 때문에 js문법에 굉장히 익숙하고 함수형 프로그래밍에 친숙하고 선호한다. 마침 공부중에 자바계열에도 Stream API라는걸 이용하면 함수형 프로그래밍이 가능하다고 들어서 검색해서 사용해봤다.

// 1. 강의에서 작성한 코드
public User findOne(int id) {
    for (User user : users) {
        if (user.getId() == id) {
                    return user;
                }

        return null;
    }
}

// 2. 내가 수정한 코드
public User findOne(int id) {
    for (User user : users) {
        if (user.getId() != id) continue;

        return user;
    }
    return null;
}

// 3. Stream API를 검색해서 작성해본 코드
public User findOne(int id) {
    return users.stream()
            .filter(user -> user.getId().equals(id))
            .findAny() // optional로 래핑된 조건과 일치하는 첫 번째 요소를 반환
            .orElse(null);
}

일단 1번 코드가 강의에서 나온 기본 코드였는데 개인적으로 2번과 같이 falsy한 케이스를 먼저 거르는 코드 스타일을 선호하는 편이여서 루프를 사용해야 할 경우에는 2번과 같이 작성하는 편이다. 자바를 너무 오랜만에 해서 제대로 작성한지는 모르겠지만 적당히 느낌대로 만들어봤다.

3번은 말로만 듣고 검색해서 Stream API라는걸 사용해서 작성한 코드인데 javascript에서 사용하던 함수형 스타일과 크게 다르지않아서 어렵지않게 만들었다. 생각보다 훨씬 생산성도 뛰어나고 가독성도 좋아서 앞으로도 많이 사용하려한다.

위의 코드들은 모두 서버를 띄워서 실행해보니 모두 잘 동작했다.

No beans of ‘UserDaoService’ type found.

위에서 선언한 UserDaoService의 의존성을 주입하기 위한 생성자를 만드는데 아래와 같은 에러가 발생

스프링 프레임워크에서는 해당 클래스가 어떤 용도로 사용될 것인지 상단에 지정을 해놔야한다.

stereo type이라 함

@Service @Component 해당 예제의 경우 Service와 Component 모두 사용가능하지만 좀 더 명확하게 하기 위해 Service사용

복사했습니다!