DevOps/Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)

Catalog-service 구현 중 테이블 생성이 안되는 이슈 발생 (미해결)

:)jun 2023. 4. 5. 15:06

현재 yml 파일

server:
  port: 0

spring:
  application:
    name: catalog-service
  rabbitmq:
    host: 127.0.0.1
    port: 5672
    username: guest
    password: guest
  cloud:
    config:
      name: ecommerce
  config:
    import: optional:configserver:http://localhost:8888
  h2:
    console:
      enabled: true
      settings:
        web-allow-others: true
      path: /h2-console
  datasource:
    driver-class-name: org.h2.Driver
    url: jdbc:h2:mem:test
  jpa:
    hibernate:
      ddl-auto: create-drop
    show-sql: true
    generate-ddl: true



eureka:
  instance:
    instance-id: ${spring.application.name}:${spring.application.instance_id:${random.value}}
  client:
    register-with-eureka: true
    fetch-registry: true
    service-url:
      defaultZone: http://localhost:8761/eureka

logging:
  level:
    com.example.catalogservice: DEBUG
management:
  endpoints:
    web:
      exposure:
        include: refresh, health, beans, busrefresh

'ddl-auto: create-drop' 속성을 줘서 애플리케이션 시작시 데이터베이스 스키마를 자동으로 생성하도록 설정.

'generate-ddl: true'속성을 줘서 ddl 스크립트를 생성하도록 설정.

 

CatalogEntity

@Data
@Entity
@Table(name = "catalog")
public class CatalogEntity implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(nullable = false)
    private String productId;
    private String productName;
    private Integer stock;
    private Integer unitPrice;

    @CreatedDate
    private Date createdAt;
}

 

'@Entity' 어노테이션을 설정.

 

그런데도 테이블 생성이 안된다.

그럼 user-service는 어떻게 USERS 테이블을 생성한거지? user-service 다시 실행해보자.

정상 작동, USERS 테이블 생성.

그러면 user-service가 미리 켜져있는 것이 catalog-service에 영향을 주나?

user-service 종료 후 catalog-service 실행 => 그래도 동일한 오류 발생.

다른 것은 sql문 실행하는 generate-ddl 값 뿐이니까 해당 설정 없애고 다시 실행.

동일한 오류 발생.

근데 generate-ddl 설정 없애줬는데도 sql문 관련 에러들이 보이네... data.sql 문 자체에서 에러가 난건가?

 

해당 에러 로그를 chatGPT에게 물어봤다.

역시나 테이블이 생성되지 않았기 때문에 생기는 오류이다.

이 얘기는 JPA를 통해 테이블을 생성하는 것보다 data.sql 문이 먼저 실행된다는 얘기인데 검증할 수 있는 방법, 만약 사실이라면 순서를 바꿀 수 있는 방법 있을까?

해당 설정 추가해서 다시 실행.

같은 오류 발생.

강의 커뮤니티에 같은 오류를 겪고 있는 글 발견

'spring.sql.init.mode: always' 라는 속성이 더 추가되어 있다.

해당 설정 추가해서 실행 => 같은 오류 발생.

 

sql문을 삭제하고 실행해보자. 실행된다.

이게 서비스 마다 h2 db가 따로 실행되는 거구나...

 

sql문 다시 넣고 해결해보자.

강의 추가 설명에 아래와 같이 설명되어 있다.

하지만 이미 해본 것. 오류 로그를 다시 확인해보자.

Error creating bean with name 'dataSourceScriptDatabaseInitializer'

 

스프링 2.5에서 SQL Script DataSource Initialization 기능이 변경되었다.

 

Hibernate and data.sql
By default, data.sql scripts are now run before Hibernate is initialized. This aligns the behavior of basic script-based initialization with that of Flyway and Liquibase. If you want to use data.sql to populate a schema created by Hibernate, set spring.jpa.defer-datasource-initialization to true. While mixing database initialization technologies is not recommended, this will also allow you to use a schema.sql script to build upon a Hibernate-created schema before it’s populated via data.sql.

 

.....spring.jpa.defer-datasource-initialization: true 했는데 왜 안될까.

 

여러가지 방법을 찾아봤지만 위의 방법 말고는 해결 방법이 없어 보인다...

먼저 sql 실행을 나중에 추가로 해주고 넘어가자.

(보류)

 

... data.sql 삭제해서 실행은 됐는데 왜 테이블이 안생기지?

잘 동작하는 user-service와 비교해보자. 버전이 다른가?

... 버전을 최신거를 가져와 사용했네...

<version>2.1.0.RELEASE</version>

버전 추가.

그래도 테이블 생성 안됨.

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.7.9</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.7.10</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>

오... parent 버전이 하나 높긴하네 낮춰보자.

낮췄는데 안되네...