Servlet을 이용하여 간단한 웹 서블릿 프로그램을 만들어보려고 한다.
회원 관리 시스템으로,
회원의 정보는 이름과 나이로 저장한다.
요구되는 기능은 다음과 같ㅌ다.
- 회원 저장
- 회원 목록 조회
Member.java
package helloMVC.servlet.domain.member;
import lombok.Getter;
import lombok.Setter;
@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;
}
}
lombok을 사용하면 따로 Getter, Setter를 만들어 줄 필요가 없다.
회원 저장소를 만들어줘야 한다.
MemberRepository.java
package helloMVC.servlet.domain.member;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* 동시성 문제가 고려되어 있지 않음, 실무에서는 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) {
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 clearStore() {
store.clear();
}
}
싱글톤이 적용된 Repository이다.
동시성 이슈가 있을 수 있는 경우는 ConcurrentHashMap, AtomicLong 을 사용해줘야 한다.
싱글톤을 만들 때는 private으로 생성자를 막아야 한다.
기본 생성자를 넣은 이유는 ID를 DB에
아무나 생성하지 못하도록 막아야 하기 때문에, 기본 생성자를 private으로 막아줘야 한다.
싱글톤을 썼기 때문에 변수 선언부에 static 을 쓰지 않아도 된다,
이렇게 회원 저장소는 싱글톤 패턴을 적용했다.
스프링을 사용하면 스프링 빈으로 등록하면 되지만,
지금은 최대한 스프링 없이 순수 서블릿 만으로 구현하는 것이 목적이다.
싱글톤 패턴은 객체를 단 하나만 생생해서 공유해야 하므로 생성자를 private 접근자로 막아둔다.
현재 화면에서 Ctrl + Shift + T 를 누르면
테스트를 할 수 있는 디렉터리로 넘어가서 테스트 클래스를 만들게 된다.
테스트 코드 작성하는 방법이 있다..
void test() {
// given - 조건이 주어졌을 때
// when - 주어지는 경우에 따라
// then - 처리 방법을 작성
}
package helloMVC.servlet.domain.member;
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Test;
import java.util.List;
import static org.assertj.core.api.Assertions.*;
import static org.junit.jupiter.api.Assertions.*;
class MemberRepositoryTest {
MemberRepository memberRepository = MemberRepository.getInstance();
// 스프링을 쓰면 싱글톤을 쓸 필요가 없다
// 스프링이 알아서 싱글톤을 제공해주기 때문이다.
@AfterEach
void afterEach() {
memberRepository.clearStore();
}
@Test
void save() {
// given
Member member = new Member("hello", 20);
// when
Member saveMember = memberRepository.save(member);
// then
Member findMember = memberRepository.findById(saveMember.getId());
assertThat(findMember).isEqualTo(saveMember);
}
@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
assertThat(result.size()).isEqualTo(2);
assertThat(result).contains(member1, member2);
}
}
여기서 Assertions 의 assertThat 이라는 static 함수가 있다.
Asstions.assertThat 에 마우스를 올리면 위처럼 노란 전구가 뜨는데
Add on-demand static import 를 하면 된다.
테스트 코드 실행 결과 모두 정상이다.
만약에 일치하지 않는다거나, 포함되지 않았다면 Fail이 나왔을 것이다.
'스프링 > 스프링 웹' 카테고리의 다른 글
[Spring] JSP로 회원 관리 웹 애플리케이션 만들기 (0) | 2023.05.20 |
---|---|
[Spring] 회원 관리 웹 애플리케이션 서블릿으로 만들기 (0) | 2023.05.19 |
[Spring] HTTP 응답 데이터 - API JSON (0) | 2023.05.18 |
[Spring] HTTP 응답 데이터 - 단순 텍스트, HTML (0) | 2023.05.18 |
[Spring] HttpServletResponse - 기본 사용법 (0) | 2023.05.18 |
댓글