• Facebook
  • LinkedIn
  • X
  • Youtube
  • 로그인
  • 회원가입
  •  한글 한글 한글 ko
  • English English 영어 en
OPENMARU APM
  • 오픈마루
    • 회사소개
    • 연혁
    • 오픈마루 CI
  • 제품
    • OPENMARU Cloud APM
      • Application 모니터링
      • Openshift & Kubernetes 모니터링
      • WEB/WAS 모니터링
      • URL 모니터링
      • Cubrid 모니터링
    • OPENMARU Cluster
    • OPENMARU Dashboard
  • 오픈소스
    • 쿠버네티스
    • 아파치 톰캣
    • CentOS
  • 레드햇
    • Red Hat Enterprise Linux
    • Red Hat OpenShift
    • Red Hat JBoss EAP
  • 가격 안내
  • 조달물품
    • G2B 딜 등록
    • 조달물품 OPENMARU APM
    • 조달물품 OPENMARU Cluster
    • 혁신장터
  • 레퍼런스
  • 고객지원
  • 문서
  • 블로그
  • Search
  • Menu Menu
Java Servlet(서블릿)

들어가며

인터넷의 출현으로 웹 애플리케이션의 개념이 도입되었습니다. 애플리케이션과 서비스는 원격 서버에서 호스팅하고 웹 브라우저를 통해 인터넷을 통해 접근합니다.

인터넷 연결을 통해 어디에서나 애플리케이션 및 데이터에 액세스할 수 있는 기능, 네트워크에서 리소스 및 데이터를 공유할 수 있는 기능, 애플리케이션 및 데이터에 대한 중앙 집중식 관리 및 보안을 제공하는 기능을 포함하여 여러 가지 장점이 있기 때문일 것입니다.

이번 시간에는 이런 웹 애플리케이션을 서비스하기 위해 필요한 개념인 Servlet에 대해서 알아보려 합니다.

1부에서는 WAS의 동작 방식에 대한 내용을 간략하게 다루었는데요.
해당 내용이 궁금하신 분들은 아래의 클릭 버튼을 통해 살펴보실 수 있습니다.

1부 보기

서블릿(Java Servlet) 은 무엇인가?

서블릿 은 앞서 설명한 Java EE 사양의 일부분으로 웹 애플리케이션 서버 내에서 실행되는 Java 프로그램이며, 클라이언트로부터 요청받고 응답을 반환합니다. 동적 웹 페이지를 만들고 웹 응용 프로그램을 구현하여 온라인 쇼핑몰이나 온라인 뱅킹 등의 다양한 웹 시스템을 구현할 수 있습니다.

앞서 HTTP Protocol 과 마찬가지로 서블릿 은 기능을 정의한 표준 API 이고, 실제 구현은 웹 애플리케이션을 만드는 주체가 직접 합니다.

따라서 Apache Tomcat 이나 JBoss EAP 도 해당 표준 API 를 기반으로 구현체를 만들었고, 그에 따라서 개발자는 서블릿 기반을 사용한다면 특정 웹 애플리케이션 서버에 종속되지 않는 웹 프로그램을 만들 수 있고 서비스할 수 있게 되는 것입니다.

위 소스를 서블릿 API 모든 기능을 구현하지 않고, Parameter 와 Header 관련 부분만 간단하게 구현하며 서블릿을 이해해 보도록 하겠습니다.
아래는 서블릿 API 중 요청 메시지 처리를 위한 API 규격 중 일부만 구현한 것입니다.

작성해야 할 Servlet API 소스 코드 목록은 다음과 같습니다.

  • src/main/java/javax/servlet/Servlet.java
  • src/main/java/javax/servlet/http/HttpServlet.java
  • src/main/java/javax/servlet/http/HttpServletRequest.java
  • src/main/java/javax/servlet/http/HttpServletRequestImpl.java
  • src/main/java/javax/servlet/http/HttpServletResponse.java
  • src/main/java/javax/servlet/http/HttpServletResponseImpl.java

