๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
  • ์žฅ์›์ต ๊ธฐ์ˆ ๋ธ”๋กœ๊ทธ
๐Ÿ’Š Java & Kotlin & Spring/- spring framework +

[Spring & SpringBoot-JPA] DB ์—ฐ๊ด€๊ด€๊ณ„ ํ…Œ์ด๋ธ”์„ Spring JPA๋ฅผ ์ด์šฉํ•˜์—ฌ CRUD ํ•˜๊ธฐ.

by Wonit 2020. 2. 16.

์ง€๋‚œ ์‹œ๊ฐ„์— ์šฐ๋ฆฌ๋Š” DB ์—ฐ๊ด€๊ด€๊ณ„ ํ…Œ์ด๋ธ” ์ƒ์„ฑ ๊นŒ์ง€ ์ง„ํ–‰์„ ํ•˜์˜€๋‹ค.


์—ฐ๊ด€๊ด€๊ณ„ ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ•˜๋ฉฐ 1:N ๊ณผ N:1์˜ ์—ฐ๊ด€๊ด€๊ณ„์— ๋Œ€ํ•ด์„œ ํ…Œ์ด๋ธ”์„ ์ž‘์„ฑํ•˜์˜€๊ณ  ์ด์ œ๋Š” Spring์—์„œ ์‹ค์ œ๋กœ ๊ด€๊ณ„๋ฅผ ํ†ตํ•œ Data ํ˜ธ์ถœ์„ ํ•™์Šตํ•ด๋ณด์ž.

ํ˜„์žฌ ํ…Œ์ด๋ธ”์˜ ์—ฐ๊ด€ ๊ด€๊ณ„

 

๋‹ค์Œ๊ณผ ๊ฐ™์„ ๋•Œ ์—ฐ๊ด€ ๊ด€๊ณ„๋ฅผ ํ’€์–ด๋ณด์ž๋ฉด

 

  • user๊ณผ item์˜ ๊ด€๊ณ„ : ์„œ๋กœ ํ•„์š”ํ•œ ์ •๋ณด๋ฅผ ๋‹ด๊ณ  ์žˆ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์–ด๋– ํ•œ ๊ด€๊ณ„๋„ ๋งบ์ง€ ์•Š๊ณ  ์žˆ๋‹ค.
  • user๊ณผ order_list์˜ ๊ด€๊ณ„ : order_list๊ฐ€ ํ˜„์žฌ user์˜ id๋ฅผ ์ฐธ์กฐํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— (orderList)n:1(user)์˜ ๊ด€๊ณ„ ์ด๋‹ค.
  • item๊ณผ order_list์˜ ๊ด€๊ณ„ : order_list๊ฐ€ ํ˜„์žฌ item์˜ id๋ฅผ ์ฐธ์กฐํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— (orderList)n:1(item)์˜ ๊ด€๊ณ„ ์ด๋‹ค.

๊ทธ๋Ÿผ ์ด์ œ ์ฝ”๋”ฉ์„ ํ•ด๋ณด์ž.

์—ฐ๊ด€๊ด€๊ณ„๋ฅผ ํ† ๋Œ€๋กœ Entity๋ฅผ ๋งŒ๋“ค์ž

ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ–ˆ์œผ๋ฏ€๋กœ Springboot์—์„œ ํ…Œ์ด๋ธ”์— ๋”ฐ๋ฅธ Entity๋ฅผ ๋งŒ๋“ค์–ด ๋ณด์ž.

 

  1. entity ํŒจํ‚ค์ง€์— ํ…Œ์ด๋ธ” ์ด๋ฆ„์— ๋งž๋Š” ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์–ด ์ค€๋‹ค.
  2. ํ…Œ์ด๋ธ”์˜ ์นผ๋Ÿผ์„ ํด๋ž˜์Šค์˜ ํ•„๋“œ๋กœ ๋งŒ๋“ค์–ด ์ค€๋‹ค.

์ด์ œ Order_detail์˜ Entity๋ฅผ ํ…Œ์ŠคํŠธ ํ•ด๋ณด์ž.

