일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- Usecase Diagram
- oracle 11g
- 매일 타자연습
- Jupyter Notebook
- Java
- python 기초
- 카카오 오븐
- ORA-1017
- MySQL
- 유스케이스 다이어그램
- Oracle 18c
- 카카오맵 API
- 데이터베이스 접속
- 자바
- 카카오맵
- SQL Developer
- typing test
- Kakao Oven
- tuple
- Oracle 오류
- Python
- The Network Adapter could not establish the connection
- database
- CSV
- Kakao 지도 API
- Set
- oracle
- SEQUENCE
- SQL
- 10fastfingers.com
- Today
- Total
Another Brain
35일차(7월 7일)_ Front DataSource 본문
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 서버에 의해 인지되었으나, 대상 리소스에 의해 지원되지 않습니다.
'P > Web' 카테고리의 다른 글
41일차(7월 15일)_ Mybatis (0) | 2021.07.15 |
---|---|
39일차(7월 13일)_ Spring Boot 환경설정 (0) | 2021.07.13 |
34일차(7월 6일)_ WebUI mini-project 발표 / Servlet & JSP 개요 (0) | 2021.07.07 |
32~33일차(7월 2~5일)_ Web UI mini-project : 운동 정보 공유 사이트 (0) | 2021.07.02 |
29일차(6월 29일)_ JavaScript (0) | 2021.06.29 |