1. 3-tier란 무엇인가

3-tier란 일반적으로 클라이언트, 웹/어플리케이션 서버, 데이터베이스 서버로 이루어진 3계층 구조를 가르킨다. 3-tier 이미지
각각의 계층에 대해서 살펴보자

1.1. 클라이언트

검색이미지
클라이언트 계층이란 사용자가 직접 상호작용을 하게 되는 부분을 칭한다.
컴퓨터, 혹은 핸드폰을 사용할 때를 생각 해 보자. 이러한 기기를 통해 웹페이지나 어플에 접근할 때 우리는 만들어진 화면을 보게 된다.
이처럼 만들어진 화면들은 User Interface(i.e. UI)라 부르며, 우리는 이러한 UI를 통해 애플리케이션과 상호작용을 할 수 있다.
클라이언트 계층은 주로 WEB Server를 통해 구현되며, 정적인 컨텐츠(e.g. HTML, CSS, 이미지)들을 요청받아 처리한다.

1.2. 웹/애플리케이션 서버

Web•Application Server(i.e.WAS)는 웹 서버와 DBMS 사이에서 동작하는 미들웨어이다.
쇼핑몰 동작 과정
쇼핑몰에서 상품을 장바구니에 담거나 결제를 진행하는 상황을 생각 해 보자.
WEB에서 볼 수 있는 UI를 통해 버튼을 클릭하면 WEB은 WAS에 사용자가 결제 요청을 보냈다는 메시지를 전달한다.
이런 메시지를 받은 WAS는 요청을 처리하기 위해 필요한 비즈니스 로직-상품 가격 계산, 재고 관리, 결제 처리 등-을 수행한다.
다시 말해, WAS란 클라이언트 계층의 요청을 처리하는 부분이다.
WAS는 다음과 같은 특징을 가진다.

  • WEB으로부터 동적인 컨텐츠(e.g. JSP, ASP, PHP)를 요청받아 처리한다.
  • 컨테이너 기반으로 동작한다.
  • 백엔드 서버라 부르기도 한다.
  • WEB+웹 컨테이너 로 이해해도 무방하다.

1.3. 데이터베이스 서버

데이터베이스 서버는 주로 데이터 계층에 위치하며, 3-tier 구조에서 정보를 저장, 관리, 검색, 제공하는 역할을 수행한다.
주로 DBMS(Database Management System) 기반으로 구축된다.
다음은 데이터베이스가 수행하는 역할이다.

  • 데이터 저장: 서비스의 목적에 따라 다양한 종류의 데이터(e.g. 사용자 정보, 상품 정보, 주문 정보, 고객 행동 데이터)를 포함
  • 데이터 관리: 데이터의 생성, 읽기, 업데이트, 삭제(i.e. CRUD) 관리
  • 데이터 검색: 이를 통해 사용자가 필요한 정보를 찾거나 분석할 수 있다.
  • 데이터 보안: 데이터의 안전성 및 보안을 유지

1.4. 3-tier를 사용하는 이유

클라이언트, 웹애플리케이션, 데이터 계층 중 가장 중요한 계층은 DB이다.
만약 서비스가 2-tier로 구성되어 있다면 DB에 접근하기 위해서 단 하나의 계층만을 해킹하면 된다.
하지만 3-tier로 서비스를 구성하게 되면 클라이언트 단을 뚫더라도 웹 애플리케이션 계층을 또 뚫어야 하기 때문에 보안성이 증대된다.

위에 든 예시 외에도 실제 다양한 웹/앱에서 3-tier구조를 사용한다. 이제부터 실제 3-tier를 구성하며 그 동작 원리를 이해 해 보자.


2. 3-tier 구성하기

3tier실습
클라이언트, 서버, 데이터베이스로 구성된 3계층을 구현하기 위해서는 3개의 서버가 필요하다. 실제로 세 대의 컴퓨터를 돌리는 것은 어려우니 가상머신을 활용해 실습을 진행 해 보자.
각각의 서버를 생성한 후 Nginx, Tomcat, MySQL을 설치 및 구동하고, 연결하여 동작을 확인하자.

1. WEB 서버 생성

