** ๐Ÿ“Œ 2.1๋‹จ๊ณ„: parameterType์˜ ์ž‘๋™ ์›๋ฆฌ **


๐Ÿ” ๋ชฉํ‘œ ์š”์•ฝ

์ „๋‹ฌ ๋ฐฉ์‹ ์„ค๋ช… ์‚ฌ์šฉ ์˜ˆ
๋‹จ์ผ ๊ฐ’ ๊ธฐ๋ณธํ˜• ๋˜๋Š” ๋ฌธ์ž์—ด ํ•˜๋‚˜ ์ „๋‹ฌ int, String, ๋“ฑ
Map ๊ฐ์ฒด Map<String, Object>๋กœ key-value ์ „๋‹ฌ ์—ฌ๋Ÿฌ ์กฐ๊ฑด ์žˆ์„ ๋•Œ ์œ ์šฉ
DTO ๊ฐ์ฒด ์ž๋ฐ” ๊ฐ์ฒด ์ „์ฒด ์ „๋‹ฌ Student์ฒ˜๋Ÿผ ํ•„๋“œ๊ฐ€ ๋งŽ์€ ๊ฒฝ์šฐ

โœ… 1) ๋‹จ์ผ ๊ฐ’ ์ „๋‹ฌ ๋ฐฉ์‹

๐Ÿ’ก ์˜ˆ: ํ•™๋…„(grade)์ด ์ผ์น˜ํ•˜๋Š” ํ•™์ƒ ์กฐํšŒ

๐Ÿ”ง ๋งคํผ XML ์˜ˆ์‹œ (StudentMapper1.xml์— ์ถ”๊ฐ€ ๊ฐ€๋Šฅ)

<select id="getStudentsByGrade" parameterType="int" resultType="main.Student">
  SELECT * FROM student WHERE grade = #{grade}
</select>

๐Ÿ”ง Java ํ˜ธ์ถœ ์ฝ”๋“œ ์˜ˆ์‹œ

List<Student> list = session.selectList("student.getStudentsByGrade", 1);

โœ… 2) Map ์ „๋‹ฌ ๋ฐฉ์‹

๐Ÿ’ก ์˜ˆ: ์ด๋ฆ„ + ํ•™๋…„์œผ๋กœ ๊ฒ€์ƒ‰ํ•  ๋•Œ

๐Ÿ”ง ๋งคํผ XML ์˜ˆ์‹œ

<select id="searchStudentByNameAndGrade" parameterType="map" resultType="main.Student">
  SELECT * FROM student
  WHERE irum = #{irum} AND grade = #{grade}
</select>

๐Ÿ”ง Java ํ˜ธ์ถœ ์ฝ”๋“œ

Map<String, Object> param = new HashMap<>();
param.put("irum", "๊น€๋ฏผ์ˆ˜");
param.put("grade", 1);

List<Student> list = session.selectList("student.searchStudentByNameAndGrade", param);

โœ… 3) ๊ฐ์ฒด ์ „๋‹ฌ ๋ฐฉ์‹

๐Ÿ’ก ์˜ˆ: Student ๊ฐ์ฒด ์ž์ฒด๋กœ ๊ฒ€์ƒ‰

๐Ÿ”ง ๋งคํผ XML ์˜ˆ์‹œ

<select id="searchStudentByObject" parameterType="main.Student" resultType="main.Student">
  SELECT * FROM student
  WHERE irum = #{irum} AND grade = #{grade}
</select>

๐Ÿ”ง Java ํ˜ธ์ถœ ์ฝ”๋“œ

Student s = new Student();
s.setIrum("์ด์˜ํฌ");
s.setGrade(2);

List<Student> list = session.selectList("student.searchStudentByObject", s);

๐Ÿง  ์ •๋ฆฌ ์š”์•ฝ

์ „๋‹ฌ ๋ฐฉ์‹ parameterType ๊ฐ’ Java ์ „๋‹ฌ ์˜ˆ ํŠน์ง•
๋‹จ์ผ ๊ฐ’ int, String ๋“ฑ selectList("id", 1) ๊ฐ€์žฅ ๊ฐ„๋‹จ
Map map selectList("id", Map) ์œ ์—ฐํ•œ ๋‹ค์ค‘ ์กฐ๊ฑด
๊ฐ์ฒด ํด๋ž˜์Šค ๊ฒฝ๋กœ selectList("id", new Student()) ํ•„๋“œ๋ช… ๋งคํ•‘ ์ž๋™ ์ฒ˜๋ฆฌ

