Overview
플러그인 환경을 구축할 일이 있어 PF4J 라이브러리를 사용하던 도중 고민하게 만드는 에러가 생겼다, 관련 에러에 대해 알아보자
기존 설정
- 파일구조
├─src │ ├─main │ │ ├─java │ │ │ └─com.plugin.test │ │ │ └─UserExtension.java │ │ │ └─mapper │ │ │ └─UserMapper.java │ │ └─resources │ │ └─plugin.properties
- plugin.properties
plugin.id=EntryPointPlugin2 plugin.class=com.plugin.test.UserExtension plugin.version=1.0.0 plugin.requires=pf4j>=3.0.0 plugin.description=My example plugin
- UserExtension 코드
@Extension @Slf4j public class UserExtension extends PluginAbstractClass { private SqlSessionFactory sqlSessionFactory; private Object result; public UserExtension(){} @Override public void setDataSource(DataSource dataSource) { try { org.apache.ibatis.session.Configuration configuration = new org.apache.ibatis.session.Configuration(); configuration.setEnvironment(new org.apache.ibatis.mapping.Environment( "development", new org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory(), dataSource )); configuration.addMapper(UserMapper.class); this.sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration); System.out.println("SqlSessionFactory 생성 성공"); } catch (Exception e) { throw new RuntimeException("SqlSessionFactory 생성 중 오류 발생", e); } } @Override public void execute() { System.out.println("Executing operation"); } @Override public Object select() { try (SqlSession sqlSession = sqlSessionFactory.openSession()) { UserMapper userMapper = sqlSession.getMapper(UserMapper.class); result = userMapper.getAllUsers(); } catch (Exception e) { e.printStackTrace(); } return null; } }
에러 상황
기존 설정을 해놓고 agent 프로그램으로 동작을 하면 아래와 같은 에러가 계속 생성되었다.
경로를 왜 못찾는지 확인도 해보고 바꿔도 봤지만 동일한 에러가 계속 생성이 되었다.
여러번의 테스트 후 AbstracPluginManager에서의 코드를 보고 plugin 클래스의 start()메서드가 없어서 NullPointerException이 생긴다는 걸 파악했다.
Plugin의 필요성을 느끼지 못하고 제대로 알지 못한 후 개발을 하게 된 게 잘못되었다 생각한다. Plugin이 무슨 역할을 하는지 왜 필요한 지 알아보자
PF4J의 Plugin
- PF4J의 Plugin 클래스는 모든 플러그인의 기본 클래스이며, 플러그인이 PF4J에 의해 인식되고 관리될 수 있도록 하는 클래스이다.
- 모든 플러그인은 Plugin 클래스를 상속받아야 하며, 플러그인의 Lifecycle을 관리하는 데 필요한 메서드들을 정의한다.
- 사용예시
- 생성자 : 모든 플러그인은 PluginWrapper를 매개변수로 가진 생성자가 있어야 한다.
- 테스트 시 생성자 빼고 나머지 항목들은 Override하지 않고 기본 메서드를 사용하였다.
Plugin Class가 필요한 이유
호스트 애플리케이션에서 PF4J의 PluginManger를 사용하여 Start하고 Stop할 때 PluginManger는 load된 플러그인들에게 Plugin 클래스에서 상속받은 start와 stop 메서드를 호출한다.
AbstractPluginManager.java중 일부
plugin.properties의 plugin.class 경로도 com.plugin.test.UserExtension이 아닌 com.plugin.test.UserPlugin이 되어야 한다. 확장을 하는 클래스가 아닌 Plugin을 상속 받는 클래스를 먼저 찾아서 시작하고, @Extension이 붙은 클래스를 찾아 들어가는 과정으로 동작한다.
위의 사용예시에서 들었던 사진대로 클래스를 생성해주고 plugin.properties의 경로를 수정해주니
정상동작을 하였다.
PluginManager에 대해 좀 더 알아봤으면 생기지 않았을 문제라고 생각한다.
Reference
PF4J
PF4J site repository
pf4j.org
'IT자료실 > Frameworks & Libraries' 카테고리의 다른 글
Netty Bytebuf (0) | 2025.02.18 |
---|