์๋ธ๋ฆฟ ์ปจํ ์ด๋ ๋์ ๋ฐฉ์
์คํ๋ง๋ถํธ๊ฐ ๋ด์ฅ๋ ํฐ์บฃ์๋ฒ๋ฅผ ๋์ฐ๊ณ ํด๋ผ์ด์ธํธ๊ฐ ์์ฒญ์ ๋ณด๋ด๋ฉด ์์ฒญ์ request, response๊ฐ์ฒด๋ก ๋ง๋ค์ด์ Servlet๊ฐ์ฒด๋ฅผ ๋ง๋ ๋ค.
์ด Servelt๊ฐ์ฒด๋ฅผ ๊ด๋ฆฌํ๋ ๊ฒ์ด ์๋ธ๋ฆฟ ์ปจํ ์ด๋์ด๋ค.
HTTP ์์ฒญ ๋ฉ์์ง๋ฅผ ์๋ธ๋ฆฟ์ด HttpServletRequest๊ฐ์ฒด๋ก ๋ด์์ ์ฌ์ฉํ๊ฒ ํธ๋ฆฌํ๊ฒ ํด์ค๋ค.
`HttpServletRequest` => [๋ฉ์๋, URL์ ๋ณด, ์ฟผ๋ฆฌ์คํธ๋ง // ํค๋ // Body]์ ๊ฐ์ ์์ฒญ๋ฉ์์ง๋ฅผ ํธ๋ฆฌํ๊ฒ ์ฌ์ฉ.
๊ฐ์ ์์ฒญ์ ๊ฐ์ ์์ ์ ์ฅํ ์ ์๋ ๊ณต๊ฐ์ ์ ๊ณตํ๋ฉด ์ธ์ ๊ด๋ฆฌ๋ ์ ๊ณตํ๋ค.
HTTP ์์ฒญ ๋ฐ์ดํฐ ๋ฐฉ์ 3๊ฐ์ง
- GET - ์ฟผ๋ฆฌํ๋ฆฌ๋ฏธํฐ `ex) url?username=hello?age=20`
- POST - HTML FORM
- ๋ฉ์์ง ๋ฐ๋์ ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ ํ์์ผ๋ก ์ ๋ฌ. (content-type: application/x-www-form-urlencoded)
- HTTP Message Body
- JSON, XML, TEXT
์์ฒญ์ ๋ฉ์์ง ๋ฐ๋์ ๊ฐ์ ๊บผ๋ด์ด ์ฌ์ฉํ๊ธฐ
์ฟผ๋ฆฌ์คํธ๋ง์ `request.getParameter(value)`๋ก ๊ฐ์ ๊บผ๋ผ ์ ์๋ค.
๊ทธ๋ ๋ค๋ฉด ๋ฉ์์ง ๋ฐ๋์ ์๋ ๊ฐ์ ์๋ธ๋ฆฟ์์ ์ด๋ป๊ฒ ๊บผ๋ผ ์ ์์๊น?
๋จผ์ content-type์ด x-www-form-urlencodedํ์์ธ ๋ฐ์ดํฐ๋ request.getParamter()๊ฐ ์ด๋ฅผ ์ง์ํ๋ฏ๋ก ๊ทธ๋๋ก ์ฌ์ฉํ ์ ์๋ค.
๋ค์์ application/json, text ๋ฐฉ์๋ค์ด๋ค.
text๋ request์์ inputStream()์ ๊บผ๋ด์ด Stringํ์์ ๋ฐ๋๋ฅผ ๋ง๋ค ์ ์๋ค.
ServletInputStream inputStream = request.getInputStream();
String messageBody = StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8);
json์ key, valueํํ์ด๋ฏ๋ก ๋จผ์ ํ์ฑํ ์ ์๋ ๊ฐ์ฒด๋ฅผ ์์ฑํ์. ์ดํ ObjectMapper๋ฅผ ํตํด ๊ฐ๋จํ Body๋ฅผ ๊ฐ์ฒด๋ก ๋ณํ์ํฌ ์ ์๋ค.
HelloData helloData = objectMapper.readValue(messageBody, HelloData.class);
HttpServletResponse
๋ฐํํ ๋ฐ์ดํฐ์ content-type๊ณผ ์ฟ ํค, redirect, ์ธ์ฝ๋ฉ ์ ๋ณด๋ฑ์ ์ค์ ํ ์ ์๋ค.
jsonํํ์ ๊ฐ์ ์๋ต์ ๋ด์ ๋๋ `objectMapper.writeValueAsString()`๋ฅผ ์ด์ฉํด ๊ฐ์ฒด๋ฅผ Stringํํ๋ก ๋ณํ ํ ๋ฐํํ๋ค.
ํ ํ๋ฆฟ ์์ง
์๋ฐ์ฝ๋์ HTML๋ฃ์ด์ ์ฝ๋ฉํ๋ ๊ฒ์ ๋งค์ฐ ๋ณต์กํ๊ณ ๋นํจ์จ์ ์ด๋ค.
ํ ํ๋ฆฟ ์์ง์ผ๋ก ์๋ฐ ์ฝ๋๋ก HTML์ ๋ง๋ค์ด ๋ด๋ ๊ฒ ๋ณด๋ค ์ฐจ๋ผ๋ฆฌ HTML ๋ฌธ์์ ๋์ ์ผ๋ก ๋ณ๊ฒฝํด์ผ ํ๋ ๋ถ๋ถ๋ง ์๋ฐ ์ฝ๋๋ฅผ ๋ฃ์ ์ ์๋ค๋ฉด ๋ ํธ๋ฆฌํ ๊ฒ์ด๋ค.
ํ ํ๋ฆฟ ์์ง์ ์ฌ์ฉํ๋ฉด HTML๋ฌธ์์๋ค๊ฐ ์ฝ๋๋ฅผ ์ ์ฉํด์ ๋์ ์ผ๋ก ๋ฌธ์๋ฅผ ๋ณ๊ฒฝ์ํฌ ์ ์๋ค. (JSP, Thymeleaf, Freemarker)
ํ์ง๋ง ์๋ฐ์ฝ๋์ HTML์ ์ฌ์ฉํ์ ๋์ ํ ํ๋ฆฟ์์ง์ ์ฝ๋๋ฅผ ์ ์ฉํ์ ๋ ํ๊ณ์ ์ด ์กด์ฌํ๋ค.
๋ฐ๋ก ๋ทฐ๋ฅผ ์์ฑํ๋ ๋ก์ง๊ณผ ๋น์ฆ๋์ค ๋ก์ง์ด ํ ํ์ผ์์ ์ด๋ค์ง๊ณ ์๋ค๋ ์ ์ด๋ค. ์ด๋ ๊ฒ ๋๋ฉด ๋๋ฌด ๋ง์ ์ญํ ์ ํ๋์ ํ์ผ์ด ๋ด๋นํ๊ฒ ๋๊ธฐ ๋๋ฌธ์ ์ ์ง๋ณด์ํ๊ธฐ ๋งค์ฐ ์ด๋ ค์์ง๋ค.
MVC ํจํด
๋น์ฆ๋์ค ๋ก์ง์ ์๋ธ๋ฆฟ ์ฒ๋ผ ๋ค๋ฅธ๊ณณ์์ ์ฒ๋ฆฌํ๊ณ , JSP๋ ๋ชฉ์ ์ ๋ง๊ฒ HTML๋ก ํ๋ฉด(View)์ ๊ทธ๋ฆฌ๋ ์ผ์ ์ง์คํ๋๋ก ํ์.
- JSP์๊ฒ ๋๋ฌด ๋ง์ ์ญํ ์ ํ ๋นํ์ง๋ง์. (๋๋ฌด ๋ง์ ์ญํ ์.. ๊ทธ ๊ฐ์ฒด๊ฐ ํ๋์ผ์ ์๊ธฐ ์ด๋ ต๊ฒ ๋ง๋ ๋ค)
- ๋ทฐ ์ ๋น์ฆ๋์ค ๋ก์ง ์ ๋ถ๋ฆฌํ์! (๊ฐ์์ ์ญํ ์ ์ง์คํ์)
'๋ทฐ'์ '๋น์ฆ๋์ค๋ก์ง'์ ๋ณ๊ฒฝ์ฃผ๊ธฐ๋ ์๋ก ๋ค๋ฅด๋ค. ๋ฐ๋ผ์ ์ด ๋๊ฐ๋ฅผ ํ๋๋ก ๊ด๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ์ ๋ ์ข์ ๋ฐฉ๋ฒ์ด ์๋๋ค. ๋ทฐ ์ฝ๋๋ง ๋ณด๊ณ ์์ ํด๋ ๋ ์ผ์ ๋น์ฆ๋์ค ๋ก์ง๊น์ง ๋ด์ผํ๊ฒ ๋๋ฏ๋ก ์ ์ง๋ณด์ํ๊ธฐ ์ข์ง ์๋ค.
- ์ปจํธ๋กค๋ฌ: HTTP ์์ฒญ์ ๋ฐ์์ ํ๋ผ๋ฏธํฐ๋ฅผ ๊ฒ์ฆํ๊ณ , ๋น์ฆ๋์ค ๋ก์ง์ ์คํํ๋ค. ๊ทธ๋ฆฌ๊ณ ๋ทฐ์ ์ ๋ฌํ ๊ฒฐ๊ณผ ๋ฐ์ดํฐ๋ฅผ ์กฐํํด์ ๋ชจ๋ธ์ ๋ด๋๋ค.
- ์์ฒญ์ด ์ฌ๋ฐ๋ฅธ์ง ์ฒดํฌ - ์ฌ๋ฐ๋ฅด์ง ์๋ค๋ฉด ์๋น์ค๋ก ๋ณด๋ด์ง ์์.
- ์ปจํธ๋กค๋ฌ๊ฐ ๋๋ฌด ๋ง์ ์ญํ ์ ๋ด๋นํ์ง ์๋๋ก '๋น์ฆ๋์ค ๋ก์ง'์ด ์กด์ฌํ๋ ์๋น์ค ๊ณ์ธต์ ๋ง๋ ๋ค.
- ๋ชจ๋ธ: ๋ทฐ์ ์ถ๋ ฅํ ๋ฐ์ดํฐ๋ฅผ ๋ด์๋๋ค. ๋ทฐ๊ฐ ํ์ํ ๋ฐ์ดํฐ๋ฅผ ๋ชจ๋ ๋ชจ๋ธ์ ๋ด์์ ์ ๋ฌํด์ฃผ๋ ๋๋ถ์ ๋ทฐ๋ ๋น์ฆ๋์ค ๋ก์ง์ด๋ ๋ฐ์ดํฐ ์ ๊ทผ์ ๋ชฐ๋ผ๋ ๋๊ณ , ํ๋ฉด์ ๋ ๋๋ง ํ๋ ์ผ์ ์ง์คํ ์ ์๋ค.
- ๋ทฐ: ๋ชจ๋ธ์ ๋ด๊ฒจ์๋ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํด์ ํ๋ฉด์ ๊ทธ๋ฆฌ๋ ์ผ์ ์ง์คํ๋ค. ์ฌ๊ธฐ์๋ HTML์ ์์ฑํ๋ ๋ถ๋ถ์ ๋งํ๋ค.
MVC์์ Controller์ฝ๋ ์ดํด๋ณด๊ธฐ
@RestController
@RequiredArgsConstructor
@WebServlet(name = "mvcMemberListServlet", urlPatterns = "/servlet-mvc/ members")
public class MvcMemberListServlet extends HttpServlet {
private MemberRepository memberRepository = MemberRepository.getInstance();
@Override
protected void service(HttpServletRequest request, HttpServletResponse
response) throws ServletException, IOException {
List<Member> members = memberRepository.findAll();
request.setAttribute("members", members);
String viewPath = "/WEB-INF/views/members.jsp";
RequestDispatcher dispatcher = request.getRequestDispatcher(viewPath);
dispatcher.forward(request, response);
}
}
ํ์ฌ MVC ํจํด์ ์ฌ์ฉํด๋ณด๋ฉด ๋ทฐ๋ ํ๋ฉด์ ๊ทธ๋ฆฌ๊ณ ๋ชจ๋ธ์ ๋ฐ์ดํฐ๋ฅผ ๋ณด๊ดํ๋ ๋ช ํํ ์ญํ ์ ๊ฐ์ง๋ค. ํ์ง๋ง Controller์ฝ๋๋ฅผ ์ดํด๋ณด๋ฉด
๋น์ฆ๋์ค ๋ก์ง์ ์ฒ๋ฆฌํ๊ณ ๋ชจ๋ธ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ณ view์ ์์น๋ฅผ ์ค์ ํ๋ ๋ง์ ์ญํ ์ ๊ฐ์ง๊ณ ์๋ค.
์ฌ๊ธฐ์ view๋ก ์ด๋ํ๋ ์ฝ๋๋ ์ค๋ณต์ฝ๋๋ก ๋ฐ๋ก ์ฒ๋ฆฌํ ์ ์์ ๊ฒ ๊ฐ๋ค. ์ด๋ฅผ ๊ณตํต ๋ฉ์๋ ์ฌ์ฉํ๋ฏ์ด ์๋ค์์ ์ฒ๋ฆฌํ๊ณ ์ถ๋ค๋ฉด ์ด๋ป๊ฒ ํด์ผํ ๊น?
-> ์ปจํธ๋กค๋ฌ ํธ์ถ์ ์ ๊ณตํต ๊ธฐ๋ฅ์ ์ฒ๋ฆฌํ๋ 'ํ๋ก ํธ ์ปจํธ๋กค๋ฌ' ํจํด์ ๋์ ํด๋ณด์..!
๋ค์์๋ ํ๋ก ํธ ์ปจํธ๋กค๋ฌ๊ฐ ๋ฌด์์ด๊ณ ์ด๋ป๊ฒ ๋์ํ๋์ง์ ๋ํด ์์๋ณด๋ ค๊ณ ํ๋ค.