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

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

spring

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

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


๐Ÿ’Ÿ UPDATE

UPDATE : ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ…Œ์ด๋ธ”์˜ ๊ธฐ์กด ๋ ˆ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

UPDATE ํ…Œ์ด๋ธ”๋ช… SET ์ปฌ๋Ÿผ๋ช… = ๋ฐ”๊ฟ€๊ฐ’, ์ปฌ๋ ด๋ช… = ๋ฐ”๊ฟ€๊ฐ’, ... WHERE ๋ ˆ์ฝ”๋“œ์˜ ์กฐ๊ฑด

๐ŸŸฅ ์ฃผ์˜ํ•  ์  : ๋จผ์ € ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ •ํ•˜๊ธฐ ์ „์— ์กฐํšŒ๋ฅผ ํ•ด์ค€ ๋‹ค์Œ์— ํ•ด๋‹น ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ๋‹ค๋ฉด ๊ทธ ๋•Œ ์ˆ˜์ •ํ•ด์ฃผ๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.


Controller30.java

@Controller
@RequestMapping("main30")
public class Controller30 {

    @Autowired
    private DataSource dataSource;

    @GetMapping("sub1")
    public void method1(Integer id, Model model) throws SQLException {
        // ๊ณ ๊ฐ ๋ฒˆํ˜ธ๋ฅผ ๋ฐ›์€ ํ›„ ์กฐํšŒํ•œ ๋‹ค์Œ์— ์ง€์šธ ์˜ˆ์ •
        if (id !=  null){
            String sql = """
                    SELECT * FROM Customers WHERE CustomerID = ?
                    """;

            Connection conn = dataSource.getConnection();
            PreparedStatement pstmt = conn.prepareStatement(sql);
            pstmt.setInt(1,id); //์ฒซ๋ฒˆ์งธ ๋ฌผ์Œํ‘œ์— id ๋„ฃ๊ธฐ
            ResultSet rs = pstmt.executeQuery();
            try (rs;pstmt;conn){
                if (rs.next()) {
                    MyBean254Customer bean = new MyBean254Customer();
                    bean.setId(rs.getInt(1));
                    bean.setName(rs.getString(2));
                    bean.setContactName(rs.getString(3));
                    bean.setAddress(rs.getString(4));
                    bean.setCity(rs.getString(5));
                    bean.setPostalCode(rs.getString(6));
                    bean.setCountry(rs.getString(7));

                    model.addAttribute("customer", bean);
                }
            }
        }
    }

