์น์ 4๋ ์์ฃผ ๊ฐ๋จํ ํ์๊ด๋ฆฌ ์น์ ๋ง๋ค์๋ค. ์ฒ์์๋ ์๋ธ๋ฆฟ์ผ๋ก ํด๋ณด๊ณ JSP, SpringMVC๋ฅผ ์ฐจ๋ก๋ก ์ดํด๋ดค๋ค. ์๋ธ๋ฆฟ๊ณผ JSP๋ก ๋ง๋ ์ฝ๋์๋ ์ด๋ค ๋ถํธํ ์ ์ด ์๋์ง, SpringMVC๋ ์ด๋ป๊ฒ ๋์ํ๋์ง ์ดํด๋ณด๋ฉฐ ์๋ธ๋ฆฟ๊ณผ JSP์ ๋ฌธ์ ์ ์ ์ด๋ป๊ฒ ๋ณด์ํ๋์ง ์ดํด๋ดค๋ค.
โ๏ธ
์๋ชป๋ ์ ๋ณด๊ฐ ์์ ์ ์์ต๋๋ค
โ๏ธ ํ์ ๊ด๋ฆฌ ์น ์ ํ๋ฆฌ์ผ์ด์ ์๊ตฌ์ฌํญ
- ํ์ ๊ด๋ฆฌ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ค๊ธฐ ์ํด์ username๊ณผ age๋ฅผ ์ ๋ณด๋ก ๊ฐ์ง๋ค.
- ํ์ ์ ์ฅ๊ณผ ํ์ ๋ชฉ๋ก์ ์กฐํํ ์ ์๋ ํด๋์ค๋ฅผ ๋ง๋ ๋ค.
โบ Memeber.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;
}
}
Member ํด๋์ค์์ getter, setter๋ฅผ ํตํด ๋ค์ด์จ ๋ฐ์ดํฐ๋ฅผ ๋ฃ๊ณ ๋บ ์ ์๋ค. ์์ฑ์ Member์๋ username๊ณผ age๋ฅผ ๋ด๋๋ค. id๋ ์๋ณ์๋ก ๋ฆฌํฌ์งํ ๋ฆฌ์ ์ ์ฅํ ๋ ๋ฐ๊ธ๋๋ค.
Q. ๊ธฐ๋ณธ ์์ฑ์๋ฅผ ๋ง๋ ์ด์ ๊ฐ ๋ฌด์์ผ๊น?
A. ํ๋ผ๋ฏธํฐ๋ฅผ ๊ฐ๋ ์์ฑ์ ์ธ์ ๊ธฐ๋ณธ ์์ฑ์๋ฅผ ๋ง๋ ์ด์ ๋ JSON ๋ณํ์ด๋ ์คํ๋ง์์ ๊ฐ์ฒด๋ฅผ ์๋ ์์ฑํ ๋ ๊ผญ ํ์ํ๊ธฐ ๋๋ฌธ์ด๋ค. ์๋ฐ๋ ์์ฑ์๋ฅผ ํ๋๋ ์๋ง๋ค๋ฉด ์์์ ๊ธฐ๋ณธ ์์ฑ์๋ฅผ ๋ง๋ค์ด์ค๋ค. ๊ทผ๋ฐ ์์ ์ฝ๋์ฒ๋ผ ์์ฑ์๊ฐ ๋ง๋ค์ด์ง ๊ฒฝ์ฐ ์๋ฐ๋ ๊ธฐ๋ณธ ์์ฑ์๋ฅผ ๋ง๋ค์ง ์๊ธฐ ๋๋ฌธ์, ๋ด๋ถ์์ ๊ธฐ๋ณธ ์์ฑ์๊ฐ ํ์ํ ๊ฒฝ์ฐ ์ค๋ฅ๊ฐ ๋ฐ์ํ ์ ์๋ค. ๊ทธ๋ฌ๋ ํ๋ผ๋ฏธํฐ๊ฐ ์๋ ์์ฑ์๋ฅผ ๋ง๋ค๋ ํญ์ ๊ธฐ๋ณธ ์์ฑ์๋ ๊ฐ์ด ๋ง๋๋ ์ต๊ด์ ๋๋ฉด ์ข์ ๋ฏ ํ๋ค.
โบ MemeberRepository.class
private static Map<Long, Member> store = new HashMap<>();
id๊ฐ ํค๊ฐ ๋๊ณ Member(๋ฐ์ดํฐ, ๊ฐ์ฒด)๊ฐ ๊ฐ์ด ๋๋ค. ๋ค์ด์จ ์ฌ๋ฌ ๊ฐ์ฒด๋ฅผ ๋น ๋ฅด๊ฒ ์ ์ฅํ๊ณ ๊ตฌ๋ถํ์ฌ ๊ด๋ฆฌํ๊ธฐ ์ํด HashMap์ ์ฌ์ฉํ๋ค. HashMap์ด ํค-๊ฐ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ์๋ฃ๊ตฌ์กฐ์ด๋ค.
private static long sequence = 0L;
public Member save(Member member) {
member.setId(++sequence);
store.put(member.getId(), member);
return member;
}
Member ํด๋์ค์์ ์์ฑ์ Member๋ username๊ณผ age๋ฅผ ๊ฐ์ง๋๋ก ์ ์ํ๋ค. ์ฌ์ฉ์๊ฐ uesername๊ณผ age๋ฅผ ์ ๋ ฅํ๋ฉด ๊ทธ ์ ๋ณด๊ฐ Member ํ์ ์ผ๋ก ํฌ์ฅ๋๋ค. Member ํ์ ์ผ๋ก ํฌ์ฅ๋ ๊ฑธ save์์ ์ ์ฅํ๋ค. save๊ฐ ์๋ํ๋ฉด member.setId(++sequence)์ผ๋ก ์ธํด 0L์ด ์ฆ๊ฐํ์ฌ id์ ์ฆ๊ฐํ ๊ฐ์ด ์๋ก ์ธํ ๋๋ค. ๊ทธ ํ ์ ์ฅ์์ธ store์ ์ฆ๊ฐํ id ๊ฐ์ ๊บผ๋ด์ key ๊ฐ์ผ๋ก ์ฃผ๊ณ , member(์ด๋ฆ๊ณผ ๋์ด ๋ฐ์ดํฐ)๋ฅผ value๋ก ๋ฃ๋๋ค.
- return ์ ๋ฆฌ
2. return
๐ชฝ"ํ๋ฆฐ ๋ด์ฉ์ด ์์ ์ ์์ผ๋ฉฐ, ๊น์ํ ์ ์๋์ Spring MVC 1์ ์์ฃผ๋ก ๊ณต๋ถํ์ต๋๋ค." โถ MemberRepositoyTest.class (๋ณ๊ฒฝ๋ ์ฝ๋)Member member1 = new Member("hello", 20);Member member2 = new Member("spring", 10);Member save
post-this.tistory.com
public Member findById(Long id) {
return store.get(id);
}
public List<Member> findAll() {
return new ArrayList<>(store.values());
}
public void clearStore() {
store.clear();
}
findById ๋ฉ์๋๋ id๋ฅผ ์ฃผ๊ณ id์ ๋ง๋ ๋ฐ์ดํฐ๋ฅผ ๋ฐํํ๋ค. findAll ๋ฉ์๋๋ store์ ์๋ values์ ๊ฐ์ ArrayList ํํ๋ก ๋ฐํํ๋ค. ๋ชฉ๋ก์ ํํ๋ก ๋ณด์ฌ์ฃผ๊ธฐ ์ํด ArrayList๋ฅผ ์ฌ์ฉํ๋ค. clearStore ๋ฉ์๋๋ store๋ฅผ ์ง์์ฃผ๋ ๊ฒ์ด๋ค. ํ ์คํธ๋ฅผ ํ๊ธฐ ์ํด ์์๋ก ์ ์ฅํ ๋ฐ์ดํฐ๋ค์ ํ ์คํธ๊ฐ ๋๋๋ฉด ๋ฐ์ดํฐ๋ฅผ ์ง์ฐ๋ ์ฉ๋๋ก ์ฌ์ฉํ๋ค.
โบ MemeberRepositoryTest.class
@afterEach
: ํ ์คํธ ์คํ ํ ๋ฌด์กฐ๊ฑด ์คํ๋๋ค.
@AfterEach
void afterEach() {
memberRepository.clearStore();
}
ํ ์คํธ ์คํ์ด ๋๋๋ฉด ์ ์ฅํ๋ ๋ฐ์ดํฐ๋ฅผ ์ญ์ ํ๋ค.
asserThat( ).contains( )
: ์ค๋ณต๊ณผ ์์์ ์๊ด์์ด ๊ฐ๋ค์ด ์์ผ๋ฉด ๋๋ค.
assertThat(result).contains(member1, member2);
member1๊ณผ member2๊ฐ result์ ์์ผ๋ฉด ํ ์คํธ๊ฐ ์ฑ๊ณตํ๋ค.
โ๏ธ ์๋ธ๋ฆฟ์ผ๋ก ํ์ ๊ด๋ฆฌ ์น ์ ํ๋ฆฌ์ผ์ด์ ๋ง๋ค๊ธฐ
- ์๋ธ๋ฆฟ์ผ๋ก ํ์ ๋ฑ๋ก HTML ํผ์ ๋ง๋ค์.
โบ MemeberSaveServlet.class
- ํ ๋ช ์ ํ์๋ง ๋ณด์ธ๋ค.
String username = request.getParameter("username");
int age = Integer.parseInt(request.getParameter("age"));
Member member = new Member(username, age);
System.out.println("member = " + member);
memberRepository.save(member);
request๋ฅผ ํตํด username๊ณผ age์ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์จ๋ค. ๊ทธ๋ฐ๋ฐ getParameter๋ ๋ฌธ์์ด๋ก ๋ฐ์์ค๊ธฐ ๋๋ฌธ์ ์ ์ํ์ธ age๋ Integer.parseInt๋ก ๋ฌธ์์ด๋ก ๋ฐ์์จ ๊ฐ์ ์ ์ํ์ผ๋ก ๋ฐ๊ฟ age์ ๋ฃ๋๋ค. ๊ทธ๋ ๊ฒ ๋ฐ์์จ ๋ฐ์ดํฐ๋ฅผ member์ ๋ฃ์ ํ save ๋ฉ์๋๋ก store์ ์ ์ฅํ๋ค.
"<ul>\n" +
" <li>id="+member.getId()+"</li>\n" +
" <li>username="+member.getUsername()+"</li>\n" +
" <li>age="+member.getAge()+"</li>\n" +
"</ul>\n" +
์ฝ๋๋ก ๋์ ํ๋ฉด์ ๊ฐ๋จํ๊ฒ ๋ง๋ค์๋ค. get์ ํตํด ์ ์ฅ๋์ ๋ฐ์ดํฐ์ id, username, age๋ฅผ ํ๋ฉด์ ๋ณด์ด๋๋ก ํ๋ค.
โบ MemeberListServlet.class
- ๋ชจ๋ ๋ฆฌ์คํธ๋ฅผ ๊ฐ์ ธ์จ๋ค.
List<Member> members = memberRepository.findAll();
findAll ๋ฉ์๋๋ฅผ ํตํด ์ ์ฅ๋ ๋ชจ๋ ํ์์ ๊บผ๋ผ ์ ์๋๋ก ํ๋ค. ๋ฐฐ์ด ํํ๋ก ๋ชจ๋ ๋ชฉ๋ก์ ๊บผ๋ด๋ฉฐ ํฌ๊ธฐ๋ ๋์ ์ผ๋ก ์กฐ์ ๋๋๋ก ํ๊ธฐ์ํด List๋ก ์ค์ ํ๋ค.
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>");
}
for๋ฌธ์ ํตํด List๋ก ๊ฐ์ ธ์จ members๋ฅผ member์ ๋ฃ์ด ์ถ๋ ฅ์ํจ๋ค. ์ด๋ ๊ฒ ์๋ธ๋ฆฟ๊ณผ ์๋ฐ ์ฝ๋๋ง์ผ๋ก HTML์ ๋ง๋ค์๋๋ ์ฝ๋๊ฐ ๋ณต์กํ๊ณ ๋นํจ์จ์ ์ด๋ค. ํ ํ๋ฆฟ ์์ง์ ์ฌ์ฉํ์ฌ HTML ๋ฌธ์์์ ํ์ํ ๊ณณ๋ง ์ฝ๋๋ฅผ ์ ์ฉํ์ฌ ๋์ ์ผ๋ก ๋ณ๊ฒฝํด๋ณด์.
โ๏ธ JSP๋ก ํ์ ๊ด๋ฆฌ ์น ์ ํ๋ฆฌ์ผ์ด์ ๋ง๋ค๊ธฐ
- JSP๋ก ํ์ ๋ฑ๋ก HTML ํผ์ ๋ง๋ค์.
โบ new-form.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
JSP ๋ฌธ์๋ผ๋ ๋ป์ ์ฒซ ์ค์ ์ ์ด์ค์ผํ๋ค.
<form action="/jsp/members/save.jsp" method="post">
username: <input type="text" name="username" />
age: <input type="text" name="age" />
<button type="submit">์ ์ก</button>
ํ์๋ฆฌํ๋ฅผ ์ฌ์ฉํด๋ณธ์ ์๋ค๋ฉด ๋งค์ฐ ์ ์ฌํ์ฌ ์ฝ๊ฒ ์ดํดํ ์ ์์ ๊ฒ์ด๋ค. action์ ๊ฒฝ๋ก๋ฅผ ์ ์ด์ฃผ๊ณ method์ ๋ฐ์ดํฐ ์ ์ก ๋ฐฉ์์ ์ ์ด์ค๋ค. ์ ์๊ฐ์ ๋ฐฐ์ ๋ฏ์ด GET ๋ฐฉ์๊ณผ POST ๋ฐฉ์, API JSON ๋ฐฉ์์ด ์๋๋ฐ ์ฌ๊ธฐ์๋ body์ ๋ฐ์ดํฐ๋ฅผ ์ ์ด๋ณด๋ด๋ post ๋ฐฉ์์ ์ฌ์ฉํ๋ค.
โบ save.jsp
<%
MemberRepository memberRepository = MemberRepository.getInstance();
System.out.println("MemberSaveServlet.service");
String username = request.getParameter("username");
int age = Integer.parseInt(request.getParameter("age"));
Member member = new Member(username, age);
System.out.println("member = " + member);
memberRepository.save(member);
%>
<% %> ๋ JSP ํ๊ทธ๋ก ์ด ์์ ์๋ฐ ์ฝ๋๋ฅผ ์ ๋ ฅํ ์ ์๋ค. ํ์ฌ ์ฝ๋์ request์ response๊ฐ ์๋๋ฐ, service๋ jsp ๋ด์์ ์ฌ์ฉ ๊ฐ๋ฅํ์ฌ ์ฝ๋์ ๋ช ์ํ์ง ์์๋ ์์์ service ๋ก์ง์ ํธ์ถํ์ฌ ์๋ธ๋ฆฟ์ผ๋ก ๋ณํํ๋ค.
<li>id=<%=member.getId()%></li>
<li>username=<%=member.getUsername()%></li>
<li>age=<%=member.getAge()%></li>
<%=%>๋ ๊ฒฐ๊ณผ๊ฐ์ ํธ์ถ(์ถ๋ ฅ)ํ๋ JSP ํ๊ทธ์ด๋ค. ์ฌ์ ํ ์๋ฐ ์ฝ๋์ ๋ถ๋ฆฌ๋์ง ์์ ์์ ์ด ๋ณต์กํ๊ฒ ๋ณด์ธ๋ค. ๋น์ฐํ๊ฒ ๋ณต์กํ ์ฝ๋๋ ์ ์ง๋ณด์๋ ์ด๋ ต๋ค.