2021. 3. 31. 17:27ㆍSpring/Spring Boot
1. Jython
1) Jython 이란?
Jython은 Python의 Java 구현으로 Jim Hugunin에 의해 만들어졌다. Jython은 Java 언어로만 작성되었기에 모든 JVM에서 동작한다. Jython은 모든 Java 클래스를 바로 불러올 수 있다. 몇가지의 표준 모듈을 제외하면 Jython은 Python 모듈 대신 Java 클래스를 사용한다. Jython은 표준 Python 배포판의 거의 모든 모듈을 가지고 있지만, 기존 C로 구현된 일부 모듈은 포함하지 않고 있다.
즉, Jython은 Java에서 Python을 이용해 개발을 하기 위한 목적을 가진 라이브러리이다.
2) 설치
Mac의 경우 brew를 이용하여 쉽게 설치할 수 있다.
brew install jython
3) Spring Boot 의존성 추가
현재까지 나온 Jython의 버전은 2.7.2가 최신이다. Jython 설치가 없어도 라이브러리만을 추가해주어도 기본적인 동작은 되지만, 외부 모듈을 사용하는데 제한적이기에 필요에 따라 Jython을 설치하는 것이 좋다. (Jython에서 numpy를 사용하는 좋은 방법은 아직까지는 없다.)
implementation group: 'org.python', name: 'jython-standalone', version: '2.7.2'
jython과 jython-standalone의 차이로는 lib 폴더의 제공 유무에 있다. jython-standalone은 lib 폴더(site.py)를 지원하고 있다. 따라서 jython-standalone이 아닌 jython으로 의존성을 추가할 경우, site 모듈이 없다는 에러가 발생한다.
- Cannot import site module and its dependencies: No module named site
jython을 사용할 때, 이 에러를 임시로 해결하기 위해서는 다음과 같이 설정해주면 된다.
System.setProperty("python.import.site", "false");
4) jython-standalone 예시
# test.py
def testFunc(a, b):
c = a + b
return c
@RestController
@RequestMapping("/test")
public class TestController {
private static PythonInterpreter interpreter;
@GetMapping("/pytest")
public String pytest() {
// System.setProperty("python.import.site", "false"); // jython-standalone이 아닐 경우 site 모듈 에러 해결 방안
interpreter = new PythonInterpreter();
interpreter.execfile("src/main/python/test.py");
interpreter.exec("print(testFunc(5, 10))");
PyFunction pyFunction = interpreter.get("testFunc", PyFunction.class);
int a = 10;
int b = 20;
PyObject pyobj = pyFunction.__call__(new PyInteger(a), new PyInteger(b));
System.out.println(pyobj.toString());
return pyobj.toString();
}
}
[참고] www.jython.org/
[참고] jythonbook-ko.readthedocs.io/en/latest/
'Spring > Spring Boot' 카테고리의 다른 글
[Spring Boot] Filter, Interceptor, AOP (0) | 2021.04.22 |
---|---|
[Spring Boot] Swagger API 문서 자동화 (0) | 2021.04.10 |
[Spring Boot] Logback (0) | 2021.03.31 |
[Spring Boot] 웹 프로젝트 생성, 프로젝트 분리, Gradle 테스트 (0) | 2021.03.22 |