Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

Jupyo's Daily Story

Xcode에 모듈 만들고 프로젝트에 연결하기 본문

그 외

Xcode에 모듈 만들고 프로젝트에 연결하기

JangJupyo 2024. 11. 13. 12:08
728x90
반응형

모듈 (Module)

모듈은 코드 배포와 재사용을 위한 기본 단위입니다. 하나의 모듈은 특정 기능이나 관련된 코드들의 모음으로, 다른 코드에서 불러와 사용할 수 있는 독립적인 단위입니다.

 

모듈은 코드의 캡슐화와 재사용성을 높이는데 중요한 역할을 합니다. 프레임워크나 라이브러리 형태로 제공되는 모듈은 다른 프로젝트에서 쉽게 통합하여 사용할 수 있으며, 이를 통해 코드의 재사용성과 유지보수성이 향상됩니다.

 

또한 모듈은 컴파일 시간을 최적화하는데도 도움을 줍니다. 각 모듈은 독립적으로 컴파일되며, 한 모듈의 변경사항이 있을 때 해당 모듈만 다시 컴파일하면 되므로 전체 프로젝트의 빌드 시간을 단축할 수 있습니다.

 

Tuist

Tuist는 Xcode 프로젝트 관리를 자동화하고 단순화하는 커맨드 라인 도구입니다. 프로젝트 설정을 Swift 코드로 작성할 수 있게 해주며, 대규모 iOS 프로젝트에서 발생하는 복잡성을 줄이고 모듈화를 쉽게 구현할 수 있도록 도와줍니다. 특히 프로젝트 구조, 종속성, 빌드 설정 등을 선언적으로 관리할 수 있어 팀 단위 개발에서 일관된 프로젝트 설정을 유지하는 데 효과적입니다.

 

최근 모듈과 Tuist가 많이 알려지면서 가끔 모듈 = Tuist 로 착각하고 프로젝트에 모듈을 적용하려면 반드시 Tuist를 사용해야 한다고 착각하는 분들이 있습니다.

그래서 이번에는 Tuist를 사용하지 않고 직접 framework를 만들어서 프로젝트에 연결하고 사용하는 것을 정리할 겁니다.

 

framework 생성

Xcode에서 framework를 생성해보겠습니다.

  • Xcode -> Create New Project -> Framework
  • Xcode -> File -> New -> Project -> Framework

Framework를 선택하고 프로젝트 이름을 작성해주고 생성하면 완료입니다.

 

프로젝트에 연결하기

프로젝트에서 Add Files to "Project"... 메뉴를 클릭해줍니다.

 

그리고 좀 전에 만들었던 framework 폴더를 찾아가 xcodeproj 파일을 선택 그리고 추가해줍니다.

추가 버튼을 눌려주면 타겟을 선택하는 팝업창이 뜨게 됩니다.

해당 팝업창에서의 Action은 다음과 같습니다.

  • Copy files to destination
    • 파일을 프로젝트 디렉토리 내부로 복사
    • 원본 파일은 그대로 두고 복사본을 사용
    • 원본을 따로 관리하고 프로젝트에서는 가져와서 사용만 하는 경우
  • Move files to destination
    • 파일을 프로젝트 디렉토리로 이동
    • 원본 파일이 원래 위치에서 프로젝트로 이동됨
    • 원본 파일이 없고 프로젝트에서 같이 수정하면서 사용하는 경우
  • Reference files in place
    • 파일을 현재 위치에서 참조만 함
    • 파일은 원래 위치에 그대로 둠
    • 외부 리소스나 공유 파일을 사용하는 경우

완료하면 모듈이 추가된 것을 확인할 수 있습니다.

 

framework 추가

추가한 모듈을 import 하면 No such module 'Module' 이라는 오류 메시지가 표시 됩니다.

  • Project > General > Frameworks, Libraries, and Embedded Content

위치로 이동하여 모듈을 추가해줍니다.

 

Embed에서 3가지 옵션을 선택할 수 있습니다.

  • Do Not Embed
    • Framework를 참조만 하고 앱 번들에 포함하지 않음
    • 시스템 Framework나 이미 기기에 있는 Framework 사용 시 선택
    • 예: UIKit, Foundation 등
  • Embed & Sign
    • Framework를 앱 번들에 포함하고 서명
    • 가장 일반적으로 사용되는 옵션
    • 자체 제작한 Framework나 대부분의  third-party Framework에 사용
  • Embed Without Signing
    • Framework를 앱 번들에 포함하지만 서명하지 않음
    • 이미 서명된 Framework를 포함할 때 사용

이제 오류 메시지가 표시되지 않고 사용할 수 있습니다.

그래도 간혹 여전히 모듈을 찾지 못 하는 경우가 있습니다. 그런 경우는 아래를 참고해주세요.

 

Target Dependencies

  • Project > Build Phases > Target Dependencies > 모듈 추가 후 확인

 

Framework Search Paths

  • Project > Build Settings > Search Paths > Framework Search Paths > 모듈 폴더 위치 작성
  • 예 :
    • 프로젝트 폴더 내에 있는 경우 : $(PROJECT_DIR)
    • 프로젝트 폴더 내의 추가한 폴더 내에 있는 경우 : $(PROJECT_DIR)/폴더명

 

모듈에 파일을 추가하고 사용해보기

임의로 테스트를 해보기 위해 모듈의 상위 폴더 아래에 Extension 폴더를 생성하고 그 아래에 Extension+String 파일을 생성합니다.

모듈에서는 접근 제한자 사용을 유의해야 합니다.

"Hello, World!" 를 출력하는 임의 함수를 만들었습니다. 확장 앞에 public을 사용해주었기 때문에 추가로 함수 앞에는 생략할 수 있습니다. 하지만 접근을 차단하고 싶은 경우에는 fileprivate나 private를 사용해주어야 합니다.

 

이제 모듈을 import 한 클래스로 돌아가 추가해서 정상적으로 출력되는지 확인합니다.

 

정상적으로 출력되는 것을 확인하였습니다.

 

No member

간혹 모듈 생성도 연결도 문제 없고, import도 정상적으로 되었음에도 불구하고 모듈 내의 멤버를 찾을 수 없다는 오류 메시지가 표시될 때가 있습니다.

 

이 경우 아래와 같이 확인해주세요.

  • 코드 유무 확인
  • 코드 접근 제어자 확인
  • 모듈 Project > Build Phases > Compile Sources > 파일 유무 확인

이렇게 framework를 생성하고 프로젝트에 연결하는 것을 완료하였습니다.

 

Project-Swift.h 에러

framework에서 만든 상속용 class가 있을 때 해당 클래스를 프로젝트에서 사용하면 -Swift.h 에서 에러가 발생할 때가 있습니다.

에러 예시: Cannot find interface declaration for 'TestView', superclass of 'SuperTestView'

 

이 경우 추가한 framework의 Build Settings에서 아래와 같이 수정 후 확인해주세요.

 

 

  • Build Settings > Apple Clang Module Verifier - Options > Supported Languages
    • "objective-c++" 제거
  • Build Settings > Swift Compiler - General > Install Generated Header
    • "Yes" 로 변경

 

반응형