둘러보기

이 둘러보기 시리즈에서는 작동 중인 클래스룸 부가기능의 모든 움직이는 부분을 보여줍니다. 각 둘러보기 단계에서는 특정 개념을 다루어 단일 웹 애플리케이션에 구현합니다. 목표는 사용자가 기능적인 부가기능을 설정, 구성, 실행하도록 돕는 것입니다.

부가기능은 Google Cloud 프로젝트와 상호작용해야 합니다. Google Cloud에 익숙하지 않은 경우 시작 가이드를 읽어보는 것이 좋습니다. Google Cloud 콘솔에서 사용자 인증 정보, API 액세스, GWM SDK를 관리합니다 GWM SDK에 대한 자세한 내용은 Google Workspace Marketplace 등록정보 가이드 페이지를 참고하세요.

이 가이드에는 다음 주제가 포함되어 있습니다.

  • Google Cloud를 사용하여 클래스룸에서 iframe에 표시할 페이지를 만듭니다.
  • Google 싱글 사인온 (SSO)을 추가하고 사용자가 로그인하도록 허용합니다.
  • API를 호출하여 과제를 과제에 첨부합니다.
  • 주요 부가기능 제출 요구사항 및 필수 기능을 해결합니다.

이 가이드는 프로그래밍 및 기본적인 웹 개발 개념에 익숙하다고 가정합니다. 둘러보기를 시작하기 전에 프로젝트 구성 가이드를 읽어보는 것이 좋습니다. 이 페이지에는 둘러보기에서 완전히 다루지 않은 중요한 구성 세부정보가 포함되어 있습니다.

구현 예

전체 참조 예시는 JavaScript, Python, 자바로 제공됩니다. 이러한 구현은 후속 페이지에 있는 예시 코드의 소스입니다.

다운로드 위치

예시의 전체 보관 파일은 아래 링크를 사용하여 다운로드할 수 있습니다.

기본 요건

다음 섹션을 검토하여 새 부가기능 프로젝트를 준비하세요.

HTTPS 인증서

모든 개발 환경에서 앱을 호스팅할 수 있지만 클래스룸 부가기능은 https://를 통해서만 사용할 수 있습니다. 따라서 앱을 배포하거나 부가기능 iframe 내에서 테스트하려면 SSL 암호화를 사용하는 서버가 필요합니다.

localhost를 SSL 인증서와 함께 사용할 수 있습니다. 로컬 개발용 인증서를 만들어야 하는 경우 mkcert를 사용하는 것이 좋습니다.

Google Cloud 프로젝트

이 예시와 함께 사용할 Google Cloud 프로젝트를 구성해야 합니다. 시작하는 데 필요한 단계에 대한 개요는 Google Cloud 프로젝트 만들기 가이드를 참조하세요. 첫 번째 둘러보기의 Google Cloud 프로젝트 설정 섹션에서는 수행할 구체적인 구성 작업도 단계별로 안내합니다.

완료되면 OAuth 2.0 클라이언트 ID를 JSON 파일로 다운로드합니다. 이 사용자 인증 정보 파일을 압축을 푼 예시 디렉터리에 추가해야 합니다. 특정 위치는 파일 이해를 참고하세요.

OAuth 사용자 인증 정보

새 OAuth 사용자 인증 정보를 만들려면 다음 단계를 따르세요.

  • Google Cloud 사용자 인증 정보 페이지로 이동합니다. 화면 상단에서 올바른 프로젝트를 선택했는지 확인합니다.
  • 사용자 인증 정보 만들기를 클릭하고 드롭다운에서 OAuth 클라이언트 ID를 선택합니다.
  • 다음 페이지로 이동합니다.
    • 애플리케이션 유형웹 애플리케이션으로 설정합니다.
    • 승인된 리디렉션 URI에서 URI 추가를 클릭합니다. 애플리케이션의 콜백 경로에 전체 경로를 추가합니다. 예를 들면 https://my.domain.com/auth-callback 또는 https://localhost:5000/callback입니다. 이 둘러보기의 뒷부분에서 이 경로를 만들고 처리합니다. 이러한 경로는 언제든지 수정하거나 추가할 수 있습니다.
    • 만들기를 클릭합니다.
  • 그러면 새로 만든 사용자 인증 정보가 있는 대화상자가 표시됩니다. JSON 다운로드 옵션을 선택합니다. 다운로드한 .json 파일을 서버 디렉터리에 복사합니다.

