JPA (요구사항 분석 과 개발)

kty.log·2022년 8월 2일
0
post-thumbnail

요즘 난 인프런에서 김영한님의 ORM 표준 JPA 프로그래밍 공부중이다.
현재 직장에선 당연히 마이바티스를 이용해 쿼리를 작성중 이지만 조금 더 편한(?)
나를 조금 더 번거롭게 하지 않는 하지만 번거로운 이 JPA를 마스터해 이직할것이다.!

- 요구사항 분석 -

  • 회원은 상품을 주문할수있다.
  • 주문 시 여러 종류의 상품을 선택 할 수있다.

    - 기능 목록 -

  • 회원 기능(회원 등록, 회원 조회)
  • 상품 기능(상품 등록, 상품 수정, 상품 조회)
  • 주문 기능(상품 주문, 주문내역 조회, 주문 취소)

    - 도메인 모델 분석 -

  • 회원과 주문의 관계: 회원은 여러번 주문 할 수있다(일대다)
  • 상품과 주문의 관계: 주문할 때 여러 상품을 선택할 수 있다.
    반대로 같은 상품도 여러번 주문할 수 있다. 주문 상품이라는 모델을 만들어서 다대다 관계를 일대다, 다대일 관계로 풀어냄

    - 데이터 중심 설계의 문제점 -

  • 위에 방식은 객체 설계를 테이블 설계의 맞춘 방식
  • 테이블의 외래키를 객체에 그대로 가져옴
  • 객체 그래프 탐색이 불가능
  • 참조가 없으므로 UML도 잘못됨
  • 코드로 알아보는 예)

    public static void main(String[] args){
            EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
            EntityManager em = emf.createEntityManager();
    
            EntityTransaction tx = em.getTransaction();
            tx.begin();
    
            //정석 코드
            try {
                //order 로 아이디 검색을 통해
                Order order = em.find(Order.class, 1L);
                //검색을 통해 얻은 MemberId를 담아
                Long memberId = order.getMemberId();
                //다시 또 member 조회해
                Member member = em.find(Member.class, memberId);
                //또 그값을 다시 객체에 담아야 하는 굉장히 불편한 작업을 해야한다.
                Member findMember = order.getMember();

    여기서 그나마 개선점은

    @Entity
    @Table(name = "ORDERS")
    public class Order { //DB는 ORDER이 예약어로 되어있는게 있어서 원랜 orders로 만이씀
    
        @Id @GeneratedValue
        @Column(name = "ORDER_ID")
        private Long id;
    
        private Member member; //이렇게 하는게 좀더 객체 지향적이라고 할수 있음 이건바로 참조해서 멤버아이디를 넣어 멤버에있는 필드를 사용할수있다.
    
        public Member getMember() {
            return member;
        }
    
        public void setMember(Member member) {
            this.member = member;
        }
    
        private LocalDateTime orderDate;
    
        @Enumerated(EnumType.STRING) 
        private OrderStatus status;

    위 코드 처럼 직접 Member 객체를 Order 클래스에 넣어 바로 참조해 사용할 수 있게하는것이 객체지향적이다.
    다만 이보다 더 좋은 방법이 있다고 하는데 그건 다음 수업때 나올거같다.

    0개의 댓글