JPA 활용1 - 프로젝트 환경설정

1. start.spring.io와 자바 직접 실행


그림1

  1. start.spring.io 홈페이지에서 spring boot를 이용해서 만들어서 불러온다.
  2. preferences - gradle - build and run using, Run tests using 둘다 IntelliJ IDEA로 선택
  3. XXXApplication과 test에서 XXXApplicationTests를 돌려서 잘 돌아가는지 확인한다.

최신 Intellij 버전은 Gradle을 통해서 실행하는 것이 기본 설정이기 때문에 2번 설정을 통해 자바로 직접 실행하도록 해주는 것이 좋다.

  • Group : 개발하고자 하는 회사이름, 팀의 이름, 도메인 이름 -> 패키지의 이름으로 사용된다.
  • Artifact : 개발하고자 하는 프로젝트의 이름, 애플리케이션의 이름을 입력


위에서 devtools 라이브러리를 깜빡하고 추가 안해줘서 그냥 만든 다음 build.gradle에서 라이브러리를 추가해줬다. 코끼리 모양 클릭으로 꼭 적용시켜주자.

implementation 'org.springframework.boot:spring-boot-devtools'

devtools는 캐시같은 것들 없애주고 리로딩이 잘 되도록 만들어주는 기능들이 있다. 사실 지금 넣어준 이유는 thymeleaf을 사용하는데 있어서 화면에 뿌려주는 html에 내용을 조금만 수정해도 적용된 내용을 보려면 스프링을 다시 띄어줘야하는데 devtools 라이브러리를 설치하면 다시 띄워줄 필요 없이 해당 파일만 build - recomplie(ctrl+shft+F9) 해주면 바로 적용되게 할 수 있다.


2. lombok 설정


  1. preferences - plugins - lombok 검색해서 설치
  2. preferences - annotation processors - enable annotation processing 선택


3. jpa와 db설정


그림7

properties나 yml이나 둘 중 하나 정해서 설정파일로 사용하면 되는데 무거워질수록 yml이 좋다고 한다. 따라서 properties는 지우고 yml을 따로 만들어서 사용한다.

spring:
  h2:
    console:
      enabled: true

  datasource:
    url: jdbc:h2:mem:testdb
    driver-class-name: org.h2.Driver
    username: sa
    password:

# 설정들은 spring.io에서 doc에서 찾아서 공부해야한다.
# jpa설정
  jpa:
    hibernate: # hibernate 사용 설정
    # 애플리케이션 실행 시점에 테이블을 다 지우고, 내가 가진 entity 정보를 보고 다시 테이블 자동 생성
    # if exists drop table 해주고 다시 만들어준다고 보면 된다.
      ddl-auto: create
    properties: # property 사용 설정
      hibernate: # hibernate property 설정
        format_sql: true

# 로그 레벨 설정
logging:
  level:
  # hibernate 가 남기는 모든 로그가 debug모드로 설정
  # jpa hibernate가 생성하는 sql이 로거를 통해서 찍히도록 하는 설정
    org.hibernate.SQL: debug
    org.hibernate.type: trace # 실제 들어가는 파라미터값 찍어주는 설정

그림8

이렇게 로그에 hibernate가 만든 sql을 찍어준다. 그리고 실제 파라미터 정보를 알려준다. 실제 파라미터 정보를 좀 더 편하게 보여주는 라이브러리들이 있는데 링크 에서 찾아서 build.gradle에 추가해주면 된다. 버전 정보는 글 읽어보면 최신 버전이 적혀있으니 그걸로 적어주면 된다. 이런 편의를 위한 라이브러리는 배포할 때는 병목현상을 유발할 수 있으므로 개발시에는 편리해도 배포시에는 사용을 고려해봐야 한다.

cf) 웹 콘솔로 h2 접속하기
그림2
localhost:8080/h2-console 에 접속해서 connect를 누르면 바로 이용 가능하다.


cf) mysql 연결

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/db명?serverTimezone=UTC&characterEncoding=UTF-8
    username: 아이디
    password: 패스워드
  jpa:
    database: mysql
    database-platform: org.hibernate.dialect.MySQL8Dialect
    show-sql: true
    hibernate:
      ddl-auto: create
    properties:
      hibernate:
        format_sql: true


logging:
  level:
    org.hibernate.SQL: debug
    org.hibernate.type: trace


cf) data.sql
resources의 data.sql을 적용하는 옵션으로 mode에는 always, never, embedded 가 있다.
추가적으로 Hibernate 초기화를 통해 생성된 스키마에다가 데이터를 채우기를 위해서 data.sql가 실행되기를 원한다면 application.yml(또는 properties)에 spring.jpa.defer-datasource-initialization 옵션 값을 true로 추가해주어야 한다.

spring:
  sql:
    init:
      data-locations: classpath:data.sql
      username: root
      password: root
      mode: always
  jpa:
    defer-datasource-initialization: true
    database: mysql    
    database-platform: org.hibernate.dialect.MySQL8Dialect
    hibernate:
      ddl-auto: create-drop
    properties:
      hibernate.default_batch_fetch_size: 1000
      hibernate:
        format_sql: true

