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

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

spring

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

๐Ÿ”” 'MyBatis'์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด์ž!


๐Ÿ’Ÿ MyBatis

MyBatis : DB ์•ก์„ธ์Šค๋ฅผ ์œ„ํ•œ ์ž๋ฐ” ORM ํ”„๋ ˆ์ž„์›Œํฌ์ž…๋‹ˆ๋‹ค. SQL ์ฟผ๋ฆฌ์™€ ์ž๋ฐ” ๊ฐ์ฒด๋ฅผ ์ž๋™์œผ๋กœ ๋งคํ•‘ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๋™์ ์ฟผ๋ฆฌ์—์„œ ์‚ฌ์šฉํ•  ๋•Œ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • JDBC ๋ณด๋‹ค ์ฝ”๋“œ๊ฐ€ ๊ฐ„๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ’Ÿ @SELECT

  • ์กฐํšŒ ๊ฒฐ๊ณผ์˜ ์ปฌ๋Ÿผ๋ช…๊ณผ ๋ฆฌํ„ดํƒ€์ž…์˜ ๊ฐ์ฒด ํ”„๋กœํผํ‹ฐ๋ช…์ด ๊ฐ™์œผ๋ฉด ๊ฐ’์„ ๋ฐ”์ธ๋”ฉ(ํ• ๋‹น) ํ•ด์ค๋‹ˆ๋‹ค.
  • ๋งŒ์•ฝ ์ปฌ๋Ÿผ๋ช…๊ณผ ํ”„๋กœํผํ‹ฐ๋ช…์ด ๋‹ค๋ฅด๋‹ค๋ฉด ์ปฌ๋Ÿผ๋ช…์„ AS๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ณ„์นญ์„ ์ •ํ•ด์ฃผ๋ฉฐ AS ํ‚ค์›Œ๋“œ๋Š” ์ƒ๋žต๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

Mapper02 ์ธํ„ฐํŽ˜์ด์Šค

@Mapper
public interface Mapper02 {

    @Select("SELECT * FROM Customers WHERE CustomerID = 1")
    MyBean254Customer selectOneCustomer2();

    @Select("""
            SELECT CustomerId id, CustomerName name, 
                    ContactName, Address, City, Country, PostalCode
            FROM Customers WHERE CustomerID = 1""")
    MyBean254Customer selectOneCustomer3();
}
  • @Mapper ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ MyBatis mapper ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์ง€์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • @Mapper๊ฐ€ ๋ถ™์€ ์ธํ„ฐํŽ˜์ด์Šค์— ๋Œ€ํ•ด ์ž๋™์œผ๋กœ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

Controller31.java

@Controller
@RequestMapping("main31")
@RequiredArgsConstructor
public class Controller31 {

    private final Mapper02 mapper; //Mapper ์ธํ„ฐํŽ˜์ด์Šค ์ƒ์„ฑ์ž ์ฃผ์ž…

    @GetMapping("sub3")
    public void method3(){
        MyBean254Customer c = mapper.selectOneCustomer2();
        System.out.println("c = " + c);
    }

    @GetMapping("sub4")
    public void method4(){
        MyBean254Customer c = mapper.selectOneCustomer3();
        System.out.println("c = " + c);
    }
}
  • selectOneCustomer2()์˜ ๊ฒฐ๊ณผ๊ฐ’์€ c = MyBean254Customer(id=0, name=null, contactName=Maria Anders, address=Obere Str. 57, city=Berlin, country=๋…์ผ, postalCode=12209) ์ด๋ฉฐ id, name์ด ์ปฌ๋Ÿผ๋ช…๊ณผ ํ”„๋กœํผํ‹ฐ๋ช…์ด ๊ฐ™์ง€ ์•Š์•„ ๊ฐ’์ด ๋‚˜์˜ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

  • selectOneCustomer3()์˜ ๊ฒฐ๊ณผ๊ฐ’์€ c = MyBean254Customer(id=1, name=Alfreds Futterkiste, contactName=Maria Anders, address=Obere Str. 57, city=Berlin, country=๋…์ผ, postalCode=12209)์ด๋ฉฐ SQL ์ฟผ๋ฆฌ์—์„œ ๋ณ„์นญ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ปฌ๋Ÿผ๋ช…์„ ํ”„๋กœํผํ‹ฐ๋ช…๊ณผ ๊ฐ™๊ฒŒ ๋ณ€๊ฒฝํ•ด์ฃผ์–ด์„œ ๋ชจ๋“  ๊ฐ’์ด ๋‚˜์˜ค๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.


