Home 섹션3) 회원 관리 웹 애플리케이션 요구사항
Post
Cancel

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

본 포스트는 스프링 MVC 1편(김영한, 인프런) 강의를 통해 학습한 내용을 작성자 임의 대로 요약 및 정리한 것입니다.


  기본적인 “회원 관리 웹 애플리케이션”을 통해
서블릿, JSP, MVC 패턴의 순서대로
각각 적용하여 개발해본다!

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

회원 정보

  • 이름
    : username
  • 나이
    : age

기능 요구사항

  • 회원 저장

  • 회원 목록 조회

1.1. 회원 도메인 모델

/main/~/hello/servlet/domain/member에서
Member.java 생성하여 아래와 같이 작성.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@Getter @Setter
public class Member {
    // 필드(3가지)
    private Long id;
    private String username;
    private int age;

    // 기본 생성자
    public Member() {
    }

    // 생성자(2가지 요소 가짐)
    public Member(String username, int age) {
        this.username = username;
        this.age = age;
    }
}

1.2. 회원 저장소

동일 디렉터리에
MemberRepository.java 생성.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
/*
 *  동시성 문제 고려되지 않음!
 *  실무에선 ConcurrentHashMap, AtomicLong 사용 고려
 */
public class MemberRepository {
    private static Map<Long, Member> store 
                    = new HashMap<>();
    private static long sequence = 0L;

    // 싱글톤으로 만들기
    private static final MemberRepository instance 
                    = new MemberRepository();

    public static MemberRepository getInstance() {
        return instance;
    }

    private MemberRepository() {
    }

    // 저장
    public Member save(Member member) {
        // id 값 추가 (1씩 증가)
        member.setId((++sequence));
        store.put(member.getId(), member);
        return member;
    }

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

    // 회원 목록
    public List<Member> findAll() {
        // store 자체를 보호하기 위해 이렇게!
        return new ArrayList<>(store.values());
    }

    // 테스트용
    public void clearStore() {
        store.clear();
    }
}

테스트 코드 작성

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
class MemberRepositoryTest {

    MemberRepository memberRepository = MemberRepository.getInstance();

    @AfterEach
    void afterEach() {
        // clearstore() 없이 실행 시 문제 생김
        // 데이터 저장 관련 문제 (순서 보장 X)
        memberRepository.clearStore();
    }

    @Test
    void getInstance() {
    }

    @Test
    void save() {
        // given
        Member member = new Member("hello", 20);

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

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

    @Test
    void findById() {
    }

    @Test
    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
        Assertions.assertThat(result.size()).isEqualTo(2);
        Assertions.assertThat(result).contains(member1, member2);
    }

    @Test
    void clearStore() {
    }
}
Contents