728x90
반응형
SMALL

Jira DC 플러그인 개발을 하면서 프레임워크같은데 프레임워크가 아닌것 같은 느낌을 받았다. 무슨 말이냐면, 개발자에게 강제하는 부분이 있는가하면 또 자유로운 부분이 있다. 예를 들면, 스프링 스캐너를 사용하여 스프링의 애노테이션을 사용하려면 사용할수가 있다. 그래서 더 모호하고 어렵다. 어떤게 좋은 코드가 될 지 한눈에 들어오지 않는다. 

 

그래서 나는 스프링의 애노테이션과 JAX-RS를 병행하는 방법을 택했다.

이 Jira DC Plugin은 기본이 JAX-RS이다. JAX-RS는 Java For XML Restful Web Service의 약자로 자바의 또 하나의 웹 애플리케이션 개발 방법이다. 그래서 깊이 있게 알아보기 전 프로젝트 구조를 먼저 살펴보자. 

 

프로젝트 구조

.
├── LICENSE
├── README
├── pom.xml
└── src
    ├── main
    │   ├── java
    │   │   └── com
    │   │       └── atlassian
    │   │           └── tutorial
    │   │               └── myPlugin
    │   │                   ├── api
    │   │                   │   └── MyPluginComponent.java
    │   │                   └── impl
    │   │                       └── MyPluginComponentImpl.java
    │   └── resources
    │       ├── META-INF
    │       │   └── spring
    │       │       └── plugin-context.xml
    │       ├── atlassian-plugin.xml
    │       ├── css
    │       │   └── myPlugin.css
    │       ├── images
    │       │   ├── pluginIcon.png
    │       │   └── pluginLogo.png
    │       ├── myPlugin.properties
    │       └── js
    │           └── myPlugin.js
    └── test
        ├── java
        │   ├── it
        │   │   └── com
        │   │       └── atlassian
        │   │           └── tutorial
        │   │               └── myPlugin
        │   │                   └── MyComponentWiredTest.java
        │   └── ut
        │       └── com
        │           └── atlassian
        │               └── tutorial
        │                   └── myPlugin
        │                       └── MyComponentUnitTest.java
        └── resources
            └── atlassian-plugin.xml

 

스프링과 유사한 구조를 가지고 있다. src/main/java, src/main/resources, src/test/java, src/test/resources.

 

Add-on Descriptor (atlassian-plugin.xml)

근데, 리소스를 추가하고 설정하는 방법이 XML을 사용한다.

 

그리고 그 파일은 src/main/resources 안에 있는 atlassian-plugin.xml 파일이다. 

이 파일이 어떻게보면 가장 중요한 파일이라고 볼 수 있다.

 

atlassian-plugin.xml

<atlassian-plugin key="${atlassian.plugin.key}" name="${project.name}" plugins-version="2">
    <plugin-info>
        <description>${project.description}</description>
        <version>${project.version}</version>
        <vendor name="${project.organization.name}" url="${project.organization.url}" />
        <param name="plugin-icon">images/pluginIcon.png</param>
        <param name="plugin-logo">images/pluginLogo.png</param>
    </plugin-info>
    <!-- add our i18n resource -->
    <resource type="i18n" name="i18n" location="myPlugin"/>
    <!-- add our web resources -->
    <web-resource key="myPlugin-resources" name="myPlugin Web Resources">
        <dependency>com.atlassian.auiplugin:ajs</dependency>
        <resource type="download" name="myPlugin.css" location="/css/myPlugin.css"/>
        <resource type="download" name="myPlugin.js" location="/js/myPlugin.js"/>
        <resource type="download" name="images/" location="/images"/>
        <context>myPlugin</context>
    </web-resource>
</atlassian-plugin>

 

만약 내가 커스텀 JQL 함수를 만들기 위해 플러그인을 개발한다 하면 이 파일에 리소스를 등록해야 한다.

만약 내가 워크플로우의 컨디션을 커스텀하기 위해 플러그인을 개발한다 하면 이 파일에 리소스를 등록해야 한다.

어떤 특정 리소스를 만들던 이 파일에 그 리소스를 등록해야 한다.

 

이후에 리소스를 개발하면서 하나씩 알아보자.

우선, 가장 먼저 나는 스프링 스캐너를 사용하기 위한 설정을 했다. Atlassian Plugin은 또 atlassian-spring-scanner 라는 것을 사용한다. 그래서 pom.xml에 이런 설정을 해줘야 한다.

 