    @PostMapping("sub1/update")
    public String update1(MyBean254Customer customer, RedirectAttributes rttr) throws SQLException {
        System.out.println(customer);
        String sql = """
                UPDATE Customers
                SET CustomerName = ?,
                    ContactName = ?,
                    Address = ?,
                    City = ?,
                    PostalCode = ?,
                    Country = ?
                WHERE CustomerID = ?
                """;

        Connection con = dataSource.getConnection();
        PreparedStatement pstmt = con.prepareStatement(sql);
        
        try (pstmt;con){
            pstmt.setString(1,customer.getName());
            pstmt.setString(2,customer.getContactName());
            pstmt.setString(3,customer.getAddress());
            pstmt.setString(4,customer.getCity());
            pstmt.setString(5,customer.getPostalCode());
            pstmt.setString(6,customer.getCountry());
            pstmt.setInt(7, customer.getId());


            int rowCount = pstmt.executeUpdate();
            if(rowCount > 0){
                rttr.addFlashAttribute("message",customer.getId() + "๋ฒˆ ๊ณ ๊ฐ์ด ์ˆ˜์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค.");
            }else{
                rttr.addFlashAttribute("message", "์ˆ˜์ •๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.");
            }
        }

        rttr.addAttribute("id", customer.getId());

        return "redirect:/main30/sub1";
    }
}
  • ์กฐํšŒ(SELECT) :

    • "/main30/sub1"๋กœ์˜ GET ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์ œ๊ณต๋œ ๊ณ ๊ฐ ID๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ๊ณ ๊ฐ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฒ€์ƒ‰ํ•˜๊ณ  ๋ชจ๋ธ ์†์„ฑ์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
    • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์—ฐ๊ฒฐํ•˜๊ณ  SQL ์ฟผ๋ฆฌ ์‹คํ–‰์„ ์œ„ํ•ด PreparedStatement๊ฐ์ฒด ์ƒ์„ฑํ•˜๊ณ  SQL ์ฟผ๋ฆฌ์˜ ๋งค๊ฐœ๋ณ€์ˆ˜์— ์‚ฌ์šฉ๋  ๊ฐ’(?์— ๋“ค์–ด๊ฐˆ ๊ฐ’) ์„ค์ •(set)ํ•˜๊ณ  SQL ์ฟผ๋ฆฌ ์‹คํ–‰ํ•˜๊ณ  ResultSet ๊ฐ์ฒด์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
  • ์ˆ˜์ •(UPDATE) :

    • "/mai30/sub1/update"๋กœ POST ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์ง์› ๋ ˆ์ฝ”๋“œ๋ฅผ ์‚ญ์ œํ•˜๊ณ  ์‚ญ์ œ ๊ฒฐ๊ณผ์— ๋”ฐ๋ฅธ ํ•ด๋‹น ๋ฉ”์‹œ์ง€๋ฅผ ์„ค์ •ํ•˜๊ณ  ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ๋ฅผ ํ•ฉ๋‹ˆ๋‹ค.
    • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์—ฐ๊ฒฐํ•˜๊ณ  SQL ์ฟผ๋ฆฌ ์‹คํ–‰์„ ์œ„ํ•ด PreparedStatement๊ฐ์ฒด ์ƒ์„ฑํ•˜๊ณ  SQL ์ฟผ๋ฆฌ์˜ ๋งค๊ฐœ๋ณ€์ˆ˜์— ์‚ฌ์šฉ๋  ๊ฐ’(?์— ๋“ค์–ด๊ฐˆ ๊ฐ’) ์„ค์ •(set)ํ•˜๊ณ  executeUpdate() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ UPDATE ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜๊ณ , ์‚ญ์ œ๋œ ํ–‰์˜ ์ˆ˜๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ๋งˆ์ง€๋ง‰์œผ๋กœ "/main30/sub1"๋กœ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธํ•˜์—ฌ ์ˆ˜์ • ์ž‘์—… ํ›„์˜ ๊ฒฐ๊ณผ๋ฅผ ํ‘œ์‹œํ•˜๋Š” ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
    • ๋งค๊ฐœ๋ณ€์ˆ˜์— ์‚ฌ์šฉ๋  ๊ฐ’(?์— ๋“ค์–ด๊ฐˆ ๊ฐ’) ์„ค์ •ํ•  ๋•Œ ์ˆ˜์ •๋œ ๊ฐ’๋„ ๋„ฃ์–ด์•ผ ํ•˜์ง€๋งŒ ์ˆ˜์ •๋˜์ง€ ์•Š์€ ๊ฐ’์€ ๊ทธ๋Œ€๋กœ ์ง€์ •ํ•ด์ฃผ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

sub1.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="jakarta.tags.core" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<c:if test="${not empty message}">
    <div style="background-color: khaki; padding: 20px">${message}</div>
</c:if>


<h3>๊ณ ๊ฐ ์ •๋ณด ์ˆ˜์ •</h3>
<form action="">
    ๋ฒˆํ˜ธ
    <input type="text" name="id">
    <button>์กฐํšŒ</button>
</form>

<hr>
<form action="/main30/sub1/update" method="post" onsubmit="return confirm('์ •๋ง๋กœ ์ˆ˜์ •ํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?')">
    <div>
        ๋ฒˆํ˜ธ <input type="text" name="id" value="${customer.id}">
    </div>
    <div>
        ์ด๋ฆ„ <input type="text" name="name" value="${customer.name}">
    </div>
    <div>
        ๊ณ„์•ฝ๋ช… <input type="text" name="contactName" value="${customer.contactName}">
    </div>
    <div>
        ์ฃผ์†Œ <input type="text" name="address" value="${customer.address}">
    </div>
    <div>
        ๋„์‹œ <input type="text" name="city" value="${customer.city}">
    </div>
    <div>
        ์šฐํŽธ๋ฒˆํ˜ธ <input type="text" name="postalCode" value="${customer.postalCode}">
    </div>
    <div>
        ๊ตญ๊ฐ€ <input type="text" name="country" value="${customer.country}">
    </div>
    <div>
        <input type="submit" value="์ˆ˜์ •">
    </div>
