Member class와 Member 등록 및 조회 class
@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;
}
}
public class MemberRepository {
/**
* 동시성 문제가 고려되어 있지 않음, 실무에서는 ConcurrentHashMap, AtomicLong 사용 고려
*/
private 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; //방금 등록한 멤버 return
}
public Member findById(Long id){ //멤버 id로 멤버 찾기
return store.get(id);
}
public List<Member> findAll(){
return new ArrayList<>(store.values());
}
public void clearStore(){
store.clear();
}
}
Member 회원 등록 form
@WebServlet(name = "memberFormServlet", urlPatterns = "/servlet/members/new-form")
public class MemberFormServlet extends HttpServlet { // 서블릿 데이터들을 홈페이지에 보여줌
private MemberRepository memberRepository = MemberRepository.getInstance();
// private 으로 new 막아둬서 get instance 로 불러와야 함
@Override // response 데이터 보여주기
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");
}
}
Member 회원(request) 데이터 저장하기
@WebServlet(name = "memberSaveServlet", urlPatterns = "/servlet/members/save")
public class MemberSaveServlet extends HttpServlet {
private MemberRepository memberRepository = MemberRepository.getInstance(); // 저장하려면 멤버 repository 필요함
@Override // request 데이터 받아서 memberRepository에 저장
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("MemberSaveServlet.service");
String username = request.getParameter("username");
int age = Integer.parseInt(request.getParameter("age")); // 나이가 문자 type 이어서 숫자 type 으로 변환
Member member = new Member(username, age);
memberRepository.save(member);
// 저장이 잘 되었는지 보기 위해 응답을 html로 내려줌
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>");
}
}
저장된 Member 회원 데이터 list 출력하기
@WebServlet(name = "memberListServlet", urlPatterns = "/servlet/members")
public class MemberListServlet extends HttpServlet {
private MemberRepository memberRepository = MemberRepository.getInstance();
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
List<Member> members = memberRepository.findAll();
response.setContentType("text/html");
response.setCharacterEncoding("utf-8");
PrintWriter w = response.getWriter();
w.write("<html>");
w.write("<head>");
w.write(" <meta charset=\"UTF-8\">");
w.write(" <title>Title</title>");
w.write("</head>");
w.write("<body>");
w.write("<a href=\"/index.html\">메인</a>");
w.write("<table>");
w.write(" <thead>");
w.write(" <th>id</th>");
w.write(" <th>username</th>");
w.write(" <th>age</th>");
w.write(" </thead>");
w.write(" <tbody>");
/*
w.write(" <tr>");
w.write(" <td>1</td>");
w.write(" <td>userA</td>");
w.write(" <td>10</td>");
w.write(" </tr>");
*/
for (Member member : members) {
w.write(" <tr>");
w.write(" <td>" + member.getId() + "</td>");
w.write(" <td>" + member.getUsername() + "</td>"); w.write(" <td>" + member.getAge() + "</td>");
w.write(" </tr>");
}
w.write(" </tbody>");
w.write("</table>");
w.write("</body>");
w.write("</html>");
}
}
Model View Controller
컨트롤러: HTTP 요청을 받아서 파라미터를 검증하고, 비즈니스 로직을 실행한다. 그리고 뷰에 전달할 결과 데이터를 조회해서 모델에 담는다.
모델: 뷰에 출력할 데이터를 담아둔다. 뷰가 필요한 데이터를 모두 모델에 담아서 전달해주는 덕분에 뷰는 비즈니스 로직이나 데이터 접근을 몰라도 되고, 화면을 렌더링 하는 일에 집중할 수 있다.
뷰: 모델에 담겨있는 데이터를 사용해서 화면을 그리는 일에 집중한다. 여기서는 HTML을 생성하는 부분을 말한다.
클라이언트 -> Controller -> View
서블릿- 컨트롤러/JSP-뷰로 사용해서 MVC 패턴을 적용하면
-> 공통되는 부분의 처리가 어렵다
-> 컨트롤러 호출 전에 공통 기능을 처리하게 하는 프론트 컨트롤러(Front Controller) 패턴을 도입하면 된다
'개발 > Springboot' 카테고리의 다른 글
[Spring] Type definition error: [simple type, class ~] (0) | 2023.11.04 |
---|---|
[Spring] @WebMvcTest 오류, jpaAuditingHandler 관련 (0) | 2023.10.20 |
[Spring MVC] 1. 웹 애플리케이션의 이해와 서블릿 (HTTP 관련) (0) | 2023.08.18 |
[Spring 핵심 원리 기본편] 8. 빈 생명주기 콜백(@PostConstruct, @PreDestroy) (0) | 2023.08.16 |
[Spring 핵심 원리 기본편] 7. 의존관계 자동 주입(생성자 주입, @Component @Autowired, lombok) (1) | 2023.08.14 |
댓글