๐Ÿงช ๋„ค ํ”„๋กœ์ ํŠธ ์ ์šฉ ์˜ˆ์‹œ (์ถ”์ฒœ ํ™•์žฅ)

ID ์„ค๋ช… ์ถ”์ฒœ ๋ฐฉ์‹
getStudentsByGrade ํŠน์ • ํ•™๋…„ ์กฐํšŒ ๋‹จ์ผ ๊ฐ’ (int)
searchStudentByNameAndGrade ์ด๋ฆ„ + ํ•™๋…„ ๋ณตํ•ฉ ์กฐ๊ฑด Map
searchStudentByObject DTO ๊ธฐ๋ฐ˜ ํ•„ํ„ฐ๋ง ๊ฐ์ฒด (Student)

โœ… ์‹ค์Šต ์ถ”๊ฐ€ ํŒ

โœ… 2.2๋‹จ๊ณ„: SQL ์กฐ๊ฑด์ ˆ๊ณผ ํŒŒ๋ผ๋ฏธํ„ฐ ๋งคํ•‘ ์‹ค์Šต

(๐Ÿ“‚ StudentMapper1.xml ํ™•์žฅ ๊ธฐ๋ฐ˜)


๐ŸŽฏ ํ•™์Šต ๋ชฉํ‘œ


โœ… 1) ๋‹จ์ผ ํŒŒ๋ผ๋ฏธํ„ฐ + WHERE ์กฐ๊ฑด์ ˆ ์‹ค์Šต

๐Ÿ”ง ๋งคํผ XML ์˜ˆ์‹œ (StudentMapper1.xml์— ์ถ”๊ฐ€ ๊ฐ€๋Šฅ)

<select id="getStudentsByGrade" parameterType="int" resultType="main.Student">
  SELECT * FROM student
  WHERE grade = #{grade}
</select>

๐Ÿ”ง Java ํ˜ธ์ถœ ์ฝ”๋“œ

List<Student> list = session.selectList("student.getStudentsByGrade", 1);

๐Ÿง  ์ž‘๋™ ์›๋ฆฌ


โœ… 2) ๋‹ค์ค‘ ํŒŒ๋ผ๋ฏธํ„ฐ(Map) + ์กฐ๊ฑด์ ˆ

๐Ÿ”ง ๋งคํผ XML

<select id="searchStudentByNameAndGrade" parameterType="map" resultType="main.Student">
  SELECT * FROM student
  WHERE irum = #{irum}
  AND grade = #{grade}
</select>

๐Ÿ”ง Java ํ˜ธ์ถœ ์ฝ”๋“œ

Map<String, Object> param = new HashMap<>();
param.put("irum", "๊น€๋ฏผ์ˆ˜");
param.put("grade", 1);

List<Student> list = session.selectList("student.searchStudentByNameAndGrade", param);

๐Ÿง  ์ž‘๋™ ์›๋ฆฌ


โœ… 3) ๊ฐ์ฒด ํŒŒ๋ผ๋ฏธํ„ฐ + ์กฐ๊ฑด์ ˆ

๐Ÿ”ง ๋งคํผ XML

<select id="searchStudentByObject" parameterType="main.Student" resultType="main.Student">
  SELECT * FROM student
  WHERE irum = #{irum}
  AND grade = #{grade}
</select>

๐Ÿ”ง Java ํ˜ธ์ถœ ์ฝ”๋“œ

Student s = new Student();
s.setIrum("์ด์˜ํฌ");
s.setGrade(2);

List<Student> list = session.selectList("student.searchStudentByObject", s);

๐Ÿง  ์ž‘๋™ ์›๋ฆฌ


โœ… ๐Ÿ” ์‹ค์ „์—์„œ ์ž์ฃผ ๋‚˜์˜ค๋Š” ์กฐ๊ฑด์ ˆ ๋งคํ•‘ ํŒจํ„ด

