1.3 회원테이블분석

Member 테이블

Member_ID

NAME

|CITY : VALUE TYPE/임베디드 타입 그대로 필드로 내려온 것이다.

|STREET : VALUE TYPE/임베디드 타입 그대로 필드로 내려온 것이다.

|ZIPCODE : VALUE TYPE/임베디드 타입 그대로 필드로 내려온 것이다.

 

설명

-1:1 맵핑이다.

-이름과 임베디드 타입인 주소(Address), 그리고 주문(orders) 리스트를 가진다.

 

Delivery 테이블

Delivery_ID

STATUS

CITY : VALUE TYPE/임베디드 타입 그대로 필드로 내려온 것이다.

STREET : VALUE TYPE/임베디드 타입 그대로 필드로 내려온 것이다.

ZIPCODE : VALUE TYPE/임베디드 타입 그대로 필드로 내려온 것이다.

 

설명

-회원 엔티티의 Address 임베디드 타입 정보가 회원 테이블에 그대로 들어갔다.

이것은 DELIVERY 테이블도 마찬가지다.

 

ITEM 테이블

ITEM_ID(상품 ID)

-상속관계 맵핑 기본편에서 설명한 3가지 전략중 가장 단순한 싱글테이블 전략을 사용했다.

 싱글테이블전략은 한테이블에 DTYPE으로 구분해서 다 넣는다.

 일반적으로 성능이 잘 나온다.

-단점이라하면 필드에 ARTIST,ETC,AUTHOR,ISBN,DIRECTOR,ACTOR 전부 섞여서 싱글테

 이블에 들어간다.

-앨범, 도서, 화 타입을 통합해서 하나의 테이블로 만들었다. DTYPE 컬럼으로 타입을 구분한

 다.

 

Orders 테이블

ORDER_ID (주문 ID)

MEMBER_ID (Foreign Key, 회원 ID)

DELIVERY_ID (Foreign Key, 배송 ID)

 

참고

-테이블명이 ORDER가 아니라 ORDERS인 것은 데이터베이스가 order by 때문에 예약어로 잡고 있는 경우가 많다.

 그래서 관례상 ORDERS를 많이 사용한다.

 

주문상품테이블

주문상품 ORDER_ITEM

ORDER_ITEM_ID

ORDER_ID (FK)

ITEM_ID (FK)

ORDERPRICE (주문한 상품가격)

COUNT (주문한 상품 개수)

 

카테고리(CATEGORY)

CATEGORY_ID

PARENT_ID (FK)

NAME

CATEGORY_ITEM

CATEGORY_ID (FK)

ITEM_ID (FK)

 

설명

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

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

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

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

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

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

낸다.

 

참고

*강의에서는 객체를 구분하기 위해 DB에 대문자를 사용했다.

-실제 코드에서는 DB에 소문자 + _(언더스코어) 스타일을 사용하겠다.

-데이터베이스 테이블명, 컬럼명에 대한 관례는 회사마다 다르다.

 보통은 대문자 + _(언더스코어)나 소문자 + _(언더스코어) 방식 중에 하나를 지정해서

 일관성 있게 사용한다. 강의에서 설명할 때는 객체와 차이를 나 타내기 위해 데이터베이스

 테이블, 컬럼명은 대문자를 사용했지만, 실제 코드에서는 소문자 + _(언더스코 어) 스타일을

 사용하겠다.

 

1-2. 회원 엔티티 분석

1.회원(Member)엔티티

 

회원(Member)

id: Long

-회원엔티티에 공통속성은 id가 다 있다.

-id=pk generating 해주는 id값 데이터베이스

 pk(id)long 값으로 해놓았다.

 

name: String

-이름(string)

 

address: Address

-임베디드 타입(내장값타입)인 주소(Address : 설계도 하기 그림참고-value type address)

 

orders : List

-그리고 주문(orders) 리스트를 가진다.

 

2.주문 엔티티

 

주문(Order)

id

member : Member(회원정보)

orderItems : list (주문목록)

delivery : Delivery(배송정보)

orderDate : Date(주문한날짜)

status : OrderStatus(주문상태-주문,취소 등등)

 

-한 번 주문시 여러 상품을 주문할 수 있으므로 주문과 주문상품(OrderItem)은 일대다 관계 다.

-주문은 상품을 주문한 회원과 배송 정보, 주문 날짜, 주문 상태(status)를 가지고 있다.

