๐Ÿ’ป ์ฝ”๋”ฉ ์ผ๊ธฐ : [Spring JDBC] 'Spring JDBC ๋ฐ SELECT' ํŽธ

ybkยท2024๋…„ 4์›” 16์ผ

spring

๋ชฉ๋ก ๋ณด๊ธฐ
10/55
post-thumbnail

๐Ÿ”” 'Spring JDBC๋ฅผ ํ™œ์šฉํ•œ DB์— ๋ฐ์ดํ„ฐ ์กฐํšŒํ•˜๋Š” ๋ฐฉ๋ฒ•'์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด์ž!


๐Ÿ’Ÿ Spring JDBC

JDBC๋Š” Java Database Connectivity์˜ ์•ฝ์ž๋กœ, ์ž๋ฐ” ํ”„๋กœ๊ทธ๋žจ์—์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์—ฐ๊ฒฐํ•˜๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ์ž๋ฐ” API์ž…๋‹ˆ๋‹ค. JDBC๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ œ์ž‘์—…์ฒด์—์„œ ์ œ๊ณตํ•˜๋Š” ๋“œ๋ผ์ด๋ฒ„๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

  1. ์—ฐ๊ฒฐ ๊ด€๋ฆฌ(Connection Management): JDBC๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. DriverManager ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋“œ๋ผ์ด๋ฒ„๋ฅผ ๋“ฑ๋กํ•˜๊ณ , Connection ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

  2. SQL ์‹คํ–‰(SQL Execution): JDBC๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ SQL ๋ฌธ์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Statement, PreparedStatement, CallableStatement ๋“ฑ์˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ SQL ๋ฌธ์„ ์‹คํ–‰ํ•˜๊ณ , ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  3. ํŠธ๋žœ์žญ์…˜ ๊ด€๋ฆฌ(Transaction Management): JDBC๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŠธ๋žœ์žญ์…˜์„ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Connection ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŠธ๋žœ์žญ์…˜์„ ์‹œ์ž‘ํ•˜๊ณ  ์ปค๋ฐ‹ํ•˜๊ฑฐ๋‚˜ ๋กค๋ฐฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  4. ์˜ˆ์™ธ ์ฒ˜๋ฆฌ(Exception Handling): JDBC๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์•ก์„ธ์Šค ์ค‘ ๋ฐœ์ƒํ•˜๋Š” ์˜ˆ์™ธ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. SQLException ๋“ฑ์˜ ์˜ˆ์™ธ๋ฅผ ์ฒ˜๋ฆฌํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์•ก์„ธ์Šค ์ค‘ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

JDBC๋Š” ์ž๋ฐ” ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ ๋‹ค์–‘ํ•œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ฐ„์˜ ํ‘œ์ค€ํ™”๋œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์‰ฝ๊ฒŒ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€์˜ ํ†ตํ•ฉ์ด ๋‹จ์ˆœํ™”๋˜๊ณ , ์ด์‹์„ฑ์ด ํ–ฅ์ƒ๋ฉ๋‹ˆ๋‹ค.

1. DB์™€ ์—ฐ๊ฒฐํ•˜๊ธฐ

String url = "jdbc:mariadb://localhost:3306/w3schools";
String user = "root";
String password = "********";
Connection connection = DriverManager.getConnection(url, user, password);

Connection์€ DB์™€ ์—ฐ๊ฒฐ์„ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฐ์ฒด์ด๋ฉฐ DB์™€์˜ ํ†ต์‹ ์„ ๋‹ด๋‹นํ•ฉ๋‹ˆ๋‹ค.


๐Ÿ“ข Datasource๋ฅผ ๋นˆ์œผ๋กœ DB ์ •๋ณด๋ฅผ ์ €์žฅํ•ด๋†“์œผ๋ฉด Spring์ด ์•Œ์•„์„œ ๊ด€๋ฆฌํ•ด์ค๋‹ˆ๋‹ค. Datasource ๋นˆ๋งŒ ์ฃผ์ž…ํ•ด์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

@Autowired
private DataSource dataSource;
~~~
Connection connection = dataSource.getConnection();

2. ์‹คํ–‰ ์ค€๋น„

Statement statement = connection.createStatement();

์ฟผ๋ฆฌ๋ฅผ ๋ณด๋‚ด๊ณ  ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด Statement ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. Statement๋Š” SQL ๋ฌธ์„ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.


3. ์ฟผ๋ฆฌ ์‹คํ–‰

ResultSet resultSet = statement.executeQuery(sql);

์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ ResultSet ๊ฐ์ฒด๋กœ ๋ฐ›์Šต๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”์ถœํ•˜๊ณ  ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


4. ๊ฒฐ๊ณผ ๊ฐ€๊ณต ๋ฐ ์ž์› ๋‹ซ๊ธฐ

