[개발] - Spring/MVC 1

회원 관리 웹 애플리케이션 요구사항

완벽한 장면 2023. 9. 22. 08:42

3. 서블릿, JSP, MVC 패턴  시작

 

회원 관리 웹 애플리케이션 요구사항

 

회원 도메인 모델

Member

@Getter
@Setter
@NoArgsConstructor
public class Member {

  private Long id;
  private String username;
  private int age;

  public Member(String username, int age) {
    this.username = username;
    this.age = age;
  }

}

 

 

 

회원 저장소

MemberRepository

/**
 * 동시성 문제가 고려되어 있지 않음, 실무에서는 ConcurrentHashMap, AtomicLong 사용 고려
 */
public class MemberRepository {

  private static Map<Long, Member> store = new HashMap<>();
  private static long sequence = 0L; // static 사용
  // -> MemberRepository가 아무리 많아도 얘들은 딱 하나만 생성된다.(static)

  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());
    // store에 있는 모든 값들을 다 꺼내서 ArrayList에 담아서 넘겨준다.
  }

  // 테스트코드용 초기화 메서드
  public void clearStore() {
    store.clear();
  }

}

 

* -> MemberRepository가 아무리 많아도 얘들은 딱 하나만 생성된다.(static) 이것의 의미

부연설명

 

 

* store에 있는 모든 값들을 다 꺼내서 ArrayList에 담아서 넘겨준다.

 

 

 

Repository 테스트 코드

class MemberRepositoryTest {

  MemberRepository memberRepository = MemberRepository.getInstance();
  // 싱글톤이기 때문에 new 해서 새로 생성할 필요가 없음.

  @AfterEach
  void afterEach() {
    memberRepository.clearStore();
  }

  @Test
  @DisplayName("회원 저장 테스트")
  void save() {
    //given
    Member member = new Member("hello", 20);

    //when
    Member savedMember = memberRepository.save(member);

    //then
    Member findMember = memberRepository.findById(savedMember.getId());
    assertThat(findMember).isEqualTo(savedMember);
  }

  @Test
  @DisplayName("전체 회원 조회")
  void findAll() {
    //given
    Member member1 = new Member("member1", 20);
    Member member2 = new Member("member2", 30);

    memberRepository.save(member1);
    memberRepository.save(member2);

    //when
    List<Member> result = memberRepository.findAll();

    //then
    assertThat(result.size()).isEqualTo(2);
    assertThat(result).contains(member1, member2);

  }
}
728x90
반응형