서블릿으로 만들기
회원 도메인 모델
@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;
}
}/**
* 동시성 문제가 고려되어 있지 않음, 실무에서는 ConcurrentHashMap, AtomicLong 사용 고려
*/
public class MemberRepository {
// static이어야 딱 하나만 생성된다.
private static Map<Long, Member> store = new HashMap<>();
private static long sequence = 0L;
// 싱글턴으로 생성한다.
// private으로 선언해 아무도 새로 생성하지 못하게 한다.
private static final MemberRepository instance = new MemberRepository();
public static MemberRepository getInstance() {
return instance;
}
// 싱글턴은 객체를 단 하나만 생성해야 하므로 생성자를 private으로 막는다.
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() {
// store의 모든 values를 꺼내서 기존 리스트를 건드리지 않고 새로운 리스트로 반환한다.
return new ArrayList<>(store.values());
}
public void clearStore() {
store.clear();
}
}회원 등록 폼
@WebServlet(name = "memberFormServlet", urlPatterns = "/servlet/members/new-form")
public class MemberFormServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html");
response.setCharacterEncoding("utf-8");
PrintWriter w = response.getWriter();
w.write("<!DOCTYPE html>\n" +
"<html>\n" +
"<head>\n" +
" <meta charset=\"UTF-8\">\n" +
" <title>Title</title>\n" +
"</head>\n" +
"<body>\n" +
"<form action=\"/servlet/members/save\" method=\"post\">\n" +
" username: <input type=\"text\" name=\"username\" />\n" +
" age: <input type=\"text\" name=\"age\" />\n" +
" <button type=\"submit\">전송</button>\n" + "</form>\n" +
"</body>\n" +
"</html>\n");
}
}회원 저장
회원 목록
템플릿 엔진
Last updated