-주문 상태는 열 거형을 사용했는데 주문(ORDER), 취소(CANCEL)을 표현할 수 있다.

 

3.주문상품 엔티티

 

주문상품(OrderItem)

-주문한 상품 정보와 주문 금액(orderPrice), 주문 수량(count) 정보를 가지고 있다.

 (보통 OrderLine, LineItem 으로 많이 표현한다.)

-주문상품을 추가한 다른 이유는 한번 주문시 여러 개의 상품을 담을 수 있는데

 주문시점시 주문한 상품의 개수 및 주문한 상품 가격정보가 필요하기 때문이다.

 

4.배송 엔티티

 

배송(Delivery)

id

order : order(주문정보, 배송지주소 아님)

address : Address(배송지주소-value type 값타입 주소를 재활용)

status : DeliveryStatus(배송현황)

 

-배송(Delivery): 주문시 하나의 배송 정보를 생성한다. 주문과 배송은 일대일 관계다.

-주문시 하나의 배송 정보를 생성한다. 주문과 배송은 일대일 관계다.

 

5.상품엔티티

 

상품(Item)

id

name (상품이름)

price: int (상품가격)

stockQuantity (상품재고)

categories: List(어느 카테고리에 매핑 되어 있는지에 대한 정보)

 

상품엔티티와의 상속관계

-상속관계Album, Book, Movie들이 있고,

 개별속성들이 상속관계로 다음과 같이 표현되어 있다.

Album - artist, etc

Book - author, isbn

Movie - director, actor

 

-이름, 가격, 재고수량(stockQuantity)을 가지고 있다.

 상품을 주문하면 재고수량이 줄어든다.

 상품의 종류로는 도서, 음반, 화가 있는데 각각은 사용하는 속성이 조금씩 다르다.

 

6. 카테고리엔티티

 

카테고리(Category)

id

name

items: List(카테고리가 가지고 있는 리스트)

parent: Category

(계층구조로 되어 있다. 내 부모가 누구인데, 자식(속성)은 여러개의 구조로 되어 있다라는 형태, 부모는 한개)

child: List

 

-카테고리(Category): 상품과 다대다 관계를 맺는다. parent, child로 부모, 자식 카테고리를

 연결한다.

 

7. 주소엔티티

 

주소(Address)

-값 타입(임베디드 타입)이다. 회원과 배송(Delivery)에서 사용한다.

 

 

설계구성도는 JPA에서 다룰 수 있는 모든관계개념들을 모두 넣어두었다.

1. MemberOrder - 1대 다 관계

2. Orderdelivery - 11 관계

3. OrderOrderItem - 1대 다 관계

4. OrderItemItem - 다대 1 관계

5. ItemAlbum,Book,Movie - 상속관계

6. CategoryItem - 다대 다 관계

 

실무에서 사용하기 애매한 것들

-Categoryitem의 다대 다 관계(JPA@다대다관계)는 실제운영에서 사용하면 안된다.

 1대 다 또는 다대 1 관계로 풀어내야 한다.

-MemberOrder 1대 다 관계가 아닌, 시스템적으로는 동등한 관계로 보고 고민해야 한다.

-회원을 통해서 주문이 일어난다가 아니라, 주문을 생성할 때 Member가 필요하다라고 생각을 해야 한다.

-쿼리가 일어날 때도 주문 내역이 필요할 때 멤버를 찾아서 거기에 있는 주문 리스트를 가져 오는 것이 아니라,

 order에서도 필터링 조건에 멤버가 들어간다.

-그래서 사실상 1대 다의 컬렉션은 필요없다..

 자세한 것은 기본편강의에서 다루었다.

 

참고

회원이 주문을 하기 때문에, 회원이 주문리스트를 가지는 것은 얼핏 보면 잘 설계한 것 같지만,

객체 세상은 실제 세계와는 다르다. 실무에서는 회원이 주문을 참조하지 않고, 주문이 회원을 참조하는 것으로 충분하다. 여기서는 일대다, 다대일의 양방향 연관관계를 설명하기 위해서 추가했다.

2-1. 도메인모델과 테이블 설계

a.회원, 주문, 상품의 관계

-회원은 여러 상품을 주문할 수 있다. 그리고 한 번 주문할 때 여러 상품을 선택할 수 있기에 주문과 상품은 다대다 관

