Caused by: java.io.FileNotFoundException: Could not open ServletContext resource [/application.yml]

soluinoon·2023년 7월 30일
0

트러블 슈팅

목록 보기
5/5

상황

어플리케이션 테스트의 contextLoads에서 오류가 발생했습니다.
제목으로 적은 오류도 있었지만, 프로필 설정 자체에 오류도 있었습니다.

오류가 있는 application.yml 입니다.

spring:
  profile:
    group:
      local: "common,local-db"
      prod1: common, prod-db, prod1-server
      prod2: common, prod-db, prod2-server
      prod3: common, prod-db, prod3-server

jwt:
  secret: ~

jasypt:
  encryptor:
    bean: ~

cloud:
  aws:
    s3:
      bucket: ~
    credentials:
      access-key: ~
      secret-key: ~
    region:
      static: ap-northeast-2
      auto: false
    stack:
      auto: false

serverName: local
---

spring:
  config:
    activate:
      on-profile: common
servlet:
  multipart:
    max-file-size: 20MB
    max-request-size: 20MB
application:
  name: ~

---

spring:
  config:
    activate:
      on-profile: local-db
datasource:
  url: ~
  username: ~
  password: ~
#    driver-class-name: com.mysql.cj.jdbc.Driver
jpa:
  hibernate:
    ddl-auto: update
  properties:
    hibernate:
      format_sql: true
      show_sql: true
dbInfo: h2

---

spring:
  config:
    activate:
      on-profile: prod-db
datasource:
  url: ~~
  username: ~~
  password: ~~
#    driver-class-name: com.mysql.cj.jdbc.Driver
jpa:
  hibernate:
    ddl-auto: create
  properties:
    hibernate:
      format_sql: true
      show_sql: true
dbInfo: rds

---

spring:
  config:
    activate:
      on-profile: prod1-server

serverName: ~

server:
  port: 8080

---

spring:
  config:
    activate:
      on-profile: prod2-server

serverName: ~

server:
  port: 8081



---

spring:
  config:
    activate:
      on-profile: prod3-server

serverName: ~~~

server:
  port: 8080

---

spring:
  config:
    activate:
      on-profile: ~~~

serverName: ~~~

server:
  port: 8081

---

이렇게 되어있었고, local로 실행한 뒤에 dbInfo를 요청하면 h2가 나오는게 아니라 rds가 나왔습니다.
즉, 프로필 설정 자체에 원인이 있었고, 그 때문에 contextLoad 테스트에서 application.yml을 읽지 못한다고 생각했습니다.

원인

spring:
  profiles: <<< profile이 아니라 profiles이다.
    active: local << 또, 혹시 몰라서 default로 local 설정
    group:
      local: common, local-db
      prod1: common, prod-db, prod1-server
      prod2: common, prod-db, prod2-server
      prod3: common, prod-db, prod3-server

jwt:
  secret: ~

jasypt:

spring.profile이 아니라 spring.profiles 였습니다.
그리고 수정하고 확인해보니, 로그에서도 문제를 찾을 수 있었습니다.
수정 전 프로필 로그입니다.

2023-07-30 12:22:55.965  INFO 61736 Application  : The following  profiles are active: "local"

정확하진 않은데 local하나만 프로필이 적용됐습니다. 하지만 오류를 수정하니까 로그도 바뀌었습니다.

2023-07-30 12:22:55.965  INFO 61736 --- [main] Application  : The following 3 profiles are active: "local", "common", "local-db"

그룹으로 묶었던 프로필 모두가 적용되는걸 확인하실 수 있습니다.

결론적으로, 제목의 원인은 application.yml의 어떤 오류로 인해 인식할 수 없는 문제로 발생하는 것 입니다.

Reference

https://yjh5369.tistory.com/entry/Spring-boot-profile-%ED%99%98%EA%B2%BD%EB%B3%84%EB%A1%9C-%EC%84%A4%EC%A0%95%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95yaml
https://stackoverflow.com/questions/49474241/integration-test-could-not-open-servletcontext-resource-application-propertie

profile
수박개 입니다.

2개의 댓글

comment-user-thumbnail
2023년 7월 30일

잘 읽었습니다. 좋은 정보 감사드립니다.

1개의 답글