언어별 기본 요건

기본 요건의 최신 목록은 각 보관 파일의 README 파일을 참조하세요.

Python

Python 예시에서는 Flask 프레임워크를 사용합니다. 위 링크에서 전체 소스 코드를 다운로드할 수 있습니다.

필요한 경우 Python 3.7 이상을 설치하고 pip를 사용할 수 있는지 확인합니다.

python3 -m ensurepip --upgrade

또한 새 Python 가상 환경을 설정하고 활성화하는 것이 좋습니다.

python3 -m venv .classroom-addon-env
source .classroom-addon-env/bin/activate

다운로드한 예시의 각 둘러보기 하위 디렉터리에는 requirements.txt가 있습니다. pip를 사용하여 필요한 라이브러리를 빠르게 설치할 수 있습니다. 다음 명령어를 사용하여 첫 번째 둘러보기에 필요한 라이브러리를 설치합니다.

cd flask/01-basic-app
pip install -r requirements.txt

Node.js

Node.js 예에서는 Express 프레임워크를 사용합니다. 위 링크에서 전체 소스 코드를 다운로드할 수 있습니다.

이 예시에서는 Node.js v16.13 이상이 필요합니다.

npm를 사용하여 필수 노드 모듈을 설치합니다.

npm install

Java

자바 예에서는 Spring Boot 프레임워크를 사용합니다. 위 링크에서 전체 소스 코드를 다운로드할 수 있습니다.

자바 11+가 머신에 아직 설치되어 있지 않으면 설치합니다.

Spring Boot 애플리케이션은 Gradle 또는 Maven을 사용하여 빌드를 처리하고 종속 항목을 관리할 수 있습니다. 이 예에는 Maven 자체를 설치하지 않고도 성공적인 빌드를 보장하는 Maven 래퍼가 포함되어 있습니다.

프로젝트를 다운로드하거나 클론한 디렉터리에서 다음 명령어를 실행하여 프로젝트를 실행하기 위한 기본 요건을 갖추었는지 확인합니다.

java --version
./mvnw --version

또는 Windows에서는 다음 스크립트를 실행합니다.

java -version
mvnw.cmd --version

파일 이해하기

다음 섹션에서는 예시 디렉터리의 레이아웃을 설명합니다.

디렉터리 이름

각 보관 파일에는 /01-basic-app/과 같이 이름이 숫자로 시작하는 디렉터리가 여러 개 포함되어 있습니다. 이 숫자는 특정 둘러보기 단계에 해당합니다. 각 디렉터리에는 특정 둘러보기에서 설명하는 기능을 구현하는 완전한 기능을 갖춘 웹 앱이 포함되어 있습니다. 예를 들어 /01-basic-app/ 디렉터리에는 부가기능 만들기 둘러보기의 최종 구현이 포함되어 있습니다.

디렉터리 콘텐츠

디렉토리 콘텐츠는 구현 언어에 따라 다릅니다.

Python

  • 디렉터리 루트에는 다음 파일이 포함됩니다.

    • main.py - Python 애플리케이션 진입점입니다. 이 파일에서 사용할 서버 구성을 지정한 다음 이를 실행하여 서버를 시작합니다.
    • requirements.txt - 웹 앱을 실행하는 데 필요한 Python 모듈입니다. pip install -r requirements.txt를 사용하여 자동으로 설치할 수 있습니다.
    • client_secret.json - Google Cloud에서 다운로드한 클라이언트 보안 비밀번호 파일입니다. 이 파일은 예시 보관 파일에 포함되어 있지 않으므로 다운로드한 사용자 인증 정보 파일의 이름을 변경하고 각 디렉터리 루트에 복사해야 합니다.

  • config.py - Flask 서버의 구성 옵션입니다.

  • webapp 디렉터리에는 웹 애플리케이션의 콘텐츠가 포함되어 있습니다. 이 패키지에는 다음 도구가 포함되어 있습니다.

  • 다양한 페이지에 대한 Jinja 템플릿이 있는 /templates/ 디렉터리

  • 이미지, CSS, 보조 자바스크립트 파일이 있는 /static/ 디렉터리

  • routes.py - 웹 애플리케이션 경로의 핸들러 메서드입니다.

  • __init__.py: webapp 모듈의 이니셜라이저입니다. 이 이니셜라이저는 Flask 서버를 시작하고 config.py에 설정된 구성 옵션을 로드합니다.

  • 특정 둘러보기 단계에서 필요한 추가 파일입니다.

