Another Brain

35일차(7월 7일)_ Front DataSource 본문

P/Web

35일차(7월 7일)_ Front DataSource

뉸누나ㄴ나 2021. 7. 7. 22:02

FrontController / Servlet 3.x Annotation / Connection Pool : DataSource / HttpSesssion

 

getOutputStream()  ServletOutputStream  : byte단위

getWriter() java.io.PrintWriter 

 

## 회원관리 Controller 클래스 
-- 요청-응답 제어 담당 클래스
-- package com.work.controller;
-- MemberControllerServlet
-- FrontController


## 회원관리 서비스 클래스 
-- 업무로직 담당 클래스
-- 로그인, 회원가입 등 서비스 구현
-- package com.work.service;
-- MemberService.java


## 회원 도메인 클래스
-- 회원 속성 모델링 클래스 
-- package com.work.dto;
-- Member
-- 도메인 속성: 
1. 아이디 : memberId
2. 비밀번호 : memberPw
3. 이름 : name
4. 휴대폰 : mobile
5. 이메일 : email
6. 가입일 : entryDate
7. 등급 : grade
8. 마일리지 : mileage
9. 담당자  : manager


## 회원 도메인 클래스
-- DTO Pattern
>> Encapsulation : private 멤버변수, public setter(), public getter()
>> 직렬화객체 : java.io.Serializable interface implments : marked interface(구현메서드는 없음)
>> setter()/getter() 메서드 이름 규칙 반드시 준수


-- JavaBean Component
>> package 선언
>> Encapsulation
>> 기본 생성자 선언


## 회원등록 요청 구현
-- view : 요청화면
>> 회원등록 요청페이지 : 
시작페이지 회원가입 >> joinForm >> join.jsp >>
 
>> 회원등록 요청
회원가입페이지 등록 >> join.jsp >> join >> MemberControllerServlet

-- controller
>> MemberControllerServlet 
>> joinForm()
>> join()

-- model : MemberService
>> 회원등록 메서드 추가 구현 : addMember(Member): boolean
>> 회원등록 사용자 입력 데이터 : 아이디, 비밀번호, 이름, 휴대폰, 이메일
>> 신규회원 정보 시스템 추가 데이터 : 가입일(현재날짜-자바 Utility.java) 등급(G)
>> com.work.util.Utility : java 구현한 클래스 가져와서 사용


## FrontController
-- 현재 서블릿 구현 : 요청당 하나의 서블릿 클래스 설계, form서블릿 + 요청서블릿 2개 클래스 설계
-- 단일 서블릿 그룹핑, 서브시스템 단위 단일 서블릿 그룹핑 
-- Query String 
>> url ? key=value & key=value


## Servlet 환경설정
-- servlet2.x
>> web.xml
>> <url-pattern>
>> <load-on-startup>

-- servlet3.x
>> web.xml
>> Annotation 추가

## Servlet Annotation
-- 선언위치 : 서블릿클래스 선언문 앞
-- 기본형식 : @WebServlet()
-- 웹프로젝트 생성시에 Servlet 버전을 3.x 선택
>> web.xml 생성 선택사항

-- 1. 
@WebServlet("/loginForm")

-- 2. 
@WebServlet(value="/mms04/login")

-- 3. 다중 url-pattern 설정
@WebServlet(urlPatterns = {"/mms04/login", "/aaa/xxx"})

-- 4. load-on-startup
@WebServlet(
urlPatterns = {"/mms04/memberCollection"}, 
loadOnStartup = 1
)

## 서블릿에서 응답페이지 이동 방법
-- redirect
=> 새로운 요청으로 응답페이지 이동
=> 기존 요청객체, 응답객체 버리고 새로운 페이에서 새로운 요청객체, 응답객체 
=> 코드 : response.sendRedirect("url");

-- forward 
=> ServletRequest >> RequestDispatcher getRequestDispatcher(String path)
=> RequestDispatcher >> forward(ServletRequest request, ServletResponse response)

