나름 길었던 프론트엔드 과정을 마치고 위 기간 동안 본격적으로 백엔드 과정에 들어가기 앞서 숙지해야할 선행 과정을 학습했다! Apache Maven과 JDBC 바인딩 JUnit 등의 개념을 배우고 Eclipse에서 Apache Maven 기반의 프로젝트 생성을 반복하여 몸에 익혔다. 이제 앞으로 Servlet/JSP와 MyBatis, Spring을 배우게 될 텐데 긴장도 되고 기대도 된다.
---
JDBC
자바언어를 이용한 데이터 베이스와의 연결
관계형 데이터베이스라면 그 어떤 것이라도 연결가능
구성요소 2개
1) JDBC API - 거의 인터페이스 (규격만정의) - 자바표준 패키지로 이미 포함 (java.sql)
2) JDBC Driver - JDBC API의 구현체
----
* JDBC driver를 이용한 데이터베이스 프로그래할 때,
핵심이 되는 클래스/인터페이스를 알아보자!!!
(0) java.sql.DriverManager (Class)
(1) java.sql.Connection (interface)
(2) java.sql.Statement (interface) ---> Dynamic SQL (자주 사용하면 안됨!!!--> 성능을 떨어뜨림)
(3) java.sql.PreparedStatement (interface) --> Prepared SQL
(4) java.sql.ResultSet (interface)
(5) java.sql.SQLException (class) - Checked Exception
0이 있어야 1이 있고 1이 있어야 2,3이 있고 2,3이 있어야 4가 있다
* 위에서, (1) ~ (4) 까지는 자원객체(Resources) 임 =>
때문에, 다 사용하고 나면, 반드시 자원해제(close) 해줘야됨!
이때 , 자원객체를 닫는 순서가 정해져 있고, 이를 반드시 지켜야 됨! :
(4) > (2) 또는 (3) > (1)
Oracle8i
Oracle9i - > Internet-based DB
Oracle10g - > Grid Computing based DB
Oracle11g
Oracle12c - > Cloud-based DB
..
Oracle19c
Cloud Computing
= Grid Computing + Utility Computing
Oracle Instance = Oracle Background Processes + SGA(System Global Area)
Oracle 최소구성 = Oracle Instance + Oracle Listener
---
JDBC API를 이용햐여 Target DB에 연결하려면 아래의 4개의 정보가 필수적으로 필요
1) JDBC URL - JDBC를 위해 만든 URL이기 때문에 아래와 같은 표기법이 적용
Oracle DBMS에 접속방식 2가지 (EZCONNECT, TNSNAMES)
가. EZCONNECT : 1) 접속IP주소, 2) 접속 port번호, 3) 접속DB이름
나. TNSNAMES : EZCONNECT의 3가지 정보를 가지고 있는 별도의 이름
(=네트워크 별칭, TNS Alias) 을 이용해서 접속하는 방식
jdbc:<vendor>: thin:@IP주소:Port번호/접속DB이름 (EZCONNECT 방식)
jdbc:<vendor>:thin@네트워크별칭 (TNSNAMES방식)
(tnsnames.ora 파일에 들어있는 경로를 지정해줘야함 (환경변수 TNS_ADMIN))
jdbc:<vendor>:thin@네트워크별칭?TNS_ADMIN=<전자지갑파일이 들어있는 폴더의 경로를 지정> (TNSNAMES방식)
jdbc:oralce:thin:@~~~~~(강사님거) (Oracle cloud db)
C:\opt\OracleCloudWallet\ATP\tnsnames.ora 에서 확인 -> "확인해보세요"
2) Driver Class's FQCN (Fully-Qualified Class Name) (패키지까지 포함된 클래스의 완전한 이름)
JDBC Driver (배포되는 라이브러리 jar파일 )안에 있다
오라클의 경우, "oracle.jdbc.OracleDriver" ---> (이걸 주로 사용)
"oracle.jdbc.driver.OracleDriver"
3) User - 아무거나 (HR로 하자)
4) Pass - 아무거나 ("우리반 비밀번호"로 하자)
public class JDBCExample1 {
// step1 : JDBC Driver에 필요한 필수연결정보
private static String jdbcUrl = "studyjdbc 프로젝트에서 확인하세요";
private static String driverClass = "oracle.jdbc.OracleDriver";
private static String user = "HR";
private static String pass = "우리반 비밀번호";
public static void main(String[] args) {
// throws ClassNotFoundException, SQLException { // 예외처리 try-catch로 해보자
log.trace("main({}) invoked", Arrays.toString(args));
// step2 : JDBC를 위한 지역변수 선언
Connection conn = null;
Statement stmt = null; // java.sql로 임포트
ResultSet rs = null;
try {
// step4 : JDBC Driver Class를 등록 (registration)
Class.forName(driverClass); // 예외처리 해주자
// step5 :
conn = DriverManager.getConnection(jdbcUrl, user, pass); // 예외처리 해주자
log.info("\t+ conn: {}", conn);
// step6 : Connection 객체로부터 Statement 객체를 생성할 수 있다
stmt = conn.createStatement();
// step7 : 실제 수행시킬 SQL 문장 생성
String sql = "Select current_date From dual"; // DQL 문장
// step7 : Statement 실행 (SQL 문장을 전송)
rs = stmt.executeQuery(sql); // if DQL (SELECT 문장에만 해당)
// step8 : ResultSet을 이용해서 각 레코드 별로 각 컬럼의 값을 추출
if(rs.next()) {
// 현재 레코드의 구성 컬럼의 값을 추출
// rs.get<추출컬럼타입에 대응되는 자바타입>("컬럼명");
Timestamp now = rs.getTimestamp("current_date"); // java.sql로 임포트
log.info("\t+ now: {}", now);
};
} catch(SQLException | ClassNotFoundException e) { // 멀티 캐치
e.printStackTrace();
} finally {
// step9 : 자원객체는 썼으면 해제해주자 (순서중요!)
// 순서 : ResultSet -> Statement -> Connection
try { if (rs != null && !rs.isClosed()) rs.close(); } catch(SQLException e) {;;} // try-catch
try { if (stmt != null && !stmt.isClosed()) stmt.close(); } catch(SQLException e) {;;} // try-catch
try { if (conn != null && !conn.isClosed()) conn.close(); } catch(SQLException e) {;;} // try-catch
} // try-catch-finally
System.exit(0);
} // main
} // end class
JDBCExample1.java
JDBCExample2.java~JDBCExample6.java 이클립스에서 확인하자
---
* Log4j log level 정리
중요
log.fatal("fatal");
log.error("error");
log.warn("warn");
log.info("info");
log.debug("debug");
log.trace("trace");
안중요
---
TDD - Test Driven Deveolpment
테스트 주도 개발
현업에서 가장 많이 사용하는 Test Framework를 통해, TDD를 일상화 해야함
우리는 Test Framework로 e-factor standard인 JUnit test framework를 배운다
이 JUnit은 version4.x와 version 5.x가 완전히 차이가 난다.
실전에서는 여전히 JUnit ver4.x를 쓰는 경우가 월등히 많다
하지만 최근에는 JUnit Jupyter ver5.x를 사용하는 곳이 빠르게 증가하고 있다.
그러므로 우리는 JUnit ver4.x와 JUnit Jupyter ver5.x 2개의 버전을 모두 배우도록 하자.
단 배우고나면 자기 것으로 만들기 위한 노력이 필요하다. 반복연습(연마) 하세요!!!
JUnit ver 4.x : 우리가 숙지해야할 어노테이션은 3개!
1) @Before : 테스트 (@Test) 수행 전, 사전 준비 작업이 필요한 경우에 적용
2) @Test : 실제 테스트 수행
3) @After : 테스트 (@Test) 수행 후, 사후 처리 작업이 필요한 경우에 적용
주의) @Before과 @After를 모두 사용하는 경우 (아니면 둘중 하나만 사용하더라도)
@Test가 여러개 출현할 때 각 @Test마다 @Before, @After가 반복 수행된다.
메이븐 중앙 저장소 (https://mvnrepository.com/) 에서 JUnit 검색해서 pom.xml에 적용해주자
https://mvnrepository.com/artifact/junit/junit/4.13.2 이거로 적용하자 코드 복사해서 붙여 넣으면 된다
Maven Repository: junit » junit » 4.13.2
JUnit is a unit testing framework for Java, created by Erich Gamma and Kent Beck. junit junit 4.13.2 test // https://mvnrepository.com/artifact/junit/junit testImplementation group: 'junit', name: 'junit', version: '4.13.2' // https://mvnrepository.com/art
mvnrepository.com
---
<dependency>
<groupId>org.bgee.log4jdbc-log4j2</groupId>
<artifactId>log4jdbc-log4j2-jdbc4</artifactId>
<version>1.16</version>
</dependency>
studyjdbc의 pom.xml의
==jdbc== 아래의
첫번째 dependency 삭제한것임
어떻게 다시 복구함?
https://mvnrepository.com/ 접속하자
검색창에 log4jdbc 검색
구글이 만든건 쓰지 않는다!
bgee에서 만든걸로 쓰자
2. Log4Jdbc Log4j2 JDBC 4 1
7. Log4Jdbc Log4j2 JDBC 4
4로 해보자 클릭!
버전에 색깔이 칠해져 있다면 쓰면 안 된다!
최신버전 (1.16)으로 쓰자 클릭
메이븐 탭에 코드가 작성되어 있다.
이걸 복사해서 (url은 지워주자) pom.xml에 붙여넣어주면 된다! 쉽죠?
---
*** 웹 어플리케이션 규약 (표준) ***
1) Document Root 역할을 하는 폴더가 있어야한다. (우리에게는 webapp 폴더)
2) Document Root 역할의 폴더 밑에는 WEB-INF라는 폴더가 있어야 한다. (우리에게는 webapp/WEB-INF 폴더)
3) WEB-INF 폴더 밑에 웹 어플리케이션 설정파일인 "web.xml" 파일이 있어야한다. (우리에게는 webapp/WEB-INF/web.xml 파일)
- 예전 규약에서는 필수였지만 지금은 선택! 하지만 필수로 만들어두자
* 위에서 언급된 Document가 무엇인가? (2가지)
1) 정적인 문서 (Static Document) - XXX.html, XXX.css, XXX.js, XXX.XXX.,jpg, XXX.mp3/mp4등등 변하지 않는 파일
2) 동적인 문서 (Servlet/JSP) : 매번 브라우저 요청시마다, 그 내용이 변하는 문서
* 위에서 언급된 Document Root는 무엇인가?
- 정적인 문서 + 동적인 문서 파일들을 저장하는 top-level 디렉토리를 의미
아파치 톰캣
파워쉘 관리자
cd $env:CATALINA_HOME
cd bin
catalina + tap -> .\catalina.bat -> 용법을 알려준다 용법을 알아보자
.\catalina.bat version -> 버전정보 알려줌
.\catalina.bat configtest -> 톰캣 9의 설정 파일들이 제대로 구성되어 있는지 톰캣의 설정파일 중 하나인 server.xml 파일의 문법적 오류 체크
-> 한글이 깨지면 chcp 65001 (utf-8로 변경)
.\catalina.bat run/start -> 현재 창에서 실행 / 새로운 창에서 실행 -> run만 쓰세요
-> 이 후 웹 브라우저에서 http://localhost:8080/ 톰캣 화면 뜨면 성공!
- Manger App 눌러서 로그인하자
파워쉘 관리자 새창
cd $env:catalina_home
cd webapps
cd root
윈도우 탐색기
C:\app\scoop\apps\tomcat9\current\webapps\root
이것이 위에 언급한 Document Root입니다!!!
웹 브라우저에서 http://localhost:8080/favicon.ico 쳐보면 루트 파일의 favicon.ico 그대로 보여줌
- tomcat.css, sample.js, bg-button.png 등도 해보셈 그대로 보여준다
- 참고로 루트 폴더만 이렇게 바로 친다. 다른 폴더는 폴더명을 적어줘야한다 (http://localhost:8080/ 이게 ROOT 폴더를 의미)
http://localhost:8080/examples/index.html 이렇게 쳐보면 형제폴더의 exmaples 안의 파일을 보여준다
다른 폴더의 파일도 한번 해보세용~!
* Context Path / Context Root => 각 웹 어플리케이션마다 고유하게 배정받은 경로를 의미 (톰캣 Manager.app 에서 확인가능)
ex) /경로명 => 특정 웹 어플리케이션의 document root를 의미
---
HTTP Request
HTTP 요청은 다음과 같이 3가지 요소로 구성된다.
1) 요청 라인(Request Line) : HTTP 메서드 방식 및 요청 URL과 프로토콜 정보를 갖는다.
2) 요청 헤더(Request Header) : 웹 브라우저 정보, 언어, 인코딩 방식, 요청 서버 정보 등과 같은 추가 정보를 갖는다.
3) 요청 본체(Request Body) : 요청에 필요한 내용을 갖는다. 일반적으로 HTML 폼 태그안에 입력된 값들인 파라미터 정보를 의미한다.
HTTP Response
HTTP 응답은 다음과 같이 3가지 요소로 구성된다.
1) 상태 라인(Status Line) : 응답 상태 코드 및 프로토콜 정보를 갖는다.
2) 응답 헤더(Response Header) : 응답처리 날짜, 인코딩 방식, 요청 서버 정보 등과 같은 추가 정보를 갖는다.
3) 응답 본체(Response Body) : 응답에 필요한 내용을 갖는다. 일반적으로 HTML 문서이다
---
*Maven 기반의 웹 어플리케이션 개발을 위한 프로젝트의 설정 파일들
(1) pom.xml - Apache Maven Configuration
- 이 파일을 단 한글자라도 수정하면 반드시 Maven Update Project을 수행하라!
(2) web.xml - Deployment Dexcriptor by Web Application Spec.
- 이 파일이 수정되면 WAS를 restart 해야한다.
- 더불어서, Maven Update Project 겸해서 수행하라!!! (**)
(3) log4j2.xml - Configuration of log4j2 for DataSource, Spring Framework, JUnit Test Framework
Driver spy JDBC, and so on...
-> 위 세가지는 반드시 설정하여야한다!
-> 이미 잘 만들어진 다른 프로젝트의 파일을 가져다가 쓰면 된다. (pom.xml에서 이름만 수정 (아래 2) 참고)
---
*** 메이븐 프로젝트 생성해보자
1) 메이븐 프로젝트 생성 - 웹앱으로, artifact id는 원하는 프로젝트명, package 뒤에 붙는건 myapp으로 고정!
2) pom.xml (-> 우클릭 -open with - other - code workspace source file - 여기서 otherartificialid, name, url 프로젝트명이랑 같게 고쳐줌)
web.xml / log4j2 각각 알 맞는 폴더에 옮겨줌
3) 프로젝트 우클릭 -> 메이븐 업데이트 한번 해주자
* Servers no available 뜬다면?! 클릭 후
- 아바치- 아파치9.0 - ***server's host name : pc이름으로 하자(파워쉘 hostname : DESKTOP-3CDN8SV) - 서버네임 : Tomcat v9.0 -> 넥스트
- 브라우즈 - C:\app\scoop\apps\tomcat9\current / JRE - 테무린11jdk 넥스트! - 피니시!
- 이클립스 아웃라인탭 밑 서버즈탭에 톰캣 9.0 더블클릭 (중요!!! 한번 저장하면 변경 불가)
- 서버 로케이션 - use tomcat installation 클릭/ 서버 옵션즈 - publish module contexts 어쩌구 클릭
이제 서버즈 탭에서 스타트, stop 눌러주면 됩니다~
4) 자 이제 프로젝트 우클릭 찍고 아래에서 위로 하나씩 설정해줍시다
5) web project settings : context root : /
6) web content settings : HTML5, CSS3
7) targeted runtimes : tomcat 9.0 체크. 없으면 day 073 참고
8) Maven 아래 project facets : Dynamic web module 4.0, java 11
9) jsp fragments : language java, content type : text/html 체크
10) java compiler 11 인지 확인
11) java build path
- 1. main test 알맞게 추가 (미싱뜨면 그냥 삭제),
(폴더 있는데 안 뜨면 애드폴더 들어가서 있는 폴더 체크해주고 피니시)
(디폴트 아웃풋 폴더는 target\classes)
(테스트 폴더는 contains test sources : yes, Output folder : test-classes로)
- 2. library에 JRE System Library 11, Maven Dependencies, Server Runtime 있는지 확인. (서버 없으면 클래스 패스찍고 애드 라이브러리)
- 3. 순서 맞추기 / 메인 (자바-리소스) / 테스트 (자바-리소스) / JRE-Maven-Server순서!
12) deployment assembly : test폴더는 삭제, add 눌러서 java build path entries > maven 추가
13) resource : other - utf8
14) 이제 자바 파일 만들 때 패키지를 org.zerock.myapp로 설정해주면 된다.
- log4j2 파일 열어서 <Logger name="여기에 패키지명 입력" level="trace" /> 여기를 수정해도 된다
----------------------------------------------------
WAS - Servlet + JSP + EJB
서블릿 개요
서블릿은 웹 컨테이너에 의해서 관리되며,
다양한 클라이언트 요청에 의해서 동적인 콘텐츠(content)로
응답 가능한 자바 기반의 웹 컴포넌트이다.
서블릿 웹 컴포넌트의 특징
- 자바기반의 웹 컴포넌트로서 java 확장자를 갖는다.
- 클라이언트의 요청에 의해서 동적으로 실행된다. 따라서 다양한 클라이언트 요구사항을 처리할 수 있다.
- 클라이언트는 브라우저를 이용한 URL 지정을 통해서 서블릿에 요청이 가능하다.
- 서블릿의 응답결과는 일반적으로 HTML 형식으로 서비스된다. 따라서 자바 코드를 이용해서 클라이언트에 HTML 코드로 전송하는 추가 작업이 필요하다.
하지만 MVC 패턴을 적용하여 웹 어플리케이션을 개발한다면, 서블릿이 아닌 JSP에서 HTML 코드를 작성하게 된다.
- 서블릿은 반드시 웹 컨테이너에 의해서 관리되며, 자바 스레드로 동작되기 때문에 효율적으로 사용이 가능하다.
- MVC 패턴의 Controller 역할로서 서블릿이 사용된다.
서블릿 생성
패키지 잡고 우클릭해서 new - servlet 해주면 된다.
*** 서블릿 생성 주의사항
Super class에는 서블릿이 상속받는 클래스명을 지정하는 곳으로 자동으로
‘javax.servlet.http.HttpServlet’로 지정된다. 서블릿을 작성하기 위해서는 반드시
HttpServlet 클래스를 상속받아야 된다
@Log4j2
@NoArgsConstructor
@WebServlet("/Hello")
public class HelloServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
@Override
protected void service(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {
log.trace("service(req, res) invoked.", req, res);
try {
// ============ 응답 문서의 생성 및 전송 =============
res.setCharacterEncoding("utf8");
@Cleanup // 자원객체 닫는 방법 1 -> 순서 상관 없이 닫을 떄
PrintWriter out = res.getWriter();
// // 자원객체 닫는 방법2 -> 순서 있게 닫을 때
// try (out) {
out.println("<html><head></head><body>");
out.println("<h1>Hello, World!!!</h1>");
out.println("</body></html>");
out.flush();
// } // try-with-resources
// int value = Integer.parseInt("백"); // 예외발생코드 (예외가 생기면 어떻게 될까?)
} catch (Exception e) {
throw new IOException(e);
} // try-catch
} // service
} // end class
@Log4j2
@NoArgsConstructor
// Servlet의 Lifecycle과 그 callback 메소드들을 이해하자
@WebServlet({ "/Lifecycle1", "/Lifecycle2" })
public class LifecycleServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
@Override
public void init(ServletConfig config) throws ServletException {
log.trace("inint({}) invoked.", config);
} // init
@Override
public void destroy() {
log.trace("destroy({}) invoked.");
} // destroy
@Override
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
log.trace("service(req, res) invoked.");
} // service
}
'국비학원' 카테고리의 다른 글
[국비지원] KH 정보교육원 76일차 (0) | 2022.07.15 |
---|---|
[국비지원] KH 정보교육원 75일차 (0) | 2022.07.14 |
[국비지원] KH 정보교육원 68일차 (0) | 2022.07.04 |
[국비지원] KH 정보교육원 67일차 (0) | 2022.07.01 |
[국비지원] KH 정보교육원 66일차 (0) | 2022.07.01 |