</form>

</body>
</html>

๊ณ ๊ฐ ์ •๋ณด ์กฐํšŒ


๊ตญ๊ฐ€๋ฅผ ๋…์ผ์—์„œ Gremany๋กœ ์ˆ˜์ •


์ˆ˜์ • ์ปดํŽŒ

์ˆ˜์ •๋œ ๊ณ ๊ฐ ๋‹ค์‹œ ์กฐํšŒ



๐Ÿ’Ÿ DAO ํŒจํ„ด ์ ์šฉ(Mapper, Repository)

//Mapper01.java
// Inversion Of Control (IOC)
@Component
public class Mapper01 {
    public MyBean254Customer getCustomerById(Integer id) throws SQLException {
        // ๊ณ ๊ฐ ๋ฒˆํ˜ธ๋ฅผ ๋ฐ›์€ ํ›„ ์กฐํšŒํ•œ ๋‹ค์Œ์— ์ง€์šธ ์˜ˆ์ •
        if (id !=  null){
            String sql = """
                    SELECT * FROM Customers WHERE CustomerID = ?
                    """;

            Connection conn = DriverManager.getConnection("jdbc:mariadb://localhost:3306/w3schools", "root", "*****");
            PreparedStatement pstmt = conn.prepareStatement(sql);
            pstmt.setInt(1,id); //์ฒซ๋ฒˆ์งธ ๋ฌผ์Œํ‘œ์— id ๋„ฃ๊ธฐ
            ResultSet rs = pstmt.executeQuery();
            try (rs;pstmt;conn){
                if (rs.next()) {
                    MyBean254Customer bean = new MyBean254Customer();
                    bean.setId(rs.getInt(1));
                    bean.setName(rs.getString(2));
                    bean.setContactName(rs.getString(3));
                    bean.setAddress(rs.getString(4));
                    bean.setCity(rs.getString(5));
                    bean.setPostalCode(rs.getString(6));
                    bean.setCountry(rs.getString(7));

                    return bean;
                }
            }
        }
        return null;
    }
}

//Controller30.java
@Autowired
    private Mapper01 mapper;


@GetMapping("sub1")
    public void method1(Integer id, Model model) throws SQLException {
        MyBean254Customer c = mapper.getCustomerById(id);
        model.addAttribute("customer", c);
    }

Mapper๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ๊ฐ์ฒด ๊ฐ„์˜ ๋งคํ•‘์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์—ญํ• ์ž…๋‹ˆ๋‹ค.

  1. Mapper01 ํด๋ž˜์Šค๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ ๋ฐ ์ฟผ๋ฆฌ๋ฅผ ๋‹ด๋‹นํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ @Component๋กœ ์ฃผ์„์ด ๋‹ฌ๋ฆฐ ์Šคํ”„๋ง ๋นˆ์œผ๋กœ ๋“ฑ๋ก๋˜์–ด ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์— ์˜ํ•ด ๊ด€๋ฆฌ๋ฉ๋‹ˆ๋‹ค.

  2. Controller30 ํด๋ž˜์Šค์—์„œ๋Š” Mapper01 ํด๋ž˜์Šค๋ฅผ ์ž๋™์œผ๋กœ ์ฃผ์ž…๋ฐ›์•„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์Šคํ”„๋ง์˜ ์˜์กด์„ฑ ์ฃผ์ž…(Dependency Injection)์„ ํ†ตํ•ด ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค.

  3. method1 ๋ฉ”์„œ๋“œ์—์„œ๋Š” ๋” ์ด์ƒ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์ง์ ‘ ์ƒํ˜ธ ์ž‘์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋Œ€์‹  Mapper01 ํด๋ž˜์Šค์˜ getCustomerById ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

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

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