요구사항 확인

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

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

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

 

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

기능 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 라이브러리가 생긴다.

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

프로젝트 환경설정

1. 프로젝트 생성(https://start.spring.io/ 로 들어간다.)

프로젝트 생성

-프로젝트를 만들고 라이브러리를 살펴본다.

-html 화면렌더링하기 위해 뷰와 관련된 환경설정

-H2 DATABASE를 설정하고

-JPA랑 데이터베이스 설정하고

실제로 돌아가는지 확인할 예정

 

프로젝트

-Gradle

*Maven에서 Gradle로 많이 넘어 가는 추세이다.

*2.2버전 이상으로 설정 할 경우에는 조금 환경이 달라질 수 있다.

 

Spring Boot 버전

-안정화된 2.1.7버전으로

 

Dependencies - 라이브러리 추가

Spring web starter

-Build web Restful App, Spring MVC, Apache Tomcat as default embedded container

 

Thymeleaf

-modern server side jave template engine

*서버사이드

*JSP는 요즘 사용하지 않는다. 성능이나 여러 가지 이슈들이 있기 때문.

스프링부트 내장톰캣에서도 권장하지 않는다.

 

Spring Data JPA (유틸리티 성 라이브러리)

-스프링 데이터 jpa 대해서 설명을 하지 않을 예정

-스프링 jpa로 어떻게 잘 어플리케이션 만드는 법을 아는 것이 중요

그래서 jpa에 대해서 개인적으로 깊이 알고 공부하는 것이 좋고, 이번에는 도움용으로 사용하는 것이 좋음

 

H2 DATABASE

-개발하거나 테스트할 때 유용하다.

-H2 데이터베이스 설치는 간단하다. MYSQL을 어렵다.

-메모리를 내장상태에서 실행할 수도 있다. 간단하게 교육용 장점이 있따.

 

Lombok

-지루하게 반복하는코드(boilerplate code)를 줄여준다라는 의미

 

 

2. Intelli J 설치

https://www.jetbrains.com/ko-kr/idea/

 

IntelliJ IDEA: JetBrains가 만든 전문 개발자용 Java IDE

Enterprise Java, Scala, Kotlin 등을 지원하며 강력한 기능을 제공하고 인체 공학적으로 설계된 Java IDE

www.jetbrains.com

3. build.gradle import

4. build.gradle 알아보기

plugins{ }

안에 내용은 다음과 같다.

-springboot 2.1.13버전 설치 표기

*plugin이 라이브러리 까지 관리를 해주기 때문에 2.1.14로 변경할 경우

 다른 라이브러리 버전까지 전부 업그레이드 된다.

-springboot에 필요한 dependency 필요한 라이브러리 추가 되었다는 내용

-java언어 설치 표기

 

sourceCompatibility ='1.8'

-자바 버전

 

configurations {	
               compileOnly {	 
                extendsFrom annotationProcessor	
               }

-Lombok으로 인해 생성된 코드들. annotation processor가 핵심!

 

repositories {	
             mavenCentral()
}

-repositories mavenCentral에서 라이브러리를 다운로드 받겠다라는 의미

 

dependencies {	
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'	
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'	
implementation 'org.springframework.boot:spring-boot-starter-web'	
compileOnly 'org.projectlombok:lombok'	
runtimeOnly 'com.h2database:h2'	
annotationProcessor 'org.projectlombok:lombok'	
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

-내가 프로젝트 생성시 선택한 dependencies 라이브러리들이 나와 있다.

 

5. 환경세팅  확인_1

JpashopApplication에서 generation codemain method가 있으니 실행시켜보자.

-Tomcat started on port(s): 8080(http) with context.. 가 보인다.

 

제대로 시작이 되었는지 실행해보자. 지금까지 아무것도 만들지 않았으니 흰색페이지에

글자 몇개만 나와야 정상이다. 실행시켜 보니 정상세팅이 되었음을 확인!

6. 환경세팅  확인_2

테스트케이스 실행

External libraries에 라이브러리가 왜이렇게 많은가

-예를 들어 JPA 라이브러리가 있다면

 JPA와 의존된 라이브러리들을 다운로드 받는 행위가 다른 라이브러리에서도 일어나기 때문에 많아지게 된 것이다.

 

*예전에는 웹어플리케이션 개발을 위해 세팅만 1주일이 걸렸다고 한다.

지금까지 실행하는 것들을 쉬지 않고 이행했다면 몇분도 걸리지 않았을 것 같다..

 

7. Lombok세팅확인 (#마주한에러해결)

-Lombok 사용하면 작성해야 할 코드양을 줄여준다.

 

객체를 만들때 변수선언, 기본생성자 Getter, Setter까지 메소드를 작성해줘야 하지만,

Lombok 플러그인은 생성을 한번에 해결가능하다. 사용할 변수 선언만 해주고

클래스명 위에 @Data라는 annotation을 선언해주면 끝이다.

 

*Lombok을 사용하기 위해서 plugin을 설치해야 한다.

 

Lombok 세팅확인 : 세팅확인순서

File->Setting->Plugins->lombok검색->install->restart IDE->

*Lombok설치후 꼭 해주어야 할 것

File->Setting->Plugins->Compiler->annotation processor에서 enable 클릭

 

Lombok 실제 동작 확인

다시한번 Lombok설정이 잘 작동되는지 코드를 실행(RUN)으로 확인

#마주한에러해결1

다음과 같은 에러 발생

Caused by: java.net.BindException: Address already in use: bind

확인해보니 톰캣 서버의 포트가 열려 있는 상태에서 코드실행하면 발생하는 에러라고 한다.

 

CMD창에서

netstat -ano 또는 netstat -a -n -o로 활성연결된 톰캣의 8080포트확인

taskkill /f /pid 2536 (8080포트로 활성화된 프로세스를 종료함)

이후 다시 실행해도 코드실행완료되지 않아 무슨 문제인지 보았더니

그리고 SpringApplication.run(JpashopApplication.class, args)을 삭제하지 않은 것이었다.

지웠더니 코드실행 및 출력이 에러 없이 완료 되었다.

 

 

다시 재실행 하니 data = hello가 보인다.

 

환경설정 추가

최근 IntelliJ 버전은 Gradle로 실행을 하는 것이 기본 설정이다.

이러한 기본설정은 실행속도가 느리기 때문에 다음과 같이 변경하기로 한다.

Setting-> Build, Execution, Deployment-> Build Tools -> Gradle

Gradle Build and run using: Gradle -> IntelliJ IDEA

Run tests using: Gradle -> IntelliJ IDEA

 

프로젝트생성까지 완료!!

스프링부트란

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

 

JPA

-강력한 ORM 기술

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

 

목표

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

 

목록

프로젝트 환경설정

-스프링부트

-Gradle

-JPA

-톰캣

-Thymeleaf(타임리프)

-HIBERNATE

 

요구사항 분석

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

 

도메인설계

-요구사항기반으로

 

엔티티설계

 

테이블설계

 

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

 

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

 

핵심비즈니스 로직개발

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

 

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

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

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

+ Recent posts