๐ŸŸฆ ๋™์  ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•

  • ๋ฆฌํ„ด๊ฐ’์ด ์—ฌ๋Ÿฌ ๊ฐœ์ผ ๊ฒฝ์šฐ List ํƒ€์ž…์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ex) ๋ฆฌํ„ดํƒ€์ž…์ด ํ•œ๊ฐœ๋ฉด MyBean254Customer ์—ฌ๋Ÿฌ ๊ฐœ์ด๋ฉด List
  • #{} ๋ฌธ๋ฒ•์„ ์‚ฌ์šฉํ•˜์—ฌ SQL ์ฟผ๋ฆฌ์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋ฐ”์ธ๋”ฉํ•ฉ๋‹ˆ๋‹ค. ์ด ๋•Œ #{} ์•ˆ์— ์ ํžŒ ์ด๋ฆ„์€ ๋ฉ”์„œ๋“œ์˜ ๋งค๊ฐœ๋ณ€์ˆ˜ ์ด๋ฆ„๊ณผ ์ผ์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
@Mapper
public interface Mapper02 {
    @Select("""
            SELECT CustomerID id,
                   CustomerName name,
                   ContactName, Address, City, Country, PostalCode
            FROM Customers
            WHERE Country = #{country1} OR Country = #{country2}
            ORDER BY Country
            """)
    List<MyBean254Customer> selectCustomersByCountry(String country1, String country2);
}
  • selectCustomersByCountry ๋ฉ”์„œ๋“œ์˜ ๋งค๊ฐœ๋ณ€์ˆ˜์ธ country1๊ณผ country2๋Š” SQL ์ฟผ๋ฆฌ์˜ ํŒŒ๋ผ๋ฏธํ„ฐ์ธ #{country1}๊ณผ #{country2}์™€ ์ด๋ฆ„์ด ์ผ์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Controller31.java

@Controller
@RequestMapping("main31")
@RequiredArgsConstructor
public class Controller31 {
    private final Mapper03 mapper;

    @GetMapping("sub11")
    public void method11(){
        List<MyBean254Customer> list = mapper.selectCustomersByCountry("usa","uk");
        list.forEach(System.out::println);
    }
}
  • selectCustomersByCountry() ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๋ฏธ๊ตญ(USA)๊ณผ ์˜๊ตญ(UK)์— ํ•ด๋‹นํ•˜๋Š” ๊ณ ๊ฐ์„ ๋ฆฌ์ŠคํŠธ์— ์ €์žฅํ•˜๊ณ , ๊ทธ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ’Ÿ @Delete

  • ํ•ด๋‹น ๋ฉ”์„œ๋“œ๊ฐ€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ๋ ˆ์ฝ”๋“œ๋ฅผ ์‚ญ์ œํ•˜๋Š” SQL ์ฟผ๋ฆฌ๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

Mapper02 ์ธํ„ฐํŽ˜์ด์Šค

@Mapper
public interface Mapper02 {
    @Delete("""
            DELETE FROM Customers WHERE CustomerId = #{id}
            """)
    int deleteOneCustomerByID(int id);
}
  • ์‚ญ์ œ ๊ฒฐ๊ณผ๋ฅผ ์ •์ˆ˜๋กœ ๋ฐ›์„ ํ•„์š”๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ ๋ฆฌํ„ดํƒ€์ž… void๋„ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