-하지만 이런 다대다 관계는 관계형 데이터베이스는 물론이고 엔티 티에서도 거의 사용하지 않는다.

-따라서 그림처럼 주문상품이라는 엔티티를 추가해서 다대다 관계를 일대 다, 다대 일 관계로 풀어냈다.

 

상품 분류

-상품은 도서, 음반, 화로 구분되는데 상품이라는 공통 속성을 사용하므로 상속 구조로 표현했 다.

 

b.회원과 주문 관계

-회원은 여러 주문을 할 수 있어서 회원과 주문의 관계는 1대 다의 관계이다.

 

c.회원과 주문, 주문과 상품 관계

-회원이 한번 주문할 때 여러개의 상품을 주문할 수 있다.

-상품도 여러 주문에 담길 수 있으면 다대 다 관계가 된다.

-하지만 이런 다대다 관계는 관계형 데이터베이스는 물론이고 엔티티에서도 거의 사용하지 않는다.

-그래서 1대 다 다 대 1의 관계 관계로 만들기 위해

 그림처럼 주문상품(테이블+주문수량)이라는 엔티티를 추가해서 다대다 관계를 일대 다,

 다대일 관계로 풀어냈다.

 

d.주문과 배송정보

-11 관계

-주문할 때 배송정보를 입력할 수 있도록 해놓음

 

e.상품

-도서, 음반, 영화 로 타입이 나누어짐

 

f.상품과 카테고리

-상품은 카테고리에 매핑이 된다.

-하나의 카테고리에 여러 가지 상품이 들어갈 수도 있고,

 어떤 상품이 카테고리에 복수로 들어갈 수 있기 때문에

 다대 다 관계로 세팅

 

g.데이터베이스의 목적

(참고 블로그 http://kdskor.blogspot.com/2010/10/pk-fk.html)

-효율적이고, 성능면에서 매우 편리하며 신속하게 수많은 데이터들을 보관 및 관리하는 것

-그 중에서도 제일 우선시 되어야 하는 것이 데이터의 무결성이다.

 신속하게 처리한다 하더라도 데이터에 결점이 있다면 데이터는 쓸모가 없을 뿐 아니라,

 데이터의 결점으로 인하여 잘못된 결과를 초래

-데이터 무결성을 보장해주기 위해서 가장 기본적으로 필요한 것이 PKFK

 

h.PK(Primary Key)FK(Foreign Key)

PK

-데이터베이스 생성에서 가장 기본적으로 고려되는 것이 PK

-PK만큼 중요한 것이 FK

-PK는 테이블에서 오직한개만 존재

-PK가 데이터의 유일성을 보장

-테이블에서 PK를 조건으로 조회하여 한 개의 값만 나오거나 값이 나오지 않게 됨

 

FK

-외래 키는 참조하는 테이블에서 1개의 키(속성 또는 속성의 집합)에 해당하고,

 참조하는 측의 관계 변수는 참조되는 측의 테이블의 키를 가리킨다.

-관계형 데이터베이스에서 외래 키(외부 키, Foreign Key)는 한 테이블의 필드(attribute) 중 다른 테이블의 행(row)

 식별할 수 있는 키

 

)아파트테이블 세대테이블의 아파트코드값에

   아파트테이블의 아파트코드에 없는 값이 들어간다면?

   이 때 데이터를 저장 또는 수정시 아파트코드 데이터는 아파트 테이블에 있는 아파트코드

   가 맞는지 확인해야 하는데, 이것이 자동적으로 확인되도록 도와주는 것이 FK이다.

요구사항 확인

-요구사항기반으로 도메인 모델과 테이블 설계

-설계바탕으로 엔티티클래스 개발

-엔티티 설계시 주의점을 알아볼 것

 

간단한 쇼핑몰기능 살펴보기

기능 3가지

 

1. 회원기능

-회원가입(회원등록)

-회원목록(회원조회)

 

2. 상품기능

-상품등록

-상품목록(수정 및 조회)

 

3. 주문기능

-상품주문 및

-주문내역 조회

-주문 취소

 

4. 기타요구사항

-상품은 제고 관리가 필요하다.

-상품의 종류는 도서, 음반, 화가 있다.

-상품을 카테고리로 구분할 수 있다.

-상품 주문시 배송 정보를 입력할 수 있다.

 

6. MemberRepositoryTest파일 테스트

MemberRepositoryTest 파일

설명

@SpringBootTest

