Member

@Getter @Setter
public class Member {
    private Long id;
    private String username;
    private int age;

    public Member() {}

    public Member(String username, int age) {
        this.username = username;
        this.age = age;
    }
}
  • id 필드의 타입이 참조형(Long)인 이유는 최초로 객체를 생성할 때는 id 값이 null 상태이어야 하기 때문이다.
  • 그런데 기본형(long) 변수는 null 값을 가질 수 없으므로 참조형(Long)으로 선언했다.

 

MemberRepostiory

public class MemberRepository {
    private Map<Long, Member> store = new HashMap<>();
    private long sequence = 0L;

    private static final MemberRepository instance = new MemberRepository();

    public static MemberRepository getInstance() {
        return instance;
    }

    private MemberRepository() {}

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

    public Member findById(Long id) {
        return store.get(id);
    }

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

    public void clearStroe() {
        store.clear();
    }
}
  • 스프링 컨테이너를 사용하지 않기 때문에 Repository 클래스를 직접 싱글톤 패턴으로 구현한다.
  • findAll() 메서드에서 바로 store.values()를 반환하지 않는 이유는 외부에서 store의 value에 접근하는 것을 막기 위함이다.
  • 만약 store.values()를 그대로 반환하면 findAll()을 통해 반환된 List<Member>store.values()로부터 반환된 객체의 참조값이 동일하기 때문에 외부에서 store 내부의 value에 접근할 수 있다.
  • 따라서, 이를 방지하기 위해 ArrayList에 복사한 후 반환한다.

+ Recent posts