=> 요청객체에 응답위한 값 설정 메서드
>> setAttribute(String name, Object object) : void
>> getAttribute(String name) : Object => type casting 필요


## 웹 자원 및 서블릿 경로설정 : 
-- view 자원위치 : WebContent\xxx> 서브폴더 기반으로 변경 *.jsp 
-- url-pattern : "/xxx/기존url-pattern"

-- 경로설정: "/웹컨텍스트명/xxx" 기반 상대경로 설정
<a href="/웹컨텍스트명/xxx">xxx</a>
<form action="/웹컨텍스트명/xxx">

>> servlet : redirect
response.sendRedirect("/웹컨텍스트명/xxx/aaa.jsp");

>> servlet : forward(주의사항) : 
>> 현재 url 주소를 기준으로 현재 컨텍스트 기준 상대경로지정, 따라서 컨텍스트명 표기하지 않음(규칙)
>> request.getRequestDispatcher("/xxx/message.jsp");
RequestDispatcher nextView = request.getRequestDispatcher("/xxx/message.jsp");
nextView.forward(request, response);


## JDBC 프로그래밍을 위한 사전 준비사항
1. DBMS : Oracle11g(XE)
2. JDBC API : JavaSE(포함설치) : java.sql.*, javax.sql.*, javax.naming.*
3. JDBC DRIVER
-- DB벤더가 구현해서 제공하는 라이브러리
-- ORACLE : ojdbc6.jar (6:jdbk1.6)
-- 위치 :
=> 공통 : 
>> C:\Program Files\Java\jdk1.8.0_202\jre\lib\ext> ojdbc6.jar
>> C:\Program Files\Java\jre1.8.0_202\jre\lib\ext> ojdbc6.jar

=> 어플리케이션 단위 : 
>> (dos) set classpath=xxx\ojdbc6.jar 설정 추가
>> (dos) javac -classpath xxx\ojdbc6.jar 설정 추가
>> (eclipse) project > properties > Java Build Path > Libraries > External jars

## JDBC 주요 API
-- package : java.sql.*, javax.sql.*, javax.naming.*
  1. Class.forName(driver)
  2. DriverManager.getConnection(url, user, password)
  3. Connection
  4. Statement / PreparedStatement / CallableStatement
  5. ResultSet
  
-- Connection Pool
  6. javax.sql.DataSource
  7. javax.naming.Context

  
## JDBC 프로그래밍 순서
  1. jdbc driver 로딩 : 생성자
-- Class.forName(driver);
  
  2. db 서버연결
-- Connection conn = DriverManager.getConnection(url, user, password);
  
  3. sql 통로개설 : Statement / PreparedStatement / CallableStatement
-- Statement stmt = conn.createStatement();
  
  4. sql 수행요청 : executeUpdate():int / executeQuery():ResultSet / execute() : boolean
-- CRUD : 추가, 조회, 변경, 삭제 
-- CUD : executeUpdate():int
-- R : executeQuery():ResultSet *****
-- DDL : execute() : boolean
  
  5. sql 결과처리 
-- int : CUD 수행한 결과 행수 
-- ResultSet : R select 수행한 결과 레코드 
-- ResultSet 결과값 가져오기 위한 함수
>> 커서 이동 메서드 : next():boolean
>> 현재 커서(row 행)의 컬럼단위로 데이터 가져오기
>> getXxx("컬럼명"):xxx타입, getXxx(select_index_no), index_no 시작은 0번부터
>> getString("name") : String
>> getInt("mileage") : int
  
  6. 자원해제
-- ResultSet#close()
-- Statement#close()
-- Connection#close()
  
  
## JDBC 예외처리
  1. ClassNotFoundException
  2. SQLException
     

## SQL 구문 수행 통로
-- Statement
>> 빈 통로
>> 동적 sql 요청
>> sql + 데이터 함께 서버 전송 : n/w 트래픽 많이 발생
>> sql 문자열 변환 별도로 수행 불편 : "'user01'"
>> 보안이슈 : sql injection

