ABOUT ME

쉽게 표현하고 싶습니다.

Today
Yesterday
Total
  • [Intellij] 다른 모듈의 클래스 사용하기
    개발/etc 2024. 2. 20. 15:57

    메인 프로젝트 하위에 모듈들을 추가했고 공통 모듈 하나를 다른 하위 모듈들이 참조하는 형태다. 아래 이미지를 보면 authserver 모듈을 제외한 OAuth2Client, ResourceSercerFriend, ResourceServerPhoto가 SharedObject에 있는 클래스를 참조한다.

     

     

    1. 최상위의  메인 프로젝트의 settings.gradle에 공유 모듈의 이름을 include 한다. 가장 윗줄에는 해당 프로젝트의 이름이 쓰여 있을 거다.  Load Gradle Changes를 클릭해서 변경 사항을 빌드하도록 하자. 아이콘이 뜨지 않는다면 우측에 Gradle의 탭을 찾아가서 Reload를 해주자.

    rootProject.name = 'authorizationserver'
    include 'SharedObject'

     

    2. 공통 모듈을 사용하는 모듈에서 공통 모듈을 클래스를 사용하기 위해 클래스 이름을 기입하고 자동 import를 하려고 하면 Add dependency on module <공통모듈.main>이 뜰 것이다. 이렇게 자동으로 추가해도 되고, 직접 추가하는 방법도 있다. Project Structure으로 가서(윈도우 단축키는 ctrl + alt + shfit + s) Modules에서도 추가할 수 있다. 프로젝트의 main을 선택한 뒤, Dependencies에서 [+ 버튼]으로 추가한다.

     

    3. 여기까지 하고 프로젝트를 빌드하면 보통은 문제가 없어야 하는데, 공통 모듈의 클래스 경로를 못 읽는 문제가 발생할 수 있다.

     

    4. 이때에는 IntelliJ의 빌드 방식을 Gradle이 아니라 IntelliJ로 바꿔본다. Settings - Build, Execution, Deployment - Gradle. 모듈 전체를 각각 변경해줘야 한다.

     

    5. 세 시간 삽질 끝에 찾아낸 해결법인데 만약 이러고도 안 되면 하위 모듈(공통 하위 모듈 말고)의 settings.gradle에 다음을 추가해보자. 내 경우는 아래 두 줄이 없어도 문제가 해결됐지만, 계속 안 되는 사람들을 위한 (내가 아는) 마지막 방법이다.

    rootProject.name = 'OAuth2Client'
    include(':SharedObject')
    project(':SharedObject').projectDir = new File(settingsDir, '../SharedObject')

     

    6. 공통 모듈에 웹 기능이 필요 없으면 spring boot 프로젝트 말고 순수 자바 프로젝트로 만들어도 된다. 이 경우에 디펜던시를 추가할 때는 디펜던시의 버전을 명시해줘야 한다. 스프링부트와 같이 쓸 때는 스프링부트가 알아서 버전을 찾아주니까 필요 없었다. 내 경우는 롬복이 필요했고 자바 17을 사용하는 관계로 [:1.18.22]를 추가했다.

        compileOnly 'org.projectlombok:lombok:1.18.22'
        annotationProcessor 'org.projectlombok:lombok:1.18.22'

     

    댓글

Designed by Tistory.