[์‹ค์ „! ์Šคํ”„๋ง ๋ถ€ํŠธ์™€ JPA ํ™œ์šฉ1] - 5. ์›น ๊ณ„์ธต ๊ฐœ๋ฐœ

2023. 2. 23. 15:37ยทSpring/Spring JPA ํ™œ์šฉ

 

 

public class MemberForm {

    @NotEmpty(message = "ํšŒ์› ์ด๋ฆ„์€ ํ•„์ˆ˜ ์ž…๋‹ˆ๋‹ค")
    private String name;

    private String city;
    private String street;
    private String zipcode;
}

 

 

ํผ ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํ™”๋ฉด ๊ณ„์ธต๊ณผ ์„œ๋น„์Šค ๊ณ„์ธต์„ ๋ช…ํ™•ํ•˜๊ฒŒ ๋ถ„๋ฆฌํ•œ๋‹ค.

 

@NotEmpty Null, ๋นˆ ๋ฌธ์ž์—ด ๋ถˆ๊ฐ€

 

 

@PostMapping("/members/new")
public String create(@Valid MemberForm form , BindingResult result) {

    if (result.hasErrors()){
        return "members/createMemberForm";
    }

 

@Valid ํŠน์ง•

 

์œ ํšจ์„ฑ๊ฒ€์‚ฌ , ์ž˜๋ชป๋œ ํ˜•์‹ ์ž…๋ ฅ๊ฐ’์„ ํ™•์ธํ•˜๊ธฐ์œ„ํ•œ ๊ธฐ๋Šฅ

 

์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” build.gradleํŒŒ์ผ -> dependencies ํ•ญ๋ชฉ -> 

 

org.springframework.boot:spring-boot-starter-validation ์ด ์ถ”๊ฐ€๋˜์–ด ์žˆ์–ด์•ผ ํ•œ๋‹ค.

 

 

 

Annotaion์ œ์•ฝ์กฐ๊ฑด

@NotNull Null ๋ถˆ๊ฐ€
@Null Null๋งŒ ์ž…๋ ฅ ๊ฐ€๋Šฅ
@NotEmpty Null, ๋นˆ ๋ฌธ์ž์—ด ๋ถˆ๊ฐ€
@NotBlank Null, ๋นˆ ๋ฌธ์ž์—ด, ์ŠคํŽ˜์ด์Šค๋งŒ ์žˆ๋Š” ๋ฌธ์ž์—ด ๋ถˆ๊ฐ€
@Size(min=,max=) ๋ฌธ์ž์—ด, ๋ฐฐ์—ด๋“ฑ์˜ ํฌ๊ธฐ๊ฐ€ ๋งŒ์กฑํ•˜๋Š”๊ฐ€?
@Pattern(regexp =) ์ •๊ทœ์‹์„ ๋งŒ์กฑํ•˜๋Š”๊ฐ€?
@Max(์ˆซ์ž) ์ง€์ • ๊ฐ’ ์ดํ•˜์ธ๊ฐ€?
@Min(์ˆซ์ž) ์ง€์ • ๊ฐ’ ์ด์ƒ์ธ๊ฐ€
@Future ํ˜„์žฌ ๋ณด๋‹ค ๋ฏธ๋ž˜์ธ๊ฐ€?
@Past ํ˜„์žฌ ๋ณด๋‹ค ๊ณผ๊ฑฐ์ธ๊ฐ€?
@Positive ์–‘์ˆ˜๋งŒ ๊ฐ€๋Šฅ
@PositiveOrZero ์–‘์ˆ˜์™€ 0๋งŒ ๊ฐ€๋Šฅ
@Negative ์Œ์ˆ˜๋งŒ ๊ฐ€๋Šฅ
@NegativeOrZero ์Œ์ˆ˜์™€ 0๋งŒ ๊ฐ€๋Šฅ
@Email ์ด๋ฉ”์ผ ํ˜•์‹๋งŒ ๊ฐ€๋Šฅ
@Digits(integer=, fraction = ) ๋Œ€์ƒ ์ˆ˜๊ฐ€ ์ง€์ •๋œ ์ •์ˆ˜์™€ ์†Œ์ˆ˜ ์ž๋ฆฌ ์ˆ˜ ๋ณด๋‹ค ์ž‘์€๊ฐ€?
@DecimalMax(value=) ์ง€์ •๋œ ๊ฐ’(์‹ค์ˆ˜) ์ดํ•˜์ธ๊ฐ€?
@DecimalMin(value=) ์ง€์ •๋œ ๊ฐ’(์‹ค์ˆ˜) ์ด์ƒ์ธ๊ฐ€?
@AssertFalse false ์ธ๊ฐ€?
@AssertTrue true ์ธ๊ฐ€?

 

BindingResult

 

BindingResult๋Š” ๊ฒ€์ฆ์˜ค๋ฅ˜๋ฅผ ๋ณด๊ด€ํ•˜๋Š” ๊ฐ์ฒด๋‹ค.

 

 

 

 

@GetMapping("/members/new")
public String createForm(Model model) {
    model.addAttribute("memberForm",new MemberForm());
    return "members/createMemberForm";
}

 

GET ์š”์ฒญ์‹œ ๋น„์–ด์žˆ๋Š” MemberForm ๊ฐ์ฒด๋ฅผ ๋ชจ๋ธ์— ๋‹ด์•„์„œ ๋ทฐ(ํ…œํ”Œ๋ฆฟ)์— ์ „๋‹ฌ 

 

 

@PostMapping("/members/new")
public String create(@Valid MemberForm form , BindingResult result) {

 

ํด๋ผ์ด์–ธํŠธ๊ฐ€ ํผ์— ์ž‘์„ฑํ•œ ํ•„๋“œ๋“ค์„ Submit ํ• ๋•Œ POST ์š”์ฒญ๋˜์–ด

 

ํ…œํ”Œ๋ฆฟ์—์„œ ๊ฐ ํ•„๋“œ์˜ ๊ฐ’๋“ค์„

 

์ปจํŠธ๋กค๋Ÿฌ์—์„œ ๋„˜๊ฒจ์ค€ ๋ชจ๋ธ์˜ form ๊ฐ์ฒด์— set ํ•œ๋‹ค 

 

Address address = new Address(form.getCity(), form.getStreet(), form.getZipcode());

Member member = new Member();
member.setName(form.getName());
member.setAddress(address);

memberService.join(member);

 

form ๊ฐ์ฒด๋Š” ์ด์ œ ๊ฐ’์ด ์„ค์ •๋˜์—ˆ์œผ๋‹ˆ 

 

Member ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์ด member ์˜ ํ•„๋“œ๋“ค์„ 

 

form ๊ฐ์ฒด์—์„œ ๊ฐ€์ ธ์™€์„œ set ํ•˜๊ณ  join(ํšŒ์›๊ฐ€์ž…)์„ ์™„๋ฃŒํ•œ๋‹ค . 

 

 

์ง€๊ธˆ์€ ์„œ๋น„์Šค๊ฐ€ ์ž‘์•„์„œ ํผ ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ๋ฒˆ๊ฑฐ๋Ÿฌ์šด ์ผ์ธ๋“ฏ ํ•œ๋ฐ 

 

๋” ๋ณต์žกํ•ด์ง€๋ฉด ์—”ํ‹ฐํ‹ฐ๋ฅผ ์œ ์ง€๋ณด์ˆ˜ํ•˜๊ธฐ ์–ด๋ ค์›Œ์ง€๊ธฐ ๋–„๋ฌธ์— 

 

์—”ํ‹ฐํ‹ฐ๋Š” ํ™”๋ฉด์„ ์œ„ํ•œ ๋กœ์ง์€ ์—†์–ด์•ผ ํ•œ๋‹ค. 

 

 

 

 

 

<td th:text="${member.address?.city}"></td>
  • ํƒ€์ž„๋ฆฌํ”„์—์„œ ?๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด null ์„ ๋ฌด์‹œํ•œ๋‹ค.

 

 

๋ณ€๊ฒฝ ๊ฐ์ง€์™€ ๋ณ‘ํ•ฉ(merge)

 

์ค€์˜์† ์—”ํ‹ฐํ‹ฐ


์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๊ฐ€ ๋”๋Š” ๊ด€๋ฆฌํ•˜์ง€ ์•Š๋Š” ์—”ํ‹ฐํ‹ฐ๋ฅผ ๋งํ•œ๋‹ค.

 

์ค€์˜์† ์—”ํ‹ฐํ‹ฐ๋Š” ์˜์† ์ƒํƒœ๋กœ ๊ด€๋ฆฌ๋˜๋‹ค๊ฐ€ ์ดํ›„ ๊ด€๋ฆฌ๋˜์ง€ ์•Š๋Š” ์ƒํƒœ๋ฅผ ๋งํ•ฉ๋‹ˆ๋‹ค.

 

 

์˜ˆ๋ฅผ ๋“ค์–ด์„œ ์—”ํ‹ฐํ‹ฐ ๊ฐ์ฒด๋Š” ์‚ด์•„์žˆ๋Š”๋ฐ, ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๊ฐ€ ์ข…๋ฃŒ๋˜๋ฉด์„œ,

 

์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๊ฐ€ ๋”๋Š” ์ด ์—”ํ‹ฐํ‹ฐ ๊ฐ์ฒด๋ฅผ ๊ด€๋ฆฌํ•˜์ง€ ๋ชปํ•˜๋Š” ์ƒํƒœ์ธ ๊ฒƒ์ด์ง€์š”.

 

์ด ๊ฒฝ์šฐ ๋ณดํ†ต ์—”ํ‹ฐํ‹ฐ ๊ฐ์ฒด๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ด๋ฏธ ์ €์žฅ์ด ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

 

๋‹ค๋งŒ ๊ฐ์ฒด๊ฐ€ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์˜ ๊ด€๋ฆฌ๋ฅผ ์ „ํ˜€ ๋ฐ›์ง€ ๋ชปํ•˜๋Š” ์ƒํƒœ์ธ ๊ฒƒ์ด์ง€์š”.

 

 

 

๊ฒฐ๊ตญ ์ค€์˜์†์˜ ๊ธฐ์ค€์€ ๊ณผ๊ฑฐ์— ํ•ด๋‹น ๊ฐ์ฒด๊ฐ€ ์˜์† ์ƒํƒœ๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅ๋˜๊ณ  ๊ด€๋ฆฌ๋œ ์ ์ด ์žˆ๋Š”๊ฐ€๋ฅผ ๊ธฐ์ค€

 

์ด๋ฏธ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์— ๊ด€๋ฆฌ๋˜๋˜ ๊ฐ์ฒด๋ฅผ ๊ทธ๋Œ€๋กœ ๋งŒ๋“ค์–ด๋‚ธ ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ค€์˜์†์ด๋ผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

@PostMapping("items/{itemId}/edit")
public String updateItem(@ModelAttribute("form") BookForm form) {

    Book book = new Book();
    book.setId(form.getId());

 

itemService.saveItem(book);


(
์—ฌ๊ธฐ์„œ๋Š” itemService.saveItem(book) ์—์„œ ์ˆ˜์ •์„ ์‹œ๋„ํ•˜๋Š” Book ๊ฐ์ฒด๋‹ค.

 

Book ๊ฐ์ฒด๋Š” ์ด๋ฏธ DB ์— ํ•œ๋ฒˆ ์ €์žฅ๋˜์–ด์„œ ์‹๋ณ„์ž๊ฐ€ ์กด์žฌํ•œ๋‹ค.

 

 

์ด๋ ‡๊ฒŒ ์ž„์˜๋กœ ๋งŒ๋“ค์–ด๋‚ธ ์—”ํ‹ฐํ‹ฐ๋„ ๊ธฐ์กด ์‹๋ณ„์ž๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉด ์ค€์˜์† ์—”ํ‹ฐํ‹ฐ๋กœ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.)

 

 

์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์—์„œ ์—”ํ‹ฐํ‹ฐ๋ฅผ ๋‹ค์‹œ ์กฐํšŒํ•œ ํ›„์— ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ๋ฐฉ๋ฒ• 

@Transactional
public void updateItem(Item itemParam) { //itemParam: ํŒŒ๋ฆฌ๋ฏธํ„ฐ๋กœ ๋„˜์–ด์˜จ ์ค€์˜์† ์ƒํƒœ์˜ ์—”ํ‹ฐํ‹ฐ
    Item findItem = em.find(Item.class, itemParam.getId());  //๊ฐ™์€ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์กฐํšŒํ•œ๋‹ค.
    findItem.setPrice(itemParam.getPrice()); //๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ •ํ•œ๋‹ค.
}

 

ํŠธ๋žœ์žญ์…˜ ์•ˆ์—์„œ ์—”ํ‹ฐํ‹ฐ๋ฅผ ๋‹ค์‹œ ์กฐํšŒ, ๋ณ€๊ฒฝํ•  ๊ฐ’ ์„ ํƒ ->

 

ํŠธ๋žœ์žญ์…˜ ์ปค๋ฐ‹ ์‹œ์ ์— ๋ณ€๊ฒฝ ๊ฐ์ง€(Dirty Checking)๊ฐ€ ๋™์ž‘ํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— UPDATE SQL ์‹คํ–‰

 

 

ํŠธ๋žœ์žญ์…˜์ด ์žˆ๋Š” ์„œ๋น„์Šค ๊ณ„์ธต์—์„œ ์˜์† ์ƒํƒœ์˜ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์กฐํšŒํ•˜๊ณ ,

 

์—”ํ‹ฐํ‹ฐ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ง์ ‘ ๋ณ€๊ฒฝํ•˜์„ธ์š”. ํŠธ๋žœ์žญ์…˜ ์ปค๋ฐ‹ ์‹œ์ ์— ๋ณ€๊ฒฝ ๊ฐ์ง€๊ฐ€ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

 

 

 

 

 

 

 

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8-JPA-%ED%99%9C%EC%9A%A9-1/dashboard

 

์‹ค์ „! ์Šคํ”„๋ง ๋ถ€ํŠธ์™€ JPA ํ™œ์šฉ1 - ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ - ์ธํ”„๋Ÿฐ | ๊ฐ•์˜

์‹ค๋ฌด์— ๊ฐ€๊นŒ์šด ์˜ˆ์ œ๋กœ, ์Šคํ”„๋ง ๋ถ€ํŠธ์™€ JPA๋ฅผ ํ™œ์šฉํ•ด์„œ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์„ค๊ณ„ํ•˜๊ณ  ๊ฐœ๋ฐœํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ณผ์ •์„ ํ†ตํ•ด ์Šคํ”„๋ง ๋ถ€ํŠธ์™€ JPA๋ฅผ ์‹ค๋ฌด์—์„œ ์–ด๋–ป๊ฒŒ ํ™œ์šฉํ•ด์•ผ ํ•˜๋Š”์ง€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค., - ๊ฐ•

www.inflearn.com

 

์ €์ž‘์žํ‘œ์‹œ (์ƒˆ์ฐฝ์—ด๋ฆผ)

'Spring > Spring JPA ํ™œ์šฉ' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[์‹ค์ „! ์Šคํ”„๋ง ๋ถ€ํŠธ์™€ JPA ํ™œ์šฉ1] - 4. ์ฃผ๋ฌธ ๋„๋ฉ”์ธ ๊ฐœ๋ฐœ  (0) 2023.02.22
[์‹ค์ „! ์Šคํ”„๋ง ๋ถ€ํŠธ์™€ JPA ํ™œ์šฉ1] - 3. ํšŒ์› ์„œ๋น„์Šค ๊ฐœ๋ฐœ  (0) 2023.02.21
[์‹ค์ „! ์Šคํ”„๋ง ๋ถ€ํŠธ์™€ JPA ํ™œ์šฉ1] - 2. ํšŒ์› ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ๊ฐœ๋ฐœ  (0) 2023.02.21
[์‹ค์ „! ์Šคํ”„๋ง ๋ถ€ํŠธ์™€ JPA ํ™œ์šฉ1] - 1. ์—”ํ‹ฐํ‹ฐ ํด๋ž˜์Šค ๊ฐœ๋ฐœ  (0) 2023.02.21
[์‹ค์ „! ์Šคํ”„๋ง ๋ถ€ํŠธ์™€ JPA ํ™œ์šฉ1] - 0. Entity / EntityManager  (0) 2023.02.20
'Spring/Spring JPA ํ™œ์šฉ' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • [์‹ค์ „! ์Šคํ”„๋ง ๋ถ€ํŠธ์™€ JPA ํ™œ์šฉ1] - 4. ์ฃผ๋ฌธ ๋„๋ฉ”์ธ ๊ฐœ๋ฐœ
  • [์‹ค์ „! ์Šคํ”„๋ง ๋ถ€ํŠธ์™€ JPA ํ™œ์šฉ1] - 3. ํšŒ์› ์„œ๋น„์Šค ๊ฐœ๋ฐœ
  • [์‹ค์ „! ์Šคํ”„๋ง ๋ถ€ํŠธ์™€ JPA ํ™œ์šฉ1] - 2. ํšŒ์› ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ๊ฐœ๋ฐœ
  • [์‹ค์ „! ์Šคํ”„๋ง ๋ถ€ํŠธ์™€ JPA ํ™œ์šฉ1] - 1. ์—”ํ‹ฐํ‹ฐ ํด๋ž˜์Šค ๊ฐœ๋ฐœ
hello_u
hello_u
  • hello_u
    ๐Ÿ˜œ
    hello_u
  • ์ „์ฒด
    ์˜ค๋Š˜
    ์–ด์ œ
    • ๐Ÿ˜œ (345)
      • Hardware (2)
        • BMC (2)
      • Spring (109)
        • Spring ์ž…๋ฌธ (20)
        • Spring ๊ธฐ๋ณธ (27)
        • Spring MVC (18)
        • Spring DB (22)
        • Spring JPA ๊ธฐ๋ณธ (16)
        • Spring JPA ํ™œ์šฉ (6)
      • Develop (27)
        • DB (8)
        • JAVA (4)
        • Web (2)
        • Python (7)
        • OSS (2)
        • Git (2)
        • API (2)
      • Algorithm (155)
        • CodeUp ๊ธฐ์ดˆ (44)
        • ํŒŒ์ด์ฌ ์ฝ”๋”ฉํ…Œ์ŠคํŠธ (64)
        • ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค (4)
        • SWEA (30)
        • Softeer (10)
        • BOJ (2)
      • CS (9)
        • ์ปดํ“จํ„ฐ์ผ๋ฐ˜ (3)
        • ์šด์˜์ฒด์ œ (3)
        • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค (0)
        • ์ •๋ณดํ†ต์‹  (1)
        • ์ž๋ฃŒ๊ตฌ์กฐ (1)
        • ์†Œํ”„ํŠธ์›จ์–ด ๊ณตํ•™ (1)
        • ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด (0)
        • ์ตœ์‹  ๋””์ง€ํ„ธ, ์ผ๋ฐ˜์ƒ์‹ (0)
      • ์ž๊ฒฉ์ฆ (41)
        • ์ •๋ณด๋ณด์•ˆ๊ธฐ์‚ฌ (9)
        • ์ •๋ณด์ฒ˜๋ฆฌ๊ธฐ์‚ฌ (22)
        • ๋ฆฌ๋ˆ…์Šค๋งˆ์Šคํ„ฐ 1๊ธ‰ (3)
        • SQLD (7)
  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.3
hello_u
[์‹ค์ „! ์Šคํ”„๋ง ๋ถ€ํŠธ์™€ JPA ํ™œ์šฉ1] - 5. ์›น ๊ณ„์ธต ๊ฐœ๋ฐœ
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”