4. 배포


배포 시에는 build한 것만 배포하면 된다. 그림9

해당 폴더로 이동해서 gradlwe.bat(윈도우) 를 실행한다. clean build는 깔끔하게 지우고 다시 빌드하는 옵션이라고 보면 된다.

그림10

빌드하고 나면 build라는 폴더가 생기는데 build -> libs 안에 만들어진 jar 파일이 있다. 그럼 ‘java -jar 파일’ 을 입력하면 실행이 잘 되는지 확인할 수 있고 배포 시에는 이 파일을 던지면 된다.


5. Properties와 profile


Properties

application.properties 또는 application.yml 로 스프링부트 설정을 할 수 있다. resource 디렉토리 안에 있는데 main과 test 둘 다 사용할 수 있다. 예를 들어 application.properties가 main에도 있고 application.properties가 test에도 있다고 가정해보자. 먼저 main쪽에서 한번 빌드되고 test에서 한번 빌드가 되는 2단계를 거친다. 즉, test에서 빌드할 때는 이미 main에서 빌드한 application.properties를 test에 있는 것으로 아애 교체해버리는 것이다. 최종적으로는 main에서 사용 했던 설정이 사라지게 되는 것이므로 오류가 발생한다.
해결하기 위한 방법은 main과 test에서의 application.properties의 이름을 다르게 주면 된다. main에서는 application.properties를 주고 test에서는 application-test.properties로 설정을 주면 이름이 다르기 때문에 덮어씌워지지 않는다. 결국 두개의 설정파일이 빌드된 상태인 것이다. 여기서 주의해야할 점은 application.properties가 항상 base 설정으로 들어간다는 것이다. 따라서 test에서 properties 파일을 만들어 놓아도 사용하겠다는 세팅을 해놓지 않으면 항상 application.properties로 적용된다. test에서는 application-test.properties 로 설정을 따르고 싶다면 클래스에 @ActiveProfile(“test”)를 붙여주면 일단은 application.properties가 적용된 상태에서 test의 properties로 override 적용되어 동작한다. application.properties 설정을 base로 가져가고 같은 설정정보가 있는 경우 test에 있는 설정으로 따르게 되는 것이다.
main에서도 여러가지 properties를 만들 수 있는데 이것도 application.properties를 base로 하고 override하는 것이다. main에서 application-dev.properties를 만들고 이 properties로 main을 실행하고 싶다면 아래 그림의 빨간색 동그라미를 클릭하고 Edit Configurations 에서 Active profiles에서 dev를 넣고 돌리면 application-dev.properties가 적용된다. 그림11

profile

profile은 설정에 따라 빈의 등록 유무를 결정하기 위해 사용한다.

@Profile("prod")
@Component
public class ProTest {
    @Bean
    public String hello(){
        return "hello";
    }
}

// application.properties
spring.profiles.active=prod

위와 같이 코딩한 상태에서 그냥 실행하면 ProTest라는 빈은 등록되지 않는다. ProTest를 빈으로 등록하기 위해서는 application.properties에서 spring.profiles.active=프로파일이름 을 적어주면 빈으로 등록된다.

properties의 값들로 주입받기

application.properties에 적어둔 값을 사용할 수 있는 방법이 있다.

// XXApplication 
@SpringBootApplication
@ConfigurationPropertiesScan
public class SpringbootStartApplication {
    public static void main(String[] args) {
        SpringApplication.run(SpringbootStartApplication.class, args);
    }
}

// application.properties
tony.name=backtony
tony.age=26
tony.fullname=idontknow

// 아무 클래스 만들어서 설정값 받기
@ConstructorBinding // 
@ConfigurationProperties(prefix = "tony") // prefix로 application.properties에 적은 prefix 매칭
@Getter
@AllArgsConstructor
public class AppProperties {
    private String name;
    private int age;
    private String fullName;
}
  • 먼저 XXApplication 에 @ConfigurationPropertiesScan 애노테이션을 붙인다.
    • 이로 인해 @ConfigurationProperties가 붙은 클래스가 빈으로 등록된다.
  • application.properties 에 원하는 값들을 적어 둔다.
  • 설정값 받을 클래스 만들고 Getter와 AllArgsConstructor 세팅해주고 @ConfigurationProperties(prefix = “”) 와 @ConstructorBinding을 붙여준다.
    • 해당하는 값들이 생성자를 통해서 들어오게 되므로 Immutable하게 만들 수 있다.
  • properties에서 설장한 값이 한글일 때 깨지는 현상이 있는데 인텔리제이 설정에서 encoding -> file encoding에서 transparent native-to-ascii conversion 체크박스를 선택해주면 해결된다.

참고로 사용할 값이 몇개 없다면 @Value로 바로 가져와서 사용할 수 있다.



본 포스팅은 인프런 김영한님의 ‘실전! 스프링 부트와 JPA 활용1’ 강의를 듣고 정리한 내용을 바탕으로 복습을 위해 작성하였습니다. [강의 링크]


© 2021. By Backtony