[Spring] Spring 시작하기
2023.03.14- -
1. Sping의 등장 배경
Spring Framework에 대해서 알아보기 전에 자바 웹 개발의 발전 과정에 대해서 먼저 알아보겠다.
아래 포스팅에서 더 자세히 다루었으니 한 번 읽어보면 도움이 될 것이다.
Applet은 "작은 Application"(let이 작다라는 뜻)이라는 의미를 가지고 있는데 이는 브라우저에서 돌아가도록 만들고자 하였기에 이러한 이름이 붙었다고 한다. 이는 웹 페이지에 상호 작용을 제공하도록 설계되었지만 멀티미디어 지원 및 그래픽 긴능 측면에서 Flash와 경쟁하는데 어려움을 겪었다. 결과적으로 Java 애플릿은 인기를 잃었고 개발자들은 다른 Java 기반 기술로 관심을 돌렸다.
자바 서블릿과 멀티스레딩의 필요성
Java Servlets 이전에는 웹 프로그래밍이 주로 CGI(Common Gateway Interface)로 수행되었다. 그러나 CGI에는 멀티스레딩을 지원하지 못하는 등의 한계가 있었다. 웹 사용자 수가 증가함에 따라 이러한 제한이 문제가 되었는데 Java Servlet은 멀티스레딩을 지원하는 솔루션으로 등장하여 서버 요청을 보다 효율적으로 처리할 수 있다.
웹이 폭발적으로 성장하면서(피씨방 등...) 이전까지만 해도 웹 프로그래밍은 CGI로 했는데 앞서 말했듯 CGI의 단점은 멀티 쓰레드가 안된다는 점이었다.
해당 방식은 서버에 요청이 올때마다 프로세스가 하나씩 생성되는 식이었는데, 이는 사용자 수가 많아지면 부하를 감당하지 못하는데 그래서 멀티쓰레드 지원하기 위해 나온 것이 Java Servlet 이다.
Servlet은 서버에 요청이 계속해서 오더라도도 쓰레드만 하나씩 추가해 주면 되기 때문에 굉장히 효율적으로 동작할 수 있다.
그래서 이 시기부터 자바 개발자의 수요가 급격하게 증가하게 되었고 Applet으로 뜰 줄 알았던 초기 목표와 다르게 Servlet으로 성장하여 급격한 발전을 이루어냈고 Servlet은 이후 JSP로 발전하게 된다.
EJB의 등장
EJB란?
Enterprise JavaBeans의 약어로 기업환경의 시스템을 구현하기 위한 서버 측 컴포넌트 모델이다. 일반적으로 비지니스 로직을 가지고 있는 서버 애플리케이션을 EJB라고 한다.
즉, 대기업 내지 사용자가 많은 애플리케이션을 개발하기 위해 필요한 스펙으로 그 구조가 다소 복잡하였다.
EJB 구조
EJB는 데이터베이스 처리 및 트랜잭션 관리와 같은 기능을 제공하여 대규모 애플리케이션의 요구사항을 충적했지만 개발하기에 복잡하고 시간이 많이 걸리는 것으로 인식되는 경우가 많았으며 서로 다른 애플리케이션 서버 간의 이식성 부족이 문제가 되었다.
종래의 어플리케이션에서 필요로 하는 비지니스로직 뿐만 아니라, 시스템 서비스를 이용한 데이터베이스처리와 transaction 처리를 하는 프로그램을 필요로 하기 때문에 어플리케이션의 개발에 시간이 걸린다.
각각의 애플리케이션 서버에서는 독자의 API가 제공되고 있기 때문에 각사의 API를 사용해서 작성한 어플리케이션에는 이식성이 별로고 부품화가 곤란하다.
하지만 이는 자바 개발사였던 SUN이 만든 것이었기 때문에 울며 겨자먹기 식으로 하는 수 없이 사용하다가 2004년에 Spring Framework가 나오게 되면서 많은 개발자들이 드디어 굉장히 간단하게 자바 웹 프로그래밍을 할 수 있게 되었다.
당시는 외국에서도 web이 폭풍성장하던 시기였기 때문에 웹사이트의 수가 우후죽순으로 생겨났지만 한 개발자가 한 회사에 계속 있는 것이 아니기 때문에 사람이 바뀌면 그 웹사이트를 유지보수하기가 굉장히 어려운 상황에 쳐해있던 시기이기도 했다. (사람마다 개발하는 방법이 다르기 때문)
그러면서 발전한 것이 Framework인데 그 중 유명한 두 가지가 Sturcts와 Spring이다.
- -> 유지보수와 생산성을 위해 정형화 된 틀을 제공하는 Framework가 발전하게 된 것.
또한 2014년에는 Spring이 너무 무겁고 설정이 복잡한 단점을 보완하기 위해 Spring boot가 나오게 된다.
Spring Boot까지 나왔는데 Spring을 공부해야 하는 이유?
Spring이나 Spring boot는 기본적으로 같기 때문에 그 원리를 이해하기 위해서는 Servlet 부터 시작되는 Servlet -> JSP -> Spring -> Spring Boot 구조를 공부하기 위해선 처음부터 차근 차근 알아가야 웹 자체를 이해할 수 있고 그래야 Spring Boot도 그렇지 않은 사람보다 더 잘 사용할 수 있게 된다..
2. 개발 도구 소개
1. VS Code 설치 - https://code.visualstudio.com/download
2. git 설치 - https://git-scm.com/download/win
3. JDK11 설치 - https://download.java.net/java/ga/jdk11/openjdk-11_windows-x64_bin.zip
JDK에는 Oracle JDK와 Open JDK가 있음.
Java는 원래 Sun이라는 회사가 만들었는데 Sun에서는 Java와 MySQL을 가지고 있었다. 그런데 이 Sun이라는 회사가 Oracle에 팔리게 되면서 Java와 MySQL을 Oracle이 갖게 된 것이다. 그래서 공식 JDK는 Oracle에서 발표하는 JDK가 공식 JDK이며 자바는 원래 무료이기 때문에 open source로 만들어진 Open JDK도 존재한다. 실제로 IBM, RedHat, Amazon 등의 기업에서는 Open JDK를 가지고 있다.
하지만 아무래도 Oracle JDK가 기능이 더 많은데, Oracle이 Java 11부터 JDK를 Open source로 풀게 되면서 Oracle JDK나 Open JDK가 사실상 똑같아졌다.
4. Tomcat 9 설치 - https://archive.apache.org/dist/tomcat/tomcat-9/v9.0.52/bin/apache-tomcat-9.0.52-windows-x64.zip
5. STS, IntelliJ 설치
STS란?
- Eclipse + Spring 플러그인
- 무료이다.
- STS4는 Spring boot 전용, STS3는 Spring, Spring boot 사용 가능
IntelliJ
https://www.jetbrains.com/idea/download/#section=windows
- 무료: Spring(X), Spring Boot(O)
- 유료: 다 가능 (30일 무료 or 학생 무료)
Java Spec
1. SE - Standard Edition (일반적인)
2. EE - Enterprise Edition (서버용;대기업) <- 톰캣이 준수하는 spec
3. ME - Micro Edition (소형기기; 폰)
즉 Tomcat이 JEE 중 일부만을 구현한 것임.
5. AWS에 서버 구축하기(1)
이제 원격 서버에 톰캣 구축을 어떻게 하는 지 알아볼 것이다.
하드웨어 추상화로 필요에 따라 Cloud Service의 하드웨어를 자유자재로 사용 가능하는 것이 가능하다.
1. AWS란?
- Amazon이 제공하는 cloud service
- 관리가 쉽고 빠르고 유연한 확장성이 장점.
- 보안
- 필요할 때만 사용하고, 사용한 만큼만 비용지불
2. AWS에 가입하기 - 최초 가입 시 12개월 동안 프리티어 계정(무료계정) 사용 가능
- https://aws.amazon.com/ko/free
- [주의] 무료 사용량을 초과하면 과금될 수 있음
- 가입 시 주소를 적는 칸에 한글 주소를 영문으로 변환하는 사이트를 활용하여 영문 주소로 작성을 해야 한다.
3. Amazon EC2 - 크긱 조정이 가능한 컴퓨팅 용량을 클라우드에서 제공하는 웹 서비스
- https://aws.amazon.com/ko/ec2/
- Amazon S3 - 확장성, 가용성(여러 서버에서 같이 공유), 내구성(깨진 데이터 복구)을 가진 데이터 저장 공간(Simple Storage)을 제공.
- Amazon RDS(Relational Database Service) - 관계형 DB 관리 서비스. 관계형 DB(MySQL, Oracle 등)를 모니터링, 주기적 백업
- 우리가 만든 서버(EC2)에 직접 database를 설치하여 사용할 수도 있지만 그렇게 하면 해당 DB를 직접 관리를 해야 하기 때문에 번거로울 때가 있어, 이를 알아서 해주는 서비스라고 보면 된다.
[참고] 관련 용어
on-Premise: 서버를 직접 운영하는 방식 (관리자가 필요; 회사 전용 서버 구축 or IDC)
Serverless: 서버 작업을 서버내부가 아닌 클라우드 서비스로 처리 (RDS)
Region: 데이터 센터가 물리적으로 존재하는 곳. (몇 년 전 AWS Seoul Region이 생김)
CDN(Content Delivery Network): 정적 리소스를 빠르게 제공할 수 있게 전세계의 캐시서버에 복제해 주는 서비스.
※ EC2는 굳이 따지자면 on-Premise에 가까움
정리하자면 서버 구축 방식에는
1. on-Premise (하나의 건물)
2. 클라우드 (호텔)
이와 같은 두 가지 방식이 존재하고 두 가지의 차이점은 아래와 같다.
on-Premise 방식은 보다 물리적으로 서버 자체를 새 걸로 통째로 임대하는 방식이라고 보면 된다. 내가 해당 건물을 온전히 대여한 것이기 때문에 그 안의 디테일한 설정같은 것들을 내 마음대로 할 수 있고 보안이 좋다는 장점이 있다.
하지만 새 것으로 구축한 만큼 안의 틀이나 체제가 잡혀있지 않아 이것을 일일히 다 설정해 주어야 한다는 단점이 있다.
클라우드 방식 또한 물리적인 서버를 결국 이용하는 것이긴 하지만 이름에서 볼 수 있듯이 내가 그 물리적인 서버를 온전히 다루기는 구름을 만지는 것과 같다.
서버 중의 한 공간만을 일부 빌려서 사용하는 방식이며, 기본적인 체제 같은 것들이 잡혀져 있고 그렇기 때문에 다양한 시스템을 빌리고 나서 처음부터 이용할 수가 있다. 보통 소규모 프로젝트를 진행하는 경우 서버를 대여해 주는 플랫폼들로부터(AWS, Azure, Naver cloud, ...) 서버를 빌려서 구축한다.
하지만 이것은 외부의 컴퓨터를 빌려서 사용하는 것이기 때문에 사양이나 구체적인 설정과 같은 것을 내 마음대로 하지 못한다는 제한이 있다.
6. AWS에 서버 구축하기(2)
이제 EC2 인스턴스를 생성해 볼 것이다. 앞서 회원가입 및 로그인 과정이 완료가 되었으면 다음 과정들을 순차적으로 진행한다.
1. Region을 아시아 태평양 (서울)로 바꿔준다.
2. 인스턴스 시작
EC2 메뉴의 인스턴스 시작 버튼을 눌러 AWS 클라우드에서 실행되는 가상 머신 또는 인스턴스를 생성하는 과정을 수행한다.
3. AMI(Amazon Machine Image) 선택
처음 계정을 만들고 1년 간은 프리티어 사용이 가능하기 때문에 위 운영체제 중 원하는 운영체제를 선택한다.
보통 ubuntu 18.04나 ubuntu 다른 버전을 많이 선택하지만 해당 포스팅에서는 Windows로 진행을 해 볼 예정이다.
4. 인스턴스 유형 선택
인스턴스 유형에는 프리티어가 가능한 유형이 단 하나만이 존재하기 때문에 원하는 스펙이 따로 있지 않다면 보통 프리티어 사용 가능한 t2.micro를 선택한다.
5. 키 페어 생성
키 페어를 생성하고 이를 다운로드 받는 과정이고 종종 해당 EC2 인스턴스에 접근을 하기 위해서 이 키 페어를 사용하는 경우가 있기 때문에 잘 다운 받아 찾기 쉬운 곳에 저장을 해 두어야 한다.
6. 완료 및 확인
다 만들었다면 인스턴스 정보를 볼 수 있는 곳을 들어가 내가 만든 인스턴스가 실행 중인지를 확인하고 한 5분이 지난 후에 상태 검사가 모두 통과 되었는 지를 확인을 한다.
상태 검사가 아직 초기화 상태라면 뒤 과정을 진행하지 않고 조금 기다린 뒤 진행한다.
7. 인스턴스에 연결
상태 검사가 완료 되었으면 내가 만든 인스턴스의 체크박스에 체크를 하고 상단의 여러 옵션 중 연결 버튼을 클릭하여 다음 단계로 넘어간다.
8. RDP 클라이언트
위 페이지에서 원격 데스크톱 파일 다운로드를 클릭하여 원격 데스크탑에 연결할 수 있는 응용프로그램을 설치하고 실행한다.
그러면 암호를 입력하는 칸이 나오게 되는데 암호는 위 페이지에서 암호 가져오기 버튼을 클릭하고 아까 생성했던 키 페어를 프라이빗 키 파일 업로드 하는 공간에 업로드 하여 암호 해독을 하면 암호가 나오게 되는데 해당 암호를 원격 데스크톱 암호 입력 칸에 붙여 넣는다.
서버 구축
그러면 원격 데스크톱에 연결이 되어 windows 바탕화면이 나오는 것을 확인할 수 있을 것이다.
이러면 windows 서버를 구축하게 된 것이다.
이제 이 서버 컴퓨터에 앞서 다운 받았던 JDK11과 Tomcat을 똑같이 설치해 주고 방화벽 설정에서 Inbound에 새로운 규칙을 추가해 준다. 규칙은 8080 포트로 다른 외부 컴퓨터에서 들어올 수 있도록 하는 것이다. (물론 환경변수 설정과 톰캣을 실행하는 과정도 똑같이 실행해 준다.)
- 톰캣에 설정 된 포트가 8080이기 때문에 8080으로 설정하는 것임.
그 다음부터는 계속 next를 누르다가 마지막에 name을 적는 칸에 대충 Tomcat tcp 8080과 같이 이름을 적고 finish 버튼을 눌러주면 최종적으로 추가가 된 것이다.
그리고 AWS 에서도 인바운드 규칙을 편집해 주어야 하는데 앞서 만들어 준 인스턴스를 클릭하여 보안 탭에 들어가 보안 그룹 링크를 타고 들어가서 인바운드 규칙 탭에 인바운드 규칙 편집 버튼을 클릭한다.
그러면 유형이 원래 RDP로 되어있을텐데 그것을 '모든 TCP'로 바꿔주고 규칙 저장 버튼을 누르면 된다.
그러면 최종적으로 내 컴퓨터에서 AWS 클라우드 서버 컴퓨터로 8080포트에 접속을 하면 톰캣서버가 실행 된 상태에서 톰캣 홈페이지가 잘 뜨는 것을 확인할 수 있다.
- 참고로 서버 컴퓨터의 IP 주소는 EC2 인스턴스 클릭 후 아래 인스턴스 정보가 뜨게 되는데 세부 정보에 퍼블릭 IPv4 주소라고 되어있는 것이 IP 주소이다.
- 그래서 만약 해당 IP 주소가 예를 들어 11.22.333.44 라면 브라우저 검색 창에 11.22.333.44:8080 을 입력하고 엔터를 누르면 접속이 되는 것을 확인할 수 있을 것이다.
'Back-end > Spring' 카테고리의 다른 글
[Spring] 관심사의 분리와 MVC 패턴 (0) | 2023.03.25 |
---|---|
[Spring] HTTP 요청과 응답(feat. AWS 배포, MIME, Base64, 설정파일) (0) | 2023.03.25 |
[Spring] Part 1-5. 나만의 MVC 프레임워크 만들기 | JDBC 프로그래밍(+CRUD) (0) | 2023.01.16 |
[Spring] Part 1-4-3. 나만의 MVC 프레임워크 만들기 | 계산기 서블릿 만들기 (0) | 2023.01.15 |
[Spring] Part 1-4-2. 나만의 MVC 프레임워크 만들기 | CGI 프로그램과 서블릿 (Servlet) (0) | 2023.01.13 |
소중한 공감 감사합니다