1.4 연관관계 맵핑 분석

회원과 주문

-회원도 오더로 갈 수 있고, 오더도 회원으로 갈 수 있도록 설계 했다.(양방향 연관관계)

-일대다 , 다대일의 양방향 관계다. 따라서 연관관계의 주인을 정해야 한다.

 관계형데이터베이스에서는 1대 다의 관계에서는 다에 무조건 외래키가 있게 된다.

 외래 키가 있는 주문을 연관관계의 주인으로 정하는 것이 좋다.

 그러므로 ORDERS 엔티티에 있는 MEMBER가 연관관계의 주인이 되고,

 MEMBER엔티티의 ordersmapped by로 단순 읽기만 가능한 연관관계의 거울 즉 단순

 조회용으로만 이용한다.

-연관관계의 주인쪽에 값을 세팅해야 값이 변경된다.

 거울쪽값은 단순조회용이다.

 

-일대다, 다대일의 양방향 관계다. 따라서 연관관계의 주인을 정해야 하는데,

 외래 키가 있는 주문을 연관관계의 주인으로 정하는 것이 좋다.

 그러므로 Order.memberORDERS.MEMBER_ID 외래 키와 매핑한다.

 

*쉽게 얘기하면 주문이 한 개만 있는 것이 아니라 많아질 수 있다고 할 때에

주문쪽에서 PK생성으로 멤버를 참조하여야 하므로 1(MEMBER) (ORDERS)의 관계라고

할 수 있다. 주문측이 갑, 주인이 된다.

 

주문상품과 주문

-한번 주문할 때 주문수량과 주문수량에 따라 가격이 달라질 수 있기 때문에

 주문상품을 두게 된다.

-다른 사람이 주문한 정보가 주문상품에 있을 수 없다.

 주문한상품들이(OrderItem)에는 주문할 때 하나의 Order에만 연관관계가 걸린다.

 주문상품들의 정보들이 OrderItem : List에 오게 된다.

 그래서 다대(ORDERS_ITEM)1(ORDERS)관계가 된다.

 

->다대일 양방향 관계다. 외래 키가 주문상품에 있으므로 주문상품이 연관관계의 주인이다.

   그러므로 OrderItem.orderORDER_ITEM.ORDER_ID 외래 키와 매핑한다.

 

*연관관계 매핑 분석할 때에

-서비스의 특성과 일반적인 관계를 알고, 일반적으로 접근해볼 것

-외래키가 있는 곳이 연관관계의 주인

 

주문상품과 상품

-itemorderitem에서 의 정보를 맵핑 할 것이 없다.

-나를 주문한 orderitem을 찾아 할필요가 없고,

 orderitem을 찾고 싶을 때에 루트를 orderitem으로 쿼리를 찍으면 된다.

 즉, orderitem에서 item정보만 잘 맵핑해주면 된다.

->다대일 단방향 관계다. OrderItem.itemORDER_ITEM.ITEM_ID 외래 키와 매핑한다.

   주문과 배송

-일대일 양방향 관계다. Order.deliveryORDERS.DELIVERY_ID 외래 키와 매핑한다.

-주문정보에 배송정보가 들어가고 OrdersDelivery_ID(PK)가 넣어 두었다.

 

-DELIVERY_ID가 있는 외래키와 매핑하면 Orders가 연관관계의 주인이 된다.

 

카테고리와 상품

-@ManyToMany를 사용해서 매핑한다.

 (실무에서 @ManyToMany는 사용하지 말자. 여기서는 다대다 관계를 예제로 보여주기 위

 해 추가했을 뿐이다)

-편법이 아닌 정상적인 방법으로는 테이블관계는 ManyToMany로 표현할 수 있는 방법이

 없기 때문에, CATEGORY_ITEM 중간테이블로 풀어낸다..

 

카테고리와 상품관련하여 앞에서의 내용과 같은 내용

-객체에서는 카테고리가 아이템리스트를 가져도 되고

 아이템이 카테고리리스트를 가져도 된다.

 양쪽 컬렉션을 만들면 객체는 다대 다로 만들 수 있지만

 관계형데이터베이스는 일반적 설계로는 그렇게 할 수 없다.

 중간에 매핑 테이블(CATEGORY_ITEM)을 두어,

1(CATEGORY) (CATEGORY_ITEM) 관계 및 다대(CATEGORY_ITEM) 1(ITEM)로 풀어

낸다.

 

참고

-외래 키가 있는 곳을 연관관계의 주인으로 정해라.

 연관관계의 주인은 단순히 외래 키를 누가 관리하냐의 문제이지 비즈니스상 우위에 있다고

 주인으로 정하면 안된다..

