의문점 공부하기/🧾공부하며

🧾intelliJ 에서 모듈과 패키지는 무슨 차이인가..?

아리빠 2023. 7. 6. 19:38

인텔리제이를 사용하며 모듈이 무엇인지, 패키지가 무엇인지, mark directory as 기능이 무엇인지 알지도 못한채 막 사용하다보니 경로도 꼬이고 실행도 안되는 불상사가 생겨 이젠 그러지 않기위해 정리해보는 모듈과 패키지,mark directory as 

 

▶모듈이란?:
-모듈은 IntelliJ 프로젝트의 구성요소. 여러 모듈을 포함하는 프로젝트를 만들 수 있다. 

-각 모듈은 독립적인 컴파일 단위이며, 소스 코드, 리소스 파일, 테스트 코드 등을 포함할 수 있다. 


→그럼 여기서  독립적인 컴파일 단위란?

모듈이 독립적인 컴파일 단위라는 것은 각 모듈이 개별적으로 컴파일되고 실행될 수 있다는 의미.

각 모듈은 자체적으로 소스 코드, 리소스 파일, 종속성 등을 포함하고 있으며, 다른 모듈과는 독립적으로 컴파일 및 빌드될 수 있다.

모듈의 독립성의 이점:

  • 모듈 간의 의존성 관리: 각 모듈은 자체적으로 필요한 종속성을 가질 수 있으며, 이를 통해 모듈 간의 의존성을 명확히 할 수 있다. 이는 코드의 유지 보수성과 재사용성을 향상시킨다
  • 병렬 빌드 지원: 독립적인 모듈은 동시에 병렬로 컴파일 및 빌드될 수 있다. 이는 개발자들이 프로젝트를 빠르게 빌드하고 실행하는 데 도움을 준다
  • 모듈 단위의 테스트: 각 모듈은 개별적으로 테스트될 수 있으며, 테스트 결과는 해당 모듈에 대한 신뢰성을 검증하는 데 도움을 준다
  • 모듈 단위의 배포: 독립적인 모듈은 개별적으로 배포될 수 있다. 이는 어플리케이션의 일부를 업데이트하거나 확장할 때 전체 애플리케이션을 다시 배포할 필요 없이 해당 모듈만 업데이트할 수 있도록 해준다

- 모듈은 프로젝트의 빌드, 실행, 디버깅 설정을 제어하는 데 사용된다
- 모듈은 프로젝트 내의 독립된 작업 단위로 볼 수 있다.
- 모듈은 소스 코드와 리소스 파일을 포함하고 필요한 라이브러리와 의존성을 정의한다
- 각 모듈은 고유한 클래스 패스와 컴파일 옵션을 가질 수 있다.
- 모듈은 다른 모듈과 의존성을 가질 수 있다.
- 모듈은 프로젝트의 빌드, 실행, 디버깅 설정을 제어하는 데 사용된다


▶패키지란?

- 패키지는 Java 프로그램에서 코드를 구조화하는 방법

- 패키지는 클래스와 인터페이스를 그룹화하고, 네임스페이스를 관리하며, 코드의 가독성과 유지 보수성을 향상시킨다
- 패키지는 클래스와 인터페이스를 논리적으로 그룹화한다
- 패키지는 네임스페이스를 제공하여 충돌을 방지한다
- 패키지는 다른 패키지를 포함할 수 있다.


네임 스페이스란?

-네임스페이스는 패키지의 식별자로 사용되는 개념

- 패키지는 코드를 구조화하고 모듈화하는 데 사용되는 디렉토리 구조

- 네임스페이스는 패키지의 이름을 고유하게 식별하기 위해 사용된다

ex) "com.example"라는 패키지는 "com" 네임스페이스에 속하고, "example"라는 서브네임스페이스에 속한다


▶ 따라서, 모듈은 IntelliJ 프로젝트의 구성 요소로서 독립된 작업 단위를 나타내며, 소스 코드와 리소스 파일을 포함하고 필요한 라이브러리와 의존성을 정의하며, 패키지는 코드를 구조화하는 방법으로 클래스와 인터페이스를 그룹화하고 네임스페이스를 제공한다


++mark directory as 기능에 대하여

 

