프로그래밍/Spring

[Spring boot / JPA] 1. 프로젝트 환경설정

daykim 2023. 6. 28. 16:45
아래 강의 정리
 

실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발 - 인프런 | 강의

실무에 가까운 예제로, 스프링 부트와 JPA를 활용해서 웹 애플리케이션을 설계하고 개발합니다. 이 과정을 통해 스프링 부트와 JPA를 실무에서 어떻게 활용해야 하는지 이해할 수 있습니다., - 강

www.inflearn.com

 

목차

  • 프로젝트 생성 : Spring Initializr
  • 라이브러리 살펴보기
  • View 환경 설정
  • H2 데이터베이스 설치
  • JPA와 DB 설정, 동작확인

 

https://spring.io/guides

 

Spring | Guides

Designed to be completed in 15-30 minutes, these guides provide quick, hands-on instructions for building the "Hello World" of any development task with Spring. In most cases, the only prerequisites are a JDK and a text editor.

spring.io

이거 보고 학습해도 좋다.

 

Spring Initializr


  • SNAPSHOT : 아직 개발중인 버전
  • Spring boot 3.xxxx는 Java17이 최소 요구사항
    • 무언가 문제 발생했을때 해결할 자신이 없어서 강의와 맞춰 선택
  • java 17 : recode class 해보고 싶어 && 서포트 기간이 길다.
  • H2 DB : 개발, 테스트 때 간단하게 교육용으로 사용하기 좋다.
  • Lombok : reduce bolierplate code. 간단한 어노테이션으로 코드 자동으로 제너레이션 해준다.
  • 스프링부트 플러그인 : 라이브러리에 대한 dependency 버전까지 자동으로 해결해준다.

 

라이브러리 살펴보기


핵심 라이브러리

  • 스프링 MVC
  • 스프링 ORM (ORM?)
  • JPA, 하이버네이터
  • 스프링 데이터 JPA

spring-boot-starter-web

  • spring-boot-starter-tomcat: 톰캣 (웹서버)
  • spring-webmvc: 스프링 웹 MVC

spring-boot-starter-thymeleaf: 타임리프 템플릿 엔진(View)

  • 뷰 템플릿이라고도 부르는데, 컨트롤러가 전달하는 데이터를 이용해 동적으로 화면을 구성할 수 있게 해준다.

spring-boot-starter-data-jpa

  • spring-boot-starter-aop
  • spring-boot-starter-jdbc
    • HikariCP 커넥션 풀
  • hibernate + JPA
  • spring-data-jpa

spring-boot-starter(공통): 스프링 부트 + 스프링 코어 + 로깅

  • spring-boot
    • spring-core
  • spring-boot-starter-logging
    • logback : slf4j의 구현체
    • slf4j : 로거를 찍는 인터페이스의 모음

spring-boot-starter-test

  • junit : 테스트 프레임워크
  • mockito : 목 라이브러리 / (Mock 객체란?)
  • assertj : 테스트 코드를 좀 더 편하게 작성하게 도와주는 라이브러리
  • sprint-test : 스프링 통합 테스트 지원

 

View 환경 설정


  • Model에 데이터를 실어서 View에 넘긴다.
  • return "hello" : 화면 이름
    • resource > templates > hello.html 로 렌더링 -> 스프링부트가 알아서 한다.

 

스프링부트 thypmeleaf viewName 매핑

  • resources:templates/ + {ViewName} + .html

 

정적인 화면

  • resources:static > 무언가파일.html

 

 참고
spring-boot-devtools 라이브러리 추가하면,
html 파일을 컴파일만 해주면, 서버 재시작 없이 View 파일 변경이 가능하다.
인텔리J 컴파일 방법 : 메뉴 > build > ReCompile
로그 이렇게 나오면 잘 설치된거다.

 

H2 데이터베이스 설치


  • 최소 한 번 이대로 연결 해야한다. -> jpashop.mv.db 파일이 생성된다.
  • 이후부턴 이걸로 연결 : jdbc:h2:tcp://localhost/~/jpashop

 

JPA와 DB 설정, 동작 확인


spring:
  datasource:
    url: jdbc:h2:tcp://localhost/~/jpashop
    username: sa
    password:
    driver-class-name: org.h2.Driver -> 데이터베이스 커넥션과 관련된 datasource 설정이 완료된다.
    => 이렇게 해도 히카리CP를 써서 커넥션 풀 이런게 스프링 부트가 다 세팅을 걸어준다.

  jpa:
    hibernate:
      ddl-auto: create 
      => 애플리케이션 실행시점에 테이블을 DROP하고, 다시 생성한다.
    properties:
      hibernate:
#        show_sql: true => System.out에 하이버네이트 실행 SQL을 보여준다.
        format_sql: true
        

logging:
  level: -> 로그 레벨을 정해준다.
    org.hibernate.SQL: debug -> org.hiber~를 디버그 모드로 쓴다
    => 이렇게 하면, 하이버네이트가 실행 SQL을 logger를 통해 남긴다.

 

++ 찾아보자

Entity 매니저가 필요하다.

EntityManager : 스프링부트가 @PersistenceContext 가 붙은 것을 주입해준다.

 

  • 엔티티 매니저를 통한 데이터 변경은 모두 트랜잭션 안에서 이루어져야 한다.

 

  • 테스트 실행하면, 자동으로 테이블이 만들어져 있다.
  • @Transactional 이 Test에 있으면, 끝나고 테이블이 rollback된다.

 

@Rollback(false) 붙이면 다음과 같이 commit한다.

hibernate sql 로그

 

Assertions.assertThat(findMember).isEqualTo(member);
  • 같은 트랜잭션 안에서 저장, 조회하면 영속성 컨텍스트가 같다.
  • 영속성 entity에서 같은 식별자(id)면, 같은 entity로 식별한다.
  • 그래서 select가 아닌 insert를 수행한 것이다.

 

쿼리 파라미터 로그 남기기

  • 이처럼 파라미터가 ?로 남는다. 가끔 답답할 수 있다.

해결방법 1

  • .yaml에 아래 코드 추가하면 다음과 같이 나온다.
org.hibernate.type: trace

 

해결방법 2

implementation 'com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.5.6'

참고
쿼리 파라미터를 로그로 남기는 외부 라이브러리는 시스템 자원을 사용하므로, 개발 단계에서는 편하 게 사용해도 된다. 하지만 운영시스템에 적용하려면 꼭 성능테스트를 하고 사용하는 것이 좋다.