둘러보기

이 둘러보기 시리즈에서는 작동하는 클래스룸 부가기능의 모든 구성요소를 보여줍니다. 각 연습 단계에서는 특정 개념을 다루고 단일 웹 애플리케이션에서 이를 구현합니다. 목표는 기능 부가기능을 설정, 구성, 실행하는 데 도움을 주는 것입니다.

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

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

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

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

구현 예

전체 참조 예는 Python에서 확인할 수 있습니다. JavaNode.js에서도 부분 구현을 사용할 수 있습니다. 이러한 구현은 후속 페이지에 나오는 예시 코드의 소스입니다.

다운로드 위치

Python 및 Java 예시는 GitHub 저장소에서 확인할 수 있습니다.

Node.js 샘플은 zip 파일로 다운로드할 수 있습니다.

기본 요건

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

HTTPS 인증서

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

SSL 인증서와 함께 localhost를 사용할 수 있습니다. 로컬 개발용 인증서를 만들어야 하는 경우 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 파일을 서버 디렉터리에 복사합니다.

언어별 필수 요건

최신 필수 구성요소 목록은 각 저장소의 리드미 파일을 참고하세요.

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 프레임워크를 사용합니다. 제공된 링크에서 전체 소스 코드를 다운로드할 수 있습니다.

머신에 아직 설치되어 있지 않다면 Java 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, 보조 JavaScript 파일이 있는 /static/ 디렉터리

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

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

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

Node.js

연습의 각 단계는 자체 <step> 하위 폴더에 있습니다. 각 단계에는 다음이 포함됩니다.

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

자바

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

  • src.main 디렉터리에는 애플리케이션을 성공적으로 실행하기 위한 소스 코드와 구성이 포함되어 있습니다. 이 디렉터리에는 다음이 포함됩니다. + java.com.addons.spring 디렉터리에는 Application.javaController.java 파일이 포함됩니다. Application.java 파일은 애플리케이션 서버를 실행하고 Controller.java 파일은 엔드포인트 로직을 처리합니다. + resources 디렉터리에는 HTML 및 JavaScript 파일이 포함된 templates 디렉터리가 있습니다. 또한 서버를 실행할 포트, 키 저장소 파일의 경로, templates 디렉터리의 경로를 지정하는 application.properties 파일도 포함되어 있습니다. 이 예시에는 resources 디렉터리의 키 저장소 파일이 포함되어 있습니다. 원하는 곳에 저장해도 되지만 그에 따라 application.properties 파일을 경로로 업데이트해야 합니다.
    • pom.xml에는 프로젝트를 빌드하고 필요한 종속 항목을 정의하는 데 필요한 정보가 포함되어 있습니다.
    • .gitignore에 git에 업로드하면 안 되는 파일 이름이 포함되어 있습니다. 이 .gitignore에 키 저장소 경로를 추가해야 합니다. 제공된 예시에서는 secrets/*.p12입니다 (키 저장소의 목적은 아래 섹션에서 설명함). 연습 2 이상에서는 원격 저장소에 비밀이 포함되지 않도록 client_secret.json 파일의 경로도 포함해야 합니다. 연습 3 이상에서는 H2 데이터베이스 파일과 파일 데이터 저장소 팩토리의 경로를 추가해야 합니다. 이러한 데이터 저장소 설정에 관한 자세한 내용은 재방문 처리에 관한 세 번째 연습에서 확인할 수 있습니다.
    • 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 키체인에 키를 추가해야 할 수 있습니다.

*.pem.gitignore 파일에 있는지 확인하세요. 파일을 Git에 커밋하면 안 되기 때문입니다.

서버 실행

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

npm run step01

또는

npm run step02

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

터미널에서 Control + C를 사용하여 서버를 종료할 수 있습니다.

자바

서버 구성

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

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

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

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

*.p12.gitignore 파일에 있는지 확인하세요. 파일을 Git에 커밋하면 안 되기 때문입니다.

서버 실행

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에 지정한 포트에서 서버가 실행됩니다.