Controller31.java

@Controller
@RequestMapping("main32")
@RequiredArgsConstructor
public class Controller32 {
    @GetMapping("sub2")
    public void method2(Integer cid){
        int rowCount = mapper.deleteOneCustomerByID(cid);
        System.out.println(rowCount + "๋ช… ๊ณ ๊ฐ ์‚ญ์ œ๋จ");
    }
}
  • cid ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋ฐ›์•„์•„์„œ ํ•ด๋‹น ID์— ํ•ด๋‹นํ•˜๋Š” ๊ณ ๊ฐ์„ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.
  • "/main32/sub2?cid=5"๋กœ ์š”์ฒญ์„ ๋ณด๋‚ด๋ฉด ๊ณ ๊ฐ id 5์— ํ•ด๋‹นํ•˜๋Š” ๊ณ ๊ฐ์ด ์‚ญ์ œ๋ฉ๋‹ˆ๋‹ค.

๐Ÿ’Ÿ @Insert

  • ํ•ด๋‹น ๋ฉ”์„œ๋“œ๊ฐ€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ๋ ˆ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” SQL ์ฟผ๋ฆฌ๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

Mapper02 ์ธํ„ฐํŽ˜์ด์Šค

@Mapper
public interface Mapper02 {
    @Insert("""
            INSERT INTO Customers(CustomerName, ContactName, Address, City, PostalCode, Country)
            VALUES (#{name}, #{contactName}, #{address}, #{city}, #{postalCode}, #{country})
            """)
    int insertCustomer(MyBean254Customer customer); 

}
  • MyBean254Customer ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ์— ์ง์ ‘ ์ ‘๊ทผํ•˜์—ฌ ๊ฐ’์„ ๋ฐ”์ธ๋”ฉํ•ฉ๋‹ˆ๋‹ค.

Controller32.java

@Controller
@RequestMapping("main32")
@RequiredArgsConstructor
public class Controller32 {

    private final Mapper03 mapper;
    
    @GetMapping("sub5")
    public void method5(){
        // form์ด ์žˆ๋Š” view ํฌ์›Œ๋”ฉ
    }

    @PostMapping("sub5")
    public String method6(MyBean258Employee employee, RedirectAttributes redirectAttributes){
        int rowCount = mapper.insertEmployee(employee);
        if (rowCount>0){
            redirectAttributes.addFlashAttribute("message", rowCount+"๋ช… ์ง์›์ด ๋“ฑ๋ก๋˜์—ˆ์Šต๋‹ˆ๋‹ค.");
        }else{
            redirectAttributes.addFlashAttribute("message", "๋“ฑ๋ก๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค");
        }
        return "redirect:/main32/sub5";
    }
}
  • GET ์š”์ฒญ์œผ๋กœ ์ž…๋ ฅ ํผ์„ ๋ณด์—ฌ์ฃผ๊ณ , POST ์š”์ฒญ์„ ์‚ฌ์šฉํ•˜์—ฌ ํผ์—์„œ ์ž…๋ ฅํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•ด์ค๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ ์ถ”๊ฐ€๊ฐ€ ๋๋‚˜๋ฉด ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ๋กœ ์ธํ•ด ๋‹ค์‹œ GET ์š”์ฒญ์œผ๋กœ ์ž…๋ ฅ ํผ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.
  • mapper.insertEmployee(employee); ์œผ๋กœ ์ธํ•ด ์ง์› ๋“ฑ๋ก ์—ฌ๋ถ€์— ๋”ฐ๋ฅธ ๋ฉ”์‹œ์ง€๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

sub5.jsp(view)

<%@ 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}">
    ${message}
