딸기말차
[Java web] 7. Web 복습, Oracle 본문
엔코아 플레이데이터(Encore Playdata) Backend 2기 백엔드 개발 부트캠프 (playdata.io)
백엔드 개발 부트캠프
백엔드 기초부터 배포까지! 매력있는 백엔드 개발자 포트폴리오를 완성하여 취업하세요.
playdata.io
1. Java Web
Java Web은 현재 개발 시 많이 사용하는 스타일로 발전되어 오기까지 다양한 방법으로 개발되어왔다.
해당 과정을 나열하자면,
1. 클라이언트-PC 기반 프로그램
순수 JAVA이고, 클라이언트 기반이기 때문에 관리자모드가 없다.
특징
1. PC에서 실행하기 때문에 반드시 프로그램을 설치해야한다.
2. 프로그램이 변경될 때마다 일일이 다시 설치해야한다.
3. DB 접속정보 같은 중요데이터가 쉽게 노출될 수 있어 보안에 취약하다.
2. 클라이언트-서버 기반 프로그램
모든 기능을 서버에서 수행하고, 클라이언트 프로그램 form 태그 같은 태그를 통해 화면 기능과 데이터 송수신만 제공한다.
특징
1. 기능이 변경 되어도 서버에서 처리하기 때문에 클라이언트 프로그램은 수정하지 않아도 된다.
2. 중요기능을 서버에서 처리하기 때문에 보안이 우수하다.
3. 다만, 클라이언트 화면기능이 바뀌면 클라이언트 프로그램도 수정해서 다시 설치해야한다.
3. 웹 기반 프로그램
브라우저에서 웹 페이지를 요청하면, 서버에서 전송 된 HTML을 화면에 표시해 준다.
특징
1. 화면, 로직을 서버에서 처리하기 때문에 클라이언트가 수행할 작업이 없다.
2. 모든 기능을 서버에서 처리하기에 보안이 좋다.
2. 웹 프로그래밍
웹 페이지는 정적 페이지, 동적 페이지로 나뉜다. 해당 페이지들을 구현하는 프로그래밍을 알아보자면,
1. 정적 웹 프로그래밍
서버에 html, css, js를 저장해두고 브라우저가 요청하면 그대로 전달한다. 주로 화면 디자인 및 클라이언트의 이벤트 처리를 java script를 통해 해결한다.
구성요소
1. 클라이언트
2. 웹 서버
3. HTTP 프로토콜 (서버 - 클라이언트 사이의 정보를 주고받는데 사용된다.)
4. HTML (화면 구성)
5. CSS (화면 꾸미기)
6. Java Script (이벤트 처리)
문제점
1. 실시간으로 변하는 정보를 뿌리려면 HTML 코드를 계속 업데이트해야 한다.
2. 즉, 사용자에게 고정 된 정보만 전달할 수 있다.
2. 동적 웹 프로그래밍
정적 웹 프로그래밍에서 관리자의 역할을 WAS 서버가 실행하여, 클라이언트의 요청이 있을 때마다 DB에 접근, 실시간 정보를 얻어와 클라이언트에게 전송한다.
JSP
1. 브라우저 요청 시 thread 방식으로 실행하기 때문에, 효율적으로 기능을 수행한다.
2. 요구를 처리하는 기능을 최초 한 번만 메모리에 로드 후, DB와 연동해 정보를 가져와 클라이언트에게 결과를 반환한다.
3. 이 후, 동일한 기능요청이 들어올 시 메모리 내의 기존에 사용한 기능을 재사용한다.
4. 때문에 프로세스 방식보다 더 빠르게 수행된다.
3. 웹 어플리케이션
1. 정의
기존의 정적 웹 어플리케이션 기능을 사용하며, 서블릿 & JSP & 자바 클래스 등을 추가해 사용자에게 동적인 서비스 제공한다.
이러한 웹 어플리케이션을 실행하려면 톰캣에 등록이 되어야한다.
2. 기본구조
1. WEB-INF : 웹 어플리케이션에 관한 정보를 저장. 외부접근 불가(톰캣이 접근 불가)
2. classes : 웹 어플리케이션이 수행하는 서블릿과 다른 일반 클래스들이 위치
3. lib : 웹 어플리케이션에서 사용하는 여러 라이브러리들 저장
4. web.xml : 웹 어플리케이션에 대한 여러 설정들을 저장하는 파일
3. 구성요소
1. html(jsp) / css / js / image
2. bin : 어플리케이션에서 사용되는 각종 실행파일 저장
3. src : 자바 소스파일 저장
4. conf : 프레임워크에서 사용하는 각종 설정파일 저장
4. 접속주소
1. localhost:포트번호
2. 127.0.0.1:포트번호
두 주소는 기본적으로 동일하지만, 쿠키를 사용할 땐 생성위치가 달라진다.
localhost:포트번호 접속 : JSESSIONID 이라는 톰캣 컨테이너에서 세션을 유지하기 위해 발급하는 key, value가 있다.
127.0.0.1:포트번호 접속 : JSESSIONID가 없다.
해당 차이는 localhost로 접속할 시 DNS 서버를 거쳐 127.0.0.1 로 변경되기 때문에 발생한다.
5. Context
1. context란 톰캣의 server.xml에 등록되는 어플리케이션이다.
2. 웹 어플리케이션 당 하나의 context가 등록된다.
3. context 이름은 톰캣 내부에서 중복되면 안된다. 대소문자 구별도 가능하다
4. 톰캣은 모든 설정 정보를 xml로 저장 후 실행 시 읽어와 실행한다.
5. 때문에 우리가 만든 어플리케이션도 <Context> 를 이용해 등록해야 실행 가능하다.
6. Deploy(배치)
개발이 완료 된 웹 어플리케이션을 실제 사용자에게 서비스하기 위한 작업으로,
1. Eclipse 내 개발 완료한 프로젝트를 export
2. export 시 경로를 C:\Program Files\Apache Software Foundation\Tomcat 9.0_Tomcat\webapps 로 준다.
3. 해당 경로는 C 드라이브 내 tomcat이 깔려있는 경로의 webapps 폴더이다.
4. Servlet
servlet 이란, 서버 내에서 실행되며 클라이언트의 요청에 따라 동적으로 서비스를 제공하는 자바 클래스를 의미한다.
1. 동작과정
1. 클라이언트의 요청
2. 웹 서버에서 요청, 파라미터 전송 -> 해당 권한을 WAS 서버로 양도
3. WAS 서버에서 서블릿 호출
4. 실행 -> 결과를 WAS 서버로 반환
5. WAS 서버 -> 웹 서버로 결과 전달
6. 실행 결과를 클라이언트가 확인
2. 특징
1. 서버 내에서 실행하기 때문에, 보안 기능 적용이 쉽다.
2. 동적인 여러 기능 제공
3. 메모리에 올려 thread 방식으로 실행하기 때문에, process 방식보다 빠르다.
4. 객체지향으로 구성되어 있고, 컨테이너(WAS 서버) 종류에 관계없이 실행 가능하다.
3. HTTPServlet의 메서드
각 요청에 따라 doGet(), doPost(), doDelete(), doHead() 등이 존재한다.
Servlet의 생명주기
1. 클라이언트의 요청
2. init() 을 통한 servlet 초기화
3. public service()의 파라미터로 ServletRequest, ServletResponse를 전달
4. 전달 된 ServletRequest, ServletResponse를 public service() 내에서 각각 HttpServlertRequest, HttpServletResponse로 변환
5. 변환 된 파라미터를 protected service()의 파라미터로 전달, 호출
6. 요청에 따라 doxxx() 를 호출
7. 작업이 완료되면 destroy()를 통해 servlet 종료
해당 메서드들을 테스트 하기위해 overload하여 실행해보았다.
@WebServlet("/login")
public class LoginServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public LoginServlet() {
super();
}
public void init(ServletConfig config) throws ServletException {
System.out.println("서블릿 초기화");
}
public void destroy() {
System.out.println("서블릿 소멸");
}
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("서블릿 서비스 중");
doGet(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
String user_id = request.getParameter("user_id");
String user_pw = request.getParameter("user_pw");
System.out.printf("id : %s pw : %s\n", user_id, user_pw);
// System.out.printf("num1 : %d num2 : %d\n", 10, 20);
// System.out.printf("float1 : %.2f float2 : %.3f\n", 1.123123, 2.123123);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
4. request 객체로 전달 된 여러종류의 변수명, 해당 값 가져오기
기존에 request 객체로 전달 된 값을 가져오기 위해서는 단순히 request.getParameter("변수명") 을 사용했다.
하지만 이 방식은 전달 되는 변수가 많을 수록 코드가 길어진다는 단점이있다.
때문에 전달 된 파라미터들을 한번에 받기 위해선,
<form action="input" method="get">
<input type="checkbox" name="sub1" value="java"> 자바 <br>
<input type="checkbox" name="sub2" value="c"> 씨 <br>
<input type="checkbox" name="sub3" value="python"> 파이썬 <br>
<input type="checkbox" name="sub4" value="jsp"> jsp <br>
<input type="checkbox" name="sub5" value="servlet"> 서블릿 <br>
<input type="submit" value="제출">
<input type="reset" value="취소">
</form>
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
// 1. name이 모두 같을 때 값 가져오기
String[] subs = request.getParameterValues("sub");
for (String s : subs)
System.out.println(s);
// 2. name이 서로 다를 때 name들 가져오기
Enumeration<String> subs = request.getParameterNames();
for (; subs.hasMoreElements();)
System.out.println(subs.nextElement());
while (subs.hasMoreElements()) {
System.out.println(subs.nextElement());
}
// 3. name이 서로 다를 때 name, value 가져오기
Map<String, String> paramMap = new HashMap<>();
request.getParameterNames().asIterator()
.forEachRemaining(paramName -> paramMap.put(paramName, request.getParameter(paramName)));
for (Map.Entry<String, String> entry : paramMap.entrySet())
System.out.println("key : " + entry.getKey() + " value : " + entry.getValue());
}
5. Cookie
쿠키란, Web browser에서 만들어지는 임시 저장소이다. 또한 쿠키는 객체는 저장이 불가능하고, 문자열만 저장 가능하다.
일반적으로 localhost와 127.0.0.1은 같은 주소라 볼 수 있다.
하지만 쿠키를 웹 브라우저 내에서 쿠키를 생성할 땐 차이가 발생하는데,
왜냐하면 쿠키는 접속주소에 따라 쿠키명이 정해지기 때문이다.
쿠키를 실습하기 위한 코드를 작성해보았다. 유의할 점은, 해당 코드에선 response에 사용자가 직접 쿠키명과 값을 입력해주지만, 해당 정보는 웹 브라우저에서 만들어주는 쿠키와는 별개라는 점이다.
@WebServlet(
description = "테스트용 서블릿",
urlPatterns = { "/test" },
initParams = {
@WebInitParam(name = "ID", value = "admin", description = "관리자 아이디 초기값")
})
public class TestServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public void init(ServletConfig config) throws ServletException {
System.out.println("-----> 서블릿 초기화");
}
public void destroy() {
System.out.println("-----> 서블릿 소멸");
}
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("-----> 서블릿 서비스 중");
doGet(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Cookie c1 = new Cookie("ID", "user");
Cookie c2 = new Cookie("PW", "1234");
response.addCookie(c1);
response.addCookie(c2);
Cookie[] cooks = request.getCookies();
System.out.println(cooks[1].getName());
System.out.println(cooks[1].getValue());
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
6. Math Class, form 태그 옵션
자주 사용하는 Math 클래스의 메서드와 form 태그의 옵션에 대해 정리해보았다.
1. Math & Random 클래스
1. Math.round() : 반올림
ex) Math.round(2.789) -> 3.0
2. Math.floor() : 버림
ex) Math.floor(2.123) -> 2.0
3. Math.ceil() : 올림
ex) Math.ceil(2.232) -> 3.0
4. Math.random() : 0 ~ 1 사이 임의의 실수 만들 때 사용 -> 이게 불편해서 Random class를 사용한다.
Random random = new Random()
random.nextInt() : 임의의 정수 -> 0, 1, 2
random.nextFloat() : 임의의 실수
2. form 태그 옵션
encType : form 태그에서 전송할 데이터의 encoding 타입을 지정
multipart/form-data : form 태그에서 파일 업로드 시 지정
form 태그 내 name 속성 : javascript로 전송 전 옵션을 주고싶을 때 사용
7. Oracle
수업 중 기존엔 MySQL을 사용했지만, 다양한 DB 사용 연습을 위해 Oracle 사용으로 변경되었다.
1. 오라클 접속
1) cmd -> sqlplus
2) id : system (사용자 계정을 만드려면 반드시 system으로 접속해야한다)
3) pw : 0000
2. 사용자계정 만들기 (오라클은 사용자계정을 통해 table을 만들기 때문에 user를 만드는게 곧 db를 만드는것이다)
1) create user 사용자계정 identified by 비밀번호;
2) 권한부여 : grant resource, connect to 사용자계정;
- table 관련된것 : resource
- 외부 접속가능 : connect to 사용자계정
여기까진 system 계정으로 만든 것이기 때문에 일단 exit로 나가고,
다시 sqlplus를 눌러 방금만든 사용자계정으로 로그인해야한다.
오라클은 설치 후 윈도우 부팅 시 자동으로 실행된다. 하지만 백그라운드에서 계속 돌아가기 때문에,
컴퓨터가 느려질 수 있다는 단점이 있다.
때문에 필자는 윈도우에서 오라클 서비스를 수동 실행으로 변경하고, 부팅 시 서비스를 실행하는 방법을 택했다.
윈도우 서비스 내 oracleServiceXE / oracleXETNListener -> 수동 실행
oracle port -> localhost:1521:xe
DBMS
뷰 : 기존 테이블을 이용한 가상 테이블
시퀀스 : auto_increament라는 값을 사용하기 위한 테이블을 집어넣는 곳. 시퀀스 테이블을 만들어야 auto_increament를 사용할 수 있다.
인덱스 : 어떤 데이터를 빨리 찾기위한 색인을 만드는 것 (DB개발자들이 많이씀)
8. 19일차 후기
기존에 수업 및 프로젝트로 진행했던 내용을 복습했던 시간이다. 저번 프로젝트까지 사용하지 않았던 쿠키가 주소에 따라 다르게 생성된다는 점을 알 수 있었고, Servlet이 어떤 메서드를 통해 어떤 순서로 실행되는지를 알 수 있었다.
DB도 MySQL이 아니라 Oracle로 바꿔 사용할 예정이다. 실제 필드에선 다양한 DB를 사용하기 때문에, 기존에 사용해본적이 없던 Oracle DB 스타일에 맞춰, Mybatis와 연계해 사용하는 연습을 하면 많은 도움이 될 것 같다.
'Bootcamp > Java web' 카테고리의 다른 글
[Java web] 9. Servlet Context, Servlet Config (0) | 2023.07.27 |
---|---|
[Java web] 8. Oracle JDBC, DispatcherServlet (0) | 2023.07.25 |
[Java web] 6. Mini Project_2 (0) | 2023.07.22 |
[Java web] 5. EL, JSTL, Java Beans (1) | 2023.07.18 |
[Java web] 4. Session, JSP tag (0) | 2023.07.15 |