본 포스트는 스프링 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() {
}
}