** ๐Ÿ“Œ PART 7. ์‹ค๋ฌด/๋ฉด์ ‘ ๋‚œ์ด๋„ ์งˆ๋ฌธ ์™„์ „ ์ •๋ฆฌ **

โ€œ๋‹จ์ˆœ ๊ฐœ๋… ๋ง๊ณ , ์‹ค์ œ ํ˜„์—…์—์„œ ์™œ ์ค‘์š”ํ•œ์ง€๋ฅผ ์ดํ•ดํ•˜์ž!โ€


๐Ÿ”ธ 1. RequestDispatcher.forward() vs response.sendRedirect() ๋ฉ”๋ชจ๋ฆฌ ์ฐจ์ด?


โœ… ์ฐจ์ด ๋จผ์ € ์ •๋ฆฌ!

ํ•ญ๋ชฉ forward() sendRedirect()
์ด๋™ ๋ฐฉ์‹ ๋‚ด๋ถ€์—์„œ ์ด๋™ (์„œ๋ฒ„ ๋‚ด๋ถ€ ์ฒ˜๋ฆฌ) ์™ธ๋ถ€๋กœ ์ด๋™ (๋ธŒ๋ผ์šฐ์ €์— ์ƒˆ ์š”์ฒญ ์ง€์‹œ)
์ฃผ์†Œ์ฐฝ ๊ทธ๋Œ€๋กœ ์œ ์ง€๋จ ์ฃผ์†Œ๊ฐ€ ๋ฐ”๋€œ
์†๋„ ๋น ๋ฆ„ (์„œ๋ฒ„ ๋‚ด๋ถ€) ๋А๋ฆผ (๋ธŒ๋ผ์šฐ์ € ์žฌ์š”์ฒญ)
๋ฉ”๋ชจ๋ฆฌ ๊ฐ™์€ request ๊ฐ์ฒด ์‚ฌ์šฉ ์ƒˆ request ๊ฐ์ฒด ์ƒ์„ฑ๋จ

๐Ÿง  ๋ฉ”๋ชจ๋ฆฌ ๊ด€์  ์ฐจ์ด


โœ… ์‹ค๋ฌด ์š”์•ฝ

์‚ฌ์šฉ ์ƒํ™ฉ ์ถ”์ฒœ ๋ฐฉ์‹
๋กœ๊ทธ์ธ ์‹คํŒจ ํ›„ ๋ฉ”์‹œ์ง€ ๋ณด์—ฌ์ค„ ๋•Œ forward() (request ๊ทธ๋Œ€๋กœ ์œ ์ง€๋จ)
๋กœ๊ทธ์ธ ์„ฑ๊ณต ํ›„ ๋ฉ”์ธ ํŽ˜์ด์ง€๋กœ ์ด๋™ sendRedirect() (URL ๋ณ€๊ฒฝ์ด ํ•„์š”ํ•จ)

๐Ÿ”ธ 2. static ํ•„๋“œ์— DB ์ปค๋„ฅ์…˜์„ ์ €์žฅํ•˜๋ฉด ์•ˆ ๋˜๋Š” ์ด์œ ๋Š”?


๐Ÿ“ฆ ์ƒํ™ฉ ์˜ˆ์‹œ

public class MyDao {
    public static Connection conn = DriverManager.getConnection(...); // โŒ
}

โ— ์œ„ํ—˜ํ•œ ์ด์œ 

์ด์œ  ์„ค๋ช…
Connection์€ ์ƒํƒœ๊ฐ€ ์žˆ๋Š” ๊ฐ์ฒด ์—ฌ๋Ÿฌ ๋ช…์ด ๋™์‹œ์— ์‚ฌ์šฉํ•˜๋ฉด ์ถฉ๋Œ ๋ฐœ์ƒ
์ปค๋„ฅ์…˜ ๋ˆ„์ˆ˜ ๋ฐœ์ƒ ๋‹ซ์ง€ ์•Š์œผ๋ฉด ๋ฉ”๋ชจ๋ฆฌ์— ๊ณ„์† ๋‚จ์•„์žˆ์Œ
์˜ˆ์™ธ ๋ฐœ์ƒ ์‹œ ํšŒ๋ณต ๋ถˆ๊ฐ€ ํ•œ ๋ฒˆ ์˜ค๋ฅ˜ ๋‚˜๋ฉด ๋ชจ๋“  ์‚ฌ์šฉ์ž๊ฐ€ ์˜ํ–ฅ๋ฐ›์Œ
์“ฐ๋ ˆ๋“œ ์•ˆ์ „ ์•„๋‹˜ ๋™์‹œ์— ๋‘ ๋ช…์ด ์ฟผ๋ฆฌ ๋‚ ๋ฆฌ๋ฉด ๊ฒฐ๊ณผ ๋’ค์„ž์ผ ์ˆ˜ ์žˆ์Œ!

โœ… ์˜ฌ๋ฐ”๋ฅธ ๋ฐฉ์‹

