** ๐ PART 2.1 DAO / DTO / Service ๊ตฌ์กฐ์ ์์กด์ฑ ๊ด๋ฆฌ + ๋ฉ๋ชจ๋ฆฌ ์ต์ ํ ์ ๋ต **
๐ข 1๋จ๊ณ. DAO / DTO / Service๊ฐ ๋ญ์ง ์์ฃผ ์ฝ๊ฒ ์ค๋ช
์ด๋ฆ | ์ญํ | ๋น์ |
---|---|---|
DAO (๋ฐ์ดํฐ ์ ๊ทผ ๊ฐ์ฒด) | DB๋ ๋ํํ๋ ์ญํ | โ๋ฐ์ดํฐ ๋ฒ ์ด์ค ์ ํ๊ธฐโ |
DTO (๋ฐ์ดํฐ ์ ๋ฌ ๊ฐ์ฒด) | ๋ฐ์ดํฐ๋ฅผ ์ฎ๊ธฐ๋ ์์ | โํ๋ฐฐ ์์โ |
Service (๋น์ฆ๋์ค ๋ก์ง ์ฒ๋ฆฌ) | ๋ก์ง ํ๋จ, ์ฒ๋ฆฌ ํ๋ฆ ๋ด๋น | โ๋งค๋์ โ |
โ ์์๋ก ์ฝ๊ฒ ๋ณด๊ธฐ
[์ฌ์ฉ์] โ ๊ธ์ฐ๊ธฐ ๋ฒํผ ํด๋ฆญ
โ [Controller] โ "๊ธ ์ ์ฅํด์ค!"
โ [Service] โ "๊ธ์ด ์ ํจํ์ง ๋จผ์ ์ฒดํฌํ์"
โ [DAO] โ DB์ INSERT ์์ฒญ
โ [DTO] โ ๊ธ ์ ๋ชฉ/๋ด์ฉ์ ํ๋๋ก ํฌ์ฅํด์ ์ ๋ฌ
๐ง DAO ์ธ์คํด์ค ์์ฑ ์ ๋ต
๐ฌ ๋ฌธ์ : DAO๋ฅผ ๊ณ์ new ํ๋ฉด ๋ฉ๋ชจ๋ฆฌ ๋ญ๋น
BoardDao dao = new BoardDao(); // ๐ฃ ์ด๊ฑธ ์์ฒญ๋ง๋ค ํ๋ฉด ๋ฉ๋ชจ๋ฆฌ ๋ญ๋น
๐ก ํด๊ฒฐ์ฑ : ์ฑ๊ธํค ํจํด(Singleton Pattern)
โจ ๋ฑ ํ ๊ฐ๋ง ๋ง๋ค๊ณ , ๋ชจ๋๊ฐ ๊ทธ๊ฑธ ์ฐ๊ฒ ํ๋ ํจํด์ด์ผ!
๐ง ์ฑ๊ธํค ํจํด ๊ตฌ์กฐ (์คํ์๋ ์ดํด ๊ฐ๋ฅ!)
public class BoardDao {
// ๐ก ๋ฑ ํ ๊ฐ๋ง ์์ฑ๋๋ ๊ฐ์ฒด ์ ์ฅ์
private static BoardDao instance = new BoardDao();
// ๐ก ์ธ๋ถ์์ new ๋ชปํ๊ฒ ๋ง์ (์์ฑ์ private)
private BoardDao() {}
// ๐ก ์ด๊ฑธ๋ก๋ง ์ ๊ทผ ๊ฐ๋ฅ
public static BoardDao getInstance() {
return instance;
}
}
โ ์ฅ์ (๋ฉด์ ํฌ์ธํธ ํฌํจ)
ํญ๋ชฉ | ์ค๋ช |
---|---|
๋ฉ๋ชจ๋ฆฌ ์ ์ฝ | ๊ฐ์ฒด๋ฅผ ๋ฑ 1๊ฐ๋ง ์์ฑ |
GC ํจ์จ | ์ค๋ณต ๊ฐ์ฒด ์์ฑ ์์ โ GC ์ค์ด๋ฆ |
์ฑ๋ฅ ํฅ์ | ๋งค๋ฒ new ํ ํ์ ์์ |
์์กด์ฑ ๊ด๋ฆฌ | ์ด๋์๋ ๋์ผํ ๊ฐ์ฒด ์ฌ์ฉ ๊ฐ๋ฅ |
๐ง ๋ฉด์ ์์ ์ง๋ฌธ
์ DAO๋ ์ฑ๊ธํค์ผ๋ก ๋ง๋ค๊น์?
โ ์์ฃผ ์ฐ๋ ๊ฐ์ฒด๋ผ ๊ณ์ ์์ฑํ๋ฉด ๋ฉ๋ชจ๋ฆฌ ๋ญ๋น + ์ฑ๋ฅ ์ ํ๊ฐ ๋ฐ์ํด์!
๐ง DB ์ปค๋ฅ์ ํ(Connection Pool, CP)์ ๋ฉ๋ชจ๋ฆฌ ์ต์ ํ ์๋ฆฌ
๐ฌ ๋จผ์ ๊ฐ๋ ๋ถํฐ ์ฝ๊ฒ ์ค๋ช
- DB์ ์ ์ํ๋ ค๋ฉด ์ปค๋ฅ์ ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด์ผ ํด
- ์ด๊ฒ ๋น์! (์๊ฐ๋ ์ค๋ ๊ฑธ๋ฆฌ๊ณ , ๋ฉ๋ชจ๋ฆฌ๋ ๋ง์ด ์)
๊ทธ๋์ ์ปค๋ฅ์ ์ ๋ฏธ๋ฆฌ ์ฌ๋ฌ ๊ฐ ๋ง๋ค์ด ๋๊ณ
์์ฒญ ์ฌ ๋๋ง๋ค ๊บผ๋ด ์ฐ๊ณ ๋ค์ ๋๋ ค์ฃผ๋ ํ(pool)์ ๋ง๋ค์ด ๋์ ๊ฒ!
๐ฏ ์ปค๋ฅ์ ํ ๋น์
๋ฐฉ์ | ์ค๋ช | ๋น์ |
---|---|---|
๋งค๋ฒ new | ์์ฒญ๋ง๋ค DB ์ ์ ์๋ก ์์ฑ | ๋งค๋ฒ ๊ณต๊ตฌ ์ฌ๋ ๊ณต์ฅ |
์ปค๋ฅ์ ํ | DB ์ ์ ์ฌ๋ฌ ๊ฐ ๋ง๋ค์ด๋๊ณ ์ฌ์ฌ์ฉ | ๊ณต๊ตฌ ๋์ฌ์ ๋ง๋ค๊ธฐ! ํ์ํ ๋ ๋น๋ ค ์ฐ๊ณ ๋๋ ค์ค |
๐ป ์ปค๋ฅ์ ํ ๋์ ๊ตฌ์กฐ
[ํ๋ก๊ทธ๋จ ์์ ์]
โ ์ปค๋ฅ์
10๊ฐ ๋ฏธ๋ฆฌ ๋ง๋ค์ด๋
[์ฌ์ฉ์ ์์ฒญ ์]
โ ํ๋ ๊บผ๋ด์ DAO์์ ์ฌ์ฉ โ ๋๋๋ฉด ๋ค์ ๋ฐ๋ฉ
[๋ฉ๋ชจ๋ฆฌ ํจ์จ ๐]
โ ๋ถํ์ํ ์ปค๋ฅ์
์์ฑ/ํ๊ดด ์์ด ๊ณ ์ ๋ ๋ฆฌ์์ค๋ก ์ฒ๋ฆฌ ๊ฐ๋ฅ
โ ์ค๋ฌด ์ฌ์ฉ ์์: DBCP / HikariCP / TomcatCP
- Tomcat, Spring, MyBatis ๋ฑ์์ ๋ชจ๋ ๊ธฐ๋ณธ์ผ๋ก ์ฌ์ฉํจ
- XML์ด๋ config์์ ์ปค๋ฅ์
ํ ๊ฐ์ ์ค์ ๊ฐ๋ฅ (
maxActive
,initialSize
๋ฑ)
โ ์ปค๋ฅ์ ํ ๋์ ์ ๋ฉ๋ชจ๋ฆฌ / GC ์ฅ์
ํญ๋ชฉ | ํจ๊ณผ |
---|---|
์ปค๋ฅ์ ๊ฐ์ฒด ์ฌ์ฌ์ฉ | ๋งค๋ฒ ์์ฑํ ํ์ ์์ โ ๋ฉ๋ชจ๋ฆฌ ๋ญ๋นโ |
GC ๋ถ๋ด ๊ฐ์ | ์์ฃผ ์์ฑ/์ญ์ ๋๋ ๊ฐ์ฒด๊ฐ ์ค์ด๋ฆ |
์๋ต ์๋ ํฅ์ | DB ์ฐ๊ฒฐ ์๊ฐ์ด ์ค์ด๋ฆ |
๐ง ๋ฉด์ ํฌ์ธํธ ์ ๋ฆฌ
์ง๋ฌธ | ์์ |
---|---|
DAO๋ฅผ ์ ์ฑ๊ธํค์ผ๋ก ๋ง๋ค๊น์? | ๋ถํ์ํ ๊ฐ์ฒด ์์ฑ ์ค์ฌ์ ์ฑ๋ฅ, ๋ฉ๋ชจ๋ฆฌ ์ ์ฝ |
์ปค๋ฅ์ ํ์ ์ฐ๋ฉด ๋ญ๊ฐ ์ข์๊ฐ์? | ๋ฉ๋ชจ๋ฆฌ ์ ์ฝ, ์ฑ๋ฅ ํฅ์, GC ๋ถ๋ด ๊ฐ์ |
์ปค๋ฅ์ ํ์ ์ ์ฐ๋ฉด ์ด๋ค ์ผ์ด ์๊ธฐ๋์? | ์ปค๋ฅ์ ๊ฐ์ฒด๊ฐ ๋งค๋ฒ ์์ฑ โ GC ๋ถ๋ด + ์๋ฒ ๋ค์ด ์ํ |
DAO๊ฐ ๋๋ฌด ๋ง์์ง๋ฉด ์ด๋ป๊ฒ ํ๋์? | ๊ณตํต ๋ก์ง ์ถ์ํ (GenericDAO ๋๋ Repository ํจํด ์ ์ฉ) |
โ ๋ง๋ฌด๋ฆฌ ์์ฝํ
์์ | ์ค๊ณ ์ ๋ต | ๋ฉ๋ชจ๋ฆฌ ์ต์ ํ ํฌ์ธํธ |
---|---|---|
DAO | ์ฑ๊ธํค | ์ค๋ณต ๊ฐ์ฒด ์ ๊ฑฐ, ์ฌ์ฌ์ฉ |
DTO | ๊ฐ๋ณ๊ฒ ์ค๊ณ, ๋ถ๋ณ ๊ฐ์ฒด ์ฌ์ฉ | ํ์ ์ GC ๋์, ์์ฑ ์ต์ํ |
Service | ์์ฒญ๋ง๋ค ์์ฑ ๊ฐ๋ฅ (์ํ ์์) | ๋น์ฆ๋์ค ๋ก์ง๋ง ์ํ |
Connection | ํ๋ก ๊ด๋ฆฌ | ๊ฐ์ฒด ์ฌ์ฌ์ฉ โ ๋ฉ๋ชจ๋ฆฌ ์์ |
โ PART 2.2 JDBC ์ปค๋ฅ์ & ๋ฆฌ์์ค ๋์ ๋ฐฉ์ง ์ ๋ต
โ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ์ฐ๊ฒฐํ ๋ ๋ฉ๋ชจ๋ฆฌ ๋ญ๋น ์์ด, ๋ณด์๋ ์ ์งํค๋ ๋ฐฉ๋ฒโ
๐ข 1๋จ๊ณ. JDBC ์ฐ๊ฒฐ์ด ๋ญ์ผ?
๐ฌ ์์ฃผ ์ฝ๊ฒ ๋งํ๋ฉด:
Java์์ DB๋ ๋ํํ๋ ค๋ฉด ์ ํ์ ์ ์ฐ๊ฒฐํด์ผ ํด.
์ด ์ ํ์ ์ JDBC ์ปค๋ฅ์ (Connection) ์ด๋ผ๊ณ ๋ถ๋ฌ.
๐ฆ JDBC ๊ธฐ๋ณธ ํ๋ฆ ์์ฝ
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
conn = DriverManager.getConnection(...); // ๐ ์ ํ ์ฐ๊ฒฐ
pstmt = conn.prepareStatement("SELECT * FROM member"); // ๐ฌ ๋งํ๊ธฐ ์ค๋น
rs = pstmt.executeQuery(); // ๐ฅ ๊ฒฐ๊ณผ ๋ฐ๊ธฐ
while(rs.next()) { ... } // ๐ ๊ฒฐ๊ณผ ๋ฐ๋ณต
} catch(Exception e) {
e.printStackTrace();
} finally {
rs.close(); pstmt.close(); conn.close(); // ๐งน ๋ง๋ฌด๋ฆฌ ์ ๋ฆฌ!
}
๐ฅ 2๋จ๊ณ. ๋ฆฌ์์ค ๋์๊ฐ ๋ญ์ผ?
๐ฃ ๋ฆฌ์์ค ๋์(Resource Leak)๋
DB ์ปค๋ฅ์ , Statement, ResultSet ๊ฐ์ ๊ฒ๋ค์
์ฐ๊ณ ๋์ ๋ซ์ง ์์์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ณ์ ์ก์๋จน๋ ํ์์ด์ผ.
๐ง ์ ์ํํ ๊น?
- ์ปค๋ฅ์ ์ด ์ ๋ซํ๋ฉด, DB ์ ์ฅ์์ ์ ํ์ ์ด ๊ณ์ ๋ถ์กํ ์์
- ์๋ฒ์๋ ์ปค๋ฅ์ ์ ์ ํ์ด ์์ โ ํญ์ฃผ ์ DB ๋ค์ด ๊ฐ๋ฅ
- GC๊ฐ ๊ฐ์ฒด๋ฅผ ์๊ฑฐํ์ง ๋ชปํ๊ณ ๋ฉ๋ชจ๋ฆฌ ํฐ์ง(OutOfMemoryError)
โ 3๋จ๊ณ. try-with-resources๋ก ์๋์ผ๋ก ๋ซ๊ธฐ!
๐ฌ ์ด ๊ธฐ๋ฅ์ Java 7๋ถํฐ ์ถ๊ฐ๋ โ์๋ ์ ๋ฆฌ ๊ธฐ๋ฅโ์ด์ผ!
๐ก try๋ฌธ์์ AutoCloseable ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ๊ฐ์ฒด๋
try๊ฐ ๋๋๋ฉด ์๋์ผ๋ก close()๊ฐ ํธ์ถ๋ผ!
โ ์์ ์ฝ๋ (์๋ ๋ฐฉ์ vs ์ต์ ๋ฐฉ์ ๋น๊ต)
// ๐งน ์ต์ try-with-resources ๋ฐฉ์
try (
Connection conn = DriverManager.getConnection(...);
PreparedStatement pstmt = conn.prepareStatement("...");
ResultSet rs = pstmt.executeQuery();
) {
while(rs.next()) { ... }
} catch(Exception e) {
e.printStackTrace();
}
// โ
rs, pstmt, conn ๋ชจ๋ ์๋์ผ๋ก ๋ซํ!
โ ์ฅ์
ํญ๋ชฉ | ํจ๊ณผ |
---|---|
์ฝ๋ ๊น๋ | try ๋ธ๋ก ํ๋๋ก close ์ฒ๋ฆฌ |
์์ ์ฑ โ | ์์ธ ๋ฐ์ํด๋ ์๋์ผ๋ก ์ ๋ฆฌ๋จ |
๋ฉ๋ชจ๋ฆฌ ์์ | GC ๋์์ด ๋จ โ ๋์ ๋ฐฉ์ง |
๐ง ๋ฉด์ ํฌ์ธํธ
try-with-resources๋ฅผ ์ ์ผ์ ๋ ResultSet ์ ๋ซํ๋ฉด GC๊ฐ ์๊ฑฐ ๋ชปํด์
โ GC๋ โ์ ๊ทผ ๋ถ๊ฐ๋ฅํ ๊ฐ์ฒดโ๋ง ์ ๋ฆฌํจ โ ์ฐ๊ฒฐ๋ ๋ฆฌ์์ค๋ ๋จ์
๐ง 4๋จ๊ณ. Statement / ResultSet ๋ฉ๋ชจ๋ฆฌ ํด์ ํ์ด๋ฐ
๊ฐ์ฒด | ํด์ ์์ | ์ฃผ์์ |
---|---|---|
Connection |
๋ฐ๋์ ์ ์ผ ๋ง์ง๋ง์ ๋ซ์์ผ ํจ | ์ฐ๊ฒฐ ๋๊ธฐ |
Statement / PreparedStatement |
์ฟผ๋ฆฌ ๋๋๋ฉด ๋ซ๊ธฐ | SQL ์คํ ๋๊ตฌ |
ResultSet |
next() ๋ฐ๋ณต๋ฌธ ๋๋๊ณ ๋ซ๊ธฐ |
๊ฒฐ๊ณผ ๋ฉ๋ชจ๋ฆฌ ํด ์ ์์! |
GC ๊ด์ ์์ฝ
close()
๋ฅผ ์ง์ ํธ์ถ โ ๋ด๋ถ์์ DB ์์ผ, ๋ฒํผ ๋ฑ๋ ์ ๋ฆฌ- ์ ๋ซ์ผ๋ฉด GC๊ฐ ์ฐธ์กฐ ์ค์ด๋ผ ๋ฉ๋ชจ๋ฆฌ ์๊ฑฐ ๋์์ด ์๋!
๐ 5๋จ๊ณ. PreparedStatement
์ฌ์ฌ์ฉ + ๋ณด์ + ๋ฉ๋ชจ๋ฆฌ ์ ๋ต
๐ ๊ฐ๋ ๋จผ์ ์ค๋ช
String sql = "SELECT * FROM member WHERE id = ?";
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setString(1, "hong");
ResultSet rs = pstmt.executeQuery();
๐ ์ ์ข์๊น?
ํญ๋ชฉ | ์ค๋ช |
---|---|
๋ณด์ | SQL Injection ๋ฐฉ์ง (์ ๋ ฅ๊ฐ์ ๋ฌธ์๋ก escape ์ฒ๋ฆฌ) |
์๋ | SQL์ ๋ฏธ๋ฆฌ ์ปดํ์ผ ํด๋ฌ์ ์คํ ์๋โ |
๋ฉ๋ชจ๋ฆฌ | ๋ฐ๋ณต ์คํ ์ PreparedStatement๋ฅผ ์ฌ์ฌ์ฉํ๋ฉด ๋ฉ๋ชจ๋ฆฌ ๋ญ๋น โ |
โ ๏ธ ๋์ ์์: ๋ฌธ์์ด๋ก SQL ๋ง๋ค๊ธฐ
String sql = "SELECT * FROM member WHERE id = '" + userInput + "'";
// ๐ฟ SQL Injection ๊ณต๊ฒฉ์ ๋ซ๋ฆผ!
๐ก ๋ฉด์ ์์ ๋์ฌ ์ง๋ฌธ ์ ๋ฆฌ
์ง๋ฌธ | ํต์ฌ ๋ต๋ณ ์์ฝ |
---|---|
JDBC ์์์ ์ธ์ ๋ซ์์ผ ํ๋์? | ์ฌ์ฉ์ด ๋๋ ์งํ, ์ญ์์ผ๋ก close() ํด์ผ ํฉ๋๋ค |
try-with-resources์ ์ฅ์ ์? | ์ฝ๋ ๊ฐ๊ฒฐ + ์๋ close + ์์ธ ์ฒ๋ฆฌ ์์ ์ฑ |
ResultSet์ ์ ๋ซ์ผ๋ฉด ์ด๋ค ๋ฌธ์ ๊ฐ ์๊ธฐ๋์? | ๋ฉ๋ชจ๋ฆฌ ๋ฆญ, ์ปค๋ฅ์ ๋์, ์ฑ๋ฅ ์ ํ |
PreparedStatement๋ฅผ ์ฌ์ฉํ๋ ์ด์ ๋? | SQL Injection ๋ฐฉ์ง + ์ฑ๋ฅ + ๋ฉ๋ชจ๋ฆฌ ์ ์ฝ |
Connection์ ์ฌ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์? | ์ปค๋ฅ์ ํ(Connection Pool) ์ฌ์ฉ (์: HikariCP) |
โ ์์ฝ ๋ง๋ฌด๋ฆฌ ํ
ํญ๋ชฉ | ์ค๋ช | ๋ฉ๋ชจ๋ฆฌ ์ํฅ |
---|---|---|
try-with-resources | ์๋์ผ๋ก close() ํธ์ถ | ๋ฆฌ์์ค ๋์ ๋ฐฉ์ง |
PreparedStatement | ๋ฏธ๋ฆฌ SQL ์ปดํ์ผ + ? ๋ฐ์ธ๋ฉ | ์ฑ๋ฅ โ, ๋ณด์ โ |
close ์์ | ResultSet โ Statement โ Connection | GC๊ฐ ๋ฐ๋ก ์ ๋ฆฌ ๊ฐ๋ฅํ๊ฒ |
โ PART 2.3 DTO ๊ฐ์ฒด์ ์ค๊ณ ๊ด์
โDTO๋ฅผ ์ด๋ป๊ฒ ๋ง๋ค์ด์ผ ๋น ๋ฅด๊ณ , ์์ ํ๊ณ , ๋ฉ๋ชจ๋ฆฌ ๋ญ๋น๋ ์์๊น?โ
๐ข 1๋จ๊ณ. DTO๊ฐ ๋ญ์ผ?
๐ฆ ์ ์ (์ฝ๊ฒ)
DTO(Data Transfer Object)๋ ๋ง ๊ทธ๋๋ก
๋ฐ์ดํฐ๋ฅผ ํ ๋ฉ์ด๋ฆฌ๋ก ์ฎ๊ธฐ๊ธฐ ์ํ ์์ ๊ฐ์ ์ญํ ์ ํด.
์์
public class Member {
private String id;
private String name;
private int age;
// getter, setter ๋ฑ
}
โ Member
๋ผ๋ DTO๋ฅผ ๋ง๋ค์ด์, ์ปจํธ๋กค๋ฌ โ DB โ ๋ทฐ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ์ ์ ์์ด.
โจ A. Serializable vs Jackson: ์ ์ฐ๊ณ , ์ฑ๋ฅ์ ์ด๋ค ์ฐจ์ด?
โ 1. Serializable ์ด๋?
๐ฌ ์๋ฐ ๊ฐ์ฒด๋ฅผ ๊ทธ๋๋ก ํ์ผ, ๋คํธ์ํฌ, ์ธ์ ์ ์ ์ฅํ ์ ์๊ฒ ๋ง๋๋ ๊ธฐ๋ฅ
๐ง ์ฌ์ฉ ์์:
public class MemberDTO implements Serializable {
private String id;
private String name;
}
๐ฆ ์ฌ์ฉํ๋ ๊ณณ:
HttpSession
์ ๊ฐ์ฒด ์ ์ฅ- ํ์ผ์ ์ ์ฅํ๊ฑฐ๋ ์ ์กํ ๋
โ ์๋ ๋ฐฉ์ (์ฝ๊ฒ)
[์๋ฐ ๊ฐ์ฒด] โ (Serializable) โ [0๊ณผ 1์ ํํ๋ก ๋ณํ] โ ์ ์ฅ/์ ์ก
๐ง ๋จ์
ํญ๋ชฉ | ์ค๋ช |
---|---|
์๋ ๋๋ฆผ | Reflection ๊ธฐ๋ฐ ์ง๋ ฌํ๋ ๋ฌด๊ฒ๊ณ ๋นํจ์จ์ |
ํฌ๊ธฐ ํผ | ํ์ ์๋ ์ ๋ณด๊น์ง ๊ฐ์ด ์ ์ฅ๋จ |
๋ณด์ ๋ฎ์ | ๋ฏผ๊ฐํ ํ๋๊น์ง ๊ทธ๋๋ก ๋ ธ์ถ ๊ฐ๋ฅ |
โ 2. Jackson ์ด๋?
๐ฌ Jackson์ ์๋ฐ ๊ฐ์ฒด๋ฅผ JSON ํํ๋ก ๋ฐ๊ฟ์ฃผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ผ.
์์:
ObjectMapper mapper = new ObjectMapper();
String json = mapper.writeValueAsString(member); // ๊ฐ์ฒด โ JSON
โ Jackson ์ฅ์
ํญ๋ชฉ | ์ค๋ช |
---|---|
๋น ๋ฆ | ์ปค์คํฐ๋ง์ด์ง๋ ์ง๋ ฌํ ๋ฐฉ์์ผ๋ก ์ฑ๋ฅ ์ข์ |
๊ฐ๋ฒผ์ | JSON ํฌ๋งท์ด ์๊ณ ๊ฐ๋ณ๋ค |
ํ์ฅ์ฑ โ | ์ธ๋ถ API, ํ๋ก ํธ์๋์ ์ฐ๊ฒฐ ์ ๋งค์ฐ ์ ๋ฆฌ |
โ ์ฑ๋ฅ ๋น๊ต ์์ฝ (๋ฉด์ ํต์ฌ)
ํญ๋ชฉ | Serializable | Jackson |
---|---|---|
์ฌ์ฉ ๋ชฉ์ | ์ธ์ ์ ์ฅ, ๋คํธ์ํฌ ์ ์ก | JSON ์๋ต, API ํต์ |
์๋ | ๋๋ฆผ (๋ด์ฅ ๋ฐฉ์) | ๋น ๋ฆ (์ต์ ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ) |
ํฌ๋งท | ๋ฐ์ด๋๋ฆฌ (0,1) | JSON (๋ฌธ์์ด) |
๊ฐ๋ ์ฑ | ์์ | ์์ (์ฌ๋๋ ์ฝ๊ธฐ ์ฌ์) |
GC ์ํฅ | ๋ฌด๊ฑฐ์ | ์๋์ ์ผ๋ก ์ ์ |
โจ B. ๋ถ๋ณ ๊ฐ์ฒด(Immutable DTO): ์ ๋ง๋ค๊ณ , ๋ฉ๋ชจ๋ฆฌ์ ์ด๋ค ์ํฅ?
โ 1. ๋ถ๋ณ ๊ฐ์ฒด๋?
๐ฌ ํ ๋ฒ ๋ง๋ค์ด์ง๋ฉด ์ ๋ ๊ฐ์ด ๋ฐ๋์ง ์๋ ๊ฐ์ฒด
์์: (Immutable DTO)
public class Member {
private final String id;
private final String name;
public Member(String id, String name) {
this.id = id;
this.name = name;
}
public String getId() { return id; }
public String getName() { return name; }
}
๐ง ์ ์ข์๊น?
์ฅ์ | ์ค๋ช |
---|---|
์์ ์ฑ โ | ๊ฐ์ ๋ฐ๊ฟ ์ ์์ด์ ๋์ ์ฒ๋ฆฌ(๋ฉํฐ์ฐ๋ ๋)์ ๊ฐํจ |
์ค๋ฅ โ | ์ด๋์ ๊ฐ์ด ๋ฐ๋๋์ง ์ถ์ ์ ํด๋ ๋จ |
GC ์ ๋ฆฌ | ๋ณต์กํ ์ฐธ์กฐ ๊ด๊ณ๊ฐ ์์ โ ๋นจ๋ฆฌ GC ๋์์ด ๋จ |
์บ์ฑ ์ต์ ํ | ๊ฐ์ ๋ด์ฉ์ ๊ฐ์ฒด๋ ์ฌ์ฌ์ฉ ๊ฐ๋ฅ โ ๋ถํ์ํ ๊ฐ์ฒด ์์ฑ์ ์ค์ |
๋ฐ๋ ์์ (Mutable DTO)
member.setName("๋ณ๊ฒฝ๋จ"); // ๐ฅ ๋ค๋ฅธ ๊ณณ์์ ๊ฐ์๊ธฐ ๋ฐ๋๋ฉด ์ถ์ ์ด๋ ค์
โ 2. ๋ฉ๋ชจ๋ฆฌ(GC) ๊ด์ ์์ ์ ์ ๋ฆฌํ๊ฐ?
ํญ๋ชฉ | ๋ถ๋ณ ๊ฐ์ฒด | ๊ฐ๋ณ ๊ฐ์ฒด |
---|---|---|
์ฐธ์กฐ ๋ณต์ก๋ | ๋ฎ์ | ๋์ |
GC ํ์ ์๋ | ๋น ๋ฆ | ๋๋ฆผ |
๊ฐ์ฒด ์ฌ์ฌ์ฉ | ๊ฐ๋ฅ | ์ด๋ ค์ |
โ ๋ถ๋ณ ๊ฐ์ฒด๋ ์ฐธ์กฐ ํธ๋ฆฌ(tree)๊ฐ ๋จ์ํด์ GC๊ฐ ๋นจ๋ฆฌ ์๊ฑฐํ ์ ์์ด!
โ ๋ฉด์ ์ง๋ฌธ ์์ฝ & ์ ๋ต ํฌ์ธํธ
์ง๋ฌธ | ํต์ฌ ๋ต๋ณ |
---|---|
Serializable์ ์ธ์ ์ฌ์ฉํ๋์? | ์ธ์ ์ ์ฅ, ํ์ผ ์ ์ก์ฒ๋ผ ๊ฐ์ฒด ์ ์ฒด๋ฅผ ์ ์ฅํ ๋ |
Jackson์ ์ ์ฐ๋์? | JSON ํต์ ์ฉ ๊ฐ์ฒด ๋ณํ, ๋น ๋ฅด๊ณ ๊ฐ๋ฒผ์ |
๋ถ๋ณ ๊ฐ์ฒด์ ์ฅ์ ์? | ์์ ์ฑ โ, ๋ฒ๊ทธ โ, GC ๋์ ๋น ๋ฆ |
DTO์ setter๊ฐ ์์ผ๋ฉด ์ ๋๋์? | ๋๋ถ๋ถ ํ์ ์์, ์์ฑ์๋ก ๊ฐ ์ฃผ์ ์ด ์์ ํจ |
DTO ๊ฐ์ฒด๊ฐ ๋ง์์ง๋ฉด ์ฑ๋ฅ์ ์ํฅ ์๋์? | GC ๋์์ด ๋ง์์ง๋ฏ๋ก ์ค๊ณ๋ฅผ ์ต์ ํํด์ผ ํจ |
โ ๋ง๋ฌด๋ฆฌ ์์ฝํ
ํญ๋ชฉ | ์ค๋ช | ๋ฉ๋ชจ๋ฆฌ ์ธก๋ฉด |
---|---|---|
Serializable |
๊ฐ์ฒด๋ฅผ ๋ฐ์ด๋๋ฆฌ๋ก ์ ์ฅ | ๋ฌด๊ฑฐ์, ๋๋ฆผ |
Jackson |
๊ฐ์ฒด โ JSON ๋ฌธ์์ด | ๊ฐ๋ณ๊ณ ๋น ๋ฆ |
Immutable DTO |
๊ฐ์ด ์ ๋ ์ ๋ฐ๋ | ์์ ์ฑ โ, GC ์ ๋ฆฌ |
Setter ์๋ DTO |
๊ฐ์ด ํ ๋ฒ๋ง ๋ค์ด๊ฐ | ๋ฒ๊ทธ ์ํ โ, ์ฌ์ฌ์ฉ โ |