์กฐ๊ฑด ์œ ํ˜• SQL ์˜ˆ์‹œ MyBatis ์˜ˆ์‹œ
๋ฌธ์ž์—ด ๋น„๊ต WHERE irum = '๊น€๋ฏผ์ˆ˜' WHERE irum = #{irum}
๋ถ€๋ถ„ ๊ฒ€์ƒ‰ WHERE irum LIKE '๊น€%' WHERE irum LIKE CONCAT(#{keyword}, '%')
๋ฒ”์œ„ WHERE grade BETWEEN 1 AND 3 WHERE grade BETWEEN #{min} AND #{max}
๋ณตํ•ฉ ์กฐ๊ฑด WHERE irum = '๊น€' AND grade = 1 WHERE irum = #{irum} AND grade = #{grade}

โœ… SQL ์กฐ๊ฑด์ ˆ ๋ฐ”์ธ๋”ฉ ์˜ค๋ฅ˜ ์œ ํ˜• ์˜ˆ์‹œ

์ฆ์ƒ ์›์ธ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•
SQL ๊ตฌ๋ฌธ ์˜ค๋ฅ˜ #{}๊ฐ€ ์•„๋‹Œ ${} ์‚ฌ์šฉ SQL ์ธ์ ์…˜ ์šฐ๋ ค โ†’ #{} ์‚ฌ์šฉ ๊ถŒ์žฅ
๊ฐ’์ด null์ธ๋ฐ ํ•„ํ„ฐ ์กฐ๊ฑด ํฌํ•จ null-safe ์กฐ๊ฑด ํ•„์š” if ์‚ฌ์šฉํ•˜์—ฌ ์กฐ๊ฑด ๋ถ„๊ธฐ ์ฒ˜๋ฆฌ
#{} ์•ˆ ์ด๋ฆ„์ด Java ํ•„๋“œ/Map key์™€ ๋ถˆ์ผ์น˜ ๋งคํ•‘ ์‹คํŒจ ์ •ํ™•ํžˆ ๋™์ผํ•œ ์ด๋ฆ„ ์‚ฌ์šฉ ํ•„์š”

โœ… ์ •๋ฆฌ ์š”์•ฝ

ํฌ์ธํŠธ ์„ค๋ช…
#{} Java ๊ฐ’ โ†’ ์•ˆ์ „ํ•˜๊ฒŒ SQL์— ์ „๋‹ฌ (PreparedStatement)
parameterType Java์—์„œ ์ „๋‹ฌํ•˜๋Š” ๊ฐ’์˜ ์ž๋ฃŒํ˜• ๋ช…์‹œ
WHERE ์กฐ๊ฑด์ ˆ #{}๋กœ Java ๊ฐ’๊ณผ ๋งคํ•‘ํ•ด์„œ ๋™์ ์œผ๋กœ ์กฐ๊ฑด ์„ค์ •
์˜ค๋ฅ˜ ๋ฐฉ์ง€ Map key ๋˜๋Š” ๊ฐ์ฒด ํ•„๋“œ๋ช…๊ณผ ๋ฐ˜๋“œ์‹œ ์ผ์น˜ํ•ด์•ผ ํ•จ

๐Ÿงช ์‹ค์Šต ์ฒดํฌ๋ฆฌ์ŠคํŠธ

โœ… 2.3๋‹จ๊ณ„: MyBatis SQL ๋กœ๊ทธ ์ถœ๋ ฅ ์„ค์ • (Log4j ์ ์šฉ ์‹ค์Šต)


๐ŸŽฏ ๋ชฉํ‘œ ์š”์•ฝ

ํ•ญ๋ชฉ ์„ค๋ช…
๋ชฉ์  SQL ์‹คํ–‰ ๋กœ๊ทธ + ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ฝ˜์†”์—์„œ ํ™•์ธ
์‚ฌ์šฉ ๋„๊ตฌ Log4j (MyBatis๊ฐ€ ์ง€์›ํ•˜๋Š” ๋Œ€ํ‘œ ๋กœ๊น… ํ”„๋ ˆ์ž„์›Œํฌ)
์„ค์ • ์œ„์น˜ src/log4j.properties ๋˜๋Š” src/resources/log4j.xml
ํ™•์ธ ํ•ญ๋ชฉ ์‹คํ–‰๋œ SQL ๋ฌธ์žฅ, ๋ฐ”์ธ๋”ฉ๋œ ์‹ค์ œ ๊ฐ’, ์—๋Ÿฌ ๋ฐœ์ƒ ์‹œ ์œ„์น˜

โœ… 1. ๋กœ๊ทธ ์ถœ๋ ฅ ์„ค์ • ์ค€๋น„

โœ… ํ•„์š”ํ•œ JAR ํŒŒ์ผ (๋„ˆ์˜ lib ํด๋”์— ์žˆ์–ด์•ผ ํ•จ)

ํŒŒ์ผ๋ช… ์„ค๋ช…
log4j-1.2.17.jar ๋กœ๊ทธ ์ถœ๋ ฅ ํ•ต์‹ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
slf4j-api-*.jar ๋กœ๊น… ์ธํ„ฐํŽ˜์ด์Šค
slf4j-log4j12-*.jar slf4j โ†’ log4j ์—ฐ๊ฒฐ ์–ด๋Œ‘ํ„ฐ

๐Ÿ“‚ ๊ฒฝ๋กœ: WebContent/WEB-INF/lib/

โœ… ๋„ˆ์˜ zip ํŒŒ์ผ ์•ˆ์— ์ด JAR๋“ค์ด ์ด๋ฏธ ์กด์žฌํ–ˆ๋Š”์ง€ ํ™•์ธ ํ›„, ์—†์œผ๋ฉด ์ˆ˜๋™ ์ถ”๊ฐ€ ํ•„์š”


โœ… 2. log4j.properties ์„ค์ • ํŒŒ์ผ ๋งŒ๋“ค๊ธฐ

๐Ÿ“„ ํŒŒ์ผ ์ƒ์„ฑ ์œ„์น˜: src/log4j.properties

# ๊ธฐ๋ณธ ๋กœ๊ทธ ๋ ˆ๋ฒจ ์„ค์ •
log4j.rootLogger=DEBUG, stdout

# ์ฝ˜์†” ์ถœ๋ ฅ ์„ค์ •
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%p] %c - %m%n

