OpenSource/Spring

k8s환경에서 리소스 파일을 읽을 경우 유의 사항

태하팍 2024. 9. 11. 17:24
반응형

오류발생

오류는 Graphql Query Validation때문에 동작을 하지 않아서 schema.graphql을 다시 만드는 과정에서 오류가 발생했다. 
로그를 확인해보니 resources아래의 파일을 못읽어오고 생성도 못하고 오류가 빵빵 터지는 상황이였다ㅋㅋ

아래처럼 path를 잡아주니 로컬에서는 잘 돌아가지만 jar로 배포되는 Docker환경에서는 리소스파일이 jar파일에 포함이 됩니다.
그래서 경로말고 클래스패스를 통해 리소스를 읽어야합니다.

public GraphQLSchema getGraphQLSchema() throws IOException {
   // 스키마 파일 경로
   String schemaFilePath = "src/main/resources/graphql/schema.graphql";
   // 스키마 파일을 읽어와서 GraphQLSchema로 빌드
   String schemaContent = new String(Files.readAllBytes(Paths.get(schemaFilePath)));
   TypeDefinitionRegistry typeRegistry = new SchemaParser().parse(schemaContent);
   RuntimeWiring wiring = getRuntimeWiring();
   return new SchemaGenerator().makeExecutableSchema(typeRegistry, wiring);
}

결론!
jar파일 내에서 리소스 파일 읽을때는 getClass().getClassLoader().getResourceAsStream()를 사용해야 합니다.

목표
InputStream을 통해 리소스 파일을 읽어온 후, 이를 문자열로 변환하여 GraphQL 스키마로 변환합니다.

    public GraphQLSchema getGraphQLSchema() throws IOException {
        
        String schemaFilePath = "graphql/schema.graphql";

        InputStream schemaInputStream = getClass().getClassLoader().getResourceAsStream(schemaFilePath);

        if (schemaInputStream == null) {
            throw new IOException("schema.graphql file not found in the classpath: " + schemaFilePath);
        }

        byte[] bytes = schemaInputStream.readAllBytes();
        String schemaContent = new String(bytes, StandardCharsets.UTF_8);

        TypeDefinitionRegistry typeRegistry = new SchemaParser().parse(schemaContent);
        RuntimeWiring wiring = getRuntimeWiring();
        return new SchemaGenerator().makeExecutableSchema(typeRegistry, wiring);
    }

주저리
고도화 작업으로 Introspection api를 통해 schema.graphql 의 내용을 만들어주는데 k8s에서 즉, Jar파일 내 리소스는 읽기전용이라
쓰기를 할 수가 없다. 
Kubernetes의 Persistent Volume 사용하거나 파일쓰기가 가능한 경로에서 작업을 하거나 해야한다.
그런데 소스상 Validation을 하기 위해 schema.graphql을 생성해서 사용하기 때문에 RuntimeWiring에서 타입을 정해줘야해서 문제가 발생할 가능성이 높다.

Kubernetes에서 돌아가는 application이라면 고려해야할 사항들이 반드시 존재할 것이다.
이번에 이런 오류가 나지 않았다면 모르고 지나갔을텐데 오류가나서 좋은경험이 하나 쌓였다:)

그럼 이상 주저리 끝! 즐프하세요~~

 

 

 

 

 

반응형