-스프링부트로 테스트하기 때문에 SpringBootTest annotation 세팅

 

@RunWith(SpringRunner.class)

-JUnit에게 스프링과 관련된 테스트를 할 것이라고 알려주기 위해 하는 세팅

 

*annotation관련설명

(https://docs.spring.io/spring-boot/docs/2.2.6.RELEASE/reference/html/spring-boot-features.html#boot-features 참고)

If you are using JUnit 4, don’t forget to also add @RunWith(SpringRunner.class) to your test,

otherwise the annotations will be ignored.

If you are using JUnit 5, there’s no need to add the equivalent @ExtendWith(SpringExtension.class)

as @SpringBootTest and the other @Test annotations are already annotated with it.

 

-JUnit4 사용할 경우, @RunWith를 넣지 않으면 annotations들이 적용되지 않을 것이라고 함.

 JUnit5 @SpringBootTest와 같은 annotation을 세팅할필요 없다고 한다.

 

@Autowired MemberRepository memberRepository;

-MemberRepository작동을 위해서 Autowired를 사용해서 MemberRepository 인젝션 받음

 

@Test

-member를 테스트하기 위함

-given when then 형태로 테스트

 

//given

-member 변수를 만들고, memberA로 설정한다.

 

//when

a.member가 잘 저장되는지 확인

: memberRepository.save(member)작성후 save에서 단축키 ctrl+ Alt + v를 누르면

다음과 같은 형태로 설정이 된다.

 

Long saveId = memberRepository.save(member);

-> saveId: 저장된 Id(변수)를 뽑아오는(extract) 역할을 한다.

->member를 가지고 save를 하면 잘 저장이 되는지 확인을 해야 한다.

 

b.Member findmember = memberRepository.find(saveId);

-memberRepository에서 find해서 saveId가지고 넘긴 것이 findmember가 맞는지 확인한다.

*findMember 변수를 만든다.

 

//then (검증)

-Assertions 라고 하면 assertj라는 라이브러리를 스프링테스트가 자동으로 가지고 있어

라이브러리 디펜던시에서 자동으로 올라온다. “ . ”을 찍어주기만 하면!

 

-findMembergetIdmembergetId와 같다.

 findMembergetUsernamemembergetUsername과 같다.

 

#마주한문제

a.applcation.yml_debug설정 위치변경

무엇이 문제인지 정확히 몰라 test하기 위해 연관 있는 파일들을 확인하기 시작했다.

-application.yml 로 들어감

-applcation.yml_debug설정 위치변경

 level : debug 라고 설정이 되어 있음을 확인

 org.hibernate.SQL : debug로 변경

 

b.application.yml_DB경로접속 휴먼에러_JPA에러

-다음과 같은 메시지 확인

a,b 문제해결

그래서 application.yml 들어가니 설정경로가 jap와 debug위치 변경

 

c.MVCC_unsupported 메세지

-MVCC=TRUE 삭제

 

d. URL 에러메세지

-application.yml에서 경로를 확인하니

“ : ” 가 하나 더 추가 되어 있어 삭제

 

 

e. No EntityManager with actual transaction available 에러메세지

엔티티매니저를 통한 모든 데이터 변경 트랜잭션 안에서 이루어져야 하는데

현재 @Transactional 어노테이션이 없다.

2가지 종류의 transaction이 있는데 현재 스프링프레임워크를 사용하므로

-javax.transaction

-org.springframework.transanction <-이것을 사용한다.

 

에러메시지

문제해결

#마주한문제 3_Member테이블 미생성

-H2 콘솔에 접속하여 데이터베이스에 member 테이블이 생겼나 확인하니 Member 생성이 안되어 있었다!

 

a.application.yml_hibernate 단어오타

-hibernate 단어correction

 

b.application.yml에서

-logging.level: 로 다시 변경

-그리고 전체적으로 띄어쓰기가 중요하다는 사실을 발견 전체적으로 2칸씩 이동해줌

-그리고 다시 h2 콘솔 접속하여 데이터베이스에 member테이블생성 확인!

 

문제해결

*localhost:8082로 접속이 안될 시

local에서 h2데이터베이스를 실행시켜주지 않고 실행시킬 시에는

h2.database 관련하여 에러가 나오니 주의 할 것!

cmd에서 h2<bin<h2.bat실행 해주어야 h2데이터베이스로 접속(localhost:8082)접속할 수 있다.

 

 

JPA가 ddl-auto: 에 CREATE 옵션이 있으니 멤버테이블을 만들어 주었다.

member 테이블생성과정

-dropcreate로 테이블 생성을 했다.

-Member Entity정보를 보고 테이블을 생성한다.

 

 

member 테이블에 데이터가 없다?

Transactional이 데이터를 Rollback한다.

-Transactional 어노테이션이 테스트케이스에 있으면 테스트가 끝난 후에 바로 롤백이 되어 버린다.

-테스트케이스가 아닌 곳에서는 제대로 작동된다.

 왜냐하면 데이터가 계속 들어가 있으면 반복적인 테스트를 하지 못하기 때문이다.

 

Rollback(false) annotation

-그럼에도 불구하고 내눈으로 직접 데이터를 보고 싶을 때 이용

JPA 세팅 및 동작 확인완료!

 

기타

-같은 트랜잭션 안에서 저장하고 조회하면 영속성 컨텍스트 같다.

 같은 영속성 context안에서는 id값이 같으면 같은 엔티티로 식별한다.

 같은 영속성 context 안에서 기존 엔티티에서 관리하던 1차 캐쉬에서 바로 정보를 가져온다.

 그래서 select 쿼리는 없고, insert 쿼리만 보인다

a.쿼리 파라미터 로그 남기기 2가지 방법

쿼리 파라미터를 남기는 방법 1

-application.yml ->logging.levvel

org.hibernate.type: trace 추가

쿼리 파라미터를 남기는 방법 2

외부라이브러리 사용

https://github.com/gavlyukovskiy/spring-boot-data-source-decorator

 

-데이터베이스 커넥션을 랩핑해서 왔다갔다하는 만들어진 sql 스테이트먼트를 로그로 출력해주는 라이브러리들을 이용

 

-P6Spy 라이브러리 추가

->build.gradle

-implementation 'com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.6.1' 추가

->refresh

 

MemberRepositoryTest 실행후

-원본 출력정보 확인 및 파라미터 바인딩 출력정보 확인

-url에서 connection 얻어오는 로그

 

*로그를 어떻게 찍을 건지에 대한 옵션은 상기 사이트에서 확인할 수 있다.

*외부라이브러리 사용시 개발단계에서는 편한데,

 운영단계에서는 성능테스트를 해야 하고 성능저하가 있을 수 있기 때문에,

 성능이 좋지 못하면 개발단계에서만 사용할 것!

 

단어개념_binding Parameter를 보다가

파라미터 - 매개변수

매개변수란

-컴퓨터 프로그래밍에서 매개변수란 변수의 특별한 한 종류로서, 함수 등과 같은 서브루틴의 인풋으로 제공되는 여러

 데이터 중 하나를 가리키기 위해 사용된다. 여기서 서브루틴의 인풋으로 제공되는 여러 데이터들을 전달인자 라고 부른

 다.

 

위키백과 및 구글 참고

https://www.google.com/search?q=%ED%8C%8C%EB%9D%BC%EB%AF%B8%ED%84%B0&oq=%ED%8C%8C%EB%9D%BC%EB%AF%B8%ED%84%B0&aqs=chrome..69i57j0l7.1697j0j7&sourceid=chrome&ie=UTF-8

 

바인딩이란

바인딩(binding)이란 프로그램에 사용된 구성 요소의 실제 값 또는 프로퍼티를 결정짓는

행위를 의미합니다.

 

예를 들어 함수를 호출하는 부분에서 실제 함수가 위치한 메모리를 연결하는 것도

바로 바인딩입니다.

이러한 바인딩은 크게 다음과 같이 구분할 수 있습니다.

 

1. 정적 바인딩(static binding)

-실행 시간 전에 일어나고, 실행 시간에는 변하지 않은 상태로 유지되는 바인딩임.

 

2. 동적 바인딩(dynamic binding)

- 실행 시간에 이루어지거나 실행 시간에 변경되는 바인딩임.

이러한 동적 바인딩은 늦은 바인딩(late binding)이라고도 불립니다.

 

참고사이트

http://tcpschool.com/php/php_oop_binding

 

 

다른 라이브러리는 버전정보가 왜 없나요?

기본적으로 스프링부트가 2.1.7에서는 내한테 맞는 라이브러리를 전부 세팅 해놓았따.

미리 세팅 해놓지 않은 라이브러리들은 직접 버전정보를 적어주어야 한다.

 

#마주한문제 <미해결>

jar빌드 동작확인

-windowsmac 환경에 따라 명령어가 다르니 주의!

 

Build

<windows 환경>

jpashop> gradlew.bat

 

<mac 환경>

jpashop> ./gradlew clean build

 

 

Buildjar 라이브러리가 생긴다.

3. JPADB설정후 동작확인

a. Member classfile 생성

 

getter setter를 이용해도 되지만,

lombok을 이용하기 때문에 getter setter를 이용하지 않아도 된다.

@Getter @Setter로 세팅완료

 

b.MemberRepository classfile 생성

*Repository : entity를 찾아주는 역할을 한다.

 

@Repository : 스프링이 제공하는 기본 타입

 

@Repository@Component가 보인다.

기본 컴포넌트 스캔에 대상이 되는 어노테이션 중에 하나이다.

컴포넌트 스캔에 대상이 되어서 자동으로 스프링 bin에 등록이 된다.

@PersistenceContext 와 엔티티매니저

jpa를 사용하기 때문에 엔티티 매니저가 필요하다

스프링부트를 사용하기 때문에 스프링컨테이너에서 모든게 동작한다.

스프링부트가 @PersistenceContext 어노테이션에 있으면 엔티티매니저를 주입을 해준다.

 

엔티티매니저를 생성하는 코드가 없는데요?

spring-boot-starter-data-jpa를 라이브러리를 설치하면서 엔티티매니저가 자동생성이 되고

application.ymljpa설정파일을 전부 읽어서 엔티티매니저 팩토리코드가 자동으로 만들어진다. 그래서 따로 코드를 작성할 필요가 없다.

 

여기에서 #마주한문제 1

persistenceContextannotations are not allowed 라고 확인을 했다..

문제해결

설명

버전이 안맞는 것인지 처음 의심을 했으나..휴먼에러였다.

문제를 찾다보니 Member클래스에 Long.id “ . ”이 있어서 삭제를 하였고

Memberclass 파일에 private.EntityManager.em“ . ”이라고 되어 있었다.

이것을 삭제해주고 나니 해결 완료

 

4. 저장하는 코드 및 조회하는 코드 작성

설명

member를 반환하면 되는데 왜 Id만 반환하지?

commandquery를 분리한다는 원칙에 의해서

저장을 하고 나면 가급적이면 사이드이펙트를 일으키는 커맨드성이기 때문에

리턴값을 거의 안만드려고 한다. 아이디정도 있으면 다음에 조회를 할 수 있으니

Id만 반환한다.

 

5. 작성된 저장코드를 테스트!

설명

window/Linux환경에서 테스트 단축키 [ctrl + shift + T]

좌측처럼 JUnit4 선택 + [ok버튼클릭]

우측과 같이 test클래스파일이 만들어진다.

 

<위키백과 참고>

JUnit(제이유닛)

-자바 프로그래밍 언어용 유닛 테스트 프레임워크

-JUnit 테스트 주도 개발면에서 중요하며 SUnit과 함께 시작된 XUnit이라는 이름의 유닛

테스트 프레임워크 계열의 하나

-JUnit은 컴파일 타임에 JAR로서 링크

 

*JAR(Java Archive, 자바 아카이브)

-여러개의 자바 클래스 파일과, 클래스들이 이용하는 관련 리소스(텍스트, 그림 등)  

메타데이터를 하나의 파일로 모아서 자바 플랫폼에 응용 소프트웨어 라이브러리를

배포하기 위한 소프트웨어를 패키지 파일 포맷

 

 

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을 통해 출력해야 한다.

 

H2 데이터베이스 엔진이란

-the free Java SQL database engine.

무료 자바 SQL 데이터베이스 엔진이라고 한다.

 

H2 데이터베이스 엔진 장점

-개발이나 테스트용도로 가볍고 편리한 db이다.

-웹콘솔환경을 제공합니다.

-메모리 모드로 사용이 가능해서 편하다.

 

스프링부트에서 지원하는 클라이언트 버전과 동일한 버전으로

H2 데이터베이스 엔진을 다운로드 받을 것!

-스프링부트에서 지원하는 클라이언트 버전이 runtimeClasspath에서 h2:1.4200버전이므로

 h2 데이터베이스를 1.4.200버전으로 다운로드 받는다.

*클라이언트와 같은 버전을 사용하지 않으면 문제가 생길 수 있다.

 

H2 데이터베이스 엔진 다운로드

사이트 https://www.h2database.com/html/main.html

 

H2 Database Engine

H2 Database Engine Welcome to H2, the Java SQL database. The main features of H2 are: Very fast, open source, JDBC API Embedded and server modes; in-memory databases Browser based Console application Small footprint: around 2 MB jar file size     Support S

www.h2database.com

 

다운로드를 받습니다

 

<하기 좌측사진>

cmd창에서 h2폴더 < bin폴더로 이동

h2.bat 파일 실행

*자바로 실행되니 자바프로그램이 있어야 한다.

<상기 우측사진>

웹브라우저 창이 하나 더 보인다.

웹주소 맨앞에는 IP주소 대신에 localhost: 라고 변경해주고

주소에 있는 세션킷값을 유지시켜주어야 한다.

이유는 최초 h2데이터베이스가 저장될 경로 파일 생성을 위해 권한이 있어야 하기 때문.

Generic H2 (Embedded)를 선택후 JDBC 칸에 jdbc:h2:~/jpashop (디비파일생성할경로)로 설정해주고 연결 버튼 클릭!

 

연결후 다음과 같은 화면이 나온다.

 

다음과 경로파일생성이 완료된 화면이 나오고

사용자계정에 데이터베이스 파일 생성!

 

추후에는 h2 server설정후

JDBC칸에 jdbc:h2:tcp://localhost/~/jpashop를 입력해서 데이터베이스에 연결하면 된다.

 

#question mark

embedded로 설정해서 경로설정한 것과 뒤에 server로 경로연결해서 데이터베이스 접속한 것과 무슨 차이인지 모르겠다.

 

디비파일생성할때에만 파일모드로 접근하여 연결을 하고

이후에는 localhost:8082로 주소를 입력하고

네트워크모드(JDBC칸에 jdbc:h2:tcp://localhost/~/jpashop를 입력)

접근하면 된다.

 

h2데이터베이스 엔진 설치 및 파일 생성완료!

스프링과 Thymeleaf

-view 환경 설정하는데 Thymeleaf엔진을 사용할 것이다.

-스프링은 Thymeleaf를 권장하는 편이고,

Thymeleaf도 스프링과 관련된 지원하는 기능들이 많다.

-스프링에서 권장하는 Template Engines

(Apache Freemarker, Mustache, Groovy Templates)

 

Thymeleaf Templates Engine

-웹과 standalone 환경을 위한 modern 서버사이드 자바 템플릿 엔진

*https://www.thymeleaf.org/ Thymeleaf 공식 홈페이지 참고

 

Thymeleaf 의 장점

-마크업을 깨지고 않고 그대로 사용 한다.

-보통 다른 Engine은 웹브라우저에서 열리지 않지만, Thymeleaf는 열린다.

-버전 2에서는 <BR></BR> 태그를 달아주는 스타일로 매칭해주지 않으면 에러가 났었지만

현재 버전 3.0에서는 <BR>작성해도 에러가 발생하지 않는다.

 

Thymeleaf 의 단점

-아직 그래도 불편한점이 있기 때문에 매뉴얼을 참고하면서 개발을 해야 한다.

 

 

스프링 

-스프링 공식 가이드

https://spring.io/guides/

-스프링 관련하여 개념이 혼란스러울 때에는 공식 가이드에서 검색을 통해

개념을 익히면 좋다.

*Serving Web Content with Spring MVC 검색을 해서 나와 있는 가이드 대로

따라해보면 좋다.

-스프링부트 매뉴얼 : 에러핸들링이나 기능이용시 궁금한점들을 공부할 수 있다.

https://docs.spring.io/spring-boot/docs/2.1.6.RELEASE/reference/html/boot-features-developing-web-applications.html#boot-features-spring-mvc-template-engines

 

Thymeleaf Template Engine을 위해 세팅해야 할 것은?

-스프링부트에서는 하기의 것을 이미 설치함으로,

자동으로 모든 세팅이 전부 되어 있으므로 오직 개발만 하면 된다.

org.springframework.boot:spring-boot-starter-thymeleaf

 

실습

스프링 부트 thymeleaf viewName 매핑

설명

-@Controller를 해줌으로써 annotation은 달아주어야 한다.

-@GetMapping(“hello”)라는 url로 오면 controller가 호출된다라는 뜻

-스프링 ui에 있는 Modelmodel에다가 어떤 데이터를 실어서 controller에서

  view로 데이터를 보낼 수 있다.

-attributeName"data"라는 키의 값(attributeValue)hello로 넘긴다.

-returnhello는 화면이름이다.

 spring initializer가 만들어 놓은 resources 안에 templates->new->file

 view name용으로 hello.html 생성한다.

 hello.html 파일생성후 추후 보이지 않아도 return hello.html 형태로 변환한다.

-return hello결과가 화면렌더링 할 때에 hello.html 화면으로 이동한다.

 

Thymeleaf 템플릿엔진 동작 확인(hello.html)

설명

-<html>xmlns:th(네임스페이스)"http://www.thymeleaf.org" 주었다.

-<p th:text${data}로 아까 hello라고 적어 두었던 데이터가 넘어온다.

  데이터(hello) 렌더링 된 것이 >안녕하세요. 손님</p>로 넘어간다.

 

 

내부경로를 인터넷주소칸에 입력해서 hello.html에 접속 및 소스코드확인

설명

-다른 template engine이면 if절부터 들어가는 것이 많은데

 thymeleaf template engine은 간결한 코드구성으로 화면렌더링이 가능하다.

 

 

서버사이드 렌더링=스프링부트메인실행

 

-스프링부트가 내장톰캣을 가지고 실행시킨다.

 

#마주한문제

hello.html 화면이 위에처럼 나와야 하는데 처음에는 나오지 않아 무엇이 문제인지 확인했다.

해본 것들

1. cmd창에서 실행한 프로세스를 taskkill /f /pid 프로세스넘버를 통해 종료

   ->실행 안됨

2. hello.html에서 복붙 없이 직접 작성해서 넣었기 때문에 확인해 보았더니

   두 번째 라인에 <html 안에 “ / ” 가 있어서 삭제하고

  <html xmlns:th="http://www.thymeleaf.org"> 로 수정

   -> 실행안됨..

3.서버사이드렌더링하는 스프링부트메인파일과 Hello.Controller파일이 같은 폴더내에 있는지 확인했더니, test폴더안에    있었다..

  스프링부트메인파일이 있는 jpabook.jpashop으로 Hello.Controller파일을 이동

->화면이 보인다.

해결!!!

 

 

어떻게 데이터 hellohello.html에 찾아가는건가?

화면렌더링 경로

 

>HelloController

attributeName인 데이터의 attributeValuehellohello.html에 있는 ${data}로 넘어간다.이때 찾아서 가는 요인은 HelloControllerreturn hello이 화면렌더링 할 때에 hello.html로 화면이 넘어가도록 한다.

 

서버사이드템플릿엔진이 내장톰캣 실행시킬 때에

스프링부트 thymeleaf viewName 매핑을 하기처럼 해주어서

resources:templates/ +{ViewName}+ .html

데이터 hellohello.html을 최종적으로 찾아갈 수 있게 된다.

 

 

127.0.0.1:8080 메인 화면에 정적화면 구현해보기

resources->static->file만들기->index.html 파일생성

*resource 폴더에 파일이 생성되었기 때문에 기본적으로 서버를 다시 실행시켜주어야 한다.

설명

href 가 데이터 hello로 넘어가는 하이퍼링크 역할을 한다.

*127.0.0.1:8080/hello에서 hello@GetMapping(“hello")url hello 역할을 한다.

 

 

devtools 라이브러리 역할

-html화면을 수정해야 할 일이 많은데 그때 마다 서버를 리스타트 하면 힘드니

 spring-boot-devtools 라이브러리를 추가한다.

-이 라이브러리가 cache제거와 reloading을 되게 해주는 역할을 한다.

 *build.gradle->dependencies->spring-boot-devtools추가->reimport

 

devtools추가후 다시 서버리스타트하면 restartedMain이라고 뜬다.

 

 

devtools와 recompiler를 이용한 수정화면

#마주한 문제 2

devtools 라이브러리가 설치되었다는 restartedmain 화면이 안보여서

계속 찾아보았더니.. spring-boot-starter-devtools로 되어 있었다.

spring-boot-devtools로 수정하고 reimport, 서버restart를 하니 작동이 된다.

 

 

View환경설정 끝!!!

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를 먼저 이해하고 사용해야 하는 응용기술이다.

+ Recent posts