버전

<properties>
	...
    <atlassian.spring.scanner.version>2.2.4</atlassian.spring.scanner.version>
	...
</properties>

 

의존성

<dependency>
    <groupId>com.atlassian.plugin</groupId>
    <artifactId>atlassian-spring-scanner-annotation</artifactId>
    <version>${atlassian.spring.scanner.version}</version>
    <scope>provided</scope>
</dependency>

 

빌드 플러그인

<build>
    <plugins>
		...
        <plugin>
            <groupId>com.atlassian.plugin</groupId>
            <artifactId>atlassian-spring-scanner-maven-plugin</artifactId>
            <version>${atlassian.spring.scanner.version}</version>
            <executions>
                <execution>
                    <goals>
                        <goal>atlassian-spring-scanner</goal>
                    </goals>
                    <phase>process-classes</phase>
                </execution>
            </executions>
            <configuration>
                <verbose>false</verbose>
            </configuration>
        </plugin>
    </plugins>
</build>

 

버전은 2.x 를 사용한다. 3.x 버전도 있는것 같은데 거의 관련 내용이나 문서가 없어서 시도하지 않기로 했다.

pom.xml 파일은 이렇게 설정을 하면 되고, 이게 끝이 아니다. 

 

`src/main/resources/META-INF/spring/plugin-context.xml` 파일에서 스프링 설정을 해줘야 한다.

plugin-context.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:atlassian-scanner="http://www.atlassian.com/schema/atlassian-scanner/2"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
        http://www.atlassian.com/schema/atlassian-scanner/2
        http://www.atlassian.com/schema/atlassian-scanner/2/atlassian-scanner.xsd">
    <atlassian-scanner:scan-indexes/>
</beans>

 

이렇게 설정을 해주면, atlassian-spring-scanner를 사용할 수 있다! 그 말은 애노테이션으로 자동 스캔이나 주입이 가능해진다는 말이다. 

Jira Version, AMPS Version

아래 명령어를 사용해서 스켈레톤 프로젝트를 만들면 자동으로 JIRA, AMPS 버전을 선정해준다.

atlas-create-jira-plugin

 

버전을 확인하는 방법은 pom.xml 파일에 있다.

<properties>
    <jira.version>9.12.2</jira.version>
    <amps.version>8.14.3</amps.version>
	...
</properties>

 

버전은 원하는 버전으로 변경할 수도 있다.

 

i18n

특히나 Atlassian 제품은 국제적으로 사용하는 제품이기 때문에 국제화가 거의 필수다. 그래서 i18n 리소스가 반드시 필요하다. 플러그인을 좀 더 완성도 높게 하려면.

 

그리고 이 파일은 `src/main/resources` 안에 작성하면 된다. 나 같은 경우는 간단하게 영어, 한국어에 대한 리소스를 만들었다.

 

kapproval.properties
kapproval_ko.properties

 

이렇게 리소스를 만들면 역시 이것도 atlassian-plugin.xml 파일에 등록해야 한다.

atlassian-plugin.xml



<atlassian-plugin key="${atlassian.plugin.key}" name="${project.name}" plugins-version="2">
	...
    <!-- add our i18n resource -->
    <resource type="i18n" name="i18n" location="kapproval"/>
    ...
</atlassian-plugin>

locationBundle의 이름을 적으면 된다.

간단하게 구조에 대해 이해해 보았다. 이제 Part.3에서 리소스를 하나씩 만들면서 어떤 설정이 필요하고 어떤 작업을 해줘야 하는지 하나씩 알아보자. 

 

728x90
반응형
LIST
728x90
반응형
SMALL

Atlassian Developer로서, 플러그인을 개발하고 있다. Data Center(또는 Server)버전과 Cloud 개발 방식이 살짝 다르다.

그리고 결정적으로 문서가 최신화가 되어있지 않은 경우가 많아서 삽질 과정을 적어두려고 한다.

 

환경 설정

우선 DC는 가장 먼저 Atlassian Plugin SDK가 필요하다. 나는 MacOS 유저이기 때문에 간단하게 Homebrew로 다운받았다.

Atlassian Plugin SDK는 Atlassian 플러그인을 개발할 때 필요한 여러 모듈들이 들어있다. 