간단한 설명 이후 [IndexServlet] 부분에서 다시 설명하겠습니다.


package javax.servlet;
 
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
 
public interface Servlet {
    public void init();         <===== ❶
 
    public void service(HttpServletRequest request, HttpServletResponse response)
        throws IOException;     <===== ❷
 
    public void destroy();      <===== ❸
}
[소스 Servlet]

[Servlet] 는 서블릿이 어떻게 작동하는지에 대한 명세입니다.

서블릿은 브라우저에서 사용자의 요청이 들어오면 서블릿을 클래스를 인스턴스화 하고 ❶ init() → ❷ service() → ❸ destory() 과정을 거쳐 종료하며 브라우저에 응답하게 됩니다.


package javax.servlet.http;
 
import javax.servlet.Servlet;
import java.io.IOException;
 
public class HttpServlet implements Servlet {     <===== ❶
    @Override
    public void init() {
 
    }
 
    @Override
    public void service(HttpServletRequest request, HttpServletResponse response) throws IOException {     <===== ❷
        if ("GET".equals(request.getMethod())) {
            doGet(request, response);      <===== ❸
        } else {
            doPost(request, response);     <===== ❹
        }
    }
 
    @Override
    public void destroy() { }
 
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException { }
 
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException {}
}
[소스 HttpServlet]

[HttpServlet] 는 ❶ [Servlet] 를 상속받아 구현합니다.

인터페이스 함수 ❷ service 가 간단하게 HTTP Method Type 에 따라 ❸ doGet, ❹ doPost 함수로 분기하는 구현 소스입니다.

개발자는 서블릿 요청에 맞는 기능을 [HttpServlet] 를 상속받아 HTTP Method 종류에 따라서 doGet() 또는 doPost() 메소드를 구현하면 됩니다.


package javax.servlet.http;
 
public interface HttpServletRequest {
    // HTTP Method
    public String getMethod();
    // 요청 URL 중 URI
    public String getRequestURI();
    // 요청 URL 중 GET Query String
    public String getQueryString();
    // 메시지 길이
    public int getContentLength();
    // 요청 메시지 타입
    public String getContentType();
    // 요청 Header 특정 값 가져오기
    public String getHeaders(String name);
    // 요청 Parameter 특정 값 가져오기
    public String getParameter(String name);
    // 클라이언트 아이피 가져오기
    public String getRemoteAddr();
}
[소스 HttpServletRequest]

[HttpServletRequest]는 앞서 [SimpleHTTPServer1] 소스에서 출력한 정보를 어떻게 꺼내어 사용할 지에 대한 명세입니다.


package javax.servlet.http;
 
import java.net.SocketAddress;
import java.util.Map;
 
public class HttpServletRequestImpl implements HttpServletRequest {
    private Map headers = null;
    private Map paramaters = null;
 
    private String remoteAddr;
    private String method;
    private String requestUrl;
    private String httpVersion;
 
... 생략 ...
 
    @Override
    public String getQueryString() {
        String queryString = null;
        if (requestUrl != null) {
            int idx = requestUrl.indexOf("?");
            if (idx > -1) {
                queryString = requestUrl.substring(idx + 1);
            }
 
            if (queryString != null) {
                String[] pairs = queryString.split("&");
                for (String pair : pairs) {
                    idx = pair.indexOf("=");
                    this.paramaters.put(pair.substring(0, idx), pair.substring(idx + 1));
                }
            }
        }
        return queryString;
    }
 
    @Override
    public int getContentLength() {
        String length = this.getHeaders("Content-Length");
        if (length == null) {
            return 0;
        } else {
            return Integer.parseInt(length);
        }
    }
 
    @Override
    public String getContentType() {
        return getHeaders("Content-Type");
    }
 
    @Override
    public String getHeaders(String name) {
        return headers==null?null:headers.get(name);
    }
    @Override
    public String getParameter(String name) {
        return paramaters==null?null:paramaters.get(name);
    }
 