# MyBatis SQL ๋กœ๊ทธ ํ™•์ธ
log4j.logger.org.apache.ibatis=DEBUG
log4j.logger.java.sql=DEBUG
log4j.logger.java.sql.Connection=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG

โœ… 3. ๋กœ๊ทธ ํ™•์ธ ์˜ˆ์‹œ

์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ–ˆ์„ ๋•Œ:

Student s = new Student();
s.setIrum("์ด์˜ํฌ");
s.setGrade(2);
List<Student> list = session.selectList("student.searchStudentByObject", s);

โœ… ๋กœ๊ทธ ์˜ˆ์‹œ (์ฝ˜์†” ์ถœ๋ ฅ)

2025-04-17 10:12:45 [DEBUG] org.apache.ibatis.logging - ==>  Preparing: SELECT * FROM student WHERE irum = ? AND grade = ?
2025-04-17 10:12:45 [DEBUG] org.apache.ibatis.logging - ==> Parameters: ์ด์˜ํฌ(String), 2(Integer)

โœ… 4. ๋กœ๊ทธ๊ฐ€ ์ถœ๋ ฅ๋˜์ง€ ์•Š์„ ๊ฒฝ์šฐ ์ฒดํฌ์‚ฌํ•ญ

์ฆ์ƒ ์›์ธ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•
์ฝ˜์†”์— ์•„๋ฌด ๋กœ๊ทธ๋„ ์•ˆ ๋‚˜์˜ด log4j.properties ์œ„์น˜๊ฐ€ classpath ๋ฐ– src ํด๋”์— ์ •ํ™•ํžˆ ์œ„์น˜ํ•ด์•ผ ํ•จ
์—๋Ÿฌ๋งŒ ์ถœ๋ ฅ๋˜๊ณ  SQL์€ ์•ˆ ๋‚˜์˜ด org.apache.ibatis ๋กœ๊ทธ ๋ ˆ๋ฒจ ๋ˆ„๋ฝ DEBUG ์„ค์ • ํ•„์ˆ˜
๋กœ๊ทธ๊ฐ€ ๊นจ์ง ํŒจํ„ด ์„ค์ • ์˜ค๋ฅ˜ ConversionPattern ๋‹ค์‹œ ํ™•์ธ