>> 예시
Connection conn = DriverManager.getConnection(url, user, password);
Statement stmt = conn.createStatement(); // 빈통로
ResultSet rs = stmt.executeQuery("select * from member where member_id='" + memberId + "'");

-- PreparedStatement
>> 전용 통로
>> 정적 sql 요청 (사전에 정의된 sql 전용)
>> 데이터만 서버 전송 : n/w 트래픽 감소
>> pstmt.setString(1, memberId) : 자동으로 sql 문자열 변환
>> 보안이슈 발생예방 : sql injection => 사용자 입력데이터가 sql 구문의 데이터로 처리됨

>> 예시
Connection conn = DriverManager.getConnection(url, user, password);

String sql = "select * from member where member_id=? and member_pw=?"
PreparedStatement pstmt = conn.prepareStatement(sql) // 통로개설시에 아규먼트로 sql 구문전달, 미완성통로
// ? 에 매핑되는 값을 순서대로 설정 : setXxx(?-index-no, 값), xxx 데이터 타입, 완벽한 전용통로 개설완료
pstmt.setString(1, memberId);
pstmt.setInt(x, mileage);

// sql 수행요청 : 주의사항 아규먼트가 없음
ResultSet rs = pstmt.executeQuery();

-- CallableStatement
>> db server 저장되어 있는 stored procedure 또는 stored function 호출 : PL/SQL


## PreparedStatement 오류
-- java.sql.SQLException: 인덱스에서 누락된 IN 또는 OUT 매개변수:: 2
>> ? 매핑 되지 않았을때 발생
-- java.sql.SQLException: ORA-03115: unsupported network datatype or representation
>> executeQuery(sql) : sql 수행메서드에 아규먼트 지정시 발생

  
## JDBC SQL 구문 수행시 유의사항
-- '데이터' : SQL 문자열은  단일 인용부호로 감싸야함
-- SQL 수행문뒤에 ;(세미콜론) 표기해서는 안됨

 
## JDBC 관련 Pattern
-- DAO Pattern
-- DTO Pattern
-- Singleton Pattern
-- Factory Pattern

## Singleton Pattern 설계 규칙
-- 목적 : 하나의 클래스(class)에 대해서 단일 인스턴스(instance/object) 설계
-- DAO 클래스에 적용 설계 : MeberDao 설계 변경

-- 설계 규칙 : 
1. private static 클래스이름 instance = new 클래스이름();
2. private 생성자(){}
3. public static 클래스이름 getInstance() { return instance; }

-- Singleton Pattern 클래스 사용 
>> 직접 객체 생성 불가
4. 클래스이름 참조변수명 = 클래스이름.getInstance();


## Eclipse 단축키

Ctrl + D : 한 줄 삭제

Ctrl + F : 찾기 / 바꾸기

Ctrl + Z : 실행 취소

Ctrl + Y : 실행 되돌리기

Ctrl + / : 드래그영역 라인주석(//)

Ctrl + Shift + / : 드래그영역 다중주석(/**/)

Tab : 들여쓰기

Shift + Tab : 내어쓰기

Ctrl + Space : 자동완성(관련 함수, 변수명 등)

Ctrl + F11 : Run as

 

##

ERROR : Several ports (8005, 8070) required by Tomcat v8.5 Server at localhost are already in use. The server may already be running in another process, or a system process may be using the port. To start this server you will need to stop the other process or change the port number(s).

 

=> 다른 workspace에서 서버를 사용하고 있어서 충돌이 일어남 

=> 다른 workspace 종료 

 

 

HTTP 상태 405 – 허용되지 않는 메소드

상태 보고

메시지 : HTTP 메소드인 POST는 이 URL에 의해 지원되지 않습니다.

설명 : 요청 행에 포함된 해당 메소드는, origin 서버에 의해 인지되었으나, 대상 리소스에 의해 지원되지 않습니다.

Comments