    @Override
    public String getRemoteAddr() {
        return this.remoteAddr;
    }
 
    public void setGeneral(String general) {
        int firstBlank = general.indexOf(" ");
        int secondBlank = general.lastIndexOf(" ");
        this.method = general.substring(0, firstBlank);
        this.requestUrl = general.substring(firstBlank+1, secondBlank);
        this.httpVersion = general.substring(secondBlank+1);
    }
 
    public void setHeaders(Map headers) {
        this.headers = headers;
    }
 
    public void setParamaters(Map paramaters) {
        this.paramaters = paramaters;
    }
 
    public void setBody(String body) {
        if (body != null && body.contains("&")) {
            System.out.println("body: " + body);
            String[] pairs = body.split("&");
            for (String pair : pairs) {
                int idx = pair.indexOf("=");
                this.paramaters.put(pair.substring(0, idx), pair.substring(idx + 1));
            }
        }
    }
 
... 생략 ...
}
[소스 HttpServletRequestImpl]

[HttpServletRequestImp] 는 [HttpServletRequest] 를 상속받아 구현한 소스입니다.


package javax.servlet.http;
 
 
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Collection;
 
public interface HttpServletResponse {
    // 응답 상태 코드
    public int getStatus();
    public void setStatus(int status);
    // 메시지 길이
    public void setContentLength(long len);
    // 요청 메시지 타입
    public String getContentType();
    public void setContentType(String type);
    // 요청 Header 특정 값 가져오기
    public String getHeaders(String name);
    public void setHeader(String name, String value);
    public Collection getHeaderNames();
    public PrintWriter getWriter() throws IOException;
}
[소스 HttpServletResponse]

[HttpServletResponse] 는 앞서 [SimpleHTTPServer2] 소스에서 사용자 브라우저로 출력해야 하는 정보에 대한 명세입니다.


package javax.servlet.http;
 
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
 
public class HttpServletResponseImpl implements HttpServletResponse {
    private Map headers = new HashMap<>();
    private PrintWriter printWriter = null;
    private int status;
   public HttpServletResponseImpl(File tmpFile) {
        try {
            printWriter = new PrintWriter(tmpFile);
        } catch (FileNotFoundException e) {
            throw new RuntimeException(e);
        }
    }
 
    @Override
    public int getStatus() {
        return this.status;
    }
 
    @Override
    public void setStatus(int status) {
        this.status = status;
    }
 
    @Override
    public void setContentLength(long len) {
        headers.put("Content-Length", len + "");
    }
 
    @Override
    public String getContentType() {
        return headers.get("Content-Type");
    }
 
    @Override
    public void setContentType(String type) {
        headers.put("Content-Type", type);
    }
 
    @Override
    public String getHeaders(String name) {
        return headers.get(name);
    }
 
    @Override
    public void setHeader(String name, String value) {
        headers.put(name, value);
    }
 
    @Override
    public Collection getHeaderNames() {
        return new ArrayList<>(headers.keySet());
    }
 
    @Override
    public PrintWriter getWriter() throws IOException {
        return printWriter;
    }
}
[소스 HttpServletResponseImpl]

[HttpServletRequestImpl] 는 [HttpServletResponse] 를 상속받아 구현합니다.

사용자가 웹 브라우저로 서버에 접근하면 해당 요청이 Socket 서버가 이를 서블릿으로 변환되어 알맞은 서블릿 구현체로 전달됩니다.

앞에서 설명한 바와 같이, 이 서버로 전달된 메시지는 Socket 프로그램에서 해석되고 재조합돼 개발자가 작성한 서블릿으로 전달되는 과정을 일어납니다.

이때 [HttpServletRequest] 객체와 [HttpServletResponse] 객체를 가지는 service 메서드가 호출되며 브라우저로부터 전달받은 메시지는 [HttpServletRequest] 인터페이스를 통해 사용할 수 있고 다시 브라우저에 메시지를 전달할 때 [HttpServletResponse] 를 활용합니다.


