๐ฌ ๋ค์ํ ์น ํ๋ ์์ํฌ์ ์ถํ์ผ๋ก ์๋ธ๋ฆฟ์ ์ง์ ๊ฐ๋ฐํ๋ ๊ฒฝ์ฐ๊ฐ ํ์น ์๋ค. ํ์ง๋ง java ์น ๊ฐ๋ฐ์๋ผ๋ฉด ์๋ธ๋ฆฟ์ด ๋ฌด์์ด๊ณ ์๋ธ๋ฆฟ์ ๋์ ๋ฐฉ์์ ์ดํดํ๋ ๊ฒ์ ํ์๋ผ๊ณ ์๊ฐํ๊ธฐ ๋๋ฌธ์ Servlet์ ๊ณต๋ถํ๊ณ ๋์ด๊ฐ๋ ๊ฒ์ด ์ข๋ค.
โ๏ธ JSP ํ์ค์ด ๋์ค๊ธฐ ์ ์ ๋ง๋ค์ด์ง ํ์ค
โ๏ธ Java๋ก ์น ์ดํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋ฐํ ์ ์๋๋ก ํ๊ธฐ ์ํด ๋ง๋ค์ด์ง
package com.fastcampus.ch2;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Random;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
// @Controller + @RequestMapping
@WebServlet("/rollDice2")
// HtppServlet ์์์ ๋ฐ์์ผ ํ๋ค.
public class TwoDiceServlet extends HttpServlet {
int getRandomInt(int range) {
return new Random().nextInt(range)+1;
}
// service ์ด๋ฆ ๊ณ ์ : request, response ํ์
public void service(HttpServletRequest request, HttpServletResponse response) throws IOException {
int idx1 = getRandomInt(6);
int idx2 = getRandomInt(6);
response.setContentType("text/html");
response.setCharacterEncoding("utf-8");
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<head>");
out.println("</head>");
out.println("<body>");
out.println("<img src='resources/img/dice"+idx1+".jpg'>");
out.println("<img src='resources/img/dice"+idx2+".jpg'>");
out.println("</body>");
out.println("</html>");
out.close();
}
}
โ๏ธ
response.setContentType("text/html");
: ์๋ต์ ์ ์กํ๋ ค๋ฉด, ์๋ต์ ์ปจํ ์ธ ํ์ ์ ์ง์ ํด์ผ ํ๋ค.
: ์ฌ๊ธฐ์ ์ ๋ฌ๋๋ ๊ฐ์ JSP์์ page ๋๋ ํฐ๋ธ์ contentType ์์ฑ๊ฐ๊ณผ ๋์ผ
html์ ์ฌ์ฉํ์ฌ ์์ฒญ์ ์๋ตํ๋ค.
Java Thread๋ฅผ ์ด์ฉํ์ฌ ๋์ํ๋ค.
MVC ํจํด์์ Controller๋ก ์ด์ฉ๋๋ค.
HTTP ํ๋กํ ์ฝ ์๋น์ค๋ฅผ ์ง์ํ๋ javax.servlet.http.HttpServlet ํด๋์ค๋ฅผ ์์๋ฐ๋๋ค.
HTML ๋ณ๊ฒฝ ์ Servlet์ ์ฌ์ปดํ์ผํด์ผ ํ๋ ๋จ์ ์ด ์๋ค.
ํ๊ฐ์ ์ธ์คํด์ค๋ก ๊ตฌ์ฑ โก๏ธ Singleton
: ํ๊ฐ๋ง ๋ง๋ค์ด์ ๊ณ์ ์ฌ์ฌ์ฉ ํ๋ค.
: ์์ฒญํ๋ ์ฌ๋๋ง๋ค ์ฒ๋ฆฌ๋์ด์ผ ๋๋ ์์
์ด ๊ฐ๋ค. ์ฌ์ฉ์๋ง๋ค ํ๋ก๊ทธ๋จ์ด ์ฌ๋ฌ๊ฐ๋ฅผ ๊ฐ์ง ํ์๊ฐ ์๊ธฐ ๋๋ฌธ์ ์ฑ๊ธํค์ผ๋ก ๋ง๋ค์ด์ก๋ค. (Spring๋ ๋ง์ฐฌ๊ฐ์ง)
์ฌ์ฉ์(ํด๋ผ์ด์ธํธ)๊ฐ URL์ ์ ๋ ฅํ๋ฉด HTTP Request๊ฐ Servlet Container๋ก ์ ์กํ๋ค.
์์ฒญ์ ์ ์ก๋ฐ์ Servlet Container๋ HttpServletRequest, HttpServletResponse ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ค.
web.xml์ ๊ธฐ๋ฐ์ผ๋ก ์ฌ์ฉ์๊ฐ ์์ฒญํ URL์ด ์ด๋ ์๋ธ๋ฆฟ์ ๋ํ ์์ฒญ์ธ์ง ์ฐพ๋๋ค.
ํด๋น ์๋ธ๋ฆฟ์์ service๋ฉ์๋๋ฅผ ํธ์ถํ ํ ํด๋ฆฌ์์ธํธ์ GET, POST์ฌ๋ถ์ ๋ฐ๋ผ doGet()
๋๋ doPost()
๋ฅผ ํธ์ถํ๋ค.
doGet()
or doPost()
๋ฉ์๋๋ ๋์ ํ์ด์ง๋ฅผ ์์ฑํ ํ HttpServletResponse๊ฐ์ฒด์ ์๋ต์ ๋ณด๋ธ๋ค.
์๋ต์ด ๋๋๋ฉด HttpServletRequest, HttpServletResponse ๋ ๊ฐ์ฒด๋ฅผ ์๋ฉธ์ํจ๋ค.
โ๏ธ ์๋ธ๋ฆฟ์ ๊ด๋ฆฌํด์ฃผ๋ ์ปจํ ์ด๋ = Tomcat
์๋ฒ์ ๋ง๋ค์ด์ง ์๋ธ๋ฆฟ์ ์ค์ค๋ก ์๋ํ๋ ๊ฒ์ด ์๋๋ผ, ์๋ธ๋ฆฟ์ ๊ด๋ฆฌ ํด์ฃผ๋ ๊ฒ์ด ํ์ํ๋ฐ, ๊ทธ๋ฌํ ์ญํ ์ ํ๋ ๊ฒ์ด ์๋ธ๋ฆฟ ์ปจํ ์ด๋์ด๋ค.
์๋ธ๋ฆฟ = ์ด๋ ํ ์ญํ ์ ์ํํ๋ ์ ์์ / ์๋ธ๋ฆฟ ์ปจํ ์ด๋: ์ ์์๋ฅผ ์ํํ๋ ๊ธฐ๊ณ
ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ๋ฐ์์ฃผ๊ณ ์๋ต์ ํ ์ ์๊ฒ, ์น ์๋ฒ์ ์์ผ์ผ๋ก ํต์
์๋ธ๋ฆฟ ์ปจํ ์ด๋๋ ์๋ธ๋ฆฟ๊ณผ ์น์๋ฒ๊ฐ ์์ฝ๊ฒ ํต์ ํ ์ ์๊ฒ ํด ์ค๋ค.
์ผ๋ฐ์ ์ผ๋ก ์ฐ๋ฆฌ๋ ์์ผ์ ๋ง๋ค๊ณ listen
, accept
๋ฑ์ ํด์ผํ์ง๋ง ์๋ธ๋ฆฟ ์ปจํ
์ด๋๋ ์ด๋ฌํ ๊ธฐ๋ฅ์ API๋ก ์ ๊ณตํ์ฌ ๋ณต์กํ ๊ณผ์ ์ ์๋ตํ ์ ์๊ฒ ํด ์ค๋ค.
๊ฐ๋ฐ์๊ฐ ์๋ธ๋ฆฟ์ ๊ตฌํํด์ผ ํ ๋น์ง๋์ค ๋ก์ง์ ๋ํด์๋ง ์ด์ ์ ๋๊ฒ๋ ๋์์ค๋ค.
์๋ธ๋ฆฟ ์ปจํ ์ด๋๋ ์๋ธ๋ฆฟ์ ํ์๊ณผ ์ฃฝ์์ ๊ด๋ฆฌํ๋ค.
์๋ธ๋ฆฟ ํด๋์ค๋ฅผ ๋ก๋ฉํ์ฌ ์ธ์คํด์คํํ๊ณ , ์ด๊ธฐํ ๋ฉ์๋๋ฅผ ํธ์ถํ๊ณ , ์์ฒญ์ด ๋ค์ด์ค๋ฉด ์ ์ ํ ์๋ธ๋ฆฟ ๋ฉ์๋๋ฅผ ํธ์ถํ๋ค.
์๋ธ๋ฆฟ์ด ์๋ช
์ ๋ค ํ ์๊ฐ์๋ ์ ์ ํ๊ฒ Garbage Collection
์ ์งํํ์ฌ ํธ์๋ฅผ ์ ๊ณตํ๋ค.
package com.fastcampus.ch2;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
@Override
public void init() throws ServletException {
// ์๋ธ๋ฆฟ์ด ์ด๊ธฐํ๋ ๋ ์๋ ํธ์ถ๋๋ ๋ฉ์๋
// 1. ์๋ธ๋ฆฟ์ ์ด๊ธฐํ ์์
๋ด๋น
System.out.println("[HelloServlet] init() is called.");
// super.init();
}
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 1. ์
๋ ฅ
// 2. ์ฒ๋ฆฌ
// 3. ์ถ๋ ฅ
System.out.println("[HelloServlet] service() is called.");
super.service(req, resp);
}
@Override
public void destroy() {
// 3. ๋ท์ ๋ฆฌ - ์๋ธ๋ฆฟ์ด ๋ฉ๋ชจ๋ฆฌ์์ ์ ๊ฑฐ๋ ๋ ์๋ธ๋ฆฟ ์ปจํ
์ด๋์ ์ํด์ ์๋ ํธ์ถ
System.out.println("[HelloServlet] destroy() is called.");
super.destroy();
}
}
์๋ธ๋ฆฟ ์ปจํ ์ด๋๋ ์์ฒญ์ด ์ฌ ๋ ๋ง๋ค ์๋ก์ด ์๋ฐ ์ฐ๋ ๋๋ฅผ ํ๋ ์์ฑํ๋๋ฐ, HTTP ์๋น์ค ๋ฉ์๋๋ฅผ ์คํํ๊ณ ๋๋ฉด, ์ฐ๋ ๋๋ ์๋์ผ๋ก ์ฃฝ๊ฒ๋๋ค.
์๋๋ ์ฐ๋ ๋๋ฅผ ๊ด๋ฆฌํด์ผ ํ์ง๋ง ์๋ฒ๊ฐ ๋ค์ค ์ฐ๋ ๋๋ฅผ ์์ฑ ๋ฐ ์ด์ํด์ฃผ๋ ์ฐ๋ ๋์ ์์ ์ฑ์ ๋ํด์ ๊ฑฑ์ ํ์ง ์์๋ ๋๋ค.
์๋ธ๋ฆฟ ์ปจํ ์ด๋๋ฅผ ์ฌ์ฉํ๋ฉด ๊ฐ๋ฐ์๋ ๋ณด์์ ๊ด๋ จ๋ ๋ด์ฉ์ ์๋ธ๋ฆฟ ๋๋ ์๋ฐ ํด๋์ค์ ๊ตฌํํด ๋์ง ์์๋ ๋๋ค.
์ผ๋ฐ์ ์ผ๋ก ๋ณด์๊ด๋ฆฌ๋ XML ๋ฐฐํฌ ์์ ์์ ๋ค๊ฐ ๊ธฐ๋กํ๋ฏ๋ก, ๋ณด์์ ๋ํด ์์ ํ ์ผ์ด ์๊ฒจ๋ ์๋ฐ ์์ค ์ฝ๋๋ฅผ ์์ ํ์ฌ ๋ค์ ์ปดํ์ผ ํ์ง ์์๋ ๋ณด์๊ด๋ฆฌ๊ฐ ๊ฐ๋ฅํ๋ค.
โ๏ธ WebServlet์ผ๋ก ์๋ธ๋ฆฟ์ URL์ ๋งตํํ ๋ ์ฌ์ฉ
Servlet์ lazy-init์ด๋ค. ํ์ง๋ง loadOnStartup
์ ํด ์ฃผ๋ฉด, ๋ฏธ๋ฆฌ ์ด๊ธฐํ ํ ์ ์๋ค.
1(์ ํํ ์ผ์น) โก๏ธ 2(๊ฒฝ๋ก) โก๏ธ 3(ํ์ฅ์) โก๏ธ 4(๋ํดํธ)๋ก ์ฐ์ ์์๊ฐ ์ ํด์ง๋ค.
โ๏ธ Spring์์๋ ๋ชจ๋ ์์ฒญ์ DispatcherServlet์ด ๋ฐ๋๋ค.
: Spring์ ์ด๋ ๊ฒ ๋งตํํ์ง ์๊ณ ๋ด๋ถ์ ์ผ๋ก DispatcherServlet์ด ์์์ ์ฒ๋ฆฌํด ์ค๋ค.
โ๏ธ Servlet โก๏ธ Spring
HttpServlet
์์์ด ์์ด์ง๋ค.
: Java๋ ๋จ์ผ ์์์ด๊ธฐ ๋๋ฌธ์ ์ฌ๋งํ๋ฉด ์์์ ์ ๋ฐ๋๊ฒ ์ข๋ค. ๊ทธ๋์ Spring์์๋ ์์์ ๋ฐ๋ ๊ฒ์ด ์ฌ๋ผ์ง๋ค.
๋งค๊ฐ๋ณ์์ ํ์ํ ๊ฒ๋ง ์ ์ผ๋ฉด ๋๋ค.
์ ๋ํ
์ด์
์ ๋๋ ์ ์ฒ๋ฆฌํ๊ฒ ๋๋ค.
: ๊ธฐ์กด์๋ url๋งคํ์ ํด๋์ค ๋จ์๋ก ํ์๋ค. (@WebServlet)
Reference
: https://mangkyu.tistory.com/14