โœ… ์‹ค์Šต ์ฒดํฌ๋ฆฌ์ŠคํŠธ


โœ… ์ •๋ฆฌ ์š”์•ฝ

ํ•ญ๋ชฉ ์„ค๋ช…
log4j ์„ค์ • ์ฝ˜์†” ๋กœ๊ทธ ํ™•์ธ์šฉ
logger ์„ค์ • org.apache.ibatis, java.sql.PreparedStatement ๋“ฑ
ํ™•์ธํ•  ๋กœ๊ทธ Preparing(์ฟผ๋ฆฌ), Parameters(ํŒŒ๋ผ๋ฏธํ„ฐ)
์œ„์น˜ ๋ฐ˜๋“œ์‹œ src/log4j.properties์— ์žˆ์–ด์•ผ ํ•จ

โœ… 2.4๋‹จ๊ณ„: #{} vs ${} ์ฐจ์ด & SQL Injection ๋ฐฉ์ง€ ์‹ค์Šต

(๐Ÿ“‚ StudentMapper1.xml ์ ์šฉ ๊ฐ€๋Šฅ)


๐ŸŽฏ ๋ชฉํ‘œ ์š”์•ฝ

ํ•ญ๋ชฉ ์„ค๋ช…
๋ชฉ์  #{}์™€ ${}์˜ ์ฐจ์ด์ ๊ณผ ๋ณด์•ˆ ์œ„ํ—˜์„ฑ์„ ์ดํ•ด
๋ณด์•ˆ SQL Injection์„ ๋ฐฉ์ง€ํ•˜๋Š” ์•ˆ์ „ํ•œ ๋ฐฉ๋ฒ• ์ตํžˆ๊ธฐ
์‹ค์Šต ์ •์  ๋ฐ”์ธ๋”ฉ vs ๋™์  ๋ฌธ์ž์—ด ์‚ฝ์ž…์˜ ์ฐจ์ด ๋น„๊ต

โœ… 1. #{} vs ${} ์ฐจ์ด ํ•ต์‹ฌ ์š”์•ฝ

ํ•ญ๋ชฉ #{} ${}
์˜๋ฏธ PreparedStatement์˜ ํŒŒ๋ผ๋ฏธํ„ฐ ๋ฐ”์ธ๋”ฉ SQL ๋ฌธ์ž์—ด ์น˜ํ™˜
์ฒ˜๋ฆฌ ๋ฐฉ์‹ ? ๋กœ ์น˜ํ™˜๋˜์–ด ์„œ๋ฒ„์—์„œ ๊ฐ’ ๋ฐ”์ธ๋”ฉ SQL์— ๋ฌธ์ž์—ด ์ง์ ‘ ์‚ฝ์ž…
๋ณด์•ˆ SQL Injection ๋ฐฉ์ง€ ๊ฐ€๋Šฅ โš ๏ธ SQL Injection ์œ„ํ—˜ ๋†’์Œ
์šฉ๋„ ์ผ๋ฐ˜ ์กฐ๊ฑด์ ˆ ๊ฐ’ ๋ฐ”์ธ๋”ฉ ์ปฌ๋Ÿผ๋ช…, ํ…Œ์ด๋ธ”๋ช…, ORDER BY ๊ฐ™์€ ๊ตฌ์กฐ ์กฐ๋ฆฝ ์‹œ๋งŒ ์‚ฌ์šฉ

โœ… 2. ์‹ค์Šต ์˜ˆ์ œ ๋น„๊ต

๐Ÿ›ก ์•ˆ์ „ํ•œ ๋ฐฉ์‹ โ€“ #{} (๊ถŒ์žฅ)

<select id="getStudentByName" parameterType="string" resultType="main.Student">
  SELECT * FROM student WHERE irum = #{irum}
</select>
String name = "์ด์˜ํฌ";
List<Student> list = session.selectList("student.getStudentByName", name);

