아래 코드를 보면 스프링부트에선 당연하게 제공해주는 서블릿을 우리는 직접 @WebServlet으로 서블릿 흉내를 내며 name = 서블릿 이름 , url = /~ → controller 로 구현해봤다!
앞에서 봤듯이 HttpServletRequest 로 요청 들어오는 파라미터를 가로채서 변수에 넣을 수 있다! 그걸로 레포지토리( 참고로 아래는 레포지토리 로직. @Repository 에서 JPA 로직 쓰는거처럼 흉내내기 위해 아래처럼 getId(), save(), findAll() 직접 구현함!!!)에서 save하고 생성하고!! MVC 느낌 물씬 난다~! 안그러냐!!
아래선 바보같이 html 에서 동적으로 쓰려고 중간에 member.getId() 이런식으로 쓰는데 이를 개선하기 위해 나온것이 템플릿 엔진 typeleaf, jsp(사장됨) → jsp는 몰라도 되는데 typeleaf는 친숙해지자!!!
package hello.servlet.basic.web.servlet;
import hello.servlet.basic.domain.member.Member;
import hello.servlet.basic.domain.member.MemberRepository;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet(name = "memberSaveServlet", urlPatterns = "/servlet/members/save")
public class MemberSaveServlet extends HttpServlet {
    MemberRepository memberRepository = MemberRepository.getInstance();
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String username = request.getParameter("username");
        int age = Integer.parseInt(request.getParameter("age"));
        Member member = new Member(username, age);
        memberRepository.save(member);
        response.setContentType("text/html");
        response.setCharacterEncoding("utf-8");
        PrintWriter w = response.getWriter();
        w.write("<html>\\n" +
                "<head>\\n" +
                " <meta charset=\\"UTF-8\\">\\n" +
                "</head>\\n" +
                "<body>\\n" +
                "성공\\n" +
                "<ul>\\n" +
                " <li>id="+member.getId()+"</li>\\n" +
                " <li>username="+member.getUsername()+"</li>\\n" +
                " <li>age="+member.getAge()+"</li>\\n" +
                "</ul>\\n" +
                "<a href=\\"/index.html\\">메인</a>\\n" +
                "</body>\\n" +
                "</html>");
    }
}
	// 참고로 이거는 레포지토리 로직. @Repository 에서 JPA 로직 쓰는거처럼 흉내내기 위해 아래처럼
	// getId(), save(), findAll() 직접 구현함!!!
package hello.servlet.basic.domain.member;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
/**
 * 동시성 문제가 고려되어 있지 않음, 실무에서는 ConcurrentHashMap, AtomicLong 사용 고려
 */
public class MemberRepository {
    private  Map<Long, Member> store = new HashMap<>();
    private  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();
    }
}