public class SimpleHTTPServer3 {
... 생략 ...
                httpServletRequest.setHeaders(REQUEST_HEADERS);           <===== ❶
                httpServletRequest.setParamaters(REQUEST_PARAMATERS);     <===== ❷
                httpServletRequest.setBody(getBody(in));                  <===== ❸
 
                if ("/".equals(httpServletRequest.getRequestURI())) {     <===== ❹
                    HttpServlet servlet = null;
                    try {
                        Class clazz = Class.forName("io.openmaru.test.web.IndexServlet");     <===== ❺
                        Constructor constructor = clazz.getConstructor();
                        servlet = (HttpServlet) constructor.newInstance();
                        servlet.init();     <===== ❻
 
                        servlet.service(httpServletRequest, httpServletResponse);     <===== ❼
 
                        httpServletResponse.setStatus(200);     <===== ❽
                    } catch (Exception e) {
                        httpServletResponse.setStatus(500);     <===== ❾
                    } finally {
                        servlet.destroy();     <===== ❿
                    }
                } else {     <===== ⓫
                    httpServletResponse.getWriter().print("404 Not Found");
                    httpServletResponse.setContentType("text/html;charset=UTF-8");
                    httpServletResponse.setStatus(404);
                }
                httpServletResponse.getWriter().flush();
                httpServletResponse.getWriter().close();
 
 
                httpServletResponse.setContentLength(tmpResponseBody.length());     <===== ⓬
 
 
                String responseFirstLine = httpServletRequest.getHttpVersion() + " " + httpServletResponse.getStatus() + " ";
                if (httpServletResponse.getStatus() == 200) {
                    responseFirstLine += "OK";
                } else if (httpServletResponse.getStatus() == 404) {
                    responseFirstLine += "Not Found";
                } else {
                    responseFirstLine += "INTERNAL_SERVER_ERROR";
                }
                out.println(responseFirstLine);     <===== ⓭
 
 
                Collection headerNames = httpServletResponse.getHeaderNames();
                for (String headerName : headerNames) {
                    out.println(headerName + ": " + httpServletResponse.getHeaders(headerName));     <===== ⓮
                }
 
                out.println();     <===== ⓯
 
 
                if (tmpResponseBody.exists()) {
                    try (BufferedReader fileIn = new BufferedReader(new FileReader(tmpResponseBody))) {
                        String content;
                        while ((content = fileIn.readLine()) != null) {
                            out.println(content);     <===== ⓰
                        }
                    }
                }
                out.flush();
... 생략 ...
[소스 SimpleHTTPServer3]

❶~❸ 을 통해 브라우저에서 보낸 요청을 분석하고 [HttpServletRequest] 객체에 설정한 후 ❹ “/” 요청에 대한 처리를합니다. 만약 일치하는 URI 에 대한 구분이 없다면 ⓫ 과 같이 404 페이지 없음을 돌려줍니다.
❹ “/” 요청에 대한 구현체인 ❺ IndexServlet.class 객체를 Load 하여 인스턴스화 한 후 ❻ init 메소드 호출 후 ❼ service 메소드에 HttpServletRequest/Response 객체 인스턴스를 파라미터로 호출합니다.
그러면 아래의 [IndexServlet] 의 service 메소드가 호출되어 실행됩니다.
구현체의 결과에 따라 ❽, ❾ 에 브라우저에 보내어질 HTTP 상태코드가 설정되고 마지막으로 ❿ 와 같이 destroy 메소드가 호출되며 IndexServlet 서블릿은 종료됩니다.
이후 ⓬ 보내질 데이터의 길이, ⓭ 기본 정보, ⓮ 응답 헤더 정보, ⓯ 공백 라인 이후 ⓰ 응답 컨텐츠 바디 부분을 마지막으로 설정하면 브라우저와 연결된 Socket 연결은 종료되고 사용자 브라우저 화면에 출력됩니다.

※ 서블릿의 service 메소드 이외 init, destroy 의 과정은 현재 소스에서는 호출 시 매번 실행되지만 스펙상의 Servlet Lifecycle 에서는 초기화 시 1회에만 init 이 호출되고, 서블릿 엔진이 종료되는 시점에 destroy 이 1회 호출됨
(즉 엔진이 시작되거나 구현 서블릿이 최초 호출되는 시점에 init 메소드 1회 실행, 엔진이 종료되는 시점에 destroy 메소드 1회 실행)

※ 실제로 ❺ [IndexServlet] 을 읽어오는 부분은 엔진과 달리 별도의 공간에 배치되고 엔진이 시작될 때 Load 되지만 작동 원리를 이해하는 소스로 해당 부분은 구현에서 제외함

위 명세 및 구현 HTTPServer 부분은 웹 애플리케이션 서버에 해당하는 부분으로 개발자가 신경쓰지 않아도 되는 부분이지만, 이후부터는 개발자가 웹 애플리케이션을 만들어가는 코드 영역입니다.


package io.openmaru.test.web;
 
 
import io.openmaru.test.util.Log;
 
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
 
public class IndexServlet extends HttpServlet {     <===== ❶
    @Override
    public void init() {
        Log.info("[init] " + getClass().getName() + " 시작");
    }
 
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {     <===== ❷
        exec(request, response);
    }
 
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {     <===== ❸
        exec(request, response);
    }
 
