Spring
[Spring] Spring MVC : Servlet 기반의 애플리케이션 - 회원 저장소
yjk490
2023. 8. 17. 17:52
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에 복사한 후 반환한다.