try (Connection conn = DBConnection.getConnection()) {
    // ์ฟผ๋ฆฌ ์ˆ˜ํ–‰
} // ์ž๋™ close!

๐Ÿ”ธ 3. JSP์—์„œ ๊ฐ์ฒด ๊ณต์œ  ์‹œ Thread-Safe ํ•˜์ง€ ์•Š์œผ๋ฉด ์ƒ๊ธฐ๋Š” ๋ฌธ์ œ?


๐Ÿ“ฆ JSP๋Š” ๋ฉ€ํ‹ฐ ์‚ฌ์šฉ์ž ํ™˜๊ฒฝ

JSP๋Š” ์„œ๋ฒ„์—์„œ ํ•œ ๋ฒˆ๋งŒ ์ปดํŒŒ์ผ๋จ โ†’

์—ฌ๋Ÿฌ ์‚ฌ์šฉ์ž๊ฐ€ ๋™์‹œ์— ๋“ค์–ด์˜ค๋ฉด โ†’ ๊ฐ™์€ ์ฝ”๋“œ๊ฐ€ ์—ฌ๋Ÿฌ ๋ช…์—๊ฒŒ ์‹คํ–‰๋จ


โ— ๊ณต์œ  ๊ฐ์ฒด ์‚ฌ์šฉ ์‹œ ๋ฌธ์ œ ์˜ˆ์‹œ

<%! List<String> list = new ArrayList<>(); %> <!-- โŒ ์„ ์–ธ๋ถ€ ๊ณต์œ ๋จ -->

<% list.add("๋ฐ์ดํ„ฐ"); %>

๐Ÿ’ฃ ๋ฌธ์ œ ๋ฐœ์ƒ


โœ… ํ•ด๊ฒฐ์ฑ…

<% List<String> list = new ArrayList<>(); %> <!-- ์•ˆ์ „ํ•จ (์ง€์—ญ ๋ณ€์ˆ˜) -->

๐Ÿ”ธ 4. Filter ์ฒด์ธ ์ˆœ์„œ ๋ณ€๊ฒฝ์ด ๋ฉ”๋ชจ๋ฆฌ์— ๋ฏธ์น˜๋Š” ์˜ํ–ฅ์€?


๐Ÿ“ฆ Filter๋Š” ์š”์ฒญ/์‘๋‹ต์„ ๊ฐ์‹ธ๋Š” ๊ตฌ์กฐ

์š”์ฒญ โ†’ [Filter1] โ†’ [Filter2] โ†’ Controller โ†’ [Filter2] โ†’ [Filter1] โ†’ ์‘๋‹ต

โ— ์ˆœ์„œ ๋ฐ”๊พธ๋ฉด ๋ฉ”๋ชจ๋ฆฌ ํ๋ฆ„๋„ ๋‹ฌ๋ผ์ง„๋‹ค!

์ˆœ์„œ ๋ณ€๊ฒฝ ์˜ํ–ฅ
์ธ์ฝ”๋”ฉ ํ•„ํ„ฐ๊ฐ€ ์ œ์ผ ๋‚˜์ค‘์— ์‹คํ–‰๋จ ํ•œ๊ธ€ ๊นจ์ง ๋ฐœ์ƒ โŒ
XSS ํ•„ํ„ฐ๋ณด๋‹ค ์ธ์ฆ ํ•„ํ„ฐ๊ฐ€ ๋จผ์ € ์‹คํ–‰๋จ ์‚ฌ์šฉ์ž ์ž…๋ ฅ ๊ฒ€์‚ฌ ์•ˆ ๋˜๊ณ  ๋ฐ”๋กœ ์ธ์ฆ ์ฒ˜๋ฆฌ๋จ
๋ž˜ํ•‘ ํ•„ํ„ฐ ์ˆœ์„œ ๊ผฌ์ž„ request/response ๊ฐ์ฒด๊ฐ€ ์ œ๋Œ€๋กœ wrap๋˜์ง€ ์•Š์•„ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ๊ฐ€๋Šฅ์„ฑ โ†‘

โœ… ์‹ค๋ฌด ์›์น™

  1. ์ธ์ฝ”๋”ฉ ํ•„ํ„ฐ๋Š” ๊ฐ€์žฅ ๋จผ์ €
  2. XSS ๋ณด์•ˆ ํ•„ํ„ฐ โ†’ ์ธ์ฆ ํ•„ํ„ฐ โ†’ ๋น„์ฆˆ๋‹ˆ์Šค ํ•„ํ„ฐ ์ˆœ์„œ๋กœ
  3. ํ•„ํ„ฐ๋Š” ๊ฐ์‹ธ๋Š” ๊ฐ์ฒด ์ˆ˜๋งŒํผ ๋ฉ”๋ชจ๋ฆฌ ๋ถ€๋‹ด๋„ ์ƒ๊ธฐ๋ฏ€๋กœ ์ตœ์†Œํ•œ์œผ๋กœ ์„ค๊ณ„

๐Ÿ”ธ 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 ํšจ์œจ โ†‘