** ๐ PART 7. ์ค๋ฌด/๋ฉด์ ๋์ด๋ ์ง๋ฌธ ์์ ์ ๋ฆฌ **
โ๋จ์ ๊ฐ๋ ๋ง๊ณ , ์ค์ ํ์ ์์ ์ ์ค์ํ์ง๋ฅผ ์ดํดํ์!โ
๐ธ 1. RequestDispatcher.forward()
vs response.sendRedirect()
๋ฉ๋ชจ๋ฆฌ ์ฐจ์ด?
โ ์ฐจ์ด ๋จผ์ ์ ๋ฆฌ!
ํญ๋ชฉ | forward() | sendRedirect() |
---|---|---|
์ด๋ ๋ฐฉ์ | ๋ด๋ถ์์ ์ด๋ (์๋ฒ ๋ด๋ถ ์ฒ๋ฆฌ) | ์ธ๋ถ๋ก ์ด๋ (๋ธ๋ผ์ฐ์ ์ ์ ์์ฒญ ์ง์) |
์ฃผ์์ฐฝ | ๊ทธ๋๋ก ์ ์ง๋จ | ์ฃผ์๊ฐ ๋ฐ๋ |
์๋ | ๋น ๋ฆ (์๋ฒ ๋ด๋ถ) | ๋๋ฆผ (๋ธ๋ผ์ฐ์ ์ฌ์์ฒญ) |
๋ฉ๋ชจ๋ฆฌ | ๊ฐ์ request ๊ฐ์ฒด ์ฌ์ฉ | ์ request ๊ฐ์ฒด ์์ฑ๋จ |
๐ง ๋ฉ๋ชจ๋ฆฌ ๊ด์ ์ฐจ์ด
-
forward()
โ ์์ฒญ ๊ฐ์ฒด(request) ์ฌ์ฌ์ฉ๋จ
โ ๋ฉ๋ชจ๋ฆฌ ๋ถ๋ด ์์
โ ๋ฐ์ดํฐ๋ ๊ทธ๋๋ก ์ ๋ฌ ๊ฐ๋ฅ
-
sendRedirect()
โ ์๋ก์ด ์์ฒญ์ด ๋ฐ์๋จ
โ request ๊ฐ์ฒด ์๋ก ๋ง๋ค์ด์ง
โ ์ด์ ๋ฐ์ดํฐ๋ ๋ ์๊ฐ๋ฏ๋ก ์ธ์ /ํ๋ผ๋ฏธํฐ๋ก ์ฌ์ ์ก ํ์
โ ์ค๋ฌด ์์ฝ
์ฌ์ฉ ์ํฉ | ์ถ์ฒ ๋ฐฉ์ |
---|---|
๋ก๊ทธ์ธ ์คํจ ํ ๋ฉ์์ง ๋ณด์ฌ์ค ๋ | forward() (request ๊ทธ๋๋ก ์ ์ง๋จ) |
๋ก๊ทธ์ธ ์ฑ๊ณต ํ ๋ฉ์ธ ํ์ด์ง๋ก ์ด๋ | sendRedirect() (URL ๋ณ๊ฒฝ์ด ํ์ํจ) |
๐ธ 2. static ํ๋์ DB ์ปค๋ฅ์ ์ ์ ์ฅํ๋ฉด ์ ๋๋ ์ด์ ๋?
๐ฆ ์ํฉ ์์
public class MyDao {
public static Connection conn = DriverManager.getConnection(...); // โ
}
โ ์ํํ ์ด์
์ด์ | ์ค๋ช |
---|---|
Connection์ ์ํ๊ฐ ์๋ ๊ฐ์ฒด | ์ฌ๋ฌ ๋ช ์ด ๋์์ ์ฌ์ฉํ๋ฉด ์ถฉ๋ ๋ฐ์ |
์ปค๋ฅ์ ๋์ ๋ฐ์ | ๋ซ์ง ์์ผ๋ฉด ๋ฉ๋ชจ๋ฆฌ์ ๊ณ์ ๋จ์์์ |
์์ธ ๋ฐ์ ์ ํ๋ณต ๋ถ๊ฐ | ํ ๋ฒ ์ค๋ฅ ๋๋ฉด ๋ชจ๋ ์ฌ์ฉ์๊ฐ ์ํฅ๋ฐ์ |
์ฐ๋ ๋ ์์ ์๋ | ๋์์ ๋ ๋ช ์ด ์ฟผ๋ฆฌ ๋ ๋ฆฌ๋ฉด ๊ฒฐ๊ณผ ๋ค์์ผ ์ ์์! |
โ ์ฌ๋ฐ๋ฅธ ๋ฐฉ์
- ๋งค ์์ฒญ๋ง๋ค ์ปค๋ฅ์
์
try-with-resources
๋ก ์ด๊ณ โ ์ฟผ๋ฆฌ ์คํ โ ๋ซ๋๋ค
try (Connection conn = DBConnection.getConnection()) {
// ์ฟผ๋ฆฌ ์ํ
} // ์๋ close!
๐ธ 3. JSP์์ ๊ฐ์ฒด ๊ณต์ ์ Thread-Safe ํ์ง ์์ผ๋ฉด ์๊ธฐ๋ ๋ฌธ์ ?
๐ฆ JSP๋ ๋ฉํฐ ์ฌ์ฉ์ ํ๊ฒฝ
JSP๋ ์๋ฒ์์ ํ ๋ฒ๋ง ์ปดํ์ผ๋จ โ
์ฌ๋ฌ ์ฌ์ฉ์๊ฐ ๋์์ ๋ค์ด์ค๋ฉด โ ๊ฐ์ ์ฝ๋๊ฐ ์ฌ๋ฌ ๋ช ์๊ฒ ์คํ๋จ
โ ๊ณต์ ๊ฐ์ฒด ์ฌ์ฉ ์ ๋ฌธ์ ์์
<%! List<String> list = new ArrayList<>(); %> <!-- โ ์ ์ธ๋ถ ๊ณต์ ๋จ -->
<% list.add("๋ฐ์ดํฐ"); %>
๐ฃ ๋ฌธ์ ๋ฐ์
- ์ฌ์ฉ์๊ฐ ๋์์ ์ ์ํ๋ฉด โ
list.add()
์ถฉ๋ - ๋ฐ์ดํฐ๊ฐ ์์ด๊ฑฐ๋,
ConcurrentModificationException
๋ฐ์
โ ํด๊ฒฐ์ฑ
- JSP ์์์๋ ๊ณต์ ๊ฐ์ฒด ์ฌ์ฉ โ
- ํญ์ ์ง์ญ ๋ณ์ ๋๋
request/session
๊ฐ์ฒด์ ์ ์ฅ
<% List<String> list = new ArrayList<>(); %> <!-- ์์ ํจ (์ง์ญ ๋ณ์) -->
๐ธ 4. Filter ์ฒด์ธ ์์ ๋ณ๊ฒฝ์ด ๋ฉ๋ชจ๋ฆฌ์ ๋ฏธ์น๋ ์ํฅ์?
๐ฆ Filter๋ ์์ฒญ/์๋ต์ ๊ฐ์ธ๋ ๊ตฌ์กฐ
์์ฒญ โ [Filter1] โ [Filter2] โ Controller โ [Filter2] โ [Filter1] โ ์๋ต
โ ์์ ๋ฐ๊พธ๋ฉด ๋ฉ๋ชจ๋ฆฌ ํ๋ฆ๋ ๋ฌ๋ผ์ง๋ค!
์์ ๋ณ๊ฒฝ | ์ํฅ |
---|---|
์ธ์ฝ๋ฉ ํํฐ๊ฐ ์ ์ผ ๋์ค์ ์คํ๋จ | ํ๊ธ ๊นจ์ง ๋ฐ์ โ |
XSS ํํฐ๋ณด๋ค ์ธ์ฆ ํํฐ๊ฐ ๋จผ์ ์คํ๋จ | ์ฌ์ฉ์ ์ ๋ ฅ ๊ฒ์ฌ ์ ๋๊ณ ๋ฐ๋ก ์ธ์ฆ ์ฒ๋ฆฌ๋จ |
๋ํ ํํฐ ์์ ๊ผฌ์ | request/response ๊ฐ์ฒด๊ฐ ์ ๋๋ก wrap๋์ง ์์ ๋ฉ๋ชจ๋ฆฌ ๋์ ๊ฐ๋ฅ์ฑ โ |
โ ์ค๋ฌด ์์น
- ์ธ์ฝ๋ฉ ํํฐ๋ ๊ฐ์ฅ ๋จผ์
- XSS ๋ณด์ ํํฐ โ ์ธ์ฆ ํํฐ โ ๋น์ฆ๋์ค ํํฐ ์์๋ก
- ํํฐ๋ ๊ฐ์ธ๋ ๊ฐ์ฒด ์๋งํผ ๋ฉ๋ชจ๋ฆฌ ๋ถ๋ด๋ ์๊ธฐ๋ฏ๋ก ์ต์ํ์ผ๋ก ์ค๊ณ
๐ธ 5. ์๋ธ๋ฆฟ์์ JSON ์๋ตํ ๋์ ๋ฉ๋ชจ๋ฆฌ ํจ์จ์ ๋ฐฉ๋ฒ์?
๐ฆ JSON ์๋ต ๊ธฐ๋ณธ ํ๋ฆ
response.setContentType("application/json;charset=UTF-8");
PrintWriter out = response.getWriter();
out.print("{\"name\":\"ํ๊ธธ๋\"}");
โ ๋ฉ๋ชจ๋ฆฌ ๋นํจ์จ ์์
String json = hugeObject.toString(); // โ ํ๊บผ๋ฒ์ ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ฆผ
out.write(json);
โ ํจ์จ์ ์ธ ๋ฐฉ์
์ ๋ต | ์ค๋ช |
---|---|
ObjectMapper.writeValue(OutputStream) ์ฌ์ฉ |
์คํธ๋ฆฌ๋ฐ ๋ฐฉ์์ผ๋ก JSON ์ถ๋ ฅ |
StringBuilder ๋์ Stream API ํ์ฉ | ์ ์ง์ ์๋ต ์ถ๋ ฅ ๊ฐ๋ฅ |
ํฐ ๋ฆฌ์คํธ ์๋ต ์ ํ์ด์ง ์ ์ฉ | ์ ์ฒด ๋ฐ์ดํฐ๋ฅผ ํ ๋ฒ์ ๋ณด๋ด์ง ์์ |
โ ์์ (Jackson ํ์ฉ)
ObjectMapper mapper = new ObjectMapper();
mapper.writeValue(response.getOutputStream(), myObject);
โ JSON ๋ฌธ์์ด์ ๋ฉ๋ชจ๋ฆฌ์ ๋ชจ๋ ์ ์ฅํ์ง ์๊ณ ,
โ ๋ฐ๋ก ์ถ๋ ฅ ์คํธ๋ฆผ์ ์ ์กํจ โ GC ๋ถ๋ด ์ค์ด๋ฆ!
โ ์ ์ฒด ์์ฝํ
์ง๋ฌธ | ํต์ฌ ํฌ์ธํธ | ๋ฉ๋ชจ๋ฆฌ ์ํฅ |
---|---|---|
forward vs redirect | forward๋ ๊ฐ์ request ์ฌ์ฌ์ฉ | redirect๋ ์ request ์์ฑ |
static ์ปค๋ฅ์ ์ ์ฅ | โ ์ํ! ์ฐ๋ ๋ ์ถฉ๋ + ๋์ ๋ฐ์ | ์ปค๋ฅ์ ํ ์ฌ์ฉํด์ผ ์์ |
JSP ๊ฐ์ฒด ๊ณต์ | ์ธ์คํด์ค ๋ณ์ ์ฌ์ฉ ๊ธ์ง | ๋ชจ๋ ์ฌ์ฉ์์๊ฒ ๊ณต์ ๋จ |
ํํฐ ์์ | ์์ ์ค์ โ ๊ฐ์ธ๋ ๊ฐ์ฒด ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ ๋ง์ | ํํฐ ์ฒด์ธ ๊ธธ์๋ก ๋ถ๋ด โ |
JSON ์๋ต | writeValue(OutputStream)์ผ๋ก ์คํธ๋ฆฌ๋ฐ ์ฒ๋ฆฌ | ๋ฉ๋ชจ๋ฆฌ ๋ญ๋น โ, GC ํจ์จ โ |