<์ถ์ฒ ์ธํ๋ฐ>
์น์
2์์ ์๋ธ๋ฆฟ์ ๊ดํ ๊ฐ๋
์ ๋ฐฐ์ ๊ณ ์น์
3์์๋ ์ค์ ๋ก ์ด๋ป๊ฒ ๊ตฌํํ๋์ง๋ฅผ ์์๋ณด์๋ค. ์๋ธ๋ฆฟ์ ๊ด๋ จํ ๊ฐ๋จํ ์์ ๋ถํฐ ๊ณผ๊ฑฐ์ ๊ฐ๋ฐ์๋ค์ด HTTP ์์ฒญ์ ์ด๋ป๊ฒ ๋ฐ์์ ์ด๋ป๊ฒ ์๋ต์ ๋ด๋ ธ๋์ง์ ๋ํ ๋ค์ํ ๋ฐฉ์์ ๋ฐฐ์ ๋ค. ํ์ฌ ์ฌ์ฉํ๋ ๋ฐฉ์์ ์๋์ง๋ง SpringMVC๋ก ๋ค์ด๊ฐ๊ธฐ์ ๊ณผ๊ฑฐ์ ์ด๋ป๊ฒ ์ฌ์ฉํ๋์ง๋ฅผ ๋ฐฐ์์ผ๋ก์จ SpringMVC์ ๋ํ ์ดํด๋๋ฅผ ๋์ด๋๋ฐ ๋์์ด ๋ ๊ฐ์์๋ค.
โ๏ธ
์๋ชป๋ ์ ๋ณด๊ฐ ์์ ์ ์์ต๋๋ค
โ๏ธ ์๋ธ๋ฆฟ ๋ฑ๋กํ๊ธฐ
์๋ธ๋ฆฟ์ ํฐ์บฃ ์๋ฒ๋ฅผ ๋ด์ฅํ๊ณ ์์ด, ๋ณ๋์ ์ค์น ์์ด ์๋ธ๋ฆฟ ์ฝ๋๋ฅผ ์คํํ ์ ์๋ค.
โบ ServletApplication.class
@ServletComponentScan
: ์คํ๋ง ๋ถํธ๋ ์๋ธ๋ฆฟ์ ์ง์ ๋ฑ๋กํด์ ์ฌ์ฉํ ์ ์๋๋ก ์ง์ํ๋ค.
@ServletComponentScan
@SpringBootApplication
public class ServletApplication {
public static void main (String[] args) {
SpringApplication.run(ServletApplication.class, args);
}
}
โบ Hello Servlet.class
@WebServlet
: ์๋ธ๋ฆฟ ํด๋์ค๋ฅผ ์๋ณํ๊ณ , URL ๋งคํ ๋ฐ ๊ธฐํ ์ค์ ์ ์ง์ ํ ์ ์๋ค.
@WebServlet(name = "helloServlet", urlPatterns = "/hello")
public class HelloServlet extends HttpServlet {
name์ ์ด๋ฆ์ ์ง์ ํจ์ผ๋ก์, ์๋ธ๋ฆฟ ์ปจํ
์ด๋(Tomcat)๊ฐ ์๋ธ๋ฆฟ์ ์๋ณํ ์ ์๊ฒ ํด์ค๋ค. ์ ์ง ์์๋ ์๋ํ๋๋ฐ ๋ฌธ์ ๋ ์๋ค. ๋ด๋ถ์์ ์๋์ผ๋ก ํด๋์ค ์ด๋ฆ์ name์ ์ง์ ํ๋ค. urlPatterns์ ๋งคํํ URL์ ์ ๋๋ค. ์ด ์ฝ๋์๋ /hello๊ฐ ์ ํ์ ธ์๋๋ฐ, /hello ๊ฒฝ๋ก๊ฐ ์ค๋ฉด ํด๋น ํด๋์ค๊ฐ ์คํํ๊ฒ ๋๋ค. ํ์ฌ๋ GernericServlet์ ์์ ํด๋์ค์ธ HttpServlet์ ์์ํ๋๋ฐ, ์์ ์๋ GernericServlet์ ์์ํ๋ค. GernericServlet์ service ๋ฉ์๋๊ฐ ๋จ์ํ ์คํ๋๊ธฐ์ HTTP ํต์ ๊ณผ ๊ด๋ จ๋ ๋ง์ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ๋ณต์กํ๋ค HttpServlet์ HTTP ์์ฒญ์ ๋ฐ๋ผ service ๋ฉ์๋์ ์คํ์ด 8๊ฐ์ง๋ก ๋๋๋ฉฐ ์ด ๊ฐ์์์๋ GET, POST ๋ฐฉ์์ ๋ฐฐ์ธ ๊ฒ์ด๋ค.
service( )
: ์๋ต์ ๋ํ ๋ด์ฉ์ ๊ตฌํํ๋ฉฐ, Servlet์ด ์์ ํ ๋ชจ๋ request์ ๋ํด service ๋ฉ์๋๊ฐ ํธ์ถ๋๋ค.
getParameter( )
: ํด๋ผ์ด์ธํธ๊ฐ ์ ์กํ HTTP ์์ฒญ์ ๋งค๊ฐ๋ณ์๋ฅผ ๊ฐ์ ธ์ค๋๋ฐ ์ฌ์ฉํ๋ค.
setContentType( )
: ์๋ธ๋ฆฟ์์ ์ง์ ๋ธ๋ผ์ฐ์ ๋ก ์ถ๋ ฅํ๋ ๊ฒฝ์ฐ ์ฌ์ฉํ๋ค.
setCharacterEncoding( )
: ํ๋ผ๋ฏธํฐ๋ก ์ ์ก๋๋ ๋ฐ์ดํฐ๋ฅผ ( ) ๋ฐฉ์์ผ๋ก ์ธ์ฝ๋ฉํ๋ค.
getWriter( ).writer( )
: HTTPServletResponse ๊ฐ์ฒด์์ ์ถ๋ ฅ ์คํธ๋ฆผ(Writer)๋ฅผ ์ป์ด์ค๋ ๋ฉ์๋๋ก ๋ธ๋ผ์ฐ์ ์ ๋ฌธ์ ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ผ ๋ ์ฌ์ฉํ๋ค.
protected void service (HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("HelloServlet.service" );
System.out.println("request = " + request);
System.out.println("response = " + response);
String username = request.getParameter("username" );
System.out.println("username = " + username);
response.setContentType("text/plain" );
response.setCharacterEncoding("utf-8" );
response.getWriter().write("hello " + username);
}
localhost:8080/hello๋ก ๋ค์ด๊ฐ๋ฉด ์น ๋ธ๋ผ์ฐ์ ๊ฐ HTTP ์์ฒญ ๋ฉ์์ง๋ฅผ ๋ง๋ ๋ค. ๊ทธ๋ฆฌ๊ณ ์๋ฒ์ ๋ง๋ ๋ฉ์์ง๋ฅผ ๋์ง๋ค. 1)request์ reponse์ ์ธํฐํ์ด์ค ๊ตฌํ์ฒด๋ค์ด ์ฐํ์ ์ฝ์์ฐฝ์ ์ถ๋ ฅ๋๋ค. ์ฟผ๋ฆฌํ๋ผ๋ฏธํฐ๋ ? ๋ค์ ์ค๋ ๊ฒ์ด๋ค.(์์๋ก http://localhost:8080/hello?username=sori) ์ด ํ๋ผ๋ฏธํฐ๋ฅผ ์ฝ๊ฒ ์ฝ์ ์ ์๋๋ก ์ง์ํด์ฃผ๋ ๊ฒ์ getParameter๊ฐ ํ๋ ์ญํ ์ด๋ค. getParameter๋ ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ๋ฅผ ๊บผ๋ด์ค๋๋ฐ ๊บผ๋ด์จ ๊ฒ์ username์ ๋ฃ์ด ์ถ๋ ฅํ๋ค. 2)๊ฐ๋จํ๊ฒ response.๋ก ์๋ต๋ฉ์์ง๋ฅผ ๋ง๋ค์ด๋ณด์. setContentType("text/plain")์ ์๋ต ๋ฐ์ดํฐ๊ฐ ๋จ์ ๋ฌธ์๋ผ๋ ๊ฒ์ด๊ณ , setCharacterEncoding("utf-8")์ ๋ฌธ์ ์ธ์ฝ๋ฉ์ utf-8๋ก ํ๋ค๋ ๊ฒ์ด๋ค. ์์ฝ๋ฉ์ ์ง์ ํ์ง ์์ผ๋ฉด ํ๊ตญ์ด๋ฅผ ์ ๋๋ก ์ง์ํ์ง ๋ชปํ๋ค. ๊ทธ๋ฆฌ๊ณ ์ด ๋ ์ ๋ณด๋ HTTP ์๋ต ํค๋์ ๋ด๊ฒจ์ ธ ๋ธ๋ผ์ฐ์ ๋ก ์ ๋ฌ๋๋ค. getWriter().write("hello " + username);์ write๋ http ์๋ต ๋ฉ์์ง ๋ฐ๋์ ๋ค์ด๊ฐ๊ฒ ๋๋ค. ์ ๋ฆฌํด๋ณด๋ฉด println์ ๋ด ์ฝ์(์๋ฒ)์์๋ง ํ์ธํ ์ ์๋ ๋ก๊ทธ๊ฐ ๋๋ค. response ๊ฐ์ฒด๋ฅผ ํตํด ์์ฑํ ํ์
๊ณผ ์์ฝ๋ฉ ๊ทธ๋ฆฌ๊ณ write๋ก ์์ฑํ ๋ณธ๋ฌธ ์ ๋ณด๋ ๋ธ๋ผ์ฐ์ ๋ก ์ ์ก๋๊ณ ์ฌ์ฉ์๊ฐ ์ค์ ํ๋ฉด์์ ํ์ธํ ์ ์๊ฒ ๋๋ค.
1) request์ response์ ์ธํฐํ์ด์ค ๊ตฌํ์ฒด ์ถ๋ ฅ ๊ฒฐ๊ณผ
2) response.๋ก ์๋ต๋ฉ์์ง ๋ง๋ค์ด ๋ธ๋ผ์ฐ์ ๋ก ๋ณด๋ธ ๊ฒฐ๊ณผ
Q. protected void service๋ฅผ ๋ถ๋ฌ์ค๋ฉด super.service(request, response) ์ฝ๋๊ฐ ๊ฐ์ด ์ค๋๋ฐ ์ด ์ฝ๋๋ฅผ ๋๋๋ฉด ๋ด๊ฐ ์์ฑํ ์ฝ๋๊ฐ ์ ๋๋ก ์๋ํ์ง ์๋๋ค. ์ ๊ทธ๋ด๊น? A. super๋ ๋ถ๋ชจํด๋์ค์ service( ) ๋ฉ์๋๋ฅผ ์คํํ๊ฒ ํ๊ณ , ๋ถ๋ชจ ํด๋์ค์ service( ) ๋ฉ์๋์๋ HTTP ์์ฒญ ๋ฐฉ์์ ๋ฐ๋ผ doGet(), doPost() ๋ฑ์ด ์๋ค. ์ค๋ฒ๋ผ์ด๋ฉํ์ฌ ์ฝ๋๋ฅผ ์์ฑํ๋ฉด ๋ด๊ฐ ์์ฑํ ์ฝ๋๊ฐ ํ ๋ฒ ์คํ๋๊ณ , ๊ทธ ๋ค์ ๋ถ๋ชจ ํด๋์ค์์ ์คํ๋๋ค. ๋ถ๋ชจ ํด๋์ค์ ๊ธฐ๋ณธ ๋ก์ง์ด ์คํ๋ ํ
๋ ๊ฒฐ๊ตญ ๋ด๊ฐ ์ํ๋ ๊ฒฐ๊ณผ์ ๋ค๋ฅธ ๊ฒฐ๊ณผ๊ฐ ๋์ค๊ฒ ๋๋ค. ์ฌ๊ธฐ์ ์ค๋ฒ๋ผ์ด๋ฉ์ด๋, ๋๊ฐ์ ์ฝ๋์ ๋๊ฐ์ ํ๋ผ๋ฏธํฐ๋ก ์๋ก ์ ์ํ์ฌ ์์ฑํ ๊ฒ์ ๋งํ๋ค.
โ๏ธ HttpServletRequest
HttpServletRequest๋ ์๋ธ๋ฆฟ์ด ํ์ฑํ HTTP ์์ฒญ ๋ฉ์์ง๋ฅผ HttpServletRequest ๊ฐ์ฒด์ ๋ด์์ ์ ๊ณตํ๋ค.
์ด๋ฒ์๋ request ๊ฐ์ฒด์ ๋ด๊ฒจ์๋ ์ ๋ณด๋ค์ ๋ฌด์์ด ์๋์ง ์ถ๋ ฅํด๋ณผ ๊ฒ์ด๋ค.
โบ RequestHeaderServlet .class
protected void service (HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
printStartLine(request);
printHeaders(request);
printHeaderUtils(request);
printEtc(request);
}
private static void printStartLine (HttpServletRequest request) {
System.out.println("request.getMethod() = " + request.getMethod());
System.out.println("request.getProtocol() = " + request.getProtocol());
System.out.println("request.getScheme() = " + request.getScheme());
System.out.println("request.getRequestURL() = " + request.getRequestURL());
System.out.println("request.getRequestURI() = " + request.getRequestURI());
System.out.println("request.getQueryString() = " + request.getQueryString());
System.out.println("request.isSecure() = " + request.isSecure());
}
์๋ธ๋ฆฟ์ด service(HttpServletRequest request, HttpServletResponse response) ๋ฉ์๋๋ฅผ ์คํ์ํจ๋ค. ์ด๋ request์ response ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด์ ๋๊ฒจ์ฃผ๋๋ฐ, request์๋ HTTP ์์ฒญ์ ๋ํ ์ ๋ณด๊ฐ ๋ด๊ฒจ์๊ณ , response์๋ ์๋ฒ๊ฐ ๋ธ๋ผ์ฐ์ ์๊ฒ ์ค ์๋ต ๋ด์ฉ์ ๋ง๋๋๋ฐ ์ฌ์ฉํ๋ค. service ๋ด์ printStartLine(request)๋ฅผ ํธ์ถํ๋ฉด, printStartLine์์ ํ์๋กํ๋ HTTP ์์ฒญ์ ์ ๋ณด๋ฅผ ์ฝ๊ณ , request ๊ฐ์ฒด ์ ๋ณด๋ฅผ ์ ๋ฌํ ํ ์ฝ์์ ์ถ๋ ฅํ๋ค. printStartLine์ด ํ์๋กํ๋ ์ ๋ณด๋ฅผ ์ดํด๋ณด์. getMethod๋ GET์ธ์ง POST ๊ฐ์ HTTP ๋ฉ์๋๋ช
์ด๊ณ getProtocol์ ํ๋กํ ์ฝ ๋ฒ์ , getScheme์ http ๋๋ https, getRequestURL์ ์ ์ฒด ์์ฒญ URL, getRequestURI๋ URI ๊ฒฝ๋ก, getQueryString์ ?๋ค์ ์ค๋ ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ, isSecure์ https ์์ฒญ์ธ์ง ์๋์ง ๋ํ ์๋ต์ ์์ฒญํ๋ ๊ฒ์ด๋ค. ๋ค์ ์ ๋ฆฌํด๋ณด๋ฉด ๋ธ๋ผ์ฐ์ ์ ์์ฒญ์ด ์ค๊ณ ์๋ธ๋ฆฟ ์ปจํ
์ด๋๊ฐ service( )๋ฅผ ์คํํ๋ค. ๊ทธ๋ผ service( )๋ด์ ์๋ printStartLine(request)๊ฐ ํธ์ถ๋๊ณ ์ถ๋ ฅํ๋ผ๋ ๊ฒ๋ค์ ์ ๋ณด๋ฅผ ๋ฐ์ ์ถ๋ ฅํ๋ค.
ํค๋ ์ ๋ณด ์ ์ฒด ๋ณด๊ธฐ
Enumeration
: ์ด๊ฑฐํ์ผ๋ก ๊ด๋ จ ์๋ ๋ฐ์ดํฐ ์งํฉ์ ์์ฐจ์ ์ผ๋ก ์ ๊ทผํ๋ค.
hasMoreElements( )
: ๋ค์ ๋ด์ฉ์ด ์๋์ง ํ์ธํ๋ ๋ฉ์๋์ด๋ค.
nextElement( )
: ๊ฐ์ ๊ฐ์ ธ์ค๋ ๋ฉ์๋์ด๋ค.
getHeaderNames( )
: ๊ฐ์ ๊ฐ์ ธ์ค๋ ๋ฉ์๋์ด๋ค.
getHeader( )
: ๊ฐ์ ๊ฐ์ ธ์ค๋ ๋ฉ์๋์ด๋ค.
private void printHeaders (HttpServletRequest request) {
Enumeration<String> headerNames = request.getHeaderNames();
while (headerNames.hasMoreElements()) {
String headerName = headerNames.nextElement();
System.out.println(headerName + ": " + request.getHeader(headerName));
}
}
Enumeration ์ธํฐํ์ด์ค์ hasMoreElements( )๋ ์งํฉ์ ๊ตฌ์ฑ ์์๊ฐ ๋ ์๋์ง๋ฅผ ๊ฒ์ฌํ๋ ๋ฉ์๋์ด๋ค. request๋ก ๋ฐ์์จ headerNames์ ๊ฐ์ฒด๊ฐ ํ๋๋ ์์ ๋๊น์ง while๋ฌธ์ด ๋ฐ๋ณตํ๋ค. headerNames๋ฅผ ์ถ๋ ฅํ๊ธฐ ์ํด nextElement๋ก ๊ฐ์ ๊ฐ์ ธ์ headerName์ ๋ฐ๋๋ค. ๊ทธ๋ฆฌ๊ณ headerName์ ์ถ๋ ฅํ๊ณ ์ค์ ๊ฐ์ getHeader๋ฅผ ํตํด ์ถ๋ ฅํ๋ค. request.getHeaderNames( )๋ HTTP ์์ฒญ์ ํค๋ ์ด๋ฆ๋ค์ Enumeration<String> ํํ๋ก ๋ฐํํ๋๋ฐ, ๋ชจ๋ ํค๋์ ์ด๋ฆ(key)๋ง ์งํฉ์ผ๋ก ๊ฐ์ ธ์จ๋ค. ์๋ก host, user-agent ๋ฑ์ด ์๋ค. getHeader๋ ํด๋น ํค๋์ ์ด๋ฆ์ ํด๋นํ๋ ์ค์ ํค๋ ๊ฐ(value)์ ๋ฐํํ๋ค. ๋ง์ฝ headerName์ host๊ฐ ๋ค์ด๊ฐ๋ค๋ฉด request.getHeader(headerName)์๋ localhost:8080 ๊ฐ์ด ๋ฐํ๋๋ค.
asIterator
: ์ปฌ๋ ์
์ ์์๋ฅผ ๋ฐ๋ณต์ ์ผ๋ก ์ ๊ทผํ ์ ์๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํ๋ฉฐ, iterator ์ธํฐํ์ด์คํ์ผ๋ก ๋ฐ๊ฟ์ ๋ฐํํ๋ค.
forEachRemaining
: Iterator์ ๋ชจ๋ ์์๋ฅผ ๋ฐฉ๋ฌธํ๋ฉด์ ์ง์ ๋ ์์
์ ์ํํ๋ค.
private void printHeaders (HttpServletRequest request) {
request.getHeaderNames().asIterator()
.forEachRemaining(headerName -> System.out.println(headerName + ": " + request.getHeader(headerName)));
}
getHeaderNames๋ Enumeration<String>์ผ๋ก ๋ฐํํ์
์ด ์ง์ ๋์ด์๋ค. ๊ทธ๊ฑธ asIterator๋ฅผ ์ฌ์ฉํ์ฌ Iterator๋ก ๋ฐ๊ฟ์ค๋ค. ํ์
์ด ๋ฐ๋ ํค๋์ ์ด๋ฆ(key)๋ค์ forEachRemaining์ ํตํด ๋ชจ๋ ์์์ ๋ฐฉ๋ฌธํ์ฌ ์ง์ ๋ ์์
์ ์ํํ๋๋ก ํ๋ค. ์ฌ๊ธฐ์ ์ง์ ๋ ์์
์ headerName์ ๋๊ฒจ headerName์ ํค๋์ ์ด๋ฆ์ ์ถ๋ ฅ์ํค๊ณ , request.getHeader(headerName)์ผ๋ก ํค๋ ์ด๋ฆ์ ๊ฐ์ ์ถ๋ ฅ์ํจ๋ค.
getCookies
: ๋ชจ๋ ์ฟ ํค๋ฅผ ๊ฐ์ ธ์จ๋ค.
getName
: ์ฟ ํค์ ์ด๋ฆ์ ๊ฐ์ ธ์จ๋ค.
getValue
: ์ฟ ํค์ ๊ฐ์ ๊ฐ์ ธ์จ๋ค.
private void printHeaderUtils (HttpServletRequest request) {
System.out.println("[cookie ํธ์ ์กฐํ]" );
if (request.getCookies() != null ) {
for (Cookie cookie : request.getCookies()) {
System.out.println(cookie.getName() + ": " + cookie.getValue());
}
}
}
request.getCookies๋ก ์ฟ ํค๋ฅผ ๋ฐ๊ณ ๊ทธ ๊ฐ์ด null์ด ์๋๋ฉด for-each๋ฌธ์ ์งํํ๋ค. for-each๋ฌธ์ ์ฌ๋ฌ ๊ฐ์ ์ฟ ํค๋ฅผ ํ๋์ฉ ๊บผ๋ด๊ธฐ ์ํด ์ฌ์ฉํ๋ค. ๊ทธ๋ ๊ฒ ํ๋์ฉ getName์ ํตํด ์ฟ ํค์ ์ด๋ฆ(key)๋ฅผ ์ถ์ถํ๊ณ , getValue๋ฅผ ํตํด ์ฟ ํค์ ์ค์ ๊ฐ์ ์ถ์ถํ๋ค.
getLocales
: ๋ชจ๋ ์ ํธ ์ธ์ด ๋ชฉ๋ก์ ์ฐ์ ์์ ์์๋๋ก ๋ฐํํ๋ค.
getLocale
: ๊ฐ์ฅ ์ฐ์ ์์๊ฐ ๋์ ์ธ์ด๋ฅผ ๋ฐํํ๋ค.
private void printHeaderUtils (HttpServletRequest request) {
System.out.println("[Accept-Language ํธ์ ์กฐํ]" );
request.getLocales().asIterator()
.forEachRemaining(locale -> System.out.println("locale = " + locale));
System.out.println("request.getLocale() = " + request.getLocale());
}
์ด๋ค ์ธ์ด๋ฅผ ์ ํธํ๋์ง์ ๋ํ ์ ๋ณด๋ฅผ ์ถ๋ ฅํด๋ณด๊ณ ์ ํ๋ค. request.getLocales๋ ๋ชจ๋ ์ ํธ ์ธ์ด ๋ชฉ๋ก์ Enumeration์ผ๋ก ๋ฐํํ๋ค. ๊ทธ๋ฆฌ๊ณ asIterator์ ํตํด iterator๋ก ๋ฐ๊พผ๋ค. ๊ทธ ํ request.getLocale๋ก ๊ฐ์ฅ ์ฐ์ ์ผ๋ก ์ ํธํ๋ ์ธ์ด๋ค์ ํ๋์ฉ ๊บผ๋ด ์ถ๋ ฅํ๋ค.
โ๏ธ HTTP ์์ฒญ ๋ฐ์ดํฐ - GET ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ
HTTP ์์ฒญ ๋ฉ์์ง๋ฅผ ํตํด ํด๋ผ์ด์ธํธ์์ ์๋ฒ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํด๋ณด์.
GET - ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ, POST - HTML Form, HTTP message body ๋ฐฉ์ ์ค GET ๋ฐฉ์์ ์์๋ณด์.
์ ์ฒด ํ๋ผ๋ฏธํฐ ์กฐํ
http://localhost:8080/request-param?username=hello&age=20
๋ฉ์์ง ๋ฐ๋ ์์ด, ์ฃผ์์ฐฝ์ ํตํด ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ๋ฅผ ์ฌ์ฉํด์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๋ค. ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ๋ ?๋ฅผ ์์์ผ๋ก ๋ณด๋ด๋ฉฐ, ์ถ๊ฐ ํ๋ผ๋ฏธํฐ๋ &๋ก ๊ตฌ๋ถํ๋ค.
getParameterNames
: ์ฟผ๋ฆฌ ์คํธ๋ง ์ค ์ด๋ฆ๋ง ๋ฐํํ๋ค.
getParameter
: ์ฟผ๋ฆฌ ์คํธ๋ง์ ์ด๋ฆ์ ํด๋นํ๋ ๊ฐ์ ๋ฐํํ๋ค.
@WebServlet(name = "requestParamServlet", urlPatterns = "/request-param")
public class RequestParamServlet extends HttpServlet {
@Override
protected void service (HttpServletRequest requset, HttpServletResponse response) throws ServletException, IOException {
System.out.println("[์ ์ฒด ํ๋ผ๋ฏธํฐ ์กฐํ] - start" );
requset.getParameterNames().asIterator()
. forEachRemaining(paramName -> System.out.println(paramName + "=" + requset.getParameter(paramName)));
System.out.println("[์ ์ฒด ํ๋ผ๋ฏธํฐ ์กฐํ] - end" );
System.out.println();
}
}
์ ์ฒด ํ๋ผ๋ฏธํฐ๋ฅผ ์กฐํํ๊ธฐ ์ํด์ request.getParameterNames๋ก ๊ฐ์ ธ์จ ํ๋ผ๋ฏธํฐ์ ์ด๋ฆ์ Iterator ํ์
์ผ๋ก ๋ฐ๊พผ ํ, ์ด๋ฆ ํ๋ํ๋๋ฅผ ์ถ๋ ฅํ ํ request.getParameter๋ก ํ๋ผ๋ฏธํฐ ์ด๋ฆ์ ๊ฐ์ ์ถ๋ ฅํ๋ค.
๋จ์ผ ํ๋ผ๋ฏธํฐ ์กฐํ
String username = requset.getParameter("username" );
System.out.println("username = " + username);
๋จ์ผ ํ๋ผ๋ฏธํฐ๋ฅผ ์กฐํํ๋ ๋ฐฉ๋ฒ์ด๋ค. ์ํ๋ ํ๋ผ๋ฏธํฐ์ ๊ฐ์ ์๊ธฐ ์ํด request.getParameter์ ํ๋ผ๋ฏธํฐ์ ์ด๋ฆ์ ๋ฃ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ ์ด๋ฆ์ ๊ฐ์ username์ผ๋ก ๋ฐ์ ์ถ๋ ฅํ๋ฉด ๋๋ค.
์ด๋ฆ์ด ๊ฐ์ ๋ณต์ ํ๋ผ๋ฏธํฐ ์กฐํ
getParameterValues
: ์ฟผ๋ฆฌ ์คํธ๋ง์ ์ด๋ฆ์ ํด๋นํ๋ ๊ฐ์ด ์ฌ๋ฌ๊ฐ์ผ๋ ๋ฐฐ์ด๋ก ๋ฐํํ๋ค.
http://localhost:8080/request-param?username=hello&age=20&username=kim
String[] usernames = requset.getParameterValues("username" );
for (String name : usernames) {
System.out.println("username: " + name);
}
username์ ๋ค๋ฅธ ๊ฐ ๋ ๊ฐ์ธ hello์ kim์ ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ์ ๋ฃ์๋ค. getParameterVaues๋ก username์ ํด๋นํ๋ ์ฌ๋ฌ ๊ฐ์ ๋ฐฐ์ด๋ก usernames๊ฐ ๋ฐ๋๋ค. usernames์ ๊ฐ๋ค์ for๋ฌธ์ผ๋ก name์ ๋ฃ์ด username์ ์ด๋ค ๊ฐ๋ค์ด ์๋์ง ์ถ๋ ฅํ๋ค. ๋ง์ฝ getParameter๋ฅผ ์ฌ์ฉํ๋ค๋ฉด ์ฒซ๋ฒ์งธ ๊ฐ์ ๋ฐํํ๋ ๋ณต์ ํ๋ผ๋ฏธํฐ์ ๊ฒฝ์ฐ getParameterValues๋ฅผ ์ฌ์ฉํด์ผํ๋ค๋ ๊ฑธ ์์๋์.
์ ์ฒด ํ๋ผ๋ฏธํฐ์ ๋จ์ผ ํ๋ผ๋ฏธํฐ ์กฐํ ๊ฒฐ๊ณผ
๋ณต์ ํ๋ผ๋ฏธํฐ ์กฐํ ๊ฒฐ๊ณผ
โ๏ธ HTTP ์์ฒญ ๋ฐ์ดํฐ - POST HTML Form
GET - ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ, POST - HTML Form, HTTP message body ๋ฐฉ์ ์ค POST ๋ฐฉ์์ ์์๋ณด์.
๋ฉ์์ง ๋ฐ๋์ username=hello&age=20(key=value๋ก) ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ ํ์์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๋ค.
<form action ="/request-param" method ="post" >
username: <input type ="text" name ="username" />
age: <input type ="text" name ="age" />
<button type ="submit" > ์ ์ก</button >
</form >
username๊ณผ age์ sori์ 20์ด๋ ๊ฐ์ ์ ์ด post ๋ฐฉ์์ผ๋ก ๋ณด๋๋ค. post ๋ฐฉ์์ผ๋ก ๋ณด๋ด๊ธฐ ์ํด form์ method์ post๋ผ๊ณ ์ ์ด๋๊ธฐ ๋๋ฌธ์ด๋ค. ์ด form์ post ๋ฐฉ์์ผ๋ก ๋ณด๋ธ๋ค๋ ์๋ฏธ์ด๋ค. post ๋ฐฉ์์ผ๋ก ๋ณด๋ธ ๋ฐ์ดํฐ๋ ์ด๋์ ๋์ฐฉํ ๊น? ๋ฐ๋ก ์ action์ ๊ฒฝ๋ก๋ฅผ ์ ์ด๋๋ค. /request-param์ผ๋ก ์ ์์ผ๋ ๋ฐ์ดํฐ๋ ์ด ๊ฒฝ๋ก๋ฅผ ๋ฐ๋ ๊ณณ์ ๋์ฐฉํ๊ณ ๊ฑฐ๊ธฐ์์ ์ฒ๋ฆฌํ๋ ๋ฐฉ์๋๋ก ํํด์ง ๊ฒ์ด๋ค. POST์ HTML Form์ ์ ์กํ๋ฉด ์์ฒญ URL๊ณผ content-type: application/x-www-form-urlencoded, ๋ฉ์์ง ๋ฐ๋์ username=hello&age=20์ผ๋ก HTTP ๋ฉ์์ง๋ฅผ ๋ง๋ ๋ค. ์ฌ๊ธฐ์ application/x-www-form-urlencoded ํ์์ GET์์ ์ดํด๋ณธ ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ ํ์๊ณผ ๊ฐ์์ ํด๋ฆฌ ํ๋ผ๋ฏธํฐ ์กฐํ ๋ฉ์๋๋ฅผ ๊ทธ๋๋ก ์ฌ์ฉํด๋ ๋๋ค. ํด๋ผ์ด์ธํธ ์
์ฅ์์ ๋ ๋ฐฉ์์ ์ฐจ์ด๊ฐ ์์ง๋ง, ์๋ฒ์ ์
์ฅ์์ ๋์ ํ์์ด ๊ฐ์ผ๋ฏ๋ก request.getParameter๋ก ํธ๋ฆฌํ๊ฒ ์ฌ์ฉํ๋ฉด ๋๋ค. ๋ฌผ๋ก content-type์ GET ๋ฐฉ์์๋ ์๋ค. ๋ฉ์์ง ๋ฐ๋๋ฅผ ์ฌ์ฉํ์ง ์๊ธฐ ๋๋ฌธ์ด๋ค. POST ๋ฐฉ์์ ๋ฉ์์ง ๋ฐ๋๋ฅผ ์ด๋ค ํ์
์ผ๋ก ๋ณด๋ผ ๊ฑด์ง ๋ช
์ํด์ผํด์ ์ฌ์ฉํ๋ค.
โ๏ธ HTTP ์์ฒญ ๋ฐ์ดํฐ - API ๋ฉ์์ง ๋ฐ๋ - JSON
๋ฉ์์ง ๋ฐ๋์ ๋ฐ์ดํฐ๋ฅผ ์ง์ ๋ด์์ ์์ฒญํ๋ ๋ฐฉ์๋ ์์ง๋ง ์ฃผ๋ก JSON ํ์์ ์ฌ์ฉํ๋ค.
JSON ํ์์ ํ์ฑํ ์ ์๊ฒ ๊ฐ์ฒด๋ฅผ ํ๋ ๋ง๋ค์ด ์ฌ์ฉํ๋ค.
@Getter
@Setter
public class HelloData {
private String username;
private int age;
}
lombok์ด ์ง์ํด์ฃผ๋ Getter, Setter ์ด๋
ธํ
์ด์
์ด๋ค. Getter, Setter์ ๋ํด ๊ฐ๋จํ ์ค๋ช
ํ์๋ฉด, private ๋ณ์๋ฅผ ๋ค๋ฅธ ํด๋์ค์์ ๊บผ๋ด๋ ๋ฉ์๋๋ฅผ Getter๋ผ๊ณ ํ๊ณ private ๋ณ์์ ๊ฐ์ ์ด๊ธฐํํ๋ ๋ฉ์๋๋ Setter๋ผ๊ณ ํ๋ค.
JSON ํ์์ผ๋ก ๋ณด๋ด์จ ๋ฐ์ดํฐ ๋ณด๋ด๊ธฐ
content-type:application/json
messageBody={"username" : "hello" , "age" : 20}
content-type์ json์ผ๋ก ์ ํํ ํ body์ ๋ด์ฉ์ ์ค์ด์ ๋ณด๋ธ๋ค.
JSON ํ์์ผ๋ก ๋ณด๋ด์จ ๋ฐ์ดํฐ ์ฒ๋ฆฌํ๊ธฐ
ObjectMapper
: ์ง๋ ฌํ์ ์ญ์ง๋ ฌํ๋ฅผ ์ฒ๋ฆฌํ๋ค.
private ObjectMapper objectMapper = new ObjectMapper();
ObjectMapper์ ์๋ฐ์์ JSON์ ๋ค๋ฃจ๊ธฐ ์ํ ๋ํ์ ์ธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ Jackson์ ํด๋์ค์ด๋ค. ObjectMapper์ ์ด์ฉํ์ฌ JSON ๋ฌธ์์ด์ ์๋ฐ ๊ฐ์ฒด๋ก ๋ณํํ๋ ์ญ์ง๋ ฌํ๋ฅผ ํ ์ ์๊ณ ๊ทธ ๋ฐ๋์ธ ์ง๋ ฌํ ๋ฑ์ ํตํด ๋ค์ํ JSON ์ฒ๋ฆฌ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์๋ค. Spring์์๋ Jackson์ ๊ธฐ๋ณธ์ผ๋ก ์ฌ์ฉํ๋ค.
getInputStream
: HTTP body์ ๋ด์ฉ์ byte stream์ผ๋ก ๋ฐ๋๋ค.
StreamUtils
: ์คํธ๋ฆผ์ ์ฒ๋ฆฌํ๊ธฐ ์ํ ๊ฐ๋จํ ์ ํธ๋ฆฌํฐ ๋ฉ์๋์ด๋ค.
copyToString
: inputStream์ผ๋ก ๋ค์ด์จ ๋ด์ฉ์ String์ผ๋ก ๋ณต์ฌํ๋ค.
ServletInputStream inputStream = request.getInputStream();
String messageBody = StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8);
HTTP body์ ๋ด์ฉ์ byte stream์ผ๋ก ๋ฐ์ ์ด byte stream์ ๋ฌธ์์ด๋ก ๋ณํํ๋ค. ์ฆ, body์ ๋ด๊ธด JSON ๋ด์ฉ์ ๋ฌธ์์ด๋ก ๋ง๋ ๊ฒ์ด๋ค.
readValue
: Json ํ์ผ์ java์ object๋ก ๋ณ๊ฒฝํ ๋ ์ฌ์ฉํ๋ค.
HelloData helloData = objectMapper.readValue(messageBody, HelloData.class);
Json ๋ฌธ์์ด์ HelloData ๊ฐ์ฒด๋ก ํ์ฑํด์ ๋ณํํ๋ค. HelloData ํด๋์ค์๋ @Getter, @Setter๊ฐ ์์๋ค. Jackson์ ์ด getter/setter ๋ฉ์๋๋ฅผ ์ฌ์ฉํด์ JSON์ username,age ๊ฐ์ ๊ฐ๊ฐ HelloData์ ํ๋์ ๋ฃ์ด์ค๋ค. ํ์ฑ์ ๋ํด ๊ฐ๋ตํ๊ฒ ์ ์ด๋ณด์๋ฉด, ๋จ์ํ ํ
์คํธ ๋ฌธ์์ด์ ์๋ฏธ ์๋ ๊ตฌ์กฐ์ธ ์ฆ, ๊ฐ์ฒด๋ก ๋ณํํ๋ ๊ณผ์ ์ ๋งํ๋ค.
โ๏ธ HttpServletResponse - ๋จ์ ํ
์คํธ
๋ฐฉ๊ธ์ ์์ฒญ์ ์ด๋ป๊ฒ ์ฒ๋ฆฌํ๋์ง์ ๋ํด ๋ฐฐ์ ๋ค.
์ด๋ฒ์๋ ์๋ต์ ๋ํด์ ๋ฐฐ์ธ ๊ฒ์ด๋ค.
์๋ต ๋ฐ์ดํฐ๋ก ๋จ์ ํ
์คํธ ์๋ต, HTML ์๋ต, HTTP API - MessageBody JSON ์๋ต์ด ์๊ณ ๊ทธ ์ค ๋จ์ ํ
์คํธ ์๋ต์ ์ดํด๋ณด์.
@WebServlet(name = "responseHeaderServlet", urlPatterns = "/response-header")
/response-header URL๋ก ์์ฒญ์ ๋ณด๋ด๋ฉด ResponseHeaderServlet์ด ์์ฒญ์ ๋ฐ์์ ์ฒ๋ฆฌํ ๊ฒ์ด๋ค. ์์ ์ฝ๋์์ ์ด๋ป๊ฒ ์ฒ๋ฆฌ๋ฅผ ํ ๊ฑด์ง, ์ด๋ค ์ฝ๋๋ฅผ ์คํ์ํฌ๊ฑด์ง์ ๋ํด ๋ฐฐ์ ๋ค๋ฉด, ์ง๊ธ์ ์๋ต์ ๋ธ๋ผ์ฐ์ ์ ์ด๋ป๊ฒ ๋ณด๋ผ๊ฑด์ง์ ๋ํด ์ค์ ์ ๋ ๊ฒ์ด๋ค.
setStatus
: ์๋ต์ฝ๋๋ฅผ ์ง์ ํ๋ค.
setHeader
: ํค๋๋ฅผ ์์ฑํ๊ณ ์๋ตํ๋ค.
response.setStatus(HttpServletResponse.SC_OK);
response.setHeader("Content-Type" ,"text/plain;charset=utf-8" );
response.setHeader("Cache-Control" ,"no-cache, no-store, must-revalidate" );
response.setHeader("Pragma" ,"no-cache" );
response.setHeader("my-header" , "hello" );
PrintWriter writer = response.getWriter();
writer.println("ok" );
content(response);
cookie(response);
redirect(response);
setStatus์์ HTTP ์๋ต์ ์ํ์ฝ๋๋ฅผ SC_OK๋ก ๋ช
์ํ๋ค. SC_OK๋ 200์ ์๋ฏธํ๋ฉฐ ์ฑ๊ณต์ ๋ปํ๋ค. 200์ด๋ผ๊ณ ์ ์ด๋ ๋ฌด๊ดํ์ง๋ง ๋งค์ง๋๋ฒ๊ฐ ์๋ ์๋ฏธ์๋ ๊ฐ์ ๋ฃ๋๊ฒ ๋ ์์ ์ ์ด๋ค. setHeader๋ ํค๋๋ฅผ ์์ฑํ๊ณ ์๋ตํ๋๋ก ํด์ค๋ค. Content-Type์ ์ผ๋ฐ ํ
์คํธ์ utf-8์ ์จ์ ์ธ์ฝ๋ฉ์ ํ๋ค๊ณ ์ ์๋ค. Cache-Control์ ์บ์๋ฅผ ์์ ํ ๋ฌดํจํํ๋๋ก ํ๋ค. ์บ์๋ฅผ ์ ๋ ์ ์ฅํ์ง๋ ๋ง๊ณ , ์ฐ์ง๋ ๋ชปํ๊ฒ ์ง์ ํ ๊ฒ์ด๋ค. Pragma์ no-cache๋ฅผ ์ ์ด ๊ณผ๊ฑฐ ๋ฒ์ ๊น์ง ์บ์๋ฅผ ์์ด๋ค. my-header๋ hello๋ผ๋ ์์์ ํค๋๋ฅผ ์ถ๊ฐํ ๊ฒ์ด๋ค. writer.println("ok")๋ ์๋ต ๋ฐ๋์ ok ๋ฉ์์ง๋ฅผ ์ถ๋ ฅํ๊ธฐ ์ํด ์ ์๋ค. ๋งจ ์๋ ์ธ์ค์ service ๋ฉ์๋ ์ธ๋ถ์ ์ ์ ๋ฉ์๋๋ฅผ ์คํ์ํค๊ธฐ ์ํด ์ ์ด๋ ๊ฒ์ด๋ค.
response.setContentType("text/plain" );
response.setCharacterEncoding("utf-8" );
setHeader์ ๋น์ทํ์ง๋ง ๋ ํธ๋ฆฌํ ๋ฐฉ์์ ๋ํ๋ธ ๊ฒ์ด๋ค. ContentType์ ์ผ๋ฐ์ ์ธ ํ
์คํธ๊ณ ์ธ์ฝ๋ฉ์ utf-8์ด๋ค.
Cookie cookie = new Cookie("myCookie" , "good" );
cookie.setMaxAge(600 );
response.addCookie(cookie);
myCookie ์ด๋ฆ์ธ cookie๋ฅผ ์๋ก ๋ง๋ค๊ณ ๊ฐ์ good์ด๋ค. setMaxAge๋ ์ ํจ๊ธฐ๊ฐ์ ๋ปํ๋ค. ์ ํจ๊ธฐ๊ฐ์ 600์ด์ด๋ค. addCookie๋ก ์๋ตํค๋์ ์ฟ ํค๋ฅผ ์ถ๊ฐํ๋ค.
response.sendRedirect("/basic/hello-form.html" );
์๋ต์ ๋ฆฌ๋ค์ด๋ ํธ๋ก ์ ํํด์ ๋ธ๋ผ์ฐ์ ๊ฐ /basic/hello-form.html๋ก ์ด๋ํ๋๋ก ํ๋ค. ๊ทธ๋ฌ๋ฉด /response-header๋ก ๊ฒฝ๋ก๋ฅผ ๋ค์ด๊ฐ๋ /basic/hello-form.html๋ก ์ด๋ํ๊ฒ ๋๋ค. ์ฌ๊ธฐ์ ์๋ต๋ฒํธ 302์ ํจ๊ป ์ด๋ํ๋ค. 302๊ฐ ๋ฆฌ๋ค์ด๋ ํธ๋ฅผ ๋ปํ๋ค.
โ๏ธ HttpServletResponse - HTML
์ด๋ฒ์๋ HTML ์๋ต์ ์ดํด๋ณผ ๊ฒ์ด๋ค.
response.setContentType("text/html" );
PrintWriter writer = response.getWriter();
writer.println("<html>" );
writer.println("<body>" );
writer.println("<div> ์๋
? </div>" );
writer.println("</body>" );
writer.println("</html>" );
ContentType์ text/html์ด๋ผ๊ณ ์ง์ ํ๋ค. ๋ธ๋ผ์ฐ์ ๋ ์๋ต ๋ฐ๋๋ฅผ html ๋ฌธ์๋ก ์ธ์ํ๊ณ <html>, <body>, <div> ๋ฑ์ ํ์ฑํ์ฌ ์นํ์ด์ง ํํ๋ก ๊ทธ๋ ค์ค ๊ฒ์ด๋ค. ์ด๋ ๊ฒ ์ด๋ค ๋ฐ์ดํฐ๋ฅผ ํน์ ํํ๋ก ๋ณํํ๊ฑฐ๋ ํํํ๋ ๊ณผ์ ์ ๋ ๋๋ง์ด๋ผ๊ณ ํ๋ค. ์ด ์ฝ๋์ ๊ฒฝ์ฐ ์น๋ธ๋ผ์ฐ์ ์ ์ ๋๋ก ๋ ๋๋ง ๋์๋ค๊ณ ๋งํ ์ ์๋ค.
โ๏ธ HttpServletResponse - API JSON
์ด๋ฒ์๋ API JSON ์๋ต์ ์ดํด๋ณผ ๊ฒ์ด๋ค.
response.setContentType("application/json" );
response.setCharacterEncoding("utf-8" );
ContentType์ application/json์ผ๋ก ์ง์ ํด, HTTP ์๋ต์ Json์ผ๋ก ๋ฐํํ๋๋ก ํ๋ค.
HelloData helloData = new HelloData();
helloData.setUsername("kim" );
helloData.setAge(20 );
๋ธ๋ผ์ฐ์ ๋ก ๋ณด๋ด๋ ค๋ ๋ด์ฉ์ด๊ณ , ์ด ๋ด์ฉ์ json ํํ๋ก ๋ฐ๊ฟ ๊ฒ์ด๋ค. Json ์์ฒญ ํํธ์์ HelloData ํด๋์ค๋ฅผ ๋ง๋ค์ด ๋ณ์๋ฅผ ๊บผ๋ด๊ณ ์ด๊ธฐํํ๋ Getter, Setter๋ฅผ ๊ธฐ๋ฅ์ ๋ง๋ค์๋ค. kim๊ณผ 20์ด๋ผ๋ ๊ฐ์ Username๊ณผ Age ๋ณ์์ ์ด๊ธฐํ ์์ผ์ค๋ค.
Q. HelloData๋ Getter, Setter ๊ธฐ๋ฅ์ ํฌํจํ๊ณ ์๋ ํด๋์ค์ด๋ค. ๊ทธ๋ฐ๋ฐ ๊ณ์ JSON์ ์ฌ์ฉํ ๋ HelloData ํด๋์ค๊ฐ ํ์ํ๋ค. Getter, Setter๋ private ๋ณ์๋ฅผ ๊ด๋ฆฌํ ๋ ์ฌ์ฉํ๋ค๊ณ ๋ฐฐ์ ๋๋ฐ JSON๊ณผ ์ด๋ค ๊ด๊ณ์ด๊ธธ๋ HelloData์ Getter,Setter๋ฅผ ์ฌ์ฉํด์ผํ๋๊ฑธ๊น? A. Json์ผ๋ก ๋ณํํ๊ธฐ ์ํด์ ObjectMapper๋ฅผ ์ฌ์ฉํ๋ค. ์ด๋ ๊ฒ ObjectMapper ๊ฐ์ Json ๋ณํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์๋ฐ ๊ฐ์ฒด์ ํ๋์ ์ ๊ทผํด์ ๊ฐ์ ์ฝ๊ณ ์ฐ๋ ๊ณผ์ ์ด ์๋ค. ์ด๋ ์ด ๊ณผ์ ์์ getter, setter ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ค.
writeValueAsString
: ๋ฐ์ดํฐ๋ฅผ Json ํ์์ผ๋ก ๋ณํํ๋ค.
String result = objectMapper.writeValueAsString(helloData);
response.getWriter().write(result);
setter๋ก ๊ฐ์ฒด์ ๊ฐ์ kim๊ณผ 20์ผ๋ก ์ด๊ธฐํํ๋ค. writeValueAsString์ผ๋ก helloData์ ๋ค์ด์๋ ๊ฐ์ getter ๋ฐ์์ฌ ๊ฒ์ด๋ค. ๊ทธ๋ ๊ฒ ๋ธ๋ผ์ฐ์ ์ Json ํ์์ ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ธ๋ค.
์๋์ ์ถ์ฒ๋ฅผ ๋จ๊ฒจ๋๊ฒ ์ต๋๋ค. ๋ธ๋ก๊ทธ์ ์ ๊ฐ ์ต๋ํ ์ดํดํ ๋ด์ฉ๊น์ง๋ง ์ ๋๊ฑฐ๋ผ ์ถ์ฒ์ ๋ค์ด๊ฐ์๋ฉด ๋ ๋ง์ ๋ด์ฉ์ด ์์ด ๊ณต๋ถํ์๋๋ฐ ๋์๋์ค๊ฒ๋๋ค.
๐ชฝ
ํ๋ฆฐ ๋ด์ฉ์ด ์๋ค๋ฉด ๋๊ธ๋ก ์๋ ค์ฃผ์ธ์
- Jackson ๋ผ์ด๋ธ๋ฌ๋ฆฌ
[Java] Jackson ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ด์ฉํ์ฌ Object๋ฅผ JSON์ผ๋ก ๋ณํํ๊ธฐ
Java Object -> JSON ๋ฌธ์์ด Java Object -> JSON ํ์ผ Map -> JSON ๋ฌธ์์ด List -> JSON ๋ฌธ์์ด ๋ฐฐ์ด -> JSON ๋ฌธ์์ด Java Object๋ฅผ JSON ๋ฌธ์์ด๋ก ๋ณํํ๊ธฐ ์ํด์ Jackson ObjectMapper ์ ๋ค์ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
hianna.tistory.com
- Spring
Overview (Spring Framework 6.2.8 API)
Support for registering the need for reflection, resources, java serialization and proxies at runtime. Annotation support for the Application Context, including JSR-250 "common" annotations, component-scanning, and Java-based metadata for creating Spring-m
docs.spring.io
- ObjectMapper
[Spring] ObjectMapper์ ๋์ ๋ฐฉ์๊ณผ SpringBoot๊ฐ ์ ๊ณตํ๋ ์ถ๊ฐ ๊ธฐ๋ฅ๋ค
์ด๋ฒ์๋ Spring์์ ์ฌ์ฉ๋๋ ObjectMapper์ ๋์ ๋ฐฉ์์ ๋ํ ์ ๋ฆฌํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค. 1. ObjectMapper๋ฅผ ์ด์ฉํ ์ง๋ ฌํ(Serialize)[ ObjectMapper์ ์ง๋ ฌํ(Serialize) ๋์ ๋ฐฉ์ ]ObjectMapper๋ ๋ฆฌํ๋ ์
์
mangkyu.tistory.com
- ์๋ธ๋ฆฟ ๋ผ์ดํ ์ฌ์ดํด
[JSP/Servlet] ์๋ธ๋ฆฟ ๋ผ์ดํ ์ฌ์ดํด - init(), service(), doGet(), destroy()
โ ๋ค์ด๊ฐ๊ธฐ - ๋๋ฅผ ์๊ทนํ๋ JSP&Servlet (๊น์ค๋ช
/ํ๋น๋ฏธ๋์ด). ์ ๊ณต๋ถํ๋ฉฐ ์ ๋ฆฌํ๋ ๋ธ๋ก๊ทธ โ ๋ชฉ์ฐจ 1. ์๋ธ๋ฆฟ ๋ผ์ดํ ์ฌ์ดํด 2. ์๋ธ๋ฆฟ ๋ผ์ดํ ์ฌ์ดํด ์์ 3. ์๋ธ๋ฆฟ ํด๋์ค์ init ๋ฉ์๋์ destroy
skyfox83.tistory.com
- Iterator์ Enumeration
[์๋ฐ/java]Iterator ์ Enumeration ์ฝ๊ฒ ์ดํดํ๊ธฐ ํธ.
Iterator์ Enumeration ์ปฌ๋ ์
(collection) ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ๋ ํด๋์ค์ ๋ฐ์ดํฐ๋ฅผ ์ํํด์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ํด๋์ค์์ ์ ๊ณตํ๋ size()๋ฅผ ์ฌ์ฉํด์ for๋ฌธ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ๋ฐฉ๋ฒ๋ ์์ง๋ง ์ํ
tiboy.tistory.com
- HttpServletRequest ๊ฐ์ฒด
3.4 HttpServletRequest ๊ฐ์ฒด - 3.4.2 HTTP ์์ฒญ ๋ฉ์์ง์ ํค๋ ์ถ๋ ฅ
3.4.2 HTTP ์์ฒญ ๋ฉ์์ง์ ํค๋ ์ถ๋ ฅ HTTP ํ๋กํ ์ฝ์ ์ด์ฉํด์ ํด๋ผ์ด์ธํธ๋ก๋ถํฐ ์์ฒญ ๋ฉ์์ง๊ฐ ...
blog.naver.com
- foreachremaining
asiterator().foreachremaining() ์ด๋?
`Iterator` ์ธํฐํ์ด์ค๋ ์ปฌ๋ ์
์ ์์๋ฅผ ๋ฐ๋ณต์ ์ผ๋ก ์ ๊ทผํ ์ ์๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. ์ด ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ์ฌ ์ปฌ๋ ์
์ ์์๋ฅผ ํ๋์ฉ ๊ฒ์ํ๊ณ ์กฐ์ํ ์ ์์ต๋๋ค. `forEachRemaining()` ๋ฉ์
lcoding.tistory.com
- Wirter
[Servlet&JSP] PrintWriter out = response.getWriter(); ์ ๋์ ์๋ฆฌ
ํด๋ผ์ด์ธํธ๋ก๋ถํฐ Servlet์ผ๋ก ์์ฒญ์ด ๋ค์ด์ค๋ฉด ์์ฒญ(Request)์ ํ์
ํ ํ ์๋ต(Response)์ ์ ๋ฌํ๋ค. Servlet์ผ๋ก ๋ค์ด์จ ์์ฒญ์ ํ
์คํธ(HTML) ํํ๋ก ์๋ต์ ๋ณด๋ด๋ ค๋ฉด ์๋์ ๊ฐ์ด ์๋ต์ผ๋ก ๋ด๋ณด๋ผ ์ถ
charliecharlie.tistory.com