</c:if>
<h3>์ง์› ์ž…๋ ฅ</h3>
<hr>
<div>
    <form method="post">
        <div>
            lastName <input type="text" name="lastName">
        </div>
        <div>
            firstName <input type="text" name="firstName">
        </div>
        <div>
            ์ƒ์ผ <input type="date" name="birthDate">
        </div>
        <div>
            photo <input type="file" name="photo">
        </div>
        <div>
            ๋…ธํŠธ :
            <textarea rows="10" cols="30" name="notes"></textarea>
        </div>
        <div>
            <input type="submit" value="๋“ฑ๋ก">
        </div>
    </form>
</div>

</body>
</html>

๊ฒฐ๊ณผ View

๋ฐ์ดํ„ฐ ์‚ฝ์ž…


@Options

@Options(useGeneratedKeys = true, keyProperty = "id") ์–ด๋…ธํ…Œ์ด์…˜์€ MyBatis์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๊ฒƒ์œผ๋กœ, ์ฃผ๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์ž๋™ ์ฆ๊ฐ€(primary key) ํ•„๋“œ์— ๋Œ€ํ•œ ์„ค์ •์„ ์ง€์ •ํ•  ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

  • useGeneratedKeys = true: ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•˜๋Š” ํ‚ค๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ƒˆ๋กœ์šด ๋ ˆ์ฝ”๋“œ๋ฅผ ์‚ฝ์ž…ํ•  ๋•Œ ํ•ด๋‹น ํ‚ค๋ฅผ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.
  • keyProperty = "id": ์ž๋™ ์ƒ์„ฑ๋œ ํ‚ค๋ฅผ ๋งคํ•‘ํ•  ์ž๋ฐ” ๊ฐ์ฒด์˜ ์†์„ฑ์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ "id"๋Š” ์ž๋™ ์ƒ์„ฑ๋œ ํ‚ค๋ฅผ ๋ฐ›์•„๋“ค์ผ ๊ฐ์ฒด์˜ ์†์„ฑ๋ช…์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ด ์†์„ฑ์—๋Š” ์ž๋™ ์ƒ์„ฑ๋œ ํ‚ค์˜ ๊ฐ’์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ๋‹ค์Œ์€ MyBatis XML ๋งคํผ ํŒŒ์ผ์—์„œ @Options ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ์ž๋™ ์ƒ์„ฑ๋œ ํ‚ค๋ฅผ ์„ค์ •ํ•˜๋Š” ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค:

@Insert("""
            INSERT INTO Customers(CustomerName, ContactName, Address, City, PostalCode, Country)
            VALUES (#{name}, #{contactName}, #{address}, #{city}, #{postalCode}, #{country})
            """)
  @Options(useGeneratedKeys = true, keyProperty = "id")
  int insertCustomer(MyBean254Customer customer); 

useGeneratedKeys="true"๋ฅผ ์„ค์ •ํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์ž๋™ ์ƒ์„ฑ๋œ ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ์ง€์ •ํ•˜๊ณ , keyProperty="id"๋ฅผ ์„ค์ •ํ•˜์—ฌ ํ•ด๋‹น ํ‚ค๋ฅผ User ๊ฐ์ฒด์˜ id ์†์„ฑ์— ๋งคํ•‘ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•จ์œผ๋กœ์จ MyBatis๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์ž๋™ ์ƒ์„ฑ๋œ ํ‚ค๋ฅผ User ๊ฐ์ฒด์— ์ž๋™์œผ๋กœ ํ• ๋‹นํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.


๐Ÿ’Ÿ @Update

  • ํ•ด๋‹น ๋ฉ”์„œ๋“œ๊ฐ€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ๋ ˆ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•˜๋Š” SQL ์ฟผ๋ฆฌ๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

Mapper ์ธํ„ฐํŽ˜์ด์Šค

@Mapper
public interface Mapper02 {
    @Select("""
            SELECT EmployeeID id,
                   FirstName,
                   LastName,
                   Notes,
                   Photo,
                   BirthDate 
            FROM Employees
            WHERE EmployeeID = #{id}
            """)
    MyBean258Employee selectOneEmployee2(Integer id);
}