์šฐ๋ฆฌ์˜ ๋ชฉ์ ์€ Order_Detail์—์„œ ์ฃผ๋ฌธํ•œ ๊ณ ๊ฐ์˜ ํšŒ์› id์™€ ํ•ด๋‹น ๊ณ ๊ฐ์˜ ์•„์ดํ…œ id๋ฅผ ์ด์šฉํ•ด ์ฃผ๋ฌธ์„ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ ์ด๋ฏ€๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์†Œ์Šค๋ฅผ ๋งŒ๋“ค์–ด ๋ณด์ž

 

๊ฐ„๊ฒฐํ•œ ์†Œ์Šค์ฝ”๋“œ๋ฅผ ์œ„ํ•ด import ๊ตฌ๋ฌธ์„ ๋ชจ๋‘ ์ œ๊ฑฐํ•˜์˜€์Šต๋‹ˆ๋‹ค.
@RestController
@RequestMapping("/item")
public class ItemController {

    @Autowired
    UserRepository userRepository;
    @Autowired
    OrderDetailRepository orderDetailRepository;
    @Autowired
    ItemRepository itemRepository;

    @GetMapping("/order")
    public String order(@RequestParam Long userId, @RequestParam Long itemId){
        AtomicBoolean userFlag = new AtomicBoolean(false);
        AtomicBoolean itemFlag = new AtomicBoolean(false);

        Optional<User> user = userRepository.findById(userId);
        user.ifPresent(selectUser ->{
            userFlag.set(true);
        });

        Optional<Item> item = itemRepository.findById(itemId);
        item.ifPresent(selectItem ->{
            itemFlag.set(true);
        });

        if (userFlag.get() && itemFlag.get()) {
            OrderDetail orderDetail = new OrderDetail();
            orderDetail.setUserId(userId);
            orderDetail.setItemId(itemId);
            orderDetail.setOrderAt(LocalDateTime.now());

            OrderDetail newOrder = orderDetailRepository.save(orderDetail);
            return "์ฃผ๋ฌธ ์ •๋ณด" + newOrder + " ์˜ ์ฃผ๋ฌธ์ด ์ฃผ๋ฌธ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.";
        }

        return "์ž˜๋ชป๋œ ์ฃผ๋ฌธ ์ž…๋‹ˆ๋‹ค.";
    }
}

์—์„œ http://localhost:8080/item/order/?userId=6&itemId=4 ๊ณผ ๊ฐ™์€ url์„ ์ž…๋ ฅํ•˜๋ฉด

 

 

๊ณผ ๊ฐ™์€ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

 

ํ•˜์ง€๋งŒ

 

ํ•˜์ง€๋งŒ ์ด์™€ ๊ฐ™์ด ํ•œ๋‹ค๋ฉด ์šฐ๋ฆฌ๋Š” ์—ฐ๊ด€๊ด€๊ณ„๋ฅผ ์ด์šฉํ•˜์ง€ ์•Š๊ณ  ํ–ˆ์œผ๋ฏ€๋กœ ์•„๋ฌด๋Ÿฐ ์†Œ์šฉ์ด ์—†๋‹ค.

 

์ด์ œ ์—ฌ๊ธฐ์— ์—ฐ๊ด€ ๊ด€๊ณ„๋ฅผ ์ถ”๊ฐ€์‹œํ‚จ๋‹ค๋ฉด

 

๊ณผ ๊ฐ™์€ ์‹์œผ๋กœ Long ํƒ€์ž…์˜ user ์ •๋ณด์™€ item ์ •๋ณด๊ฐ€ ์•„๋‹Œ ๊ฐ์ฒด ํƒ€์ž…์˜ user์™€ item์„ ๋ฐ›์„ ๊ฒƒ์ด๋‹ค.

 

ํ•˜์ง€๋งŒ ๋นจ๊ฐ„์ƒ‰์œผ๋กœ User์™€ Item ๋ฐ‘์— ๋ฐ‘์ค„์ด ์ƒ๊ธด ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋Š”๋ฐ ์ด๋Š” Hibernate๋ฅผ ํ†ตํ•œ ์—ฐ๊ด€ ๊ด€๊ณ„ Annotation์„ ์„ค์ •ํ•˜๊ธฐ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

