집돌이 공대남 IT

JPA 프로그래밍 마스터하기: 초급부터 전문가까지 실습을 통한 학습(15) 본문

IT/웹개발

JPA 프로그래밍 마스터하기: 초급부터 전문가까지 실습을 통한 학습(15)

집공이 2023. 8. 28. 12:00

JPA 실습: 복잡한 도메인 모델과 비즈니스 로직 다루기

안녕하세요. 집돌이 공대남입니다.

이번에는 좀 더 복잡한 도메인 모델과 비즈니스 로직을 다루는 JPA 실습을 진행해 보겠습니다.

이번 실습에서는 회원, 상품, 주문 등 여러 개의 도메인을 다루며, 1:N, N:1, N:M 등 다양한 관계 매핑을 경험해볼 예정입니다. 재밌겠죠?(아닌가..)

 

1단계: 도메인 모델링

먼저, 회원(Member), 상품(Item), 주문(Order), 주문 상세(OrderItem) 등의 엔티티를 만들어 보겠습니다.

@Entity
public class Member {
    // 기존에 작성한 코드
    @OneToMany(mappedBy = "member")
    private List<Order> orders = new ArrayList<>();
}

@Entity
public class Order {
    @Id @GeneratedValue
    private Long id;

    @ManyToOne
    @JoinColumn(name = "member_id")
    private Member member;

    @OneToMany(mappedBy = "order")
    private List<OrderItem> orderItems = new ArrayList<>();

    // getters, setters
}

@Entity
public class OrderItem {
    @Id @GeneratedValue
    private Long id;

    @ManyToOne
    @JoinColumn(name = "order_id")
    private Order order;

    @ManyToOne
    @JoinColumn(name = "item_id")
    private Item item;

    // getters, setters
}

 

2단계: 리포지토리 생성

위에서 만든 엔티티에 대한 각각의 리포지토리를 생성합니다.

public interface OrderRepository extends JpaRepository<Order, Long> {
}

public interface OrderItemRepository extends JpaRepository<OrderItem, Long> {
}

 

3단계: 서비스 계층 구현

이번에는 주문 생성, 주문 취소, 주문 검색 등의 비즈니스 로직을 구현해 보겠습니다.

@Service
@Transactional
public class OrderService {

    private final OrderRepository orderRepository;
    private final MemberService memberService;
    private final ItemService itemService;

    public OrderService(OrderRepository orderRepository,
                        MemberService memberService,
                        ItemService itemService) {
        this.orderRepository = orderRepository;
        this.memberService = memberService;
        this.itemService = itemService;
    }

    public Long order(Long memberId, Long itemId, int count) {
        // 생략...
    }

    public void cancelOrder(Long orderId) {
        // 생략...
    }

    public List<Order> findOrders(OrderSearch orderSearch) {
        // 생략...
    }
}

이상으로 복잡한 도메인 모델과 비즈니스 로직을 다루는 JPA 실습을 마쳤습니다.

이번 실습을 통해 JPA를 활용하여 좀 더 복잡한 애플리케이션을 구축하는 방법을 배웠습니다. 

좀 더 연습해보시고 어떻게 하는지 감을 익히시면 좋을 것 같습니다. 

오늘도 화이팅!