@Mapper
public interface Mapper03 {
    @Update("""
            UPDATE Employees 
            SET LastName = #{lastName}, FirstName = #{firstName}, 
                     BirthDate = #{birthDate}, Photo = #{photo}, Notes = #{notes}
            WHERE EmployeeId = #{id}
            """)
    int updateEmployee(MyBean258Employee employee);
}
  • ์ˆ˜์ •ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋จผ์ € ํ•ด๋‹น ์ง์›์˜ ์ •๋ณด๋ฅผ ์กฐํšŒํ•˜๋Š” SELECT ์ฟผ๋ฆฌ์™€ ์ˆ˜์ •ํ•˜๋Š” UPDATE ์ฟผ๋ฆฌ ๋ชจ๋‘ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

Controller32.java

@Controller
@RequestMapping("main32")
@RequiredArgsConstructor
public class Controller32 {

    private final Mapper03 mapper;
    private final Mapper02 mapper02;

    @GetMapping("sub6")
    public void method7(@RequestParam(value = "id", required = false) Integer eid, Model model){
        if(eid != null){
            MyBean258Employee e = mapper02.selectOneEmployee2(eid);
            model.addAttribute("employee", e);
        }
    }

    @PostMapping("sub6/update")
    public String method8(MyBean258Employee employee, RedirectAttributes redirectAttributes){
        int rowCount = mapper.updateEmployee(employee);
        if (rowCount>0){
            redirectAttributes.addFlashAttribute("message", rowCount+"๋ช… ์ง์›์ด ์ˆ˜์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค.");
        }else{
            redirectAttributes.addFlashAttribute("message", "์ˆ˜์ •๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค");
        }
        redirectAttributes.addAttribute("id", employee.getId());
        return "redirect:/main32/sub6";
    }
}
  • ์ˆ˜์ •ํ•˜๊ธฐ ์ „์— GET ๋ฐฉ์‹์œผ๋กœ ์•„์ด๋””๋ฅผ ์ž…๋ ฅ๋ฐ›์•„ ์กฐํšŒ๋œ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.
  • POST ๋ฐฉ์‹์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ •ํ•˜๊ณ  ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ๋กœ ์ธํ•ด ๋‹ค์‹œ GET ์š”ํŽ‘์œผ๋กœ ์กฐํšŒ ํผ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.
  • redirectAttributes.addAttribute("id", employee.getId()); : ์ˆ˜์ •๋œ ์ง์› ์•„์ด๋””๋ฅผ ๋‹ค์‹œ ์กฐํšŒ ํŽ˜์ด์ง€๋กœ ์ „๋‹ฌํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
    • ์ด ์ฝ”๋“œ๋Š” redirectAttributes ๊ฐ์ฒด์˜ addAttribute() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ id๋ผ๋Š” ์ด๋ฆ„์˜ ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ์— employee.getId()๋กœ๋ถ€ํ„ฐ ์–ป์€ ์ง์›์˜ ์•„์ด๋””๋ฅผ ์ „๋‹ฌํ•˜๋ฉด ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ๋  URL์— id ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ์ถ”๊ฐ€๋˜์–ด ์ง์›์˜ ์•„์ด๋””๊ฐ€ ํฌํ•จ๋œ URL์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

sub6.jsp(view)

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="jakarta.tags.core" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h3>์ง์› ์กฐํšŒ ๋ฐ ์ˆ˜์ •</h3>
<c:if test="${not empty message}">
    ${message}
</c:if>
<form>
    ๋ฒˆํ˜ธ
    <input type="number" name="id">
    <button>์กฐํšŒ</button>
</form>
<hr>
<c:if test="${empty employee}">
    ์กฐํšŒ๋œ ์ง์›์ด ์—†์Šต๋‹ˆ๋‹ค.
