## 56. 웹 애플리케이션 자바 표준 기술 JavaEE 도입
- JavaEE 기술 소개
- JavaEE 버전 별 하위 기술 버전
- JavaEE 구현 서버 및 Servlet 컨테이너 관계
- Servlet API 사용법
gradle 이용하여 프로젝트 생성
=>
eomcs-servlet/build.gradle
ㄴ plugins 에서 application 이 아닌 java 로 변경해주도록 함
ㄴ 이제 더 이상 application 이 아니므로 해당 코드 제거
ㄴ 자바 소스를 컴파일 할 때 적용할 옵션 추가
ㄴ eclipse 프로젝트 이름을 설정 => servlet-app
ㄴ 프로젝트 이름을 servlet-app 으로 변경할 것임
프로젝트 이름 변경
=>
=>
ㄴ gradle 설정해주기
ㄴ workspace 에 servlet-app 프로젝트 import 하기
ㄴ App.java 는 필요 없으므로 제거
ㄴ AppTest.java 도 필요 없으므로 함께 제거
ㄴ src/main/resources 패키지가 비어있으면 git 에 commit 할 때 commit 이 되지 않으므로 README.md 파일을 추가해줌
ㄴ src/test/java 패키지 안에 있는 eomcs.servlet 패키지가 비어있으면 git 에 commit 할 때 commit 이 되지 않으므로 README.md 파일을 추가해줌
ㄴ src/test/resources 패키지가 비어있으면 git 에 commit 할 때 commit 이 되지 않으므로 README.md 파일을 추가해줌
ㄴ src/main/java 패키지 안에 eomcs.servlet 패키지에 HelloServlet.java 클래스 생성
HelloServlet.java
ㄴ Servlet 을 import 하기 위해 라이브러리 다운로드 필요
Servlet 라이브러리 추가
=>
ㄴ 4.0.1 버전을 선택
ㄴ Gradle(short) 선택 후 [Copy to clipboard] 선택
build.gradle
ㄴ Servlet API 추가
ㄴ gradle 재설정
ㄴ javax.servlet-api-4.0.1.jar 생성됨을 확인
HelloServlet.java
ㄴ 이제 javax.servlet.Servlet 라이브러리 import 가능
HelloServlet.java
ㄴ service 메서드 오버라이딩
HelloServlet.java
ㄴ init 메서드 오버라이딩
HelloServlet.java
ㄴ destroy 메서드 오버라이딩
HelloServlet.java
ㄴ GetServletInfo 메서드 오버라이딩
HelloServlet.java
ㄴ GetServletConfig 메서드 오버라이딩
HelloServlet.java
ㄴ init 메서드 작성
HelloServlet.java
ㄴ service 메서드 작성
=> 클라이언트가 요청할 때 마다 서블릿 컨테이너가 호출함을 확인하기 위한 코드
HelloServlet.java
ㄴ destroy 메서드는 서블릿 컨테이너가 종료되기 직전에 호출함
HelloServlet.java
ㄴ getServletInfo 메서드는 서블릿의 간단한 설명이 필요할 때 호출하도록 함
ㄴ 서블릿 컨테이너가 관리 화면에 출력하기 위해 호출할 수 있고, 다른 서블릿에서 호출할 수도 있음
HelloServlet.java
ㄴ ServletConfig 를 담기위해 config 필드 선언
HelloServlet.java
ㄴ ServletConfig 메서드는 서블릿에 대한 설정 정보를 담은 객체를 리턴함
ㄴ 서블릿과 관련된 설정 정보를 알고자 할 때 이 메서드를 호출하여 그 리턴 값을 사용하도록 함
HelloServlet.java
ㄴ init 메서드에서 서블릿 실행에 필요한 것들을 준비하도록 함
HelloServlet.java
ㄴ service 메서드에서 클라이언트 요청을 처리한 후 그 결과를 리턴하면 됨
HelloServlet.java
ㄴ destroy 메서드를 이용하여 init 메서드에서 준비한 자원을 해제시키도록 함
HelloServlet.java
=>
HelloServlet.java
ㄴ @WebServlet 애노테이션을 이용
ㄴ gradle 재설정하기 하기
ㄴ /Users/사용자명/git/bitcamp-study/servlet-app/app/build/classes/java/main/eomcs/servlet/HelloServlet.class
=> HelloServlet 의 클래스 파일 확인
build.gradle
ㄴ war 플러그인 추가
ㄴ gradle 재설정
ㄴ /Users/yangsoyul/git/bitcamp-study/servlet-app/app/build/libs/app.war 파일 확인
build.gradle
ㄴ war 설정 추가
ㄴ gradle 재설정
=>
ㄴ build.gradle 스크립트 파일 설정에서 설정한 이름으로 war 파일 생성됨
ㄴ 생성된 servlet-app.war 파일 복사
=>
ㄴ 톰캣 경로/webapps 위치에 붙여넣어 배포하기
=>
ㄴ 조금 기다리면 servlet-app 폴더가 생김
ㄴ /Users/사용자명/server/apache-tomcat-9.0.78/webapps/servlet-app/WEB-INF/lib 경로에 라이브러리들 확인
=>
build.gradle
ㄴ 배포 받는 쪽에서 라이브러리를 갖고 있을 때 사용하는 옵션
ㄴ 배포 제외
=>
ㄴ gradle 재설정
ㄴ war 파일 확장자를 zip 으로 변경한 후 zip 파일 압축 풀기
=>
ㄴ /Users/사용자명/git/bitcamp-study/servlet-app/app/build/libs/servlet-app/WEB-INF/lib 에 들어가서 8개였던 라이브러리가 7개로 줄어듦을 알 수 있음
=> build.gradle 스크립트 파일에서 배포시 제회할 라이브러리 설정을 해주었기 때문
ㄴ localhost:8888/ 에 바로 Hello 를 적어주면 정상적으로 실행되지 않음
=>
ㄴ 현재 프로젝트 이름까지 적어줘야 정상적으로 실행됨
프로젝트 적용
build.gradle
=>
build.gradle
ㄴ Netty 라이브러리 제거
=>
build.gradle
ㄴ Servlet API 추가
build.gradle
ㄴ application 제거
build.gradle
ㄴ war 파일 이름 설정 추가
ㄴ gradle 재설정
=>
ㄴ 라이브러리가 생기지 않아서 cleanEclipse 를 해줌
=>
ㄴ 프로젝트 Refresh 해주기
ㄴ 라이브러리 생긴 것을 확인
ㄴ 해당 파일들 모두 제거
MySQLBoardDao.java
ㄴ @Component 애노테이션 제거
MySQLItemDao.java
ㄴ @Component 애노테이션 제거
MySQLMemberDao.java
ㄴ @Component 애노테이션 제거
ㄴ report-server/src/main 경로에 webapp 폴더 생성
ㄴ /report-server/src/main/resources/static 에 있는 auth, item, member 폴더 및 favicon.ico, index.html 파일을 /report-server/src/main/webapp 경로로 이동시킴 (드래그 앤 드랍)
ㄴ /report-server/src/main/resources 에 있는 static 폴더 삭제
ㄴ LoginServlet.java 파일 복사
=>
ㄴ /report-server/src/main/java/bitcamp/report/handler 경로에 InitServlet 이라는 이름으로 붙여넣기
ㄴ AbstractServlet 클래스 생성
AbstractServlet.java
ㄴ AbstractServlet 클래스는
InitServlet.java
ㄴ @WebServlet 애노테이션 추가
InitServlet.java
ㄴ AbstractServlet 을 상속받도록 수정
InitServlet.java
ㄴ service 메서드 새로 오버라이딩 해주기
InitServlet.java
ㄴ req -> request 로 변경
ㄴ res -> response 로 변경
InitServlet.java
ㄴ 코드 변경
InitServlet.java
ㄴ AppConfig.java 파일에서 해당 코드 잘라내와서 sqlSessionFactory 에 대입해주기
InitServlet.java
ㄴ DAO 인터페이스를 구현하고, 실제 데이터베이스 연산을 처리하며 SqlSessionFactory를 이용하여 데이터베이스 세션을 생성하고 관리하도록 함
=> init 메서드는 각각의 DAO를 생성하고 SqlSessionFactory를 초기화하여 데이터베이스 작업을 수행할 준비를 하도록 함
ㄴ config 패키지 자체를 삭제 => AppConfig.java 파일은 이제 필요 없음
ㄴ ApplicationContext.java 파일 제거
ㄴ DataSource.java 파일 제거
BoardListServlet.java
ㄴ @WebServlet 애노테이션 추가
BoardListServlet.java
ㄴ 생성한 AbstractServlet 상속받도록 해줌
BoardListServlet.java
ㄴ 해당 인터페이스구현은 이제 InitServlet 에서 해줄 것이므로 제거
BoardListServlet.java
ㄴ service 메서드 새로 오버라이딩 해주기
=>
BoardListServlet.java
ㄴ req -> request 로 변경
ㄴ res -> response 로 변경
BoardListServlet.java
ㄴ boardDao 는 InitServlet 에서 구현하므로 해당 코드 추가
ㄴ /Users/사용자명/git/bitcamp-study/report/app-server/src0
ㄴ app-server 의 src 를 src0 라는 이름으로 백업해두기
ㄴ BoardListServlet.java 를 제외한 XxxXxxServlet.java 파일 모두 삭제
ㄴ gradle build 실행해주기
=>
ㄴ tomcat 에 배포해주기
ㄴ 톰캣 실행하기
=>
ㄴ 브라우저를 띄운 후 init 을 실행해주기
ㄴ 리스트 출력 잘 됨을 확인
ㄴ 메인 페이지로 이동하려면 프로젝트 이름도 브라우저에 적어줘야 하는 문제점이 있음
=>
server.xml
ㄴ 톰캣 server.xml 설정에서 해당 코드에서 docBase 를 report 로 변경해줌
=>
톰캣 서버 재시작
=>
ㄴ 기본 루트가 report 로 변경됨
ㄴ 글 목록이 노출되지 않음
=>
ㄴ init 해주면 해결됨
=>
ㄴ 목록 제대로 출력됨을 확인
=>
init 을 자동으로 실행하도록 하자
=>
InitServlet.java
ㄴ loadOnStartup의 값이 숫자로 지정되며, 작은 숫자일수록 먼저 로드됨
=> 1을 지정하여 웹 애플리케이션이 시작될 때 InitServlet 서블릿이 가장 먼저 로드되도록 설정
InitServlet.java
ㄴ init 메서드 오버라이딩
=>
InitServlet.java
ㄴ service 메서드에 있던 해당 코드를 init 메서드로 옮긴 후 try~catch 문으로 묶어주기
InitServlet.java
ㄴ init 호출 확인을 위해 출력문 추가해주기
ㄴ gradle build 실행해주기
=>
=>
ㄴ 이제 init 을 실행하지 않아도 자동으로 실행됨
=> 게시글 목록이 잘 출력되는 것을 확인
Mac 에서 로그 확인 방법
=>
ㄴ Server > Runtime Environments 선택
=>
ㄴ Apache Tomcat v9.0 > [Next>] 선택
=>
ㄴ 톰캣 경로 설정해주기
=>
=>
ㄴ 이렇게 Servers 탭이 보이지 않는다면 아래와 같이 설정해주기
=>
=>
ㄴ No servers are available. Click this link to create a new server... 링크를 선택
=>
ㄴ Apache > Tomcat v9.0 Server 선택
ㄴ Server name 이름 변경해주기
=>
ㄴ Project Explorer 창에 Servers 폴더가 생성되며, 생성한 Tomcat 서버 노출됨
ㄴ 추가한 서버별로 설정파일을 따로 설정할 수 있음
=>
ㄴ server 가 start 됨을 확인
ㄴ start 가 실행되지 않는다면 이미 실행되고 있는 tomcat 서버를 모두 종료시켜줘야 함
ㄴ /Users/yangsoyul/bitcamp-workspace/.metadata/.plugins/org.eclipse.wst.server.core 경로에 tmp 폴더가 생김
=> tmp0, tmp1, tmp2 에서 각각의 번호는 서버가 생성된 순서대로 부여됨
ㄴ 다른 서버가 실행되고 있을 때 또 다른 서버를 실행시키려고 하면 다음과 같은 오류 발생함
=>
=>
ㄴ 다른 서버를 실행시키고 싶으면 이미 실행되고 있는 서버를 stop 한 후 다시 실행하면 됨
=>
=>
=>
=>
해당 서버 실행시키기
=>
ㄴ 해당 오류 발생
=>
ㄴ /Users/yangsoyul/bitcamp-workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp2/wtpwebapps/report-server/WEB-INF/lib 경로 들어가서 라이브러리 확인
build.gradle
ㄴ plugins 설정에서 eclipse -> eclipse-wtp 로 변경해주기
build.gradle
ㄴ wtp 설정을 추가해주도록 함
ㄴ gradle clean 후 재설정하기
ㄴ 프로젝트 Refresh 해주기
=>