리눅스-시작하기를 참고하여 웹서버를 돌릴 우분투 서버를 생성하라.
이후 다음의 과정을 통해 Nginx를 설치하라.

  1. 패키지 업데이트
    $ sudo apt-get update
    
  2. Nginx 설치
    $ sudo apt-get install nginx
    
  3. Nginx 실행
    $ sudo systemctl start nginx
    
  4. Nginx 실행 확인
    $ sudo systemctl status nginx
    

    위 과정을 거쳐 실행되는 nginx 프로세스를 확인하면 다음과 같은 화면을 볼 수 있다.
    Nginx 실행 확인
    State가 Running으로 나온다면 nginx가 성공적으로 실행된 것이다.

    nginx는 80포트를 사용한다. http://localhost:80을 통해 서버에 접속하면 다음과 같은 화면을 확인할 수 있다.
    Nginx 브라우저

2. WAS 서버 생성

위에서 생성한 서버에 대해 스냅샷을 찍고, 이를 clone하여 서버를 생성하라.

  1. snapshot 찍기 스냅샷 촬영 스냅샷 촬영

  2. 촬영한 스냅샷 클론하여 서버 생성 클론
    클론

이후 생성된 서버에서 톰캣을 설치하자.

  1. tomcat 설치
    $ sudo apt-get install tomcat10
    
  2. tomcat 실행
    $ sudo systemctl tomcat10 start
    
  3. tomcat 실행 확인
    $ sudo systemctl status tomcat10
    

    위 과정을 거쳐 실행되는 톰캣 프로세스를 확인하면 다음과 같은 화면을 볼 수 있다.
    Tomcat 실행 확인
    State가 Running으로 나온다면 Tomcat이 성공적으로 실행된 것이다.
    올라간 웹서버는 브라우저를 통해 접속 가능하다. 톰캣은 8080 포트를 사용하며, http://localhost:8080을 입력해 톰캣에 접속할 수 있다.
    Tomcat 브라우저

    +) 사용하는 우분투 버전에 따라 설치할 수 있는 톰캣의 버전이 달라진다.

3. DBMS 서버 생성

RDBMS 중 가장 가벼운 MariaDB를 설치하자. 앞의 WAS 서버 생성 과정을 참고하여 DBMS 서버를 생성 후 MariaDB를 설치하라.

  1. MariaDB 설치
    $ sudo apt install mariadb-server
    
  2. MariaDB 실행
    $ sudo systemctl start mariadb
    
  3. netstat 명령어 사용하여 mariadb 실행 여부 및 점유 포트확인
    $ netstat -anp | grep 3306
    

    MariaDB의 기본 통신 포트는 3306이다.위 명령어를 실행하면 127.0.0.1의 3306 포트가 열려 있는 것을 확인할 수 있다. 3306포트에 연결된 127.0.0.1
    +) netstat는 활성 상태의 네트워크 관련 데이터들을 보여준다. 즉, 어느 프로그램 혹은 프로세스가 네트워크와 연결되어 살아 있는지 알려준다. 이를 사용하기 위해서는 net-tools가 설치되어야 한다. 만약 설치되지 않았다면 sudo apt-get install net-tools 명령어를 사용해 설치하자.

  4. Mariadb 서버 변경 3의 과정에서 3306포트가 127.0.0.1에 연결된 것을 확인할 수 있다. 해당 IP주소를 0.0.0.1로 바꾸자.
    4.1. Mariadb 설정파일 위치로 이동
      $ sudo vi /etc/mysql/mariadb.conf.d/50-server.cnf
    

    4.2. bind-address 설정

      bind-address     = 0.0.0.0
    

    Mariadb의 설정파일
    4.3. Mariadb 서버 재시작

      $ sudo systemctl restart mariadb
    

    +)127.0.0.1 vs 0.0.0.0 두 개의 IP 주소 모두 컴퓨터가 스스로를 가리킬 때 쓰이나, 차이점이 존재한다.

    • 127.0.0.1: 이 주소는 루프백 인터페이스(더미 인터페이스)라 부른다. TCP/IP가 컴퓨터에 부여한 예약된 주소로, 로컬에서만 접근이 가능하다.
    • 0.0.0.1: Wi-Fi, Bluetooth, Ethernet 등 모든 네트워크 인터페이스의 주소를 포함하는 IP 주소이다. localhost와 달리 외부의 접근이 가능하다.
  5. 계정 생성 5.1. mysql 접속
      $ sudo su
      # mysql
    

    5.2. mysql이라는 데이터베이스 선택

      > use mysql
    

    5.3. 모든 ip에서 접속 가능한 사용자 생성

      create user '{사용자 이름}'@'%' identified by '{비밀번호}';
    

    5.4. 생성한 사용자에게 모든 권한 허용

      grant all privileges on *.* to {사용자이름}@'%';
    

    5.5. 생성한 규칙 적용

      flush privileges;
    

    +) 만약 호스트ip를 제한하고 싶다면 위 ‘%’를 원하는 ip로 수정하면 된다