-예를 들어서 자동차와 바퀴가 있으면, 일대다 관계에서 항상 다쪽에 외래 키가 있으므로

 외래 키가 있는 바퀴를 연관관계의 주인으로 정하면 된다.

 

주의 (연관관계를 잘못 설정하게 되면 생기는 현상)

-물론 자동차를 연관관계의 주인으로 정하는 것이 불가능 한 것은 아니지만,

 자동차를 연관관계의 주인으로 정하면 자동차가 관리하지 않는 바퀴 테이블의 외래 키 값이

 업데이트 되므로 관리와 유지보수가 어렵고, 추가적으로 별도의 업데이트 쿼리가 발생하는

 성능 문제도 있다. 자세한 내용은 JPA 기본편을 참고하자.

 

1. resources -> templates -> application.yml생성

yml 또는 properties를 사용하면 된다.

설정파일이 복잡해지면 yml이 더낫다.

여기에서는 application.yml을 생성하고

기존에 있던 application.properties삭제 한다.

 

*YAML이란 (위키백과 참고)

- XML, C, 파이썬, , RFC2822에서 정의된 e-mail 양식에서 개념을 얻어 만들어진

  '사람이 쉽게 읽을 수 있는' 데이터 직렬화 양식

-XMLJSON이 데이터 직렬화에 주로 쓰이기 시작하면서,

 많은 사람들이 YAML'가벼운 마크업 언어'로 사용하려 함

 

*PROPERTIES이란 (위키백과 참고)

-응용 프로그램의 구성 가능한 파라미터들을 저장하기 위해

 자바 관련 기술을 주로 사용하는 파일들을 위한 파일 확장자

-더 복잡한 설정 포맷을 원할 경우 XMLYAML이 사용된다.

 

2. Database connection : 데이터베이스 소스 설정

a. spring 세팅

datasource :

  url: (상기사진내용참고)

  username: sa

  password: 

  driver-class-name: (상기사진내용참고)

(주의: 칸 띄어쓰기가 제대로 되어 맞춰지지 않는다면 테스트시 에러발생할 가능성이 크다!!)

 

설명

application.yml 안에

하기와 같이 설정하게 되면

데이터베이스 연결과 관련된 데이터소스설정이 완료 된다.