</c:if>
<c:if test="${not empty employee}">
    <h3>${employee.id}๋ฒˆ ์ง์›</h3>
    <form action="/main32/sub6/update" method="post">
        <div>last name
            <input type="text" value="${employee.lastName}" name="lastName"></div>
        <div>first name
            <input type="text" value="${employee.firstName}" name="firstName"></div>
        <div>birth
            <input type="date" value="${employee.birthDate}" name="birthDate"></div>
        <div>
            photo
            <input type="file" value="${employee.photo}" name="photo">
        </div>
        <div>notes
            <textarea name="notes" id="" cols="30" rows="10">${employee.notes}</textarea></div>
        <div style="display: none">
            <input type="text" name="id" value="${employee.id}">
        </div>
        <div>
            <input type="submit" value="์ˆ˜์ •">
        </div>
    </form>
</c:if>
</body>
</html>
  • ์กฐํšŒ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ๊ฒฝ์šฐ, ํผ์˜ ๊ฐ ์ž…๋ ฅ ํ•„๋“œ์—๋Š” ์ˆ˜์ •ํ•  ๋ฐ์ดํ„ฐ์˜ ํ˜„์žฌ ๊ฐ’์„ ๋ณด์—ฌ์ฃผ๊ธฐ ์œ„ํ•ด value ์†์„ฑ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ์ˆ˜์ •๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์„œ๋ฒ„๋กœ ์ œ์ถœํ•  ๋•Œ ๊ฐ ์ž…๋ ฅ ํ•„๋“œ์˜ name ์†์„ฑ์€ ํ•ด๋‹น ๋ฐ์ดํ„ฐ ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ๋ช…๊ณผ ์ผ์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

birth๋ฅผ 1968-12-08์—์„œ 1968-12-20์œผ๋กœ ์ˆ˜์ •


๐Ÿ“ข ํ”„๋กœํผํ‹ฐ๋Š” ์ž๋ฐ”๋นˆ์˜ ์†์„ฑ์„ ๋งํ•ฉ๋‹ˆ๋‹ค.

@Data
@AllArgsConstructor
@NoArgsConstructor
public class MyBean254Customer {
    private int id;
    private String name;
    private String contactName;
    private String address;
    private String city;
    private String postalCode;
    private String country;
}

์ž๋ฐ”๋นˆ์˜ ํ”„๋กœํผํ‹ฐ ๋ช…๊ณผ JSP์—์„œ ์‚ฌ์šฉํ•  ๋•Œ์˜ name ์†์„ฑ์„ ๋งค์นญ์‹œ์ผœ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด JSP์—์„œ ํผ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•  ๋•Œ, ๊ฐ ์ž…๋ ฅ ํ•„๋“œ์˜ ์ด๋ฆ„์ด ํ•ด๋‹น ํ”„๋กœํผํ‹ฐ์™€ ์ผ์น˜ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์„œ๋ฒ„ ์ธก์—์„œ ์ด๋Ÿฌํ•œ ์ด๋ฆ„์„ ํ†ตํ•ด ํผ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์‹ ํ•˜๊ณ  ์ฒ˜๋ฆฌํ•  ๋•Œ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

  • ๋งˆ์ด๋ฐ”ํ‹ฐ์Šค(MyBatis)์—์„œ๋Š” SQL ์ฟผ๋ฆฌ์— ํŒŒ๋ผ๋ฏธํ„ฐ ๊ฐ’์„ ๋ฐ”์ธ๋”ฉํ•˜๊ธฐ ์œ„ํ•ด # ๊ธฐํ˜ธ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. # ๊ธฐํ˜ธ ๋‚ด์—๋Š” ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋Š” ๊ฐ์ฒด์˜ getter ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ๊ฐ’์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ฃผ์–ด์ง„ updateCustomer ๋ฉ”์„œ๋“œ์—์„œ๋Š” MyBean254Customer ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ ๊ฐ’์„ ๊ฐ€์ ธ์™€์„œ SQL ์ฟผ๋ฆฌ์— ๋ฐ”์ธ๋”ฉํ•ฉ๋‹ˆ๋‹ค.
profile
๊ฐœ๋ฐœ์ž ์ค€๋น„์ƒ~

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