Account ID 와 Client ID, Client Secret이 생성된걸 볼 수 있다.
- Information, Scopes 등을 설정해주고 활성화 시킨다 !
2. Eclipse
- Eclipse에서 Dynamic Project 생성
1. ZoomAuth.java
이 클래스는 Zoom의 OAuth 2.0 인증을 통해 액세스 토큰을 받아오는 기능을 제공
주요 메소드: - getAccessToken(): Zoom의 OAuth 2.0 API를 호출하여 액세스 토큰을 가져온다. - CLIENT_ID와 CLIENT_SECRET을 사용하여 기본 인증(Basic Auth)을 설정한다. - grant_type=account_credentials와 account_id를 POST 요청의 본문으로 전달하여 액세스 토큰을 받는다. - 받은 응답에서 access_token을 추출하여 반환한다.
public class ZoomAuth {
private static final String TOKEN_URL = "";
private static final String ACCOUNT_ID = "";
private static final String CLIENT_ID = "";
private static final String CLIENT_SECRET = "";
private static List<ZoomMeeting> meetings = new ArrayList<>();
// 모든 ZoomMeeting 객체를 반환하는 메소드
public static List<ZoomMeeting> getMeetings() {
return meetings;
}
// ZoomMeeting 객체를 추가하는 메소드
public static void addMeeting(ZoomMeeting meeting) {
meetings.add(meeting);
}
// Zoom OAuth 토큰을 가져오는 메소드
public String getAccessToken() throws Exception {
CloseableHttpClient client = HttpClients.createDefault();
HttpPost post = new HttpPost(TOKEN_URL);
String auth = CLIENT_ID + ":" + CLIENT_SECRET;
String encodedAuth = Base64.getEncoder().encodeToString(auth.getBytes(StandardCharsets.UTF_8));
post.setHeader("Authorization", "Basic " + encodedAuth);
post.setHeader("Content-Type", "application/x-www-form-urlencoded");
String body = "grant_type=account_credentials&account_id=" + ACCOUNT_ID;
post.setEntity(new StringEntity(body));
HttpResponse response = client.execute(post);
HttpEntity entity = response.getEntity();
String responseString = EntityUtils.toString(entity);
// JSON 파서로 응답에서 access_token 추출
ObjectMapper mapper = new ObjectMapper();
JsonNode jsonNode = mapper.readTree(responseString);
return jsonNode.get("access_token").asText();
}
}
2. ZoomMeeting.java
이 클래스는 Zoom 미팅을 생성하는 기능을 제공
주요 메소드: - createMeeting(String accessToken, String topic, String password): Zoom API를 사용해 새로운 미팅을 생성한다. - accessToken을 사용하여 Zoom API에 인증한다. - topic(주제)과 password(비밀번호)를 사용해 미팅을 설정하고, 생성된 미팅의 정보를 JSON 형태로 받아서 처리한다. - 이 메소드는 미팅의 join_url, meeting_id, start_url을 포함하는 ZoomMeetingResponse 객체를 반환한다.
주요 필드: - joinUrl : 참가자가 미팅에 참여할 수 있는 URL. - meetingId : 생성된 미팅의 ID.- startUrl : 호스트가 미팅을 시작할 수 있는 URL.
생성자 및 Getter 메소드: - 생성자는 각 필드를 초기화하며, Getter 메소드는 각 필드의 값을 반환한다.
public class ZoomMeetingResponse {
private String joinUrl;
private String meetingId;
private String startUrl; // start_url 추가
public ZoomMeetingResponse(String joinUrl, String meetingId, String startUrl) {
this.joinUrl = joinUrl;
this.meetingId = meetingId;
this.startUrl = startUrl; // start_url 초기화
}
public String getJoinUrl() {
return joinUrl;
}
public String getMeetingId() {
return meetingId;
}
public String getStartUrl() {
return startUrl;
}
}
4. ZoomController.java
이 서블릿은 Zoom 미팅을 생성하는 요청을 처리하고, 생성된 미팅 정보를 JSP 페이지로 전달
주요 메소드: - doPost(HttpServletRequest request, HttpServletResponse response) : POST 요청을 처리하는 메소드 - topic, password 등의 요청 파라미터를 받아온다. - ZoomAuth 클래스를 이용해 accessToken을 받아온다. - ZoomMeeting 클래스를 이용해 새로운 Zoom 미팅을 생성한다. - 생성된 미팅 정보를 ZoomAuth.addMeeting() 메소드를 통해 미팅 리스트에 추가한다. - 미팅의 joinUrl, meetingId, startUrl 등을 Lecture.jsp 페이지에 전달한다.
public class ZoomController extends HttpServlet {
public static ZoomMeeting getMeetingById(String meetingId) {
List<ZoomMeeting> meetings = ZoomAuth.getMeetings();
for (ZoomMeeting meeting : meetings) {
if (meeting.getMeetingId().equals(meetingId)) {
return meeting;
}
}
return null;
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
try {
String topic = request.getParameter("topic");
String description = request.getParameter("description"); // Retrieve the description
String password = request.getParameter("password");
ZoomAuth zoomAuth = new ZoomAuth();
String accessToken = zoomAuth.getAccessToken();
ZoomMeeting zoomMeeting = new ZoomMeeting();
ZoomMeetingResponse zoomMeetingResponse = zoomMeeting.createMeeting(accessToken, topic, password);
// Add the ZoomMeeting to the list
ZoomAuth.addMeeting(new ZoomMeeting(zoomMeetingResponse.getMeetingId(), password));
// Set attributes for the JSP page
request.setAttribute("topic", topic); // Set the topic
request.setAttribute("description", description); // Set the description
request.setAttribute("joinUrl", zoomMeetingResponse.getJoinUrl());
request.setAttribute("meetingId", zoomMeetingResponse.getMeetingId());
request.setAttribute("startUrl", zoomMeetingResponse.getStartUrl());
request.setAttribute("password", password);
RequestDispatcher dispatcher = request.getRequestDispatcher("Lecture.jsp");
dispatcher.forward(request, response);
} catch (Exception e) {
e.printStackTrace();
response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "An error occurred while creating the meeting.");
}
}
}
5. JoinLecture.java
이 서블릿은 사용자가 미팅에 참여하려고 할 때 호출됨
주요 메소드: - doPost(HttpServletRequest request, HttpServletResponse response) : 사용자가 제공한 meetingId와 password를 검증한다. - meetingId로 미팅을 검색하고, 입력한 비밀번호가 일치하는지 확인한다. - 일치하면 Zoom의 미팅 URL로 리디렉션(redirect)한다. - 비밀번호가 틀리면 오류 메시지를 JSP 페이지(join.jsp)에 전달한다.
@WebServlet("/JoinLecture")
public class JoinLecture extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String meetingId = request.getParameter("meetingId");
String password = request.getParameter("password");
ZoomMeeting meeting = ZoomController.getMeetingById(meetingId);
if (meeting != null && meeting.getPassword().equals(password)) {
// Zoom 회의 참가 URL로 리디렉션
String zoomJoinUrl = "https://zoom.us/j/" + meetingId + "?pwd=" + password;
response.sendRedirect(zoomJoinUrl); // 클라이언트를 줌 회의로 리디렉션
} else {
// 실패 시 오류 메시지를 join.jsp로 전달
request.setAttribute("error", "Meeting ID or Password is incorrect. Please try again.");
RequestDispatcher dispatcher = request.getRequestDispatcher("Join.jsp");
dispatcher.forward(request, response);
}
}
}
6. CreateLecture.jsp
사용자가 새로운 강의를 생성할 수 있는 폼 페이지
주요 기능: - 사용자는 topic, description, startTime, password를 입력한다. - 이 폼은 ZoomController 서블릿으로 POST 요청을 보내며, 이 요청을 통해 미팅이 생성된다.
프로젝트 식별자: - groupID : 프로젝트를 식별하는 그룹 ID - artifactID : 프로젝트의 이름 - version : 프로젝트의 버전을 나타냄. SNAPSHOT은 아직 릴리즈되지 않은 개발 중인 버전임을 나타낸다. - packaging : 프로젝트의 패키징 타입을 지정. 여기서는 war(웹 애플리케이션 아카이브)로 설정되어 있다.
종속성 관리: - org.apache.httpcomponents:httpclient : Apache HttpClient 라이브러리를 사용하여 HTTP 요청을 보낼 수 있도록 한다. - com.fasterxml.jackson.core:jackson-databind : JSON 데이터를 처리하기 위해 사용된다. 이를 통해 JSON을 Java 객체로 변환 하거나 Java 객체를 JSON으로 변환할 수 있다. - javax.servlet:javax.servlet-api : 서블릿 API를 제공한다. scope가 provided로 설정되어 있으므로, 이 라이브러리는 빌드할 때만 필요하며, 배포 환경 (예:Tomcat)에서는 제공되지 않는다.
빌드 플러그: - maven-war-plugin : 이 플러그인은 프로젝트를 .war 파일로 패키징하는 데 사용된다. - failOnMissingWebXml : 이 속성을 false로 설정하면, web.xml이 없어도 빌드가 실패하지 않도록 한다. 이는 웹 애플리케이션에서 web.xml이 없어도 애노테이션 기반 설정을 사용할 수 있게 해준다.
- ZoomController 서블릿은 입력된 정보를 사용해 Zoom API를 통해 미팅을 생성하고, 생성된 미팅 정보를 Lecture.jsp에 전달한다.
- 사용자가 특정 강의에 참여하려면 join.jsp에서 meetingId와 password를 입력한다.
- JoinLecture 서블릿이 입력된 정보를 검증하고, 올바르다면 해당 Zoom 미팅 URL로 리디렉션한다.
- 이렇게 각 컴포넌트가 협력하여 Zoom 강의를 생성하고 참여하는 기능이 구현된다.
4. 비교
1. Zoom API를 통한 회의 관리 (링크 제공) 개요 Zoom API를 사용하여 서버 측에서 회의를 생성하고 관리하는 방식 회의를 생성한 후, 생성된 회의 URL(링크)과 비밀번호 등을 사용자에게 제공하여 회의에 참여할 수 있도록 한다. 주요 특징 회의 관리 : 서버에서 회의를 생성하고, 생성된 회의 정보를 API를 통해 받아온다. 링크 제공 : 회의 링크(start_url, join_url)를 사용자에게 제공하여, 사용자는 이 링크를 통해 Zoom 클라이언트나 웹 브라우저에서 회의에 참여할 수 있다. 서버 측 구현 : 서버에서 Zoom API를 사용하여 회의 생성, 참가자 관리, 회의 일정 변경 등을 처리한다. 장점 광범위한 기능 : Zoom의 모든 API 기능을 사용할 수 있다. 예) 회의 예약, 녹화, 참가자 관리 등. 다양한 애플리케이션 : 웹, 모바일, 데스크탑 등 여러 플랫폼에서 동일한 회의 링크를 통해 회의에 참여할 수 있다. 유연한 통합 : API를 통해 회의 정보를 백엔드에서 관리할 수 있어, 기존 시스템과의 통합이 용이하다. 단점 링크 기반 참여 : 사용자가 회의에 참여하려면 Zoom 클라이언트나 웹 브라우저에서 링크를 클릭해야 한다. 서버 측 코드 구현 : 서버에서 API 호출을 관리하고, 회의 링크를 제공하는 로직을 구현해야 한다.
2. Zoom Web SDK 개요 Zoom Web SDK를 사용하여 웹 애플리케이션에 직접 Zoom 회의 기능을 통합하는 방식이다. 사용자는 웹 애플리케이션 내에서 Zoom 회의를 시작하고, 참여할 수 있다.
주요 특징 직접 통합 : 웹 애플리케이션 내에서 Zoom 회의를 직접 시작하고, 참가할 수 있다. 웹 기반 참여 : 사용자가 브라우저에서 직접 Zoom 회의에 참여할 수 있으며, 별도의 Zoom 클라이언트를 설치할 필요가 없다. Zoom UI 제공 : 기본적으로 Zoom의 UI를 사용하지만, SDK를 통해 일부 커스터마이징이 가능하다.
장점 통합된 사용자 경험 : 사용자가 별도의 애플리케이션이나 링크를 통해 이동하지 않고, 웹 애플리케이션 내에서 바로 회의에 참여할 수 있다. 브라우저 기반 : 브라우저에서 직접 Zoom 회의를 실행할 수 있어, 사용자에게 보다 매끄러운 경험을 제공한다. 빠른 회의 시작 : 회의 링크를 따로 생성하고 공유할 필요 없이, SDK 내에서 바로 회의가 시작된다.
단점 제한된 커스터마이징 : Zoom Web SDK의 UI는 커스터마이징이 가능하지만, 제한적일 수 있다. 브라우저 의존성 : 웹 브라우저의 성능에 따라 회의 품질이 달라질 수 있으며, 모든 브라우저에서 동일한 성능을 보장하기 어렵다. 웹 전용 : Web SDK는 웹 애플리케이션에만 통합될 수 있으며, 모바일이나 데스크탑 애플리케이션에는 적용할 수 없다.
Zoom API (링크 제공)
Zoom Web SDK
참여 방식
회의 링크를 제공하여 Zoom 클라이언트나 브라우저에서 참여
웹 애플리케이션 내에서 직접 회의 시작 및 참여
사용자 경험
사용자는 링크를 클릭하여 Zoom 클라이언트 또는 브라우저로 이동
사용자에게 매끄러운 통합된 경험 제공 (웹 내에서 회의 진행)
커스터마이징
서버 측 로직과 API를 통해 다양한 커스터마이징 가능
제한된 UI 커스터마이징 가능 (기본 Zoom UI 제공)
플랫폼 지원
웹, 모바일, 데스크탑 모두 지원
웹 브라우저에서만 지원
기술 복잡도
서버 측 API 통합 필요 (복잡하지만 강력)
클라이언트 측 SDK 통합 (상대적으로 간단)
성능
Zoom 클라이언트나 브라우저의 성능에 의존
브라우저의 성능에 크게 의존
Server-to-Server OAuth와 Web SDK 연동이 어려운 이유
Server-to-Server OAuth는 주로 API 호출을 위해 설계되었으며, 사용자 상호작용을 포함한 Web SDK와의 직접적인 연동을 지원하지 않는다.
Web SDK는 사용자 인증과 회의 관리 기능을 제공하는 데 API Key와 Secret을 사용하므로, Server-to-Server OAuth 앱과는 기본적으로 호환되지 않는다.
2023년도 부터 JWT 방식이 사라지고, 새로운 방식으로 Web SDK를 사용하는 자료나 정보들이 부족했다 !