Node.js

둘러보기의 각 단계는 자체 <step> 하위 폴더에서 찾을 수 있습니다. 각 단계에는 다음 항목이 포함됩니다.

  • JavaScript, CSS, 이미지와 같은 정적 파일은 ./<step>/public 폴더에 있습니다.
  • 익스프레스 라우터는 ./<step>/routes 폴더에 있습니다.
  • HTML 템플릿은 ./<step>/views 폴더에 있습니다.
  • 서버 애플리케이션은 ./<step>/app.js입니다.

Java

프로젝트 디렉터리에는 다음이 포함됩니다.

  • src.main 디렉터리에는 애플리케이션을 성공적으로 실행하기 위한 소스 코드와 구성이 포함되어 있습니다. 이 디렉터리에는 다음이 포함됩니다. + java.com.addons.spring 디렉터리에는 Application.javaController.java 파일이 있습니다. Application.java 파일은 애플리케이션 서버 실행을 담당하고 Controller.java 파일은 엔드포인트 로직을 처리합니다. + resources 디렉터리에는 HTML 및 자바스크립트 파일이 있는 templates 디렉터리가 포함되어 있습니다. 여기에는 서버를 실행할 포트, 키 저장소 파일의 경로 및 templates 디렉터리의 경로를 지정하는 application.properties 파일도 포함되어 있습니다. 이 예시에는 resources 디렉터리에 있는 키 저장소 파일이 포함되어 있습니다. 이 파일은 원하는 위치에 저장할 수 있지만 이에 따라 경로로 application.properties 파일을 업데이트해야 합니다.
    • pom.xml에는 프로젝트를 빌드하고 필요한 종속 항목을 정의하는 데 필요한 정보가 포함됩니다.
    • .gitignore에 git에 업로드해서는 안 되는 파일 이름이 포함되어 있습니다. 이 .gitignore의 키 저장소에 경로를 추가해야 합니다. 제공된 예에서는 secrets/*.p12입니다. 키 저장소의 용도는 아래 섹션에서 설명합니다. 둘러보기 2 이후로는 보안 비밀이 원격 저장소에 포함되지 않도록 client_secret.json 파일의 경로도 포함해야 합니다. 둘러보기 3 이상에서는 H2 데이터베이스 파일과 파일 Datastore 팩토리의 경로를 추가해야 합니다. 이러한 데이터 저장소 설정에 대한 자세한 내용은 재방문 처리의 세 번째 둘러보기에서 확인할 수 있습니다.
    • mvnwmvnw.cmd는 각각 Unix 및 Windows용 Maven 래퍼 실행 파일입니다. 예를 들어 Unix에서 ./mvnw --version를 실행하면 다른 정보 중에서도 Apache Maven 버전이 출력됩니다.
    • .mvn 디렉터리에는 Maven 래퍼의 구성이 포함되어 있습니다.

샘플 서버 실행

테스트하려면 서버를 시작해야 합니다. 아래 안내에 따라 원하는 언어로 예시 서버를 실행하세요.

Python

OAuth 사용자 인증 정보

위 설명에 따라 OAuth 사용자 인증 정보를 만들고 다운로드합니다. .json 파일을 애플리케이션의 서버 시작 파일과 함께 루트 디렉터리에 배치합니다.

서버 구성

여러 가지 방법으로 웹 서버를 실행할 수 있습니다. Python 파일 끝에 다음 중 하나를 추가합니다.

  1. 보안되지 않은 localhost. 이는 브라우저 창에서 직접 테스트하는 데에만 적합하며 안전하지 않은 도메인은 클래스룸 부가기능 iframe에 로드할 수 없습니다.

    if __name__ == "__main__":
      # Disable OAuthlib's HTTPs verification.
      os.environ["OAUTHLIB_INSECURE_TRANSPORT"] = "1"
    
      # Run the web app at http://localhost:5000.
      app.run(debug=True)
    
  2. localhost 보안을 강화하세요. ssl_context 인수에 SSL 키 파일 튜플을 지정해야 합니다.

    if __name__ == "__main__":
      # Run the web app at https://localhost:5000.
      app.run(host="localhost",
              ssl_context=("localhost.pem", "localhost-key.pem"),
              debug=True)
    
  3. Gunicorn 서버 이는 프로덕션에 즉시 사용 가능한 서버 또는 클라우드 배포에 적합합니다. 이 실행 옵션에 사용할 PORT 환경 변수를 설정하는 것이 좋습니다.

    if __name__ == "__main__":
      # Run the web app at https://<your domain>:<server_port>.
      # Defaults to https://<your domain>:8080.
      server_port = os.environ.get("PORT", "8080")
      app.run(debug=True, port=server_port, host="0.0.0.0")
    

서버 시작

Python 애플리케이션을 실행하여 이전 단계에서 구성한 대로 서버를 시작합니다.

python main.py

표시되는 URL을 클릭하여 브라우저에서 웹 앱을 보고 올바르게 실행되고 있는지 확인합니다.

Node.js

서버 구성

HTTPS를 통해 서버를 실행하려면 HTTPS를 통해 애플리케이션을 실행하는 데 사용되는 자체 인증서를 만들어야 합니다. 이러한 사용자 인증 정보는 저장소 루트 폴더에 sslcert/cert.pemsslcert/key.pem로 저장해야 합니다. 브라우저에서 키를 허용하려면 OS 키 체인에 이러한 키를 추가해야 할 수도 있습니다.

파일을 git에 커밋하지 않도록 *.pem.gitignore 파일에 있는지 확인합니다.

서버 시작

서버로 실행할 올바른 단계를 step01를 대체하여 다음 명령어로 애플리케이션을 실행할 수 있습니다 (예: 01-basic-app은 step01, 02-sign은 step02).

npm run step01

또는

npm run step02

그러면 https://localhost:3000에서 웹 서버가 실행됩니다.

터미널에서 Control + C로 서버를 종료할 수 있습니다.

Java

서버 구성

HTTPS를 통해 서버를 실행하려면 HTTPS를 통해 애플리케이션을 실행하는 데 사용되는 자체 인증서를 만들어야 합니다.

로컬 개발에 mkcert를 사용하는 것이 좋습니다. mkcert를 설치하면 다음 명령어를 통해 HTTPS를 통해 실행할 로컬에 저장된 인증서가 생성됩니다.

mkcert -install
mkcert -pkcs12 -p12-file <path_to_keystore> <domain_name>

이 예에서는 리소스 디렉터리에 키 저장소 파일을 포함합니다. 원하는 곳에 저장할 수 있지만 이에 따라 경로로 application.properties 파일을 업데이트해야 합니다. 도메인 이름은 프로젝트를 실행하는 도메인입니다 (예: localhost).

파일을 git에 커밋하지 않도록 *.p12.gitignore 파일에 있는지 확인합니다.

서버 시작

Application.java 파일의 main 메서드를 실행하여 서버를 시작합니다. 예를 들어 IntelliJ에서는 src/main/java/com/addons/spring 디렉터리에서 Application.java > Run 'Application'를 마우스 오른쪽 버튼으로 클릭하거나 Application.java 파일을 열어 main(String[] args) 메서드 서명 왼쪽에 있는 녹색 화살표를 클릭할 수 있습니다. 또는 터미널 창에서 프로젝트를 실행해도 됩니다.

./mvnw spring-boot:run

또는 Windows:

mvnw.cmd spring-boot:run

그러면 https://localhost:5000 또는 application.properties에 지정한 포트에서 서버가 시작됩니다.