ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Intellij 플러그인 개발기 - ① [프로젝트 생성하기]
    툴 사용법/IntelliJ 2023. 5. 6. 07:54

    발단

    플러그인을 무척 사랑하는 사람으로써 이것저것을 다 적용해보다가
    가끔 인텔리제이 버전 업그레이드 이후 적용안되는 경우가 무수히 발생하게되면서
    내껄 만들자는 취지로 시작하였다.

    다른분들도 이 글을 읽고 자신만의 IDE를 만들 수 있기를 바란다. 
    또한 삽질을 줄일 수 있기를 바란다. ㅠㅠ

     

    도움 받은 수단

    유튜브 - Make IntelliJ IDEA Your Own - YouTube

    공식 사이트 - Developing a Plugin | IntelliJ Platform Plugin SDK (jetbrains.com)

    챗 GPT - New chat (openai.com)

     

    Developing a Plugin | IntelliJ Platform Plugin SDK

     

    plugins.jetbrains.com

     

    달성 목표

    1차 - DTO Class To  MyBatis ResultMap
    (Dto, Entity 클래스를 MyBatis ResultMap으로 자동 생성해주기) 
    Git Hub: th1993kim/DtoToMyBatisResultMap at master (github.com)

    Intellij MarketPlace: DtoToMyBatisResultMap - IntelliJ IDEs Plugin | Marketplace (jetbrains.com)

     

    2차 - Controller API Method To RestDocTestCode
    (Controller API 메서드를 RestDoc 테스트코드를 자동생성해주기)

    Git Hub: th1993kim/RestDocCodeGenerator at master (github.com)

    Intellij MarketPlace: RestDocCodeGenerator - IntelliJ IDEs Plugin | Marketplace (jetbrains.com)

     

     

     

    [1] 프로젝트 생성

    인텔리제이가 23.1 버전으로 업데이트 됨에 따라 플러그인 제작시에 JDK 버전을 17버전을 사용하여야한다.

    (스프링부트와 동일하게 가려는 전략인지 모르겠다.)

     

     

     

    두가지를 선택해서 시작을 하자.

     

    시작을 하면 프로젝트 구조가 다음과 같이 나온다.

     

    my_plugin
    ├── .run
    │   └── Run IDE with Plugin.run.xml
    ├── gradle
    │   └── wrapper
    │       ├── gradle-wrapper.jar
    │       └── gradle-wrapper.properties
    ├── src
    │   └── main
    │       ├── kotlin
    │       └── resources
    │           └── META-INF
    │               ├── plugin.xml
    │               └── pluginIcon.svg
    ├── .gitignore
    ├── build.gradle.kts
    ├── gradle.properties
    ├── gradlew
    ├── gradlew.bat
    └── settings.gradle.kts

     

    플러그인은 코틀린언어에 최적화 되어있는 것 같은데, 자바도 호환 되니 걱정하지말자.

     

    Main 폴더에 java 디렉토리를 만들어서 해도 되고, 아니면 kotlin에 java파일을 만들어도 상관없다.

    그 다음 build.gradle.kts을 살펴보자

    intellij {
        version.set("2022.2.5") //테스트를 실행할 버전
        type.set("IC") // IC의 경우 커뮤니티 버전, IU인 경우 얼티메이트 버전
    
        plugins.set(listOf(/* Plugin Dependencies */)) // 플러그인 제작 의존성
    }

     

    플러그인 제작시에는 우리가 웹에서 UI테스트를 하는것과 같이 Intellij에서도 플러그인을 UI테스트해볼 수 있다.

    이를 위해서 버전과 타입을 명시해야한다.

    Gradle IntelliJ Plugin | IntelliJ Platform Plugin SDK (jetbrains.com)에서 고를 버전을 확인 할 수 있다.

     

    그리고 어떠한 언어에 접근하여 사용할것인지 플러그인 의존성을 추가해야한다. 물론 여러개를 등록할 수 있다.
    (Plugin Dependencies | IntelliJ Platform Plugin SDK (jetbrains.com))

    가령 플러그인이벤트가 발생했을때, java파일의 패키지, 클래스 , 필드, 메서드 정보 등등을 읽어오려면 필수 등록

    사항이다.

     

    필자는 다음과 같이 등록하였다.

     

    intellij {
        version.set("2023.1.1")
        type.set("IU")
    
        plugins.set(listOf("com.intellij.java"))
    }

    이 후 꼭 그레이들 업데이트를 실행하자! 의존성을 위해서

     

     

    이제 생성에 대한 부분은 끝났다. 

     

    [2] 클래스 생성하기

     

    Class를 생성하고 AnAction 을 상속받는다.

     

    public class DtoToResultMap extends AnAction {
        
        
        @Override
        public void actionPerformed(@NotNull AnActionEvent e) {
            
        }
    }

    이제 이곳에 event 객체를 이용하여 로직을 작성하면된다..

     

    [3] 화면에 버튼생성하기

    무언가 작동을 시키려면 단축키를 사용하던가 버튼을 사용하던가 해야하는데,
    인텔리제이는 plug.xml 에서 등록한다. (다른설정도 같이 있음)

     

    <idea-plugin>
        <id>com.ththth.DtoToResultMap</id> <!-- 프로젝트명-->
        <name>DtoToResultMapV2</name> <!-- 플러그인 이름 -->
        <vendor email="th1993kim@gmail.com" url="https://codingdreamtree.tistory.com/">코딩꿈나무</vendor>
        <!-- 본인의 이메일 및 이름 -->
        <description>
            <![CDATA[<h3>Convert Dto,Entity Class To MyBatis Result Map</h3><br>
                    <p>Enter your Class File(Dto),  Mouse Right Click Generate Menu</p><br>
                    <p>You can see ConvertDtoToSingleResultMap, ConvertDtoToMultipleResultMap</p><br>
                    <p>If Click ConvertDtoToSingleResultMap, Only This class Converted On Your Clipboard</p><br>
                    <p>If Click ConvertDtoToMultipleResultMap, Recursive search You Class And Converted On Your Clipboard (10Times)</p><br>
            ]]>
        </description>
        <!-- 플러그인에 대한 설명 (한글이 안된다 주의하자) -->
        <depends>com.intellij.modules.java</depends>
        <!-- 의존성 -->
        <extensions defaultExtensionNs="com.intellij">
        </extensions>
        <!--해당 내용은 작성할 필요 없지만 나중에 intention 플러그인을 제작할 때 필요하다.-->
        
        <!-- 아래부터가 액션을 등록하는 과정이다. 
        안드로이드를 생각해보시면 비슷하다고 생각하실 수 있다. -->
        <actions>
            <!-- 액션을 정의하는 과정이다. action부터 설명하자면
            	id: 해당 액션의 ID값이다.
                class: 해당 액션이 발생했을 때 진행할 기능을 정의하는 클래스이다.
                        위에서 생성한 클래스를 넣는다.
                text: 버튼의 이름을 넣는다.
                description: 해당 버튼에 대한 설명이다. (지금 잠시 기능때문에 임의로 작성)
            -->
            <action id="DtoToResultMapOnlyOne" class="plugin.main.DtoToResultMap"
                    text="DtoToResultMapOnlyOne"
                    description="1">
                    
                <!-- add-to-group 는 기존 메뉴에 버튼 추가할때 사용한다. 
                    그외에도 마우스 단축키나, 키보드 단축키등 다양한 소스가 있으니
                    플러그인 가이드에서 확인하면 된다.
                    
                    group-id: 버튼을 추가할 그룹
                    anchor: 버튼 순서(위치)
                -->
                <add-to-group group-id="GenerateGroup" anchor="first"/>
            </action>
            <action id="DtoToResultMapMaxTenDepth" class="plugin.main.DtoToResultMap"
                    text="DtoToResultMapMaxTenDepth"
                    description="10">
                <add-to-group group-id="GenerateGroup" anchor="after"  
                relative-to-action="DtoToResultMapOnlyOne"/>
            </action>
        </actions>
    </idea-plugin>

     

     

     

    [4] UI에 등록되었는지 확인해보기

    이제 정말 메뉴가 등록되었는지 확인하여야 하는데,

     

    그레이들에 runIde 혹은 runIdeForUiTests를 통해 확인할 수 있다.

     

     

    해당 작업을 진행하면 Intellij를 새로 띄워주게 되는데 나같은 경우 Generate 그룹에 생성하였다.

    단축키로는 Alt + Insert 이다.

     

    메뉴가 생긴것을 확인할 수 있다.

     

     

     

    [4] 조금 더 쉽게 생성하기


    사실 번거롭게 생성하였는데, 아래와 같은 방식으로도 생성할 수 있다.

     

    Help 메뉴 -> Edit Custom Properties에서

    idea.is.internal=true

    로 놓자.

     

    그 다음

    파일 생성 메뉴에서 Action 을 선택하면

     

    우리가 이전에 입력했던 값들을 대신 입력할 수 있는 창이 뜬다.

     

     

    이렇게 하면 UI적으로 그룹을 탐색하여 생성할 수 있다.

Designed by Tistory.