4. Nginx-tomcat 연동

Nginx에 tomcat 서버를 성공적으로 연결하면 이전에 보았던 Welcome to Nginx 화면 대신 tomcat을 실행했을 때 나오는 화면이 나타날 것이다.
이를 위해서는 Nginx의 설정 파일을 수정 후 Nginx를 재시작해야 한다.

  1. Tomcat 서버의 IP 주소 보기
    $ ip addr
    

    Nginx와 Tomcat 서버를 연동하기 위해서는 Nginx 서버가 Tomcat 서버의 IP주소를 받아와야 한다.
    이를 위해 ip addr 명령어를 사용해 생성한 Tomcat 서버의 IP 주소를 확인하자.
    우분투 ip주소
    다음과 같은 화면에서 ens로 시작하는 단락의 inet 주소가 해당 서버의 ip주소이다.

  2. Nginx 설정파일 찾기 Nginx의 설정파일은 각 버전에 따라 다르다.
    따라서 nginx가 설치된 위치로 이동하여 설정파일을 수정해야 한다.
    nginx는 /etc/nginx에 설치되며, 설정파일은 nginx.conf, conf, conf.d/, sites-available/default, default 등의 이름을 가진다.

  3. Nginx 설정파일 수정 Nginx가 Tomcat 서버를 전달받기 위해서는 프록시 패스를 설정하여 두 서버를 이어 주어야 한다. 해당 파일을 수정하여 거칠 프록시 패스를 설정 해 주자.
    Nginx 설정파일
    프록시 패스 부분에 넣는 주소는 0.Tomcat 서버의 IP 주소 보기 단계에서 찾은 주소를 넣어주면 된다.

  4. Nginx 재시작
    $ sudo systemctl restart nginx
    

위처럼 프록시 패스를 설정해준 후 nginx를 재시작하면 Welcome to Nginx 대신 tomcat의 브라우저 화면이 나올 것이다.
nginx-tomcat이 연동된 브라우저 화면

5. WAS-DB 연동

이제부터 수행할 동작은 WAS서버에서 이루어질 것이다. 이전까지 사용한 WAS서버는 톰캣이므로 DB서버 연동도 톰캣에서 이루어 질 예정이다.

  1. 외부 서버와의 연결을 위한 클라이언트 및 커넥터 수동 설치
    $ wget https://dlm.mariadb.com/1965742/Connectors/java/connector-java-2.7.5/mariadb-java-client-2.7.5.jar
    $ cp mariadb-java-client-2.7.5.jar /usr/lib/jvm/java-1.8.0-openjdk-amd64/lib/
    $ cp mariadb-java-client-2.7.5.jar /usr/local/tomcat/lib/
    $ wget https://downloads.mysql.com/archives/get/p/3/file/mysql-connector-java-5.1.40.tar.gz
    $ wget https://downloads.mysql.com/archives/get/p/3/file/mysql-connector-java-5.1.40.tar.gz
    $ tar xvf mysql-connector-java-5.1.40.tar.gz
    $ cp mysql-connector-java-5.1.40/mysql-connector-java-5.1.40-bin.jar /usr/local/tomcat/lib/
    
  2. 환경변수 설정 환경변수는 /etc/profile에 위치한다. 해당 파일을 열어 아래 내용을 입력하라.
    export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-amd64/
    export CATALINA_HOME=/usr/local/tomcat
    PATH=$PATH:$JAVA_HOME/bin:$CATALINA_HOME/bin
    export CLASSPATH=.:$JAVA_HOME/lib/mariadb-java-client2.7.5.jar:$CATALINA_HOME/lib/mariadb-java-client-2.7.5.jar
    
  3. WAS 홈페이지에 DB와 통신하는 소스코드 올리기 /usr/local/tomcat/webapps/ROOT/에 DB와 통신할 수 있는 코드를 가진 JSP 파일을 만들어 저장하라.

위 과정을 모두 무사히 거쳤다면 WEB의 IP주소로 접속했을 때 WAS 서버에서 연동한 DB에 접속할 수 있다.