[
  {
    "path": ".gitignore",
    "content": "# Created by .ignore support plugin (hsz.mobi)\n.idea/\n"
  },
  {
    "path": "JPA/JPA-Console.md",
    "content": "---\ntitle: 인텔리제이 JPA Console\ncatalog: true\nsubtitle: JPA Console\nheader-img:\ntags:\n - IntelliJ\n - JPA\n - JPA Console\n---\n\n![](https://i.imgur.com/oJqtQpV.gif)\n\n**JPA를 시작하면서 크게 불편했던 점이 쿼리 실행 결과를 바로바로 확인할 수 없는 점이었는데 `IntelliJ JPA Console` 기능으로 확인해볼 수 있습니다.**\n\n\n## DataBase 연동\n\n### Data Source\n![](https://i.imgur.com/7Uaibtf.png)\n* 사용 중인 데이터베이스를 선택합니다.\n\n### Database 정보 입력\n![](https://i.imgur.com/Lt9fDab.png)\n\n* `Name`, `Host`, `Database`, `User`, `Password`를 입력합니다.\n\n## JPA 연동\n\n### JPA Module 추가\n![](https://i.imgur.com/hnAQEtJ.png)\n\n1. `Project Structure` 설정\n2. `Modules` 탭이동\n3. 상단 `+` 클릭 이후 `JPA` 추가\n4. 하단 `+` 클릭 이후 `Hibernate` 추가\n\n### Persistence 추가\n![](https://i.imgur.com/q8l4Pkr.png)\n1. 위의 작업을 완료했으면 왼쪽 탭에 `Persistence` 추가됩니다.\n2. `Assign Data Sources….`를 클릭합니다.\n3. `Assign Data Sources` 에서 `Data Source` 항목에 위에 추가해 `Data Source` 항목을 추가합니다.\n\n## JPA Console\n\n### JPA Console 연결\n![](https://i.imgur.com/230LRUi.png)\n1. `entityManagerFactory`를 클릭합니다.\n2. `Console`를 클릭합니다.\n3. `JPA Console`를 선택합니다.\n\n### Query\n![](https://i.imgur.com/oJqtQpV.gif)\nJPQL 쿼리를 통해서 결과를 출력했습니다. 다음 포스팅에는 구체적인 사용법을 진행해 보겠습니다\n"
  },
  {
    "path": "README.md",
    "content": "[![Hits](https://hits.seeyoufarm.com/api/count/incr/badge.svg?url=https%3A%2F%2Fgithub.com%2Fcheese10yun%2FIntelliJ&count_bg=%2379C83D&title_bg=%23555555&icon=&icon_color=%23E7E7E7&title=hits&edge_flat=false)](https://hits.seeyoufarm.com)\n# IntelliJ 사용법\n\n* [인텔리제이 JPA Console](https://github.com/cheese10yun/IntelliJ/blob/master/JPA/JPA-Console.md)\n* [인텔리제이로 Builder Pattern 쉽게 구현하기](https://github.com/cheese10yun/IntelliJ/blob/master/plugin/builder-pattern.md)\n* [문자열 팁](https://github.com/cheese10yun/IntelliJ/blob/master/nomal/%EB%AC%B8%EC%9E%90%EC%97%B4.md)\n* [리팩토링](https://github.com/cheese10yun/IntelliJ/blob/master/nomal/refactoring.md)\n* [Live Template](https://github.com/cheese10yun/IntelliJ/blob/master/nomal/live-template.md)\n* [Todo 사용법](https://github.com/cheese10yun/IntelliJ/blob/master/nomal/intellij-todo.md)\n* Git 활용법\n    * [기초: commit, push, pull, stash, unstash ..](https://github.com/cheese10yun/IntelliJ/blob/master/git/base.md)\n    * [Rest](https://github.com/cheese10yun/IntelliJ/blob/master/git/rest.md)\n* [다국어 messages.properties](https://github.com/cheese10yun/IntelliJ/blob/master/nomal/messages-properties.md)\n* [Github 사용법](https://github.com/cheese10yun/IntelliJ/blob/master/github/기본사용법.md)\n* [Properties 자동완성 기능](https://github.com/cheese10yun/IntelliJ/blob/master/plugin/Assistant-Properties.md)\n* [특정 Import 제외하기](https://github.com/cheese10yun/IntelliJ/blob/master/nomal/import-exclude.md)\n* 추천 Plugin\n  * [Spring Assistant - Properties 자동완성](https://github.com/cheese10yun/IntelliJ/blob/master/plugin/Spring-Assistant.md)\n  * [String Manipulation](https://github.com/cheese10yun/blog-sample/blob/master/kotlin-jpa/docs/intellij-string-manipulation.md)\n* [Null Safe 설정](https://github.com/cheese10yun/IntelliJ/blob/master/nomal/null-safe.md)\n* [Excute Gradle Task 사용하기](https://github.com/cheese10yun/IntelliJ/blob/master/nomal/gradle-task.md)\n* [Visual VM Launcher IntelliJ](https://cheese10yun.github.io/intellij-visual-vm/)\n* [인텔리제이 Github Code Review](https://cheese10yun.github.io/intellij-code-review/)\n* Spring\n  * [Spring Boot 여러대 서버 실행하기](https://github.com/cheese10yun/IntelliJ/blob/master/spring/run-config.md)\n  * [Spring Boot Run Gradle에게 위임하기](https://github.com/cheese10yun/IntelliJ/blob/master/spring/spring-boot-out.md)\n  * [Spring Boot Actuator IntelliJ 활용하기](https://github.com/cheese10yun/blog-sample/tree/master/actuator?fbclid=IwAR26-tzhK16V2wGh1dt9CekOGCRkvlIfIkYfsJC5p_eF-CPeI7D4pF_jnK4#intellij-endpint)\n* [IntelliJ 기능 종합 정리](https://github.com/cheese10yun/blog-sample/blob/master/intellij-test/intellij-test/REAEMD.md) \n* [인텔리제이(IntelliJ) cannot resolve symbol 에러 처리](https://github.com/cheese10yun/IntelliJ/blob/master/etc/%EC%9D%B8%ED%85%94%EB%A6%AC%EC%A0%9C%EC%9D%B4(IntelliJ)%20cannot%20resolve%20symbol%20%EC%97%90%EB%9F%AC%20%EC%B2%98%EB%A6%AC.md)\n* [IntelliJ 각종 Tip](https://github.com/cheese10yun/IntelliJ/blob/master/nomal/tip.md)\n"
  },
  {
    "path": "etc/인텔리제이(IntelliJ) cannot resolve symbol 에러 처리.md",
    "content": "# IntelliJ cannot resolve symbol 에러 해결\n\n자바에서 Lombok과 같은 라이브러리로 인한 `cannot resolve symbol` 오류는 대체로 SDK 버전 문제로 발생합니다. 이를 해결하기 위해서는 프로젝트 내의 SDK 버전을 일관되게 설정해야 합니다. 이 과정에서 여러 설정을 조정해야 하는데, 구체적인 SDK 설정 방법에 대해 안내해 드리겠습니다.\n\n## Project Settings 설정\n\n### Project 설정\n\n![](https://raw.githubusercontent.com/cheese10yun/IntelliJ/master/image/Project-Structure.png)\n\nProject Structure 설정에서 SDK, Language Level을 동일한 버전으로 설정합니다.\n\n### Modules 설정\n\n![](https://raw.githubusercontent.com/cheese10yun/IntelliJ/master/image/module.png)\n\nModule SDK 버전도 동일한 버전으로 설정합니다.\n\n## Gradle 설정\n\n![](https://raw.githubusercontent.com/cheese10yun/IntelliJ/master/image/gradle.png)\n\nGradle JVM SDK 버전도 동일하게 설정합니다.\n\n## Java Compiler 설정\n\n![](https://raw.githubusercontent.com/cheese10yun/IntelliJ/master/image/java-compile.png)\n\nJava Compiler 설정도 동일한 버전으로 설정합니다."
  },
  {
    "path": "git/base.md",
    "content": "---\nlayout: post\ntitle: 인텔리제이 Git 활용법\nsubtitle: IntelliJ Tip\ncatalog: true\nheader-img: 'https://i.imgur.com/avC1Xor.jpg'\ntags:\n  - IntelliJ\n  - Tip\n  - Git\nthumbnail: 'https://i.imgur.com/6xFlHcv.png'\ndate: 2018-04-03 00:00:00\n---\n\n\n벡엔드 개발을 할 때 많은 틀을 사용합니다. Source Tree, Postman, Sequel Pro 등등 수없이 개발하다가 해당툴을 사용하기 위해서 왔다 갔다 하는 경우가 많습니다. 하지만 외부 툴을 사용하는 순간 뭔가 개발 흐름이 끊기는 느낌이 있어서 저는 거의 모든 작업을 인텔리제이에서 하는 것을 지향합니다. **이번 포스팅은 Source Tree 즉 Git 관련 툴을 대체하는 방법을 소개하겠습니다.** ***해당 기능의 단축키는 스크린샷 하단에 표시되있습니다.***\n\n## Commit\n![](https://i.imgur.com/6xFlHcv.png)\n\n* Diff : 변경 이력이 있는 모든 파일에 대해서 Diff 기능을 제공합니다. Commit을 하기 전에 자신이 변경한 모든 파일에 대해서 한 번 꼼꼼하게 읽어 보는 습관을 갖는 것이 실수를 줄이는 가장 효율적인 방법이라고 생각합니다.\n* Before Commit : **인텔리제이로 커밋을 했을 경우 얻을 수 있는 최고의 장점이라고 생각합니다.** 간단하게 다루고 이 기능은 추후 포스팅을 통해서 다시 한번 다루겠습니다.\n  * Check TODO:  //TODO 메시지가 남아 있을 경우 사용자에게 해당 TODO가 남아 있다고 알려줍니다.\n  * Optimize imports : 사용하지 않은 imports를 제거해 줍니다.\n  * Reformat Code : 인텔리제이에서 설정한 코드스타일로 변경 해줍니다.\n\n## Push\n![](https://i.imgur.com/TzF1dNk.png)\n* 커밋한 내용을 레파지토리에 푸쉬 하는 기능입니다.\n\n## Pull\n![](https://i.imgur.com/pMhiJPi.png)\n* Remote Repository에 변경 내역을 Pull 받는 기능입니다.\n\n## Stash\n![](https://i.imgur.com/ZIn63MI.png)\n\n* Stash 기능은 아주 간단하게 소개하면 변경 내역을 임시저장 해놓는 기능입니다. 가령 다른 branch로 변경을 원할 때 변경 내역이 남아 있어 부득이하게 commit을 하는 경우가 있습니다. 그럴 때 stash 임시 저장소에 저장하면 편리하게 branch 간의 이동을 할 수 있습니다.\n* 기본 단축키가 지정되있지 않아 `Find Action` 으로 stash 기능을 사용합니다.\n\n## UnStash\n![](https://i.imgur.com/kDCYgib.png)\n* Stash 저장한 내역을 POP 하는 기능입니다.\n* 기본 단축키가 지정되있지 않아 `Find Action` 으로 unStash 기능을 사용합니다.\n* 저장한 메시지를 기반으로 선택하고 `Apply Stash`을 클릭하면 변경 내역을 불러옵니다.\n\n## Share Project on Github\n![](https://i.imgur.com/bOJ0X8n.png)\n* 해당 프로젝트를 Github에 올리는 기능입니다.\n\n## Branch\n![](https://i.imgur.com/HJjPhjW.png)\n* New branch, Checkout, Compare, Merge, Rebase 등등 다양한 기능들을 제공합니다.\n"
  },
  {
    "path": "git/rest.md",
    "content": "# Git Reset\n\n![스크린샷 2018-08-04 오후 6.51.38](https://github.com/cheese10yun/IntelliJ/blob/master/assets/%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7%202018-08-04%20%EC%98%A4%ED%9B%84%206.51.38.png?raw=true)\n\nIntelliJ는 Version Controller의 기능을 다양하게 지원하고 있습니다. 웬만한 Git 관련된 기능들은 IntelliJ에서 더욱 편리하게 사용할 수 있습니다. Find Action 에서 `version controller`를 찾을 수 있습니다. 만약 단축키 설정이 안 되어있다면 단축키 지정하는 것을 권장해 드립니다.\n\n\n\nGit Reset에 대한 소개는 다루지 않고 IntelliJ에서 Git Reset 기능을 편리하게 사용을 다루겠습니다.\n\n![스크린샷 2018-08-04 오후 6.54.10](https://github.com/cheese10yun/IntelliJ/blob/master/assets/%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7%202018-08-04%20%EC%98%A4%ED%9B%84%206.54.10.png?raw=true)\n\nReset 하고 싶은 지점에 가서 마우스 우클릭 후 Reset Current Branch... 클릭하면 Git Reset 창이 출력됩니다. Soft, Mixed, Hard, Keep 중 본인이 원하는 옵션을 선택하고 하단의 Reset 버튼을 클릭하면 됩니다.\n"
  },
  {
    "path": "github/기본사용법.md",
    "content": "IntelliJ에서 다양한 Github 기능들을 제공해줍니다. 그 대표적인 기능들에 대한 정리입니다. 단축키는 하단 녹색박스에 표시되어 있습니다.\n\n## Github 아이디 연동\n\n인텔리제이에서 지원하는 다양한 기능들을 사용하기 위해서는 Github 연동이 반드시 필요 합니다.\n\n![](https://i.imgur.com/wdn4bEW.png)\n\n1. 설정에서 github 텝 인동\n2. 해당 Auth Type 선택 후 Test 버튼 클릭\n3. Success 출력 확인후 OK 버튼 클릭\n\n\n## Share Proejct\n\n<p align=\"center\">\n    <img src= \"https://github.com/cheese10yun/IntelliJ/blob/master/image/github-share.gif?raw=true\">\n</p>\n\n해당 프로젝트를 GitHub Repository에 쉽게 업로드 할 수 있습니다.\n\n## Gist 올리기\n<p align=\"center\">\n  <img src=\"https://github.com/cheese10yun/IntelliJ/blob/master/image/gist.gif?raw=true\">\n</p>\n![](https://i.imgur.com/8XoRPgf.png)\n\n원하는 코드를 드래그하고 위 그림처럼 Gist를 편하게 업로드 할 수 있습니다.\n\n## Task 연동\n\n![](https://i.imgur.com/qiDODzI.png)\n\nGithub Repository에 등록된 이슈들 기반으로 Branch를 생성 할 수있습니다. 세부 적인 워크 플로우는 [Github로 프로젝트 관리하기](https://github.com/cheese10yun/github-project-management)에서 확인 할 수 있습니다.\n\n### Task(Issue) 기반 Branch 생성\n\n<p align=\"center\">\n  <img src=\"https://github.com/cheese10yun/IntelliJ/blob/master/image/task.gif?raw=true\">\n</p>"
  },
  {
    "path": "intellij-synthesis.md",
    "content": "# 인텔리제이 종합 \n* [ ] gradle task \n* [ ] find action\n* [ ] 동일 문자열 변경\n* [ ] 동일한 위치 문자열 변경\n* [ ] 복사 리스트\n* [ ] Live Template\n* [ ] 리팩토링\n* [ ] 인텔리제이의 다국어 message properties\n* [ ] TODO \n* [ ] 특정 Import 제외하기\n* [ ] JPA Console\n* [ ] Github PR & Code Review\n* [ ] Git commit, push, rebase, stash, unstash\n* [ ] plugin\n  * [ ] grep\n  * [ ] git tool box\n  * [ ] string manipulation\n  * [ ] Rainbow \n  * [ ] Key Promoter X\n* [ ] Http Client\n\n\n\n\n## 기존\n\n* [ ] Find Action\n    * [ ] Open File\n    * [ ] Gradle CMD + 9\n* [ ] Http Client\n* [ ] Actuator End Point\n* [ ] 특정 Import 제외하기\n* [ ] Execute Gradle Task 사용하기\n* [ ] Refactoring\n    * [ ] move\n    * [ ] copy\n    * [ ] introduce variable\n    * [ ] Property\n    * [ ] introduce Parameter\n    * [ ] Pull Members Up\n* [ ] 다중 라인\n* [ ] live template\n    * [ ] todo, fixme, String, private, psvm\n* [ ] 문자열\n    * [ ] 동일 문자열 ⌘ + ⌃ + g\n    * [ ] 동일 위치열 ⌥ + drag\n    * [ ] 복사 히스토리 command + shift + v를\n* [ ] Github 사용법\n    * [ ] Github 연동\n    * [ ] Share Project\n    * [ ] Gist\n    * [ ] Task Issue 연동, Task 기반 branch 생성\n    * [ ] [Github Code Review](https://cheese10yun.github.io/intellij-code-review/)\n* [ ] Git\n    * [ ] Commit, Push, Pull\n    * [ ] Stash, UnStash\n    * [ ] Branch, Branch Diff, Merge, Checkout\n* [ ] Spring\n    * [ ] Health\n    * [ ] Mappings \n\n\n## 플러그인\n* [ ] Grep\n* [ ] Rainbow Brackets, Rainbow Intent\n* [ ] GitToolbox\n* [ ] Key Promoter\n* [ ] Lombok\n* [ ] Translation\n* [ ] VisualVM Launcher"
  },
  {
    "path": "nomal/gradle-task.md",
    "content": "\nIntellIj를 이용하면 Gradle Task의 명령어 자동완성 기능을 Gradle을 보다 쉽게 사용할 수 있습니다.\n\n\n## 설정 방법\n![](../assets/execute-gradle-task.png)\n\nFind Action에서 `Execute Gradle Task`을 열어 볼 수 있습니다.\n\n![](../assets/gradle-tasks-hot-key.png)\n단축키를 지정해서 사용하는 것을 권장드립니다. `Keymap` -> `Execute Gradle Task` -> `Hot Key` 지정\n저같은 경우에는 `CMD + 0`으로 지정해서 사용하고 있습니다.\n\n## 사용법\n\n![](../assets/gradle-task-run-1.gif)\n\n\n`Execute Gradle Task`를 실행하면 위 화면 처럼 해당 Gradle 명령어를 assistant 해줍니다.\n\n![](../assets/costom-build.png)\n\n\n위 그림처럼 커스텀하게 등록한 task도 assistant 해줍니다.\n\n![](../assets/gradle-task-run-2.gif)"
  },
  {
    "path": "nomal/import-exclude.md",
    "content": "# 특정 Import 제외하기\n\n인텔리 제이에서는 자동 `Import`설정을 지원해주고 있습니다. `Import` 대상이 여러 개 일 경우에는 개발자가 직접 선택하아합니다.\n\n![](/assets/import-setting.png)\n\n위 그림처럼 있을 경우 `javax.transaction`를 `Import`할 수도 있습니다. 한번 전체 검색으로 `javax.transaction`을 찾아보는 것도 좋을 거 같습니다.\n\n이런 경우에 특정 `Import`를 제외할 수 있습니다.\n\n![](/assets/import-exclude.png)\n\n1. Auto Import 탭으로 이동\n2. `+` 버튼 클릭해서 사용하지 않을 Import 추가\n3. 제외 대상 추가\n\n```\nimport javax.transaction.Transactional; // 제거 대상 이라면 import, ;를 제거하고 추가한다\n\njavax.transaction.Transactional\n```\n\n![](/assets/import-result.png)\n\n자동완성 시 `javax.transaction.Transactional` 제외가 된 것을 확인할 수 있습니다.\n"
  },
  {
    "path": "nomal/intellij-todo.md",
    "content": "---\nlayout: post\ntitle: 인텔리제이 Todo 활용법\nsubtitle: Intellij Tip\ncatalog: true\nheader-img: 'https://i.imgur.com/avC1Xor.jpg'\ntags:\n  - IntelliJ\n  - Todo\nthumbnail: 'https://i.imgur.com/x5yMIgW.png'\ndate: 2018-03-21 00:00:00\n---\n\n\n개발할 때 생각나는 사소 한 것들을 이슈 트래킹이나 메모장 같은 곳에 작성하기엔 번거롭고 올려 등록해도 잘 찾아보지 않는 경우가 많습니다. 그래서 저 같은 경우는 아래 그림과 같이 생각나는 모든 것들을 todo로 갈겨 놓습니다. 저는 개발 할 때 IDE에서 벗어나는 걸 싫어해서 웬만한 것들 IDE에서 작업을 진행합니다. 이러한 문제를 해결하는 인텔리제이 팁을 포스팅해보겠습니다.\n\n## 인텔리제이 Todo 활용법\n![](https://i.imgur.com/74N8oYR.png)\n\n위 그림과 같이 생각 나는 것들을 날짜 + 내용 + 작성자 이름 형식으로 Todo로 등록합니다. 날짜 정보와 누가 작성했는 지 는 나중에 Todo를 추적할 때 많은 도움을 줍니다.\n\n\n## TODO 전체 검색\n\n![](https://i.imgur.com/AgvhG70.png)\n\n개발 중에 Todo 전레 검색을 통해서 혹시라도 놓친 작업들이 있나 검색해 볼 수 있습니다. 단축키는 스크린샷에 나와 있습니다.\n\n## 커밋할 때 한 번 더 검사\n\n![](https://i.imgur.com/ZTW8jIq.png)\n\n인텔리제이를 통해서 커밋 작업을 진행하게 되면 다양한 지원을 받을 수 있습니다. 그중에 하나가 TODO 검사 입니다. 왼쪽 중단에 `Check TODO` 라는 항목을 체크 하고 커밋을 하게 되면 아래 그림과 같이 표시 됩니다.\n\n![](https://i.imgur.com/x5yMIgW.png)\n\n작성된 TODO가 있으면 커밋전에 사용자에게 알려줍니다. 남은 작업들을 확인하려면 `Review` 버튼을 누를 경우 위 처럼 작성된 TODO 리스트들이 출력됩니다. 혹시라도 잊어 버린 TODO를 커밋전에 확인 할 수 있습니다. `Before Commit` 기능은 이 이외도 많은 기능이 있는데 추후 포스팅에서 정리 해보겠습니다.\n"
  },
  {
    "path": "nomal/live-template.md",
    "content": "---\nlayout: post\ntitle: 인텔리제이 Live Template\nsubtitle: IntelliJ Tip\ncatalog: true\nheader-img: https://i.imgur.com/avC1Xor.jpg\ntags:\n  - null\nthumbnail: https://i.imgur.com/H4qR4aa.png\ndate: 2018-03-18\n---\n\n## IntelliJ Live Template\n\nIntelliJ Live Template 이란 코드 템플릿을 미리 지정해서 편하게 코드를 작성할 수 있는 기능입니다. 등록 방법은 아래와 같습니다.\n\n## Template 등록\n![](https://i.imgur.com/H4qR4aa.png)\n1. IntelliJ Preferences\n2. template 검색\n3. 등록할 스타일 작성 (Markdown template를 등록할 경우 Markdown 항목에 추가)\n4. Abbreviation: Template key 등록, Description: 간단한 설명 작성\n5. 추가 하고 싶은 Template 등록\n6. **하단의 Define에 사용할곳 반드시 정의** (Markdown 파일에서 사용할 것임으로 Markdown 선책)\n\n## Template 사용법\n\n![](https://i.imgur.com/mZuDMdU.gif)\n* 위에서 작성한 `key`값을 입력하면 Template 불러옵니다.\n\n\n## Template\n```\n---\nlayout: post\ntitle: $END$\nsubtitle:\ncatalog: true\nheader-img: https://i.imgur.com/avC1Xor.jpg\nthumbnail:\ndate: $date$\ntags:\n  -\n---\n```\n* `$END$` :  Template 을 보시면 코드가 완성되고 포커싱이 `title : ` 쪽으로 가시는 것 볼 수 있씁니다. 키워드를 사용하면 Template 작성후 커서가 자동 이동 됩니다.\n* `$date$` : 현재 시간을 자동으로 입력하게 합니다. (IntelliJ에서 작성하면 표시나 WebStorm 에서는 표시가 안되네요)\n\n## 자주사용하는 Template\n![](https://i.imgur.com/iQ40QYK.gif)\n\n제가 가장 많이 사용하는 Template 입니다. `TODO` 입니다. 코드를 작성하면 추가적으로 필요한 작업, 기타등등 작업들은 모두 TODO로 적어 놓습니다. 해당 날짜와 작성인이 자동으로 작성되는 것을 확인할 수 있습니다.\n"
  },
  {
    "path": "nomal/messages-properties.md",
    "content": "---\nlayout: post\ntitle: 인텔리제이 다국어 message properties\nsubtitle: Intellij Tip\ncatalog: true\nheader-img: 'https://i.imgur.com/avC1Xor.jpg'\ntags:\n  - Intellij\n  - message properties\nthumbnail: 'https://i.imgur.com/1rPFIE1.png'\ndate: 2018-06-06 00:00:00\n---\n\n\n인텔리제이의 다국어 message properties 기능을 소개하려 합니다.\n\n\n## messages.properties 생성\n![](https://i.imgur.com/qLq9yRu.png)\n\n원하는 디렉터리에서 파일을 생성하실 때 Resource Bundle 선택합니다.\n\n## Locales 추가\n![](https://i.imgur.com/cx4BUD0.png)\n\n하단의 + 버튼을 눌러서 원하는 Locales를 추가합니다. 추가하실 때는 [ISO_639](https://ko.wikipedia.org/wiki/ISO_639) 표준을 따르는 것을 추천해 드립니다. Alpha-3, Alpha-2 둘 중 선택하되 일괄되게 적용 하는 것이 좋다고 생각합니다.\n본 예제에서는 kr, en을 추가했습니다.\n\n## 추가된 messages.properties 파일\n![](https://i.imgur.com/CqePrKL.png)\n\n디폴트 messages.properties 및 위에서 추가시킨 kr, en 파일들도 같이 생성된 걸 확인할 수 있습니다.\n\n## message 작성\n![](https://i.imgur.com/1rPFIE1.png)\n\n1. 아무 messages.properties 선택하시고 하단의 Resource Bundle를 클릭 합니다.\n2. messages.properties의 key 값을 입력합니다.\n3. 오른쪽 messages.properties 알맞는 메시지를 추가합니다.\n\n\nResource Bundle 탭에서 에서는 여러 곳에 있는 messages.properties 쉽게 추가, 삭제, 변경 작업을 쉽게 할 수 있습니다."
  },
  {
    "path": "nomal/null-safe.md",
    "content": "![](/assets/intellij-null.png)\n\n인텔리제이의 설정을 통해서 `null`을 허용하지 매개변수, 리턴 타입에 대해서 어노테이션 `@NonNull`을 통해서 위 그림처럼 방지할 수 있습니다.\n\n![](/assets/spring-null-safe.png)\n\n\n1. `Preferences` 설정 단축키 `cmd + ,`\n2. `Compiler` 텝에서  `Configure annotations...` 클릭\n3. `Nullable`, `NotNull` 탭에서 각각 `+` 버튼 클릭 이후 `Nunllable` , `NonNull` 어노테이션 추가\n   * **반드시 `org.springframework.lang` 어노테이션을 추가해야합니다.**\n4. 인텔리제이 재부팅\n"
  },
  {
    "path": "nomal/refactoring.md",
    "content": "---\nlayout: post\ntitle: 인텔리제이 리팩토링\nsubtitle: Intellij Refactoring\ncatalog: true\nheader-img:\ntags:\n - IntelliJ\n - Refactoring\ndate: 2018-03-11\n---\n\n## 인텔리제이 리팩토링 기능\n\n![](https://i.imgur.com/Dq0m2Pf.png)\n\n인텔리제이의 리팩토링 기능을 이용해서 비교적 쉽게 리팩토링을 할 수 있습니다. 대표적인 리팩토링 기능들을 하나 하나 천천히 살펴 보도록 하겠습니다.\n\n**해당 기능의 단축키는 스크린샷 하단 녹색으로 표시되어있습니다. 단축키 환경이 다른 사용자들은 해당 그림 처럼 Find Action 창에서 리팩토링 키워드를 검색하면 원하는 기능을 쉽게 찾을 수 있습니다. 위 예제는 `Extract Method` 검색한 이미지 입니다.**\n\n\n## Extract Method : 함수 수출 기능\n\n![](https://i.imgur.com/8uhaWJF.png)\n\n```java\nif(age > 19){\n    //메소드 수출전\n    System.out.println(\"성인 입니다.\");\n}\n\nif(isSenior(age)){\n    //메소드 수출후\n    System.out.println(\"성인 입니다.\");\n}\n\nprivate boolean isSenior(int age) {\n    return age > 19;\n}\n\n```\n\n메소드로 수출하는 기능으로 가장 많이 사용하는 리팩토링 기능입니다. 단순히 `age > 19` 으로 구분하는 것보다 `isSenior` 메소드를 이용해서 묻는 것이 가독성 및 유지보수에서도 좋다고 생각합니다.\n저는 테스트 코드를 통과하는 코드를 최대한 빠르게 만들고 인텔리제이의 리팩토링 기능을 통해서 클린코드 작업을 진행합니다.\n\n## Change Signature : 메소드 파라메터 추가, 삭제 및 변경\n![](https://i.imgur.com/bsAUiSX.png)\n\n```java\n//리팩토링 전\npublic void printName() {\n    printName(\"Yun\");\n}\n\nprivate String printName(String firstName) {\n    return firstName;\n}\n\n//리팩토링 후\npublic void printName() {\n    printName(\"Yun\", \"kim\");\n}\n\nprivate String printName(String firstName, String lastName) {\n    return firstName + lastName;\n}\n```\n\n메소드에 파라미터가 추가되는 일은 빈번하게 만나게 됩니다. 이 때 유용하게 사용할수 있는 기능이 `Change Signature` 기능입니다.  또한 메소드에 추가된 파라메터는 해당 메소드를 호출하는 곳에 일괄적용 됩니다.\n\n## Rename : 이름 변경\n\n![](https://i.imgur.com/N4RVP73.png)\n\n```java\npublic void test() {\n    printName(\"Yun\", \"kim\");\n}\n\n//리팩토링전\nprivate String printName(String firstName, String lastName) {\n    return firstName + lastName;\n}\n\n//리팩토링후\nprivate String printFullName(String firstName, String lastName) {\n    return firstName + lastName;\n}\n```\n클래스, 메소드, 변수 등등 이름을 변경하는 기능입니다. 정말 많이 사용 하는 기능중에 하나입니다. 이름이 변경되면 참조되는 모든 곳에서 일괄 변경 됩니다.\n\n## Extract Variable : 변수 수출 기능\n![](https://i.imgur.com/gIBsKZ8.png)\n\n```java\n// 리팩토링 전\npublic void printFullName() {\n    printFullName(\"Yun\", \"kim\");\n}\n\n//리팩토링 후\npublic void printFullName() {\n    final String yun = \"Yun\";\n    printFullName(yun, \"kim\");\n}\n```\n\n특정 값을 변수로 수출하는 기능입니다. 기본적으로 `final` 키워드로 변수가 할당됩니다.변수는 생각보다 변수보다 상수로 사용을 많이 됩니다. 즉 한번 할당된 값을 변경하는 생각보다 흔하지는 않습니다.  그렇기 때문에 저는 일단 상수로 선언하고 나중에 값을 변경할 이유가 생기면 그때 `final` 키워드를 제거하는 방향으로 사용하고 있습니다.  `final` 키워드는 상수로 할당된 값이 변경되지 않는다고 명시적으로 선언함으로써 코드를 이해하는데 좋은 역활을 한다고 생각합니다.\n\n## Extract Filed : 맴버 필드 수출 기능\n\n![](https://i.imgur.com/OFRC3sm.png)\n\n변수 수출 기능과 거의 동일 합니다. 특정 값을 멤버 필드로 할당됩니다.\n\n## Extract Constant\n\n![](https://i.imgur.com/09d6IB8.png)\n\n변수 수출 기능과 거의 동일 합니다. 특정 값을 static 영역에 할당합니다.\n\n## Pull Members up\n\n![](https://i.imgur.com/8UDFcwU.png)\n\n```java\n\npublic interface AttackStrategy {\n}\n\npublic class MissileStrategy implements AttackStrategy{\n    public void attack() {\n        System.out.println(\"미사일 공격\");\n    }\n}\n```\n\n위와 같은 코드일 경우 `attack()` 메소드를 상위 인터페이의 추상 메소드로 올리는 기능 입니다. 하위 클래스에서는 `@Override` 어노테이션이 자동으로 추가됩니다.\n\n## Push Members down\n\nPull Members up 기능의 반대 기능입니다. 상위 클래스의 있는 메소드를 하위 클래스의 메소드로 내려줍니다.\n\n\n## 결론\n\n위에서 소개한 기능으로 레거시한 코드들을 리팩토링하는 것은 현실적으로 어렵습니다. 하지만 리팩토링을 너무 거창하고 어렵게 시작하는 것보다 반복 적인 코드를 효과적으로 줄이고 코드를 유지보수 및 가독성 좋은 코드를 작성하는 것도 좋은 리팩토링 이라고 생각합니다.\n\n\n\n\n\n\n"
  },
  {
    "path": "nomal/tip.md",
    "content": "# IntelliJ Tip\n\n## Database Global\n\n![](https://raw.githubusercontent.com/cheese10yun/IntelliJ/master/assets/a002.png)\n\nIntelliJ에서는 MySQL, Oracle, PostgreSQL, Redis, Mongo DB 등을 포함한 다양한 데이터베이스에 대한 지원을 제공해주고 있습니다. **이를 통해서 동일한 도구를 이용해서 다양한 데이터베이스에 대한 작업을 수행할 수 있습니다.**\n\n![](https://raw.githubusercontent.com/cheese10yun/IntelliJ/master/assets/a001.png)\n\n해당 Database 설정은 Project Data Sources을 통해서 프로젝트 단위로 설정할 수 있습니다. 만약 다양한 프로젝트에서 이 설정을 공유해서 사용하고 싶다면 빨간색 박스 버튼을 누르면 **Project Data Sources를 Global로 설정할 수 있습니다.**\n\n\n## Database DateTime Format\n\n![](https://raw.githubusercontent.com/cheese10yun/IntelliJ/master/assets/a003.png)\n\n데이터베이스에서 DateTime이 UTC 기준으로 저장되어 있을 때, 특정 지역의 시간대로 설정하여 데이터 조회를 보다 편리하게 할 수 있습니다. 이 설정은 Data Editor and Viewer에서 `Display temporal data in time zone` 옵션을 통해 원하는 지역의 시간대로 변경할 수 있습니다.\n\n\n![](https://raw.githubusercontent.com/cheese10yun/IntelliJ/master/assets/a004.png)\n\n해당 설정을 한 이후 조회 쿼리를 실행하여 결과를 확인 해보면 `Asia/Seoul` 기준으로 출력되는 것을 확인할 수 있습니다.\n\n\n## Live Template\n\n![](https://raw.githubusercontent.com/cheese10yun/IntelliJ/master/assets/a005.png)\n\n```kotlin\n// TODO: xxxx 2024-11-25 by yun.cheese\n```\n\nLive Template에서 TODO를 설정 하여 코드 작성시 자동으로 주석을 추가할 수 있습니다. 이런 경우 TODO 작성시 $END$를 통해 커서를 이동시킬 수 있습니다. 또한 작성 날짜를 추가하고 싶다면 `Edit variables`를 통해 `Date`를 추가할 수 있습니다. Data Formatter을 `yyyy-MM-dd`와 같이 설정할 수 있습니다.\n\n\n## Commit 새창으로 보기\n\n![](https://raw.githubusercontent.com/cheese10yun/IntelliJ/master/image/commit-001.png)\n\n* 업데이트 이후 인텔리제이 commit시 프로젝트 뷰쪽에서 별도의 영역으로 표시, 이 설정이 싫은 경우 아래와 같이 수정 가능\n\n\n![](https://raw.githubusercontent.com/cheese10yun/IntelliJ/master/image/commit-002.png)\n\n* `Find Action` -> `Use non-modal commit interface` -> `Off` 설정\n\n![](https://raw.githubusercontent.com/cheese10yun/IntelliJ/master/image/commit-003.png)\n\n* 다시 commit시 프로젝트 뷰에 표시됨을 확인 가능\n"
  },
  {
    "path": "nomal/문자열.md",
    "content": "---\nlayout: post\ntitle: 문자열 복사\ndate: 2016-12-18\ncatalog: true\ntags:\n- WebStorm\n- IntelliJ\n---\n\n안녕하세요 스타트업에서 근무하고 있는 신입 개발자입니다. 회사 내의 기술 스펙이 거의 자바스크립트를 기반으로 두고 있어 기존에 사용해왔던 IntelliJ에서 WebStrom으로 변경하게 되었습니다. 그래서 이번 기회에 Webstrom에 좀 더 친숙해지고 사용법을 읽힐 겸 간단하게 정리해봅니다.\n물론 WebStrom 뿐만 아니라 JetBrains사의 IDE에서 공통적으로 사용이 가능합니다.  \n\n단축키는 Mac OS 기반으로 알려드리겠습니다.\n\n\n### 동일 문자열 변경\n\n![⌘ + ⌃ + g](https://i.imgur.com/fAMA6Or.gif  \"⌘ + ⌃ + g\")\n***⌘ + ⌃ + g***\n\n\n코드를 작성하다가 동일한 문자열을 변경해야 하는 경우는 빈번하게 발생합니다. 위 그림과 같이 특정 변수를 모두 변경해야 하는 경우가 대표적인 예입니다. 변수가 2~3이면 귀찮지 않은데 위 와 같은 경우에는 크게 귀찮아집니다. 이럴 때 유용하게 사용하는 기능입니다.\n\n변경하고 싶은 문자열을 드래그 이후 ***command + control + g***  단축키를 입력하면 동일 문자열을 한 번에 변경이 가능합니다.\n\n### 동일한 위치 문자열 변경\n![⌥  + dra](https://i.imgur.com/Z5IYg6w.gif  \"⌥  + drag\")\n***⌥  + drag***\n\n동일 문자열과 비슷한 기능입니다. 만약 변경 대상이 동일한 문자열이 아닐 경우도 위와 같이 발생할 수 있습니다. 이러한 경우에 ***Alt + 마우스 드래그***를 통해서 한 번에 변경하실 수 있습니다. 이 기능 익숙해지면 다양하게 사용할 수 있습니다.\n\n### 복사 리스트\n![⌘  + ⇧ + v ](https://i.imgur.com/6ClfGhw.gif)\n\n개발을 하면서 우리는 수없이 정말 수없이 복사 붙여 넣기를 합니다... 이럴 때 가장 불편한 점 중에 하나는 새로 복사할 때마다 이전 복사한 내용들이 없어진다는 점이죠.\n\n\n이러한 경우에 ***command + shift + v***를 사용하시면 간단하게 해결됩니다. 단축키를 입력하시면 복사한 리스트들 출력되고 해당 리스트에서 엔터키를 입력하면 됩니다\n### Live Template\n![console.log()](https://i.imgur.com/ojSSHaC.gif)\n![console.log()](https://i.imgur.com/SPMRe1P.gif)\n\n\n코드를 작성하다 보면 중간중간 결과 값을 확인하기 위해서 `console.log('')`를 사용해서 확인 작업을 수없이 진행하게 됩니다. 이러한 반복적인 코드와 예약 어를 정의하고 예약 어를 통해서 코드를 불러오는 기능이 Live Template입니다.\n\n저 같은 경우에는 예약어 clog로 `console.log('')`를 간단하게 작성합니다. 물론 이러한 간단한 코드는 그때그때 작성해도 크게 불 펴하지는 않지만 코드량이 길어지면 점점 귀찮아지기 시작합니다.\n\napi를 호출하는 ajax 같은 코드도 빈번하게 작성되는 코드다 보니 위 그림과 같이 ajg 예약어로  ajax get 코드를 간단하게 작성하실 수 있습니다.\n\n하지만 저 같은 신입의 경우 해당 코드를 어느 정도 숙지가 완료되었을 때 Live Template에 추가하는 것을 권장드립니다. 코드를 숙지하지 않고 IDE기능을 통해서만 작성하는 것은 좋은 습관은 아니라고 생각합니다.\n\n### Live Template 등록 방법\n![Live Template](https://i.imgur.com/SPMRe1P.gif)\n\n**⌘ + ,단축키**를 통해서 설정에 들어가시면 Live Template 항목에서 해당 언어의 Template을 설정할 수 있습니다. 자바스크립트뿐만 아니라 다양하 언어의 Template 지정할 수 있습니다. ***반드시 하단에 Define을 클릭하시고 해당 언어를 다시 한번 정의해주셔야 됩니다.***\n\n이번에 소개해드린 기능들은 제가 가장 많이 사용하고, 유용하게 사용하는 기능들입니다. 앞으로는 좀 더 막강한 기능들을 공부해서 소개하여드리도록 하겠습니다.\n\n\n조금이나마 도움이 되셨기를 바랍니다. 긴 글 읽어주셔서 감사드립니다.\n"
  },
  {
    "path": "plugin/Assistant-Properties.md",
    "content": "# Assistant Properties \n\n\n![](/assets/X6giEx5.gif)\n\n위 그림처럼 유저가 추가한 properties 속성들도 자동 완성을 지원합니다.\n\n\n![](/assets/AmkyrnX.gif)\n\nProperties 속성이 코드에 바인딩 되는지 확인 할 수 있어 아주 유용합니다.\n\n\n## Properties \n```yml\nsample:\n  email: \"yun@test.com\"\n  name : \"yun\"\n  age: 27\n  auth: true\n```\n\n```java\n@Configuration\n@ConfigurationProperties(prefix = \"sample\")\npublic class SampleProperties {\n    private String email;\n    private String name;\n    private int age;\n    private boolean auth;\n\n    // getter, setter \n}\n```\nProperties 속성값과 바인딩 될 객체입니다.\n\n\n## Plugin 추가\n\n<p align=\"center\">\n    <img src = \"https://i.imgur.com/rVX7XJz.png\"/> \n</p>\n\n**대부분 이미 설치가 되어있을 겁니다.**\n\n\n## 의존성 추가\n\n### maven\n```xml\n<dependency>\n    <groupId>org.springframework.boot</groupId>\n    <artifactId>spring-boot-configuration-processor</artifactId>\n    <optional>true</optional>\n</dependency>\n```\n\n### gradle\n```\nbuildscript {\n  repositories {\n    jcenter()\n    mavenCentral()\n  }\n  dependencies {\n    classpath 'com.netflix.nebula:gradle-extra-configurations-plugin:3.0.3'\n  }\n}\n\napply plugin: 'nebula.optional-base'\n\n...\n\ndependencies {\n    optional \"org.springframework.boot:spring-boot-configuration-processor\"\n}\n```\n\n## Intellij 설정\n\n<p align=\"center\">\n    <img src = \"https://i.imgur.com/Gojvv1c.png\"/> \n</p>\n\n`Settings > Build, Execution & Deployment > Compiler > Annotation Processors` 에서 `Enable annotation processing`를 체크\n"
  },
  {
    "path": "plugin/Spring-Assistant.md",
    "content": "# Spring Assistant\n\n![](https://raw.githubusercontent.com/1tontech/intellij-spring-assistant/0.12.0/help.gif)\n\n> [이미지 출저 : JetBrains Spring Assistant](https://plugins.jetbrains.com/plugin/10229-spring-assistant)\n\n위 그림 처럼 `properties` 파일을 자동으로 완성해주는 플러그인이다. 대부분 기본으로 설치가 되어있다.\n\n## 설치\n![](../assets/Spring-Assistant.png)\n\n`Preferences` -> `Plugins` -> `Sprong Assistant` 검색 -> install"
  },
  {
    "path": "plugin/builder-pattern.md",
    "content": "---\nlayout: post\ntitle: 인텔리제이로 Builder Pattern 쉽게 구현하기\ncatalog: true\ndate: 2018-01-18 01:25:21\nsubtitle:\nheader-img:\ntags:\n- IntelliJ\n- Builder Pattern\n---\n\n이미 많은 분들이 빌더 패턴 관련해서 포스팅을 잘 정리해주셔서 빌더 패턴에 대해서 설명 해주기 보다는 인텔리제이 플러그인을 활용해서 좀 쉽게 사용할 수 있는 팁을 포스팅을 해보겠습니다.\n물론 Lombok을 활용해서 빌더를 손쉽게 사용할 수있지만 Lombok을 사용하지 않고도 쉽게 만들 수 있는 방법을 소개해드리겠습니다.\n\n\n## Builder Generator 플러그인 설치\n![](https://i.imgur.com/qlSmnIG.png)\n\n**Preferences -> Plugins -> Browse Repositories -> Builder Generator 검색 및 설치**\n\n## 빌더클래스 생성 방법\n![](https://i.imgur.com/vj6km1L.gif)\n\n* `command + n` 키를 눌러 Builder 를 선택합니다.\n* 위 화면처럼 Builder 클래스를 생성합니다.\n\n\n## 빌더 패턴 간단 소개\n\n### Member 객체\n```java\npublic class Member {\n\n    private String name; //mandatory\n    private String email; //mandatory\n    private String mobile; //optional\n    private String address; //optional\n    private String password; //optional\n    private String state; //optional\n    private int age; //optional\n\n    //Getter, Setter, Constructor\n}\n```\n\n\n### 문제점\n```java\nMember member = new Member(name, email, mobile ....)\n```\n* 객체를 생성할 때 어떤 값이 필수 값인지 옵션 값인지 인지 하기 어렵다.\n* `Member member = new Member(name, email, mobile ....)` 생성자로 객체를 생성 할 경우 반드시 순서를 맞추야 한다.\n* `Setter`로 생성할 경우 Setter 메소드를 많이 작성해야한다.\n\n### 해결\n* 빌더 패턴을 사용해서 필수 값은 생성자로 옵션 값은 빌더 클래스로 작성한다.\n\n\n### MemberBuilder.class\n\n```java\npublic final class MemberBuilder {\n    private final String name; //mandatory\n    private final String email; //mandatory\n    private String mobile; //optional\n    private String address; //optional\n    private String password; //optional\n    private String state; //optional\n    private int age; //optional\n\n    private MemberBuilder(String name, String email) {\n        this.name = name;\n        this.email = email;\n    }\n\n    public static MemberBuilder aMember(String name, String email) {\n        return new MemberBuilder(name, email);\n    }\n\n    public MemberBuilder withMobile(String mobile) {\n        this.mobile = mobile;\n        return this;\n    }\n\n    public MemberBuilder withAddress(String address) {\n        this.address = address;\n        return this;\n    }\n\n    public MemberBuilder withPassword(String password) {\n        this.password = password;\n        return this;\n    }\n\n    public MemberBuilder withState(String state) {\n        this.state = state;\n        return this;\n    }\n\n    public MemberBuilder withAge(int age) {\n        this.age = age;\n        return this;\n    }\n\n    public Member build() {\n        Member member = new Member();\n        member.setName(name);\n        member.setEmail(email);\n        member.setMobile(mobile);\n        member.setAddress(address);\n        member.setPassword(password);\n        member.setState(state);\n        member.setAge(age);\n        return member;\n    }\n}\n```\n\n* 필수 맴버 필드인 `name, email`에 `final`을 추가합니다.\n* 생성자 파라미터에 `name, email` 추가합니다.\n* 자동으로 만들어준 `name, email`의 `with` 메소드를 제거 합니다.\n\n\n### 객체 생성\n\n```java\nMember member = MemberBuilder\n                .aMember(\"Yun\", \"cheese10yun@gmail.com\")\n                .withAddress(\"address\")\n                .withAge(20)\n                .withMobile(\"010-XXXX-XXXX\")\n                .build();\n```\n\n![](https://i.imgur.com/lNLW4dh.png)\n* 필수 값은 생성자로 넘겨 필수 값을 넘겨 필수 값을 인지 하기 쉽습니다.\n* 옵션 값들은 순서에 상관 없이 .`with...()` 메소드로 이어나갑니다.\n\n## 결론\n객체를 안전하게 생성하고 쉽게 생성할 수 있다는 장점이 있습니다. 개념도 그렇게 어렵지 않아 가장 만만하게 도입해 볼만한 디자인 패턴인거 같습니다.\n"
  },
  {
    "path": "spring/run-config.md",
    "content": "# 스프링 부트 여러대 서버 구동 시키기\n\n![](../assets/configuration-run.png)\n\n1. 단축키 cmd + F11로 `edit configuration` 검색합니다.\n2. 해당 `edit configuration` 으로 들어갑니다.\n\n![](../assets/configruration-run-setting.png)\n\n1. 왼쪽 상단의 `+` 버튼을 클릭합니다.\n2. `Spring Boot`을 선택합니다.\n3. 상단의 `Name` 이름을 지정합니다.\n4. `VM options`에 `-Dserver.port=8081`을 지정합니다.\n5. 동일한 방법으로 다른 Port도 등록합니다.\n\n\n![](../assets/spring-boot-run.png)\n1. ctrl + alt + r 단축키로 Run을 실행합니다.\n2. 위에서 등록한 2개의 Application을 선택합니다.\n\n![](../assets/spring-boot-run-result.png)\n위에서 등록한 Application 2개가 실행되는것을 확인할 수 있습니다.\n\n"
  },
  {
    "path": "spring/spring-boot-out.md",
    "content": "## IntelliJ Spring Boot Run Gradle에게 위임하기\n\n![](../assets/out-dir.png)\n\n인텔리제이에서 Gradle Spring Boot Run을 실행시킬 경우 out 디렉토리가 생성됩니다. Gradle 플러그들이나 Task 작업에 추가적인 것들이 `out` 디렉토리에 반영이 되지 않습니다.\n\n인텔리제이에서는 Sprong Boot Run 작업을 Gradle에게 위임하는 옵션이 있습니다. 이 옵션으로 인텔리제이에서 Gradle을 사용하여 Run을 동작시킬수 있습니다.\n\n\n![](../assets/intellij-delegate-build.png)\n\npreference -> Gradle -> Runner -> Delegate IDE ... CheckBox를 선택\n\n\n![](../assets/non-out-dir.png)\n\n이제 인텔리제이를 실행하더라도 `out` 디렉토리가 생성되지 않은것을 확인할 수 있습니다.\n"
  }
]