// 5. ์ž์› ๋‹ซ๊ธฐ
try (resultSet; statement; connection;){
    
// 4. ๊ฒฐ๊ณผ ๊ฐ€๊ณต
    while (resultSet.next()){ // resultSet์— ์ €์žฅ๋œ ๊ฐ ํ–‰์„ ํƒ์ƒ‰
        String name = resultSet.getString(1);//์ฒซ ๋ฒˆ์งธ ์ปฌ๋Ÿผ(์—ด)์˜ ๊ฐ’ ์–ป๊ธฐ
        list.add(name);
    }
}

์ฃผ์–ด์ง„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ฟผ๋ฆฌ์— ๋Œ€ํ•œ ๊ฒฐ๊ณผ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ  ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋ฌธ์ž์—ด ๋ฆฌ์ŠคํŠธ์— ์ €์žฅํ•˜๋ฉฐ ๋ชจ๋“  ์ฒ˜๋ฆฌ๊ฐ€ ๋‹ค ๋๋‚˜๋ฉด try-with-resources ๊ตฌ๋ฌธ์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ๋ฐฉ์ง€๋ฅผ ์œ„ํ•ด ๋‹ซ์•„์ค๋‹ˆ๋‹ค.

  • resultSet.next()์€ ํ…Œ์ด๋ธ”์˜ ๊ฐ ํ–‰์„ ํƒ์ƒ‰ํ•ฉ๋‹ˆ๋‹ค.
  • getString(n)์€ ํ•ด๋‹น ํ…Œ์ด๋ธ”์˜ ์ปฌ๋Ÿผ์˜ ์ธ๋ฑ์Šค(n)๋ฅผ ๋„ฃ์–ด ๊ฐ’์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. ๋งŒ์•ฝ 5๋ฒˆ์งธ ์ปฌ๋Ÿผ์˜ ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์˜ค๊ณ  ์‹ถ์œผ๋ฉด getString(5)๋ฅผ ํ•ด์ค˜์•ผ ํ•ฉ๋‹ˆ๋‹ค.

5. ๋ชจ๋ธ ๊ฐ์ฒด์— ๊ฒฐ๊ณผ ์ถ”๊ฐ€ํ•˜๊ธฐ

1) nameList ์†์„ฑ์— list ๊ฐ’์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

model.addAttribute("nameList", list);

2) ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ”์ธ๋”ฉํ•˜์—ฌ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. nameList ์†์„ฑ์„ ์ฐพ์•„ ๋ฐ”์ธ๋”ฉํ•ฉ๋‹ˆ๋‹ค.

@ModelAttribute("nameList") ArrayList<String> list

Model ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ๊ณ  @ModelAttribute ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ์Šต๋‹ˆ๋‹ค.


6. view๋กœ ํฌ์›Œ๋“œ(html)
jspํŒŒ์ผ๋กœ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.


๐Ÿ’Ÿ Spring JDBC ์˜ˆ์ œ

๐ŸŸฆ ์ž๋ฐ”๋นˆ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด Spring JDBC ์ ์šฉํ•˜๊ธฐ

@Controller
@RequestMapping("main24")
public class Controller24 {

    @Autowired
    private DataSource dataSource;

    @GetMapping("sub2")
    public void method02(@ModelAttribute("customers")
                             ArrayList<MyBean242> list) throws Exception{
        String sql = """
                SELECT CustomerName, City, Country FROM Customers
                """;
        // DB ์—ฐ๊ฒฐ
        Connection connection = dataSource.getConnection();

        // Select ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ๊ฒฐ๊ณผ๋กœ ResultSet์„ ์–ป๋Š”๋‹ค
        Statement statement = connection.createStatement();
        ResultSet resultSet = statement.executeQuery(sql);

        try (connection; statement; resultSet;){
            // resultSet์— ์ €์žฅ๋œ ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ ์ˆœํšŒ
            while (resultSet.next()){
                MyBean242 bean242 = new MyBean242();
                bean242.setCustomerName(resultSet.getString(1));
                bean242.setCity(resultSet.getString(2));
                bean242.setCountry(resultSet.getString(3));
                list.add(bean242);
            }
        }
    }
import lombok.Data;

@Data
public class MyBean242 {
    private String customerName;
    private String city;
    private String country;
}
<h3>๊ณ ๊ฐ ๋ชฉ๋ก</h3>
<table>
    <thead>
    <tr>
        <th>NO</th>
        <th>CustomerName</th>
        <th>City</th>
        <th>Country</th>
    </tr>
    </thead>
    <tbody>
        <c:forEach items="${customers}" var="customer" varStatus="st">
            <tr>
                <td>${st.count}</td>
                <td>${customer.customerName}</td>
                <td>${customer.city}</td>
                <td>${customer.country}</td>
            </tr>
        </c:forEach>
    </tbody>
</table>

profile
๊ฐœ๋ฐœ์ž ์ค€๋น„์ƒ~

0๊ฐœ์˜ ๋Œ“๊ธ€