์—ฐ๊ด€๊ด€๊ณ„ ์–ด๋…ธํ…Œ์ด์…˜

์•„๊นŒ ์—ฐ๊ด€๊ด€๊ณ„๋ฅผ ํ’€์–ด ๋†“์•˜๋˜ ๊ฒƒ์„ ๋ณด๋ฉด

  • user๊ณผ order_list์˜ ๊ด€๊ณ„ : order_list๊ฐ€ ํ˜„์žฌ user์˜ id๋ฅผ ์ฐธ์กฐํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— (orderList)n:1(user)์˜ ๊ด€๊ณ„ ์ด๋‹ค.
  • item๊ณผ order_list์˜ ๊ด€๊ณ„ : order_list๊ฐ€ ํ˜„์žฌ item์˜ id๋ฅผ ์ฐธ์กฐํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— (orderList)n:1(item)์˜ ๊ด€๊ณ„ ์ด๋‹ค.

์—์„œ 

 

  • N:1 -> @ManyToOne
  • 1:N -> @OneToMany

๋กœ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋Š”๋ฐ ์œ„์™€ ๊ฐ™์€ ์–ด๋…ธํ…Œ์ด์…˜์„ ์ ์šฉํ•˜๋ ค๋ฉด ๋ฌด์กฐ๊ฑด ๊ฐ์ฒด ํƒ€์ž…์œผ๋กœ ๋ฐ›์•„์•ผ ํ•œ๋‹ค.

 

User ์ž…์žฅ์—์„œ OrderDetail

 

User ์ž…์žฅ์—์„œ OrderDetail๋Š” 1๋ช…์˜ user๊ฐ€ ์—ฌ๋Ÿฌ๊ฐ€์ง€ OrderDetail๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— 1:N (@OneToMany)๊ด€๊ณ„ ์ด๋ฏ€๋กœ ํ•ด๋‹น ์–ด๋…ธํ…Œ์ด์…˜์„ ์ถ”๊ฐ€ํ•˜๋Š”๋ฐ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ถ”๊ฐ€์  ๋ณ€์ˆ˜๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

 

  • mappedBy = "user" :user ํ…Œ์ด๋ธ”์— ์—ฐ๊ฒฐ์‹œํ‚ค๊ธฐ ์œ„ํ•จ
  • fetch = FetchType.LAZY : ์ถ”ํ›„ ์„ค๋ช…

 

๋˜ํ•œ ์œ„์— ๋ณธ๋‹ค๋ฉด List<OrderDetail> ๋กœ ๋ฐ›๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ด๋Š” OrderDetail์ด N์— ํ•ด๋‹นํ•˜๋ฏ€๋กœ List๋กœ ๋ฐ›๋Š” ๊ฒƒ์ด๋‹ค.

 

Item ์ž…์žฅ์—์„œ OrderDetail ๋˜ํ•œ ์œ„์™€ ๊ฐ™์€ ๋ฐฉ๋ฒ•์œผ๋กœ ์„ค์ •ํ•˜๋ฉด ๋œ๋‹ค

 

Test ์ฝ”๋“œ ์ž‘์„ฑ

 

์ด์ œ OrderDetail์˜ id๋ฅผ ํ†ตํ•ด์„œ User์™€ Item์˜ ์ •๋ณด๋ฅผ ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ๋‹ค์Œ๊ณผ ๊ฐ™์ด

 

 

 

์˜ ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด์„œ ์—ฌ๋Ÿฌ ๋ฒˆ์˜ user์˜ ๊ฒ€์ƒ‰๊ณผ item์˜ ๊ฒ€์ƒ‰ ์—†์ด ๋ฐ”๋กœ 

 

 

๊ณผ ๊ฐ™์€ ๊ฐ์ฒด ์ •๋ณด๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

 

๋Œ“๊ธ€