    private void exec(HttpServletRequest request, HttpServletResponse response) throws IOException {     <===== ❹
        Log.info("[exec] getMethod: " + request.getMethod());     <===== ❺
        Log.info("[exec] getRequestURI: " + request.getRequestURI());
        Log.info("[exec] getQueryString: " + request.getQueryString());
        Log.info("[exec] getRemoteAddr: " + request.getRemoteAddr());
        Log.info("[exec] getContentType: " + request.getContentType());
        Log.info("[exec] getContentLength: " + request.getContentLength());
        Log.info("[exec] getParameter name: " + request.getParameter("name"));
        Log.info("[exec] getParameter age: " + request.getParameter("age"));
 
        // 업무 로지 작성 (예로 DBMS 에서 데이터 조회 후 출력)     <===== ❻
 
 
        response.setContentType("text/html;charset=UTF-8");     <===== ❼
 
        response.getWriter().print("Hello, World!");     <===== ❽
    }
 
    @Override
    public void destroy() {
        Log.info("[destroy] " + getClass().getName() + " 종료");
    }
}
[소스 IndexServlet]

IndexServlet 은 ❶ HttpServlet 를 상속받아 구현합니다.
브라우저에서 “/” 요청 후 Socket 연결이 완료되면 요청 정보에 의해 HttpServletRequest 객체가 셋팅되고, 응답을 위한 HttpServletResponse 객체가 준비됩니다.
그런 후 HTTP Method Type에 따라 ❷ doGet(), ❸ doPost() 함수를 호출합니다.
편의를 위해 모든 호출은 ❹ exec 함수를 호출하게 하였고 ❺ 와 같이 브라우저에서 요청 시 보내온 정보를 출력합니다.
❻ 영역에서는 DBMS 와 연결 후 데이터를 가져온 다던지, 다른 서비스의 REST API 를 호출하여 결과를 얻을 수 있습니다.
그런 후 ❼ 브라우저에 보낼 메시지 타입을 설정하고 ❾ 화면에 출력한 HTML 문자열을 지정합니다.

이렇게 간단한 서블릿 API 를 구현하여 “/” 요청을 처리하는 서블릿 프로그램을 만들어 보았습니다.
이러한 규칙을 가지고 개발자는 특정 요청에 대한 기능을 HttpServlet 을 상속받아 구현하기만 하면 됩니다.

[그림 3,4] 에서 처럼 브라우저에서 “/” 요청을 다시 해봅니다.

PreviousNext
123

[그림 5] IndexServlet GET/POST 호출 실행 화면

[그림 3,4] 브라우저 개발자 도구(F12) 로 확인한 정보를 [그림 5] 와 같이 APM 에서 확인해 봅니다.
요청에 대한 URL 을 포함하여 기본정보, Header, Cookie, HTTP Status 응답코드가 잘 나오는 것을 확인 할 수 있습니다.

지금의 웹 어플리케이션 서버에서 응답속도가 0.5 초인 기능을 10명의 사용자가 동시에 요청하면 초당 처리 수(TPS) 는 20 이 나올까요?
예를 들어 “/” 에 대한 평균 응답속도가 0.5 초라고 가정하고 10명의 사용자가 동시에 요청하는 부하 테스트를 진행해 보겠습니다.
❻ 영역에 응답이 지연되는 현상을 아래와 같이 추가하고 Apache JMeter 부하테스트 도구로 10명의 사용자가 10번씩 호출하도록 하고 측정해 보겠습니다.



try {
    Thread.sleep(500);
} catch (InterruptedException e) {
    throw new RuntimeException(e);
}

[그림 6-1] “/” 호출에 대한 JMeter 화면

[그림 6-2] “/” 호출에 대한 OPENMARU APM 화면

[그림 6-1,2] 를 확인해 보면 초당 처리 수(TPS) 2 이고, JMeter 로 확인된 사용자의 평균 응답속도는 4.78 초로 많이 느린것을 확인할 수 있습니다.
그 이유는 [소스 SimpleHTTPServer3] 의 경우 싱글 스레드로 동작하고 있어 IndexServlet 의 응답속도가 0.5 초로 초당 2회밖에 처리할 수 없어 발생하는 문제입니다.

이러한 싱글 스레드 문제를 해결하려면 당연하게도 멀티 스레드를 활용해야 합니다.
그러기 위해서는 스레드에 대해서 알아야 하는데요.  스레드와 관련된 기술은 챕터 3에서 설명드리겠습니다.

이구용 (ddakker@openmaru.io)
R&D Center
Pro

JBoss EAP 교육 자료 공개 – JBoss EAP 학습 자료 무상 배포

JBoss EAP 교육 자료 공개 – JBoss EAP 학습 자료 무상 배포

2021-03-08/in JBoss, 발표자료/by 오픈마루 마케팅0

 

Read more
https://i0.wp.com/www.openmaru.io/wp-content/uploads/2021/03/main_1_top_jboss1.png?fit=355%2C200&ssl=1 200 355 오픈마루 마케팅0 https://www.openmaru.io/wp-content/uploads/2020/11/logo@2x.png 오픈마루 마케팅02021-03-08 22:37:382024-01-12 14:15:28JBoss EAP 교육 자료 공개 – JBoss EAP 학습 자료 무상 배포
클라우드 네이티브 비대면 세미나 자료 다운로드 – 혁신적인 지식 획득

클라우드 네이티브 비대면 세미나 자료 다운로드 – 혁신적인 지식 획득

2020-12-22/in Seminar, 발표자료/by 오픈마루 마케팅0
Read more
https://i0.wp.com/www.openmaru.io/wp-content/uploads/2024/01/%ED%81%B4%EB%9D%BC%EC%9A%B0%EB%93%9C-%EB%84%A4%EC%9D%B4%ED%8B%B0%EB%B8%8C-%EB%B9%84%EB%8C%80%EB%A9%B4-%EC%84%B8%EB%AF%B8%EB%82%98_main_banner-21.png?fit=700%2C400&ssl=1 400 700 오픈마루 마케팅0 https://www.openmaru.io/wp-content/uploads/2020/11/logo@2x.png 오픈마루 마케팅02020-12-22 13:53:342024-01-21 18:23:01클라우드 네이티브 비대면 세미나 자료 다운로드 – 혁신적인 지식 획득
데모로 이해하는 클라우드 네이티브

클라우드 네이티브 데모와 발료자료를 다운로드하세요!!

2020-12-22/in OPENMARU, Seminar, 발표자료/by 오픈마루 마케팅0
Read more
https://i0.wp.com/www.openmaru.io/wp-content/uploads/2024/01/%ED%81%B4%EB%9D%BC%EC%9A%B0%EB%93%9C-%EB%84%A4%EC%9D%B4%ED%8B%B0%EB%B8%8C-%EB%8D%B0%EB%AA%A8_main-banner-11.gif?fit=700%2C400&ssl=1 400 700 오픈마루 마케팅0 https://www.openmaru.io/wp-content/uploads/2020/11/logo@2x.png 오픈마루 마케팅02020-12-22 13:53:042024-09-13 23:16:45클라우드 네이티브 데모와 발료자료를 다운로드하세요!!
Page 14 of 14«‹121314
쿠버네티스

Kubernetes

오픈시프트 엔터프라이즈 쿠버네티스

OpenShift

OPENMARU APM

OPENMARU APM

Share this:

  • Facebook
  • Twitter
  • Email
  • Print
  • Reddit
  • Pinterest
  • Telegram
  • WhatsApp

Like this:

Like Loading...

Recent Posts

  • ChatGPT 프롬프트 엔지니어링, 이렇게 시작하세요! 2025-05-08
  • 올해 1분기, 사람들이 가장 많이 본 OPENMARU 콘텐츠는? 2025-04-17
  • 보안 강화의 다음 단게, mTLS를 아시나요? 2025-04-03
  • 성공적인 MSA 구축을 위한 핵심 전략 대공개! 테크 엣지 세미나 안내 2025-03-21
  • 안전한 서비스 통신을 위한 필수 요소, mTLS의 이해와 필요성 2025-03-20

Categories

  • APM
  • Cloud
  • Cloud Native Seminar
  • Cluster
  • gift
  • JBoss
  • Kubernetes
    • Container
  • Linux
  • Microservices Architecture
  • News
  • Newsletter
  • OPENMARU
    • Dashboard
  • OpenShift
  • Red Hat
  • Seminar
    • gift
  • Tech Talk
  • 발표자료
  • 분류되지 않음
  • 오픈나루 공지사항
  • 오픈소스

이메일로 블로그 구독하기

이 블로그를 구독하고 이메일로 새글의 알림을 받으려면 이메일 주소를 입력하세요

Tags

APM cloud Cloud Native Container Docker Hybrid Cloud jboss JBoss EAP Kubernetes Kubernetes 모니터링 linux MSA Native OPENMARU OPENMARU APM OpenShift Openshift Promotion PaaS PaaS 플랫폼 Red Hat redhat RHEL tomcat Virtualization WAS Wildfly 가상화 네이티브 도커 레드햇 리눅스 모니터링 브리핑 세미나 오픈마루 오픈마루 APM 오픈시프트 주간 진짜 클라우드 컨테이너 쿠버네티스 클라우드 클라우드 네이티브 클라우드네이티브 클라우드 네이티브 세미나

Search

오픈마루

04778 서울시 성동구 뚝섬로1길 31 906 호
(성수동1가, 서울숲M타워)

Tel : 02-469-5426 | Fax : 02-469-7247
Email : sales@openmaru.io

  • OPENMARU CLOUD APM
    • Application 모니터링
    • Openshift & Kubernetes 모니터링
    • WEB/WAS 모니터링
    • URL 모니터링
    • Cubrid 모니터링
  • 가격안내
  • 고객 레퍼런스
  • 고객지원
    • 문서
    • 사용자가이드
    • 기술지원
  • 블로그
  • 이용약관
  • 개인정보처리방침
  • 서비스수준협약
  • 회사소개
Copyright © OPENMARU, Inc. All Rights Reserved. - powered by Enfold WordPress Theme
  • Facebook
  • LinkedIn
  • X
  • Youtube
최신 컨테이너 기술 총정리! Red Hat Container Day에서 확인하...컨테이너 데이사명변경사명변경 – 오픈소스 전문 IT 기업 오픈마루로 새롭게...
Scroll to top
  • 한글
  • English
%d