brew tap atlassian/tap
brew install atlassian/tap/atlassian-plugin-sdk

 

두 줄의 명령어를 한번씩 실행하자. 실행하면 Atlassian Plugin SDK를 내려받는다.

정상적으로 내려받았으면 다음 명령어를 통해 제대로 설치가 됐는지 확인해보자.

atlas-version

 

잘 설치가 됐다면 아래 사진과 유사한 결과를 보게된다.

 

그리고 JDK 8이 필요하다. 8 이상이어도 되는지는 모르겠다. 공식 문서는 정확히 8로 명시하고 있어서 나도 공식 문서를 따르기로 했다.

JDK 8 설치 과정은 따로 작성하지는 않는다.

 

그리고 나서, 다음 명령어로 기본 틀을 갖춘 프로젝트 하나를 생성한다. 

atlas-create-jira-plugin

그럼 배치 파일 하나가 실행되는데, pom.xml 파일에 작성될 groupId, ArtifactId 등등의 정보를 작성한다. 참고로 이 Jira 플러그인을 개발할 땐 기본이 Maven을 사용한다. Gradle을 사용할 수 있는지는 모르겠다. 난 Maven도 불편함이 없기 때문에 그대로 Maven을 사용하기로 했다.

Define value for groupId: : com.atlassian.tutorial
Define value for artifactId: : myPlugin
Define value for version: 1.0.0-SNAPSHOT: : 1.0.0-SNAPSHOT
Define value for package: com.atlassian.tutorial: : com.atlassian.tutorial.myPlugin

 

참고로, 이 명령어를 실행중에 OSGi 활성화를 묻는 상황이 온다. 나는 No로 설정했다. 사용하지 않아도 상관이 없기 때문에.

프로젝트가 만들어지면 본인이 사용하는 IDE로 프로젝트를 연다.

 

가장 먼저 해야할 건 Maven Path 설정이다. 위에서 설치한 Atlassian Plugin SDK 경로를 넣어줘야 한다.

Settings > Build, Execution, Deployment > Build Tools > Maven에 보면 Maven home path 설정이 있다. 이 부분을 위에서 확인한 Atlassian Plugin SDK 경로로 설정한다. 그리고 JDK8이 잘 설정됐는지도 확인!

Project Structure > Project Settings > Project > SDK 확인

여기까지 확인을 했으면 프로젝트를 진행하기 위해 기본적으로 설정할 것들을 다 했다.

 

Debug 설정

개발하면서 디버깅은 필수 요소이다. Atlassian Plugin SDK는 디버깅을 위한 명령어가 따로 존재하고, 디버깅 설정도 필요하다.

우선 IntelliJ IDE에서 상단에 Run / Debug Configuration을 설정해야 한다. 아래 사진을 보자. 

JIRA Dev 라는 이름은 각자 다를 수 있다. Edit Configurations 버튼을 클릭해보자.

그럼 아래 사진과 같은 창이 하나 보인다.

 

여기서 왼쪽 상단에 + 버튼을 클릭한다. 그리고 `JVM`을 검색해보자. 검색하면 아래와 같이 `Remote JVM Debug`가 나온다.

이걸 선택해보자. 다음 화면이 보인다. 여기서 이름 정도만 수정해주면 된다. 기본으로 Host(localhost)Port(5005)가 적절하게 설정되어 있다. 그리고 Use module classpath에 만든 프로젝트가 잘 설정되어 있으면 된다.

 

이제 만약, 디버깅을 하고 싶으면 아래 명령어를 먼저 실행하자.

atlas-debug

 

그럼 프로젝트가 실행이 된다. 기본적으로 내장 톰캣을 사용하여 서버 하나가 띄워진다.

시스템 콘솔에는 다음 라인이 시간이 조금 지난 후 찍힌다.

[INFO] jira started successfully in 89s at http://localhost:2990/jira

이런 로그가 찍히면 이제 디버깅을 할 수 있다. 아래 사진처럼 디버그 버튼을 클릭하면 된다.

그럼 아래 사진과 같이 연결되었다고 보여진다.

이제 디버깅하고 싶은 특정 라인을 BreakPoint를 찍어서 확인해보면 된다!

이 정도로 환경 설정은 얼추 갖춰졌다. 이제 Part.2에서 프로젝트 구조에 대해 알아보는 시간을 가져보자!

 

728x90
반응형
LIST

+ Recent posts