1.2 개발 환경 구축
들어가면서
이번 장에서는 자바 웹 개발에 필요한 개발 환경을 구축 합니다. 개발에 필요한 소프트웨어 구성요소들을 살펴보고 학습에 최적화된 개발 환경을 스스로 구축할 수 있도록 한다.
필요한 소프트웨어 구성요소는 다음과 같으며 여기서는 Windows 10 운영체제에 설치하는 것을 기본으로 한다.
- JDK: AdoptOpenJDK 11(LTS)
- IDE: Eclipse IDE for Java Enterprise Developer
- Servlet Container: Apache Tomcat 9
- Database: H2 Database v1.4
자바 웹 개발 환경
자바 웹 개발을 위해서는 기본적으로 자바 코드를 컴파일하고 실행하기 위한 JDK(Java Development Kit)와 코드 편집기를 비롯해 개발에 도움을 주는 도구인 Eclipse IDE(Integrated Development Environment), 서블릿, JSP와 같은 웹 프로그램의 실행과 서비스 운영을 위한 서블릿 컨테이너(Servlet Container)인 아파치 톰캣 등이 필요 하다.
자바 개발 환경
자바 개발을 위해서는 기본적으로 JDK(Java Development Kit)가 필요하다. JDK는 자바 컴파일러와 디버거등이 포함된 개발 도구를 말한다. 단순히 자바를 실행하는 경우에는 JRE(Java Runtime Environment)만 있어도 된다. 또한 자바는 적용 분야에 따라 플랫폼이라는 명칭으로 구성요소와 규격을 달리해 구분을 두고 있으므로 개발 목적에 따라 적절한 자바 플랫폼을 선택해 사용해야 한다.
Java SE
Java Standard Edition 을 말하며 일반적으로 데스크톱 컴퓨터에서 자바 응용 프로그램들을 사용하기 위한 플랫폼이다. 기본적으로 자바로 만들어진 프로그램을 실행하기 위해 필요한 환경이며 예를들어 서블릿 컨테이너인 아파치 톰캣(자바로 만들어짐) 실행을 위해서도 필요하다.
Java EE
Java Enterprise Edition 을 말한다. 단어적 의미로는 기업용 버전으로 해석될 수 있지만 단순히 기업을 위한것이 아니라 기업수준에서 운영하는 대규모 프로그램이나 서비스 개발에 필요한 규격들을 갖춘 플랫폼의 의미로 이해하면 된다. 개인이 사용하는 프로그램과 달리 기업에서 사용하는 프로그램이나 서비스는 대용량의 데이터를 처리할 수 있어야 하고 보안이나 성능, 안정성등 고려할 사항이 많기 때문에 관련된 요구사항들을 규격화해서 만든것으로 볼 수 있다.
서블릿, JSP와 같은 자바 웹 프로그래밍 기술들은 기본적으로 Java EE 규격에 포함되어 있지만 서블릿이나 JSP사용을 위해 Java EE 플랫폼을 직접 사용하거나 전체 규격을 지원하는 서버를 갖출 필요는 없다.
자바 버전
2020년 8월 현재 자바의 최신 버전은 Java SE 14 이다. 최신 버전은 매년 버전업 되지만 개발의 안정성과 호환을 위해서는 LTS(Long Term Support)버전을 사용하는 것이 좋다. 현재 LTS 버전은 11 이며 최대 2026년 까지 기술 및 보안 업데이트 등이 보장되어 있기 때문에 대부분의 프로젝트나 학습에 권장된다.
JDK 배포본
오라클의 자바 라이센스 상용화 정책에 따라 기본적인 자바 소스코드는 오픈소스 정책에 따라 배포 되지만 JDK 패키지는 상용제품인 Oracle JDK와 공개 버전인 Open JDK로 나뉘어 배포된다. 몇몇 구성요소와 설치방법등의 차이를 제외하면 기본적인 기능과 성능은 동일하지만 라이센스 문제가 발생하므로 자바를 이용한 제품이나 서비스 개발시 고려해야 할 중요한 사안이다.
특별히 오라클에 종속되거나 반드시 라이센스를 지불해야만 하는 환경이 아니라면 Open JDK의 사용이 권장된다. 다만 오라클에서 공식적으로 배포하는 Open JDK는 설치 방법등이 불편하기 때문에 몇몇 회사(혹은 단체)나 개인이 github등을 통해 배포하는 패키지를 사용하게 된다.
여기서는 AdoptOpenJDK를 사용한다.
통합 개발 환경
본격적인 개발을 위해서는 통합 개발 환경(IDE, Integrated Development Environment)이 필요 하다. 마이크로소프트의 Visual Studio, Visual Studio Code 를 비롯해 NetBeans, IntelliJ IDEA등 다양한 개발 도구들이 있으며 회사의 정책이나 개발자의 취향에 따라 적절한 개발도구를 사용할 수 있다. 대표적인 도구로 가장 많은 사용자를 확보하고 있는 IDE를 살펴 보면 다음과 같다.
Eclipse
이클립스는 대표적인 자바 통합 개발도구 이며 IBM에서 1999년 개발해 오픈소스로 기증한 개발 도구 이다. 이클립스는 자바 이외의 개발 도구로 사용할 수 있으며 플러그인 구조로 인해 이클립스 기반의 여러 개발도구를 만들 수 있는 형태이다. 안드로이드 스튜디오가 나오기 전까지는 안드로이드의 공식 개발도구 였으며 무료로 사용할 수 있다는 장점과 다양한 플러그인등으로 오랜 기간 대표적인 자바 개발 도구로 자리 잡아 왔으나 획기적인 변화 없이 유지되는 UI및 고급기능의 부재등으로 점차 상용 개발 도구인 IntelliJ 에 자리를 내어주고 있는 상황이다.
IntelliJ IDEA
Jetbrains 라는 회사에서 개발한 자바 개발 도구로 Jetbrains 는 다양한 개발 도구를 만들어 판매하고 있으나 기본적으로는 동일한 IDE 베이스에 특정 개발에 필요한 플러그인들을 포함한 형태로 볼 수 있다.
Kotlin을 개발한 회사이기도 하고 현재 안드로이드 공식 개발도구인 안드로이드 스튜디오도 IntelliJ 를 기반으로 하고 있다.
기능이 많다 보니 저사양의 컴퓨터에서 사용하기 어렵다는 단점이 있지만 많은 기능과 편리함으로 인해 현재는 가장 대표적인 자바 개발도구가 되었다. 다만 본격적인 개발을 위해서는 상용버전을 사용해야 하고 특히 자바 웹 개발은 상용버전인 Ultimate 버전을 사용해야한다는 문제가 있다.
학생의 경우 학교 이메일 인증을 통해 1년간 Ultimate 버전을 무료로 사용할 수 있다. 매년 갱신 필요.
VS Code
Visual Studio Code는 프론트엔드 개발이 본격화 되면서 가장 빠르게 성장하고 있는 개발도구 이다. 마이크로소프트에서 제공하는 오픈소스 개발 도구로 가벼운 기본 구조로 저사양의 컴퓨터에서도 비교적 쉽게 사용할 수 있으며 필요한 기능을 익스텐션 형태로 설치해 자신만의 환경을 구축하는 것이 가능하다.
스프링프레임워크를 비롯해 모든 자바 기반의 개발이 가능하기는 하지만 관련된 익스텐션을 직접 설치해야 하고 개별적인 환경 설정등을 맞추고 해야 하기 때문에 다소 불편함이 있다.
여기서는 이클립스를 사용하도록 한다. 이클립스는 개발 목적에 따라 여러 버전이 있으며 웹 개발을 위해서는 Eclipse IDE for Java Enterprise Developer 를 설치해야 한다.
개발 환경과 배포 프로세스
개발 환경
오늘날과 같이 클라우드 인프라가 발전하고 협업이 기본인 개발 환경에서 개발자들은 자신의 컴퓨터에 개발도구를 설치하는 수준을 넘어 클라우드 인프라와 협업을 위한 기본적인 배경지식과 경험이 요구 된다.
- Git에 대한 전반적인 이해와 개발 소스 관리에 활용
- Github, Gitlab 등의 소스 공유 및 관리 도구 사용
- DevOps 개념을 이해하고 적응 가능한 역량과 마인드
- AWS, GCP 등 클라우드 인프라 활용
- Docker 등 컨테이너 기반 개발 경험
개발 환경도 점점 복잡해 지고 있지만 개발된 결과물을 실제 운영 되는 서버로 배포하는 과정과 절차도 점점 복잡해지고 있어 이에 대해서도 어느정도 이해가 필요 하다. 물론 규모가 큰 기업의 경우 전체적인 툴 체인(Tool Chain)이 잘 셋업되어 있고 프로세스도 정립되어 있으며 각자 역할에 따라 본인의 작업만 수행하며 되기 때문에 모든 과정의 세부적인 내용까지는 자세히 알필요가 없다.
배포(Deplyment)
배포란?
배치라고도 하며 개발된 결과물을 실제 사용자에게 전달하는 작업을 말한다. 웹의 경우 운영 서버로 개발 소스를 복사하고 WAS에 등록하는 과정을 말하며 모바일 앱의 경우 앱 스토어등에 앱을 업로드하는 절차등이 여기에 해당한다. 그외 일반적인 애플리케이션이라면 FTP서버, 홈페이지 혹은 github 등을 통해 버전을 릴리즈하는 작업이 될 수 있다.
웹 애플리케이션 배포
이클립스에서 jsp 나 서블릿을 실행하게 되면 현재 프로젝트 구조를 WAR 형태로 패키징한 다음 아파치 톰캣에 전달해 실행하는 구조이다. 물론 로컬 서버에서는 효율성을 위해 매번 실제 WAR를 생성하지 않고 이클립스에서 내부적으로 톰캣과 연동하는 과정을 거치게 된다.
반면 완성된 프로젝트를 운영 서버에 설치하는 경우라면 이클립스에서 프로젝트를 war 파일로 패키징한 다음 서버에 옮기는 과정이 필요하다. 기본적으로 운영서버가 리눅스라고 가정하면 개발자의 윈도우 컴퓨터에서 운영 서버에 원격으로 접속해야 하고 war 파일을 FTP(File Transfer Protocol)등의 파일 전송 프로그램을 사용해 전송해야 한다. 만일 서버가 보안의 이유로 외부 접속이 완전히 차단되어 있는 경우라면 직접 서버가 설치된 데이터 센터나 접속이 인가된 컴퓨터로 이동해 작업해야 하기도 한다.
서버에 war 파일을 복사한 다음에는 톰캣이 설치된 디렉토리의 webapps 폴더로 war 파일을 위치시키면 톰캣이 자동으로 압축을 풀어 사용하게 된다.
톰캣의 경우 war 파일을 원격으로 설치하고 관리하기 위한 웹 기반의 관리자 콘솔 기능을 제공하고 있으며 대부분의 WAS 들이 이와 같은 도구를 포함하고 있다. 톰캣 관리자 콘솔은 웹기반의 UI도 제공하지만 빌드 도구에서 원격으로 직접 배포하는 방법도 제공 하고 있다.
중소규모의 서비스라면 위와 같은 과정으로 개발과 배포가 이루어질 수 있겠지만 많은 개발자와 여러 회사들이 참여하는 대규모 서비스의 경우에는 상황이 좀 달라지게 된다. 각각의 개발자들이 물리적으로 떨어져 작업하게 되고 소스를 공유해야 하며 버전관리도 이루어져야 한다. 또한 단계별 테스트와 운영 서버에 배포하기전 별도의 테스트 기간을 거쳐야 하고 테스트가 끝난 모듈이나 배포단위는 운영 서버로 옮겨야 한다.
이러한 일련의 과정들이 복잡하고 개인에 의해 관리될 경우 많은 시간이 소요되고 여러 문제가 발생할 수 있으며 생산성이 저하 되기 때문에 최근에는 개발과 운영을 체계적으로 관리하기 위한 DevOps 개념이 중요해 지고 있으며 이를 지원하기 위한 여러 소프트웨어들로 구성된 환경에서 작업하게 된다.
DevOps
DevOps는 개발(Development)과 운영(Operations)의 합성어로 소프트웨어 개발 규모가 커지고 협업이 보편화 되면서 신속한 개발과 지속적 유지보수, 배포등 전주기적 소프트웨어 개발 라이프사이클을 통합하기 위한 노력을 통칭 한다.
예를들어 서비스의 개선을 위해 몇 달간의 작업 후 배포하던 전통적인 방식과 달리, 지금은 수시로 서비스 를 배포하는 형태가 되었으며 대부분의 서비스가 설치 기반에서 웹 기반으로 바뀌었으며 MSA(Micro Service Architecture)와 클라우드 인프라의 활용이 많아졌고 그로 인해 빈번한 서비스의 배포가 필요해 졌다.
이러한 새로운 전략을 위해 개발과 운영팀이 병합되어 개발, 테스트, 배포, 운영에 이르는 애플리케이션 수명주기를 개발하게 되었고 이를 DevOps라고 한다.
DevOps의 이점
- 속도: 배포까지의 빠른 작업속도를 효율적으로 제공하기 때문에 시장 변화에 빠르게 대처하고 비즈니스 성과를 창출 가능.
- 빠른 배포: 새로운 릴리즈와 버그픽스를 빠르게 배포할 수 있으며, 그로 인해 고객의 요구를 빠르게 대응 가능.
- 안정성: 지속적 통합, 지속적 전달, 모니터링, 로깅을 통해 안정적인 서비스 품질을 고객에게 제공 가능.
- 확장 가능: 복잡하거나 변화하는 시스템을 효율적으로 관리 가능.
- 협업 강화: 개발자와 운영팀이 긴밀하게 협력할 수 있기 때문에 책임을 공유하고 워크플로우를 결합할 수 있음. 이를 통해 비효율을 줄이고 시간 절약 가능.
DevOps 구현
DevOps 구현을 위해서는 기업 구성원들의 협력과 조직 문화가 뒷받침이 되어야 하며 다음과 같은 구성 요소들을 포함해야 한다.
- SCM(Source Code Management): 팀단위의 소스코드 버전관리, git, svn 등의 도구를 사용
- CI(Continuous Integration): 빌드와 테스트를 통합, Jenkins, Travis CI 등의 도구를 사용
- CD(Continuous Deploy): 지속적인 배포, 원하는 시점에 바로 배포가 가능한 설정이 필요
- Configuration Management: 서비스의 설정을 통합 관리, 운영서버 OS, 버전, 라이브러리 버전, 컴파일등을 포함.
DevOps와 관련한 추가적인 학습은 관련 자료를 참고하도록 한다.
실습: 개발 도구 설치
개발도구 설치는 실습 코드랩과 유튜브 설치 동영상 강좌를 참고해 직접 완료하도록 합니다.
유튜브 동영상 강좌는 오라클 JDK로 되어 있으나 실습 코드랩에 있는 AdoptOpenJDK 설치를 권장 합니다.