โœ… ์ถœ๋ ฅ ๋กœ๊ทธ ์˜ˆ์‹œ (log4j ์„ค์ • ์‹œ)

Preparing: SELECT * FROM student WHERE irum = ?
Parameters: ์ด์˜ํฌ(String)

โš ๏ธ ์œ„ํ—˜ํ•œ ๋ฐฉ์‹ โ€“ ${} (SQL Injection ๊ฐ€๋Šฅ)

<select id="getStudentByNameUnsafe" parameterType="string" resultType="main.Student">
  SELECT * FROM student WHERE irum = '${irum}'
</select>
String name = "' OR '1'='1";
List<Student> list = session.selectList("student.getStudentByNameUnsafe", name);

โ— ์‹คํ–‰๋˜๋Š” SQL ์˜ˆ:

SELECT * FROM student WHERE irum = '' OR '1'='1'

โžก๏ธ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๊ฐ€ ์กฐํšŒ๋จ โ†’ SQL Injection ๊ณต๊ฒฉ ์„ฑ๊ณต


โœ… 3. ์ปฌ๋Ÿผ๋ช…์— ${} ์“ฐ๋Š” ์•ˆ์ „ํ•œ ์˜ˆ (์ •์  ๊ตฌ์กฐ ์กฐ๋ฆฝ์šฉ)

<select id="getStudentsSorted" parameterType="string" resultType="main.Student">
  SELECT * FROM student ORDER BY ${sortColumn}
</select>

String sortColumn = "grade"; // ์™ธ๋ถ€ ์ž…๋ ฅ์ด๋ฉด ๋ฐ˜๋“œ์‹œ ํ™”์ดํŠธ๋ฆฌ์ŠคํŠธ ์ฒดํฌ!
List<Student> list = session.selectList("student.getStudentsSorted", sortColumn);

โœ… ์ฃผ์˜:


โœ… ์‹ค์Šต ์ฒดํฌ๋ฆฌ์ŠคํŠธ

ํ•ญ๋ชฉ ํ™•์ธ ์—ฌ๋ถ€
WHERE ์กฐ๊ฑด, ๊ฐ’ ๋น„๊ต์—๋Š” ๋ฌด์กฐ๊ฑด #{} ์‚ฌ์šฉ โœ…
${}๋Š” ๊ตฌ์กฐ์  ์กฐ๋ฆฝ์—์„œ๋งŒ ์ œํ•œ์ ์œผ๋กœ ์‚ฌ์šฉ โœ…
์™ธ๋ถ€ ๋ฌธ์ž์—ด์ด ${}์— ๋“ค์–ด๊ฐ€์ง€ ์•Š๋„๋ก ํ•„ํ„ฐ๋ง โœ…
๋กœ๊ทธ ์ถœ๋ ฅ ์‹œ Preparing: โ†’ ? ์‚ฌ์šฉ๋˜๋Š”์ง€ ํ™•์ธ โœ…

โœ… ์ •๋ฆฌ ์š”์•ฝ

ํ•ญ๋ชฉ #{} ${}
๋‚ด๋ถ€ ๋™์ž‘ ? ๋กœ ์น˜ํ™˜ + ์•ˆ์ „ํ•œ ๊ฐ’ ๋ฐ”์ธ๋”ฉ ๋ฌธ์ž์—ด ์ง์ ‘ ์‚ฝ์ž… (์น˜ํ™˜)
SQL Injection ๋ฐฉ์ง€ ๊ฐ€๋Šฅ (๊ถŒ์žฅ) ์œ„ํ—˜ ๋งค์šฐ ๋†’์Œ
์‚ฌ์šฉ ์œ„์น˜ WHERE, SET, INSERT VALUES ๋“ฑ ๊ฐ’ ๋ฐ”์ธ๋”ฉ ํ…Œ์ด๋ธ”๋ช…/์ปฌ๋Ÿผ๋ช… ์กฐ๋ฆฝ ์‹œ๋งŒ
์˜ˆ์‹œ WHERE name = #{name} ORDER BY ${column}

๐Ÿง  ์‹ค๋ฌด ๋ณด์•ˆ ํŒ