[url: jdbc:h2:tcp://localhost/~/jpashop;MVCC=TRUE]

 

*MVCC TRUE

-> 여러개가 접근할 때 조금 더 빨리 처리가 된다. 넣어주는 것이 권장.

*스프링부트에서 hikaricp를 써서 데이터베이스 커넥션 풀 등 위의 세팅이 이루어지게 한다.

 

b. JPA 세팅

 hibernate:

  ddl-auto: create

 properties:

hibernate:

 #show_sql: true

    format_sql: true

 

*createtab을 자동생성해주는 역할을 한다.

application 실행시점에 내가가지고 있는 엔티티(테이블)정보를 전부 다 지우고,

다시 생성한다.

*properties (*hibernate와 관련된 특정한 properties 사용할 것을 여기에다가 타입한다.)

*설정하는 것을 어떻게 배우느냐

spring bootreference document를 참고해서 하나하나씩 공부해야 한다.

https://docs.spring.io/spring-boot/docs/2.2.6.RELEASE/reference/html/

Data Access ->configure JPA Properties를 찾아서 읽어볼 것!

 

c. LOG LEVEL세팅

logging:

   level:

    org.hibernate.SQL: debug

 

(주의 : 잘 안될 경우, logging.level:로 세팅할 것!)

 

*hibernate.SQLdebug모드로 사용한다는 의미가 있고,

jpahibernate가 생성하는 SQL전부 확인이 가능하다.

 

show_sqlorg.hibernate.SQL의 차이점

jpa:

show_sql: true

->system.out에 출력하는 것. 그래서 주석처리를 하여 사용하지 않도록 한다.

운영환경에서는 사용하지 않는다.

 

logging:

org.hibernate.SQL: debug

->log on을 통해 출력하는 것. 운영환경에서는 로그들을 log on을 통해 출력해야 한다.

 

gradle 가지고 라이브러리 의존관계를 세팅하고 있다.

 

의존성 전이

과거에는 모든 라이브러리를 직접 다 찾아서 끌어와야 했는데, 이제는 필요한 라이브러리를 선택하면 해당 라이브러리를 사용하는데 필요한 의존관계를 다 긁어 온다.

이것을 의존성 전이라고 한다.

 

스프링 부트에서 확인하고 싶은 라이브러리가 있을 때

어떤식으로 관련된 라이브러리를 사용하고 있는지 확인하고 싶다면?

 

확인하는 방법 1 (cmd에서 확인)

-> d:\mineproject\jpashop>dir

프로젝트폴더가 어디에 있는지 확인
폴더 및 파일을 확인 그리고 dependency가 있는 gradlew디렉터리확인

-> d:\mineproject\jpashop>gradlew dependencies

다음과 같이 dependency tree들이 보인다.

확인하는 방법 2 (IntelliJ에서 확인)

spring-boot-starter

spring-boot-starter-web2.1.13.RELEASE 라이브러리가 있고

spring-boot-starter-tomcat

apache.tomcat.embed:tomcat-embed

spring-webmvc

위의 라이브러리들을 의존하고 있음을 확인할 수 있다.

tomcatwebmvc들을 사용할 수 있는 것이 이러한 의존성 때문에 가능하다.

 

thymeleaf

마찬가지로 thymeleaf와 관련된 라이브러리들이 세팅되어 있고

3버전의 thymeleaf를 사용함을 확인할 수 있다.

 

 

제일 중요한 라이브러리 spring-boot-starter-data-jpa

관련된 라이브러리 중에서 중요한 것은 spring-boot-starter-jdbcHikariCP(커넥션 툴)이라고 한다.

spring-boot 2.대 버전부터는 기본 라이브러리(커넥션 툴)이다.

운영시에도 사용하는 커넥션 툴인데 유용하다.

그리고 data:spring-data-jpa 라이브러리가 설치 되어 있음을 볼 수 있다.

*강의에는 spring-boot-starter-data-jpa:2.1.7 버전, hibernate 5.3.10.이지만,

내가 설치된 라이브러리는 각각 2.1.13, 3.2.0 버전이다.

강의를 들을 당시에는 버전선택이 2.1.132.1.7버전에 제일 가까운 버전이었다.

 

 

spring-boot-starter -> spring-boot-starter-logging

slf4j ->단순한 로그를 찍는 인터페이스 모음

slf4jlogback이라는 구현체를 꽂아서 사용한다.

라이브러리 설정만 조금 바꾸어주면 실제 구현된 로그를 바꿀 수가 있다

slf4j를 쓰는 것이 요즘 대세라고 한다.

 

 

spring-corespring-context

spring-core spring-context 라이브러리는 한묶음으로 거의 같이 사용한다.

spring-boot-starter시리즈를 사용하면 core,context는 패키지로 라이브러리를 사용한다고 한다.

 

 

test 라이브러리

junit-> 기본 라이브러리

mockito->mock객체 만드는 라이브러리

assertj-> 테스트를 편하게 할 수 있도록 도와주는 라이브러리

spring-test ->기본라이브러리

H2 database -> h2버전과 접근하는 클라이언트 버전과 맞지 않으면 충돌이 일어남

 

 

종합해서 라이브러리 요약정리하자면 다음과 같다.

 

테스트 라이브러리

spring-boot-starter-test

junit: 테스트 프레임워크

mockito: 목 라이브러리

assertj: 테스트 코드를 좀 더 편하게 작성하게 도와주는 라이브러리

spring-test: 스프링 통합 테스트 지원

 

핵심 라이브러리

스프링 MVC

스프링 ORM

JPA, 하이버네이트

스프링 데이터 JPA

 

기타라이브러리

H2 데이터베이스 클라이언트

커넥션 풀: 부트 기본은 HikariCP

WEB(thymeleaf)

로깅 SLF4J & LogBack

테스트

 

참고: 스프링 데이터 JPA는 스프링과 JPA를 먼저 이해하고 사용해야 하는 응용기술이다.

스프링부트란

-복잡하고 어려운 스프링기술을 간결하고 쉽게 사용할 수 있도록 도와주는 기술

 

JPA

-강력한 ORM 기술

-자바진영에서는 두가지 기술의 조합으로 높은 생산성과 맵 어플리케이션을 개발하는 추세

 

목표

-프로젝트를 처음부터 끝까지 코딩으로 완성하는 것이 목표

 

목록

프로젝트 환경설정

-스프링부트

-Gradle

-JPA

-톰캣

-Thymeleaf(타임리프)

-HIBERNATE

 

요구사항 분석

-쇼핑몰 구축을 위한 요구사항 분석

 

도메인설계

-요구사항기반으로

 

엔티티설계

 

테이블설계

 

JPA로 엔티티와 테이블을 ORM으로 맵핑

 

애플리케이션 아키텍쳐 구성

 

핵심비즈니스 로직개발

-테스트케이스로 이것을 검증한다.

 

=>이것들을 하게 되면 도메인 주도 설계를 이해 할 수 있다.

=>이것을 기반으로 웹계층개발을 올린다.

=>컨트롤러 타임리프로 올려서 HTML이 렌더링 되게 만든다.

+ Recent posts