/* ์ด ๊ธ์ ๊น์ํ๋์ ๊ฐ์๋ฅผ ๋ณด๊ณ ์ ๋ฆฌํ๋ ค๊ณ ์์ฑํ ๊ธ์ ๋๋ค.
๊ฐ์ธ์ ์ธ ๊ณต๋ถ๋ฅผ ์ํด ์ฌ๋ฆฌ๋ ๊ธ์ด๋ฏ๋ก ์ค๊ฐ ์ค๊ฐ ์ฝ๋๋ ์๋ต๋์์ต๋๋ค. */
์คํ๋ง MVC 1ํธ - ๋ฐฑ์๋ ์น ๊ฐ๋ฐ ํต์ฌ ๊ธฐ์ | ๊น์ํ - ์ธํ๋ฐ
๊น์ํ | ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋ฐํ ๋ ํ์ํ ๋ชจ๋ ์น ๊ธฐ์ ์ ๊ธฐ์ด๋ถํฐ ์ดํดํ๊ณ , ์์ฑํ ์ ์์ต๋๋ค. ์คํ๋ง MVC์ ํต์ฌ ์๋ฆฌ์ ๊ตฌ์กฐ๋ฅผ ์ดํดํ๊ณ , ๋ ๊น์ด์๋ ๋ฐฑ์๋ ๊ฐ๋ฐ์๋ก ์ฑ์ฅํ ์ ์์ต
www.inflearn.com
1. ์๊ตฌ์ฌํญ ์ ๋ฆฌ
ํ์ ์ ๋ณด : ์ด๋ฆ(username), ๋์ด(age)
๊ธฐ๋ฅ ์๊ตฌ์ฌํญ : ํ์ ์ ์ฅ, ํ์ ๋ชฉ๋ก ์กฐํ
ํ์ ๋๋ฉ์ธ ๋ชจ๋ธ
@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;
}
}
- id๋ Member๋ฅผ ํ์ ์ ์ฅ์์ ์ ์ฅํ๋ฉด ํ์ ์ ์ฅ์๊ฐ ํ ๋นํด์ค๋ค
ํ์ ์ ์ฅ์
public class MemberRepository {
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;
}
public Member findById(Long id){
return store.get(id);
}
public List<Member> findAll() {
return new ArrayList<>(store.values());
}
public void clearStore(){
store.clear();
}
}
- ๋์์ฑ ๋ฌธ์ ๊ฐ ๊ณ ๋ ค๋์ด ์์ง ์์ ์ฝ๋๋ก ์ค๋ฌด์์๋ ConcurrentHashMap, AtomicLong ์ฌ์ฉ ๊ณ ๋ ค
- instance๋ MemberRepository ํด๋์ค์ ์ ์ผํ ์ธ์คํด์ค๋ฅผ ์ ์ฅํ๋ ๋ณ์๋ก static๊ณผ final๋ก ์ ์ธ๋์ด
ํด๋์ค ๋ก๋ ์ ๋ฑ ํ ๋ฒ ์ด๊ธฐํ๋๊ณ ๋ณ๊ฒฝํ ์ ์์. ์ด ๋ณ์๋ฅผ ํตํด Singleton ํจํด์ด ๊ตฌํ๋จ
- getInstance ๋ฉ์๋๋ฅผ ํตํด ํด๋์ค ์ธ๋ถ์์ MemberRepository์ ์ ๊ทผํ ์ ์์
- MemberRepository ์์ฑ์๋ฅผ private๋ก ์ ์ธํ์ฌ ์ธ๋ถ์์ ์ธ์คํด์ค๋ฅผ ์์ฑํ ์ ์๋๋ก ํจ
ํ์ ์ ์ฅ์ ํ ์คํธ
class MemberRepositoryTest {
MemberRepository memberRepository = MemberRepository.getInstance();
@AfterEach
void afterEach() {
memberRepository.clearStore();
}
@Test
void save() {
// Given
Member member = new Member("kim", 20);
// When
Member savedMember = memberRepository.save(member);
//Then
Member findMember = memberRepository.findById(savedMember.getId());
assertThat(findMember);
}
@Test
void findAll() {
// Given
Member member1 = new Member("member1", 20);
Member member2 = new Member("member2", 25);
memberRepository.save(member1);
memberRepository.save(member2);
// When
List<Member> result = memberRepository.findAll();
// Then
assertThat(result.size()).isEqualTo(2);
assertThat(result).contains(member1, member2);
}
}
2. ์๋ธ๋ฆฟ์ผ๋ก ํ์๊ด๋ฆฌ ์น ์ ํ๋ฆฌ์ผ์ด์ ๋ง๋ค๊ธฐ
ํ์ ๋ฑ๋ก ํผ
@WebServlet(name = "memberFormServlet", urlPatterns = "/servlet/member/new-form")
public class MemberFormServlet extends HttpServlet {
private MemberRepository memberRepository = MemberRepository.getInstance();
@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");
}
}
ํ์ ์ ์ฅ
@WebServlet(name="memberSaveServlet", urlPatterns = "/servlet/members/save")
public class MemberSaveServlet extends HttpServlet {
private MemberRepository memberRepository = MemberRepository.getInstance();
@Override
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"));
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>");
}
}
- MemberSaveServlet์ ๋์์์๋
1. ํ๋ผ๋ฏธํฐ๋ฅผ ์กฐํํด์ Member ๊ฐ์ฒด๋ฅผ ๋ง๋ ๋ค
2. Member ๊ฐ์ฒด๋ฅผ MemberRepository๋ฅผ ํตํด ์ ์ฅํ๋ค
3. Member ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํด์ ๊ฒฐ๊ณผ ํ๋ฉด์ฉ HTML์ ๋์ ์ผ๋ก ๋ง๋ค์ด ์๋ตํ๋ค.
ํ์ ๋ชฉ๋ก ์กฐํ
@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>");
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>");
}
}
* ์ง๊ธ๊น์ง ์๋ธ๋ฆฟ๊ณผ ์๋ฐ ์ฝ๋๋ง์ผ๋ก HTML์ ๋ง๋ค์ด ๋ณด์๋ค. ํ์ง๋ง ์ฝ๋์์ ๋ณด๋ฏ ์ด๊ฒ์ ๋งค์ฐ ๋ณต์กํ๊ณ ๋นํจ์จ ์ ์ธ
์ฝ๋์ด๋ค. ์๋ฐ ์ฝ๋๋ก HTML์ ๋ง๋ค์ด ๋ด๋ ๊ฒ ๋ณด๋ค HTML ๋ฌธ์์ ๋์ ์ผ๋ก ๋ณ๊ฒฝํด์ผ ํ๋ ๋ถ๋ถ๋ง ์๋ฐ ์ฝ๋๋ฅผ ๋ฃ์ ์
์๋ค๋ฉด ๋ ํธ๋ฆฌํ ๊ฒ์ด๋ค.
๋ค์ ์๊ฐ์๋ JSP๋ก ๋์ผํ ์์ ์ ์งํํด๋ณด์.