- IntelliJ에서 "Mark Directory as" 기능을 사용하여 다양한 디렉토리를 표시할 수 있다

  • Sources Root: 이 폴더는 컴파일되어야 하는 프로덕션 코드를 포함한다. 소스 폴더에는 설정 파일(.idea 폴더나 .iml 파일)을 넣지 않는 것이 좋다. 
  • Test Sources Root: 이 폴더는 프로덕션 코드와 별도로 테스트 코드를 관리하는 폴더. 일반적으로 소스 폴더와 테스트 소스 폴더의 컴파일 결과는 서로 다른 폴더에 배치된다
  • Resources Root: 이 폴더는 애플리케이션에서 사용되는 리소스 파일(이미지, XML 및 프로퍼티 파일 등)을 포함한다. 빌드 과정에서 리소스 파일은 기본적으로 출력 폴더로 복사된다.
  • Test Resources Root: 이 폴더는 테스트에 사용되는 리소스 파일(예: .sql 픽스처)을 포함한다
  • Excluded: 이 폴더는 IntelliJ에서 색인화하거나 관리하지 않아야 하는 파일이나 폴더를 포함한다 ex)프로젝트 루트에 데이터베이스와 같은 코드 베이스에 속하지 않는 디렉토리 트리가 있다면 이를 제외 처리해야 한다
  • Generated Sources Root: 이 폴더에는 빌드 도구나 다른 프로세스에서 생성된 소스 코드가 있습니다. ex) Play Framework(2.x)는 프로젝트를 빌드할 때 HTML 및 라우팅 정보에서 Scala 코드를 자동으로 생성한다. 생성된 소스는 IDE가 참조를 해결할 수 있도록 표시되어야 하며(코드의 유효성을 확인함), 직접 편집하지 않아야 한다. 

=> 원하는 기능을 선택하여 디렉토리를 마크할 수 있다

vending-machine
├── src
│   ├── main
│   │   └── java            // Sources Root
│   │       └── com
│   │           └── example
│   │               └── Main.java
│   ├── test
│   │   └── java            // Test Sources Root
│   │       └── com
│   │           └── example
│   │               └── MainTest.java
│   └── resources           // Resources Root
│       └── config.properties
├── test-resources          // Test Resources Root
│   └── test-config.properties
├── excluded-folder         // Excluded
│   └── excluded-file.txt
└── generated-sources       // Generated Sources Root
    └── generated-code.java
  • src/main/java 디렉토리는 "Sources Root"로 표시되었다. 이는 프로덕션 코드를 포함하는 디렉토리
  • src/test/java 디렉토리는 "Test Sources Root"로 표시되었다. 이는 테스트 코드를 포함하는 디렉토리
  • src/resources 디렉토리는 "Resources Root"로 표시되었다. 이는 애플리케이션에서 사용되는 리소스 파일을 포함하는 디렉토리(ex) 설정 파일)
  • test-resources 디렉토리는 "Test Resources Root"로 표시되었다. 이는 테스트에서 사용되는 리소스 파일을 포함하는 디렉토리
  • excluded-folder 디렉토리는 "Excluded"로 표시되었다. IntelliJ에서 무시해야 하는 파일이나 폴더를 포함하는 디렉토리.
  • generated-sources 디렉토리는 "Generated Sources Root"로 표시되었다. 이는 외부 도구나 프로세스에서 생성된 소스 코드를 포함하는 디렉토리

+++인텔리제이의 구성 요소와 실행 순서

프로젝트: 인텔리제이에서 작업하는 단위. 프로젝트는 여러 모듈로 구성될 수 있으며, 소스 코드, 리소스 파일, 설정 파일 등을 포함

 

모듈: 프로젝트 내의 독립적인 단위로, 개별적으로 컴파일되고 실행될 수 있다. 각 모듈은 소스 코드, 리소스 파일, 종속성 등을 가질 수 있다

 

패키지: 소스 코드를 구조화하기 위해 사용되는 단위. 패키지는 클래스와 인터페이스를 그룹화하고, 네임스페이스를 제공한다

 

클래스: 자바 프로그래밍에서 기본적인 코드 단위. 클래스는 필드, 메서드, 생성자 등을 포함하며, 객체 지향 프로그래밍의 기본 개념

 

 

실행 순서: 인텔리제이에서 프로젝트를 실행하는 일반적인 순서

  • 프로젝트를 열고 인텔리제이에서 해당 프로젝트를 선택
  • 필요한 모듈을 구성하고 의존성을 설정
  • 실행하려는 클래스나 메서드를 선택
  • 실행 구성을 설정하고 실행
  • 실행 결과를 확인하고 디버깅 및 로깅을 수행