[공공데이터 개발] 0601 jsp 개념 정리

송경근·2023년 6월 1일
0

jsp/servlet 배우기

목록 보기
1/4

JDBC

java database connectivity
DB 서버에 원격으로 접속하기 위해 네트워크 연결 제공
자바 프로그램에서 DB 검색과 수정을 위한 SQL문을 전송하고 
서버로부터 결과를 받을 수 있도록 지원

DBMS 종류에 관계없이 공통 API를 이용해 일관성 있게 DB 작업 처리 가능
대신에 드라이버는 설치해야함

이렇게 넣어 놔야만 DB연결 준비가 끝난 것

API를 이용한 DB 접근방법

6단계로 이루어짐

    1. Java Reflection을 이용한 JDBC 드라이버 로딩
	2. 데이터베이스 접속을 위한 Connection 객체 생성
	3. SQL 명령문 전달을 위한 Statement 객체 생성
	4. Statement  객체를 이용한 쿼리 실행
	5. 데이터베이스로부터 전송된 쿼리 실행. 결과 처리
	6. 사용된 객체(Statement ,Connection 등 ) 닫기

1.

드라이버 로딩

	연결 안되신 분들은 JDBC파일을 js로 바꿔보세요~
	라고 하신게
	com.mysql.jdbc.driver.class
	>이 구문은 파일을 찾아들어가는 과정임!
	이게 어디있느냐하니
	우리가 web-inf 에 있는 lib에 넣어놓은 커넥터.jar 에 저장되어 있음

	처음에는 class.forName() 함수를 이용해 로딩했었음!

	driver 클래스를 JVM 메모리에 로딩
	>프로그램을 종료할 때 까지 적재되어 남아있음!

	이거까진 몰라도됨!
	

2.

Connection 객체 생성

	DriverManager.getConnection() 함수를 이용해 DB 서버와 네트워크 연결 생성

	접속할 네트워크위 주소를 먼저 입력하고 사용자 이름과 비밀번호를 입력해줌
	제일 밑에 커넥션 객체에 연결정보를 담게 되는 것

3.

Statement 객체 생성

	SQL문을 저장하고 실행하기 위해선 Statement 객체가 필수적으로 존재해야함! 

	우리는 update함수를 더 많이 썼었다
	셀렉트문은 반환값이 하나더라도 테이블형태로 반환됨
	어 근데 자바에는 테이블이 없는데?
	자바에서 테이블을 부르는 이름은 resultset 이라고 부름
	자료형이라고 볼 수도 있음 
	이 객체로 테이블을 받아서 사용함!
	보통 rs라고 객체 이름을 짓는다~

next() : 순회함수

		첫번째 값이 끝나면 다음값으로 쭉쭉쭉 값이 없을때까지!
		테이블 값을 출력할 수 있게 되는 것
	객체를 안닫아도 오류는 안남!
	근데 안닫으면 가비지컬렉터가 파업하게 됨
	메모리가 풀로 이용되다보면 프로그램이 다운될 가능성이 
    있기때문에(+메모리 효율성이 떨어질 수 있음) 명시적으로 닫아주는것
	

userList.jsp

	out객체를 만드는  printWriter가 어딘가에 생성되어 있을거야..
	
	톰켓에서 db에 요청해 받아낸 테이블은 rs에 저장됨!
	


나는 분명 잘했는데 500에러가 나는 경우가 있음!
	the server time zone : timestamp를 쓰는데 현재 여기 위치가 어디인지에 대한 설정이 필요함! 대부분의 컴퓨터들은 이미 위치가 잡혀있는데 종종 안잡혀있는경우가 있음!

해결방법은

	서버 타임존을 설정하면 된다~		

insert 구문 처리

html!

여기서 중요한건 테이블안에 인풋들이 존재하기 때문에 
어디론가 전달을 하려면 폼태그로 묶어줘야한다
폼태그를 어떤 방식(method)으로 누구(action)에게 전달할지를 써줘야함

DB의 6단계는 우리는 DAO에서 했었다!
jsp에서는 접근처리만 했었다
다만 이 예제에서는 jsp에서 모든 처리를 할 것이야!

여기 보면 쌩뚱맞은게 하나 나올건데

겟파라미터로 다 받아와서 변수에 저장해뒀다!
사용자는 매번 다른 값을 입력할건데,,?
그렇다면 매번 값이 변해야함!
고정시킬수가없기때문에 

이런 방법을 쓴다! 
	

그치만 우리는 이런 방식을 써본적이 없음 ㅋㅋ.
이렇게 안 쓰고 우린 preparestatment를 이용해서 values(?,?,?)로 썼었음
이게 불편해서 pstmt를 쓰는것

익스큐트 업데이트는 인트형태로 저장될 수 있다! 
그래서 여기 예제에서는 익스큐드 업데이트가 1이면 회원가입이 완료되었다고 쓰는 것

rs는 select문과 함께 쓴다!라고 기억해둘 것

요약

JDBC

	자바에서 DB에 접근할 수 있는 프로그래밍 인터페이스
	데이터베이스 서버에 원격으로 접속 할 수 있도록 네트워크 연결 제공
	DB검색과 수정을 위한 sql 전송,서버로부터 결과를 
    받을 수 있도록 API 제공
	

자바 리플렉션

	패키지라고 생각하면 된다
	여러가지 클래스, 인터페이스가 있음
	반사시킨다
	쉽게 클래스나 인터페이스나 필드 여러가지 정보가 
    서로 동적인 기능을 수행하도록 하는 역할을 하는 메서드다
	
	디비랑은 관련이없음~
	Class : 클래스와 인터페이스에 대한 정보를 제공하고 
		생성자를 호출하는 등의 작업을 함
	Field: 클래스의 필드에 대한 정보를 제공 
클래스 안에 있는 맴버변수에 대한 접근제어자나 자료형, 
파라미터 타입, 리턴타입을 알아낼 수 있는 기능을 가짐!

글작성

얘도 테이블형태로 만들었다
버튼 하나 만들어서 form을 전달함!

이건 많이 만들어봐서 기억하고있지..

놓쳤다.

prepareStatement

SQL문을 동적으로 만드는데 좀 더 쉬운 방법

요즘은 이걸 쓰는게 당연하다! 굳이 stmt를 쓸 이유가 없으니까용

statement 는 sql문을 전달하기 위해 만들어진 객체기 때문에 알아둬야한다구~
값들을 넣은 후에 익스큐트 업데이트를 해야함
물음표에 넣을 내용들을 모두 채운 이후에 sql문을 DB 서버로 전달하게 되는 것

예외 처리

특수문자가 들어가거나 비어있는경우 체크해야한다
stmt의 단점 하나 더!
	따옴표가 하나 더 있을 경우 sql injection이 발생하기 때문에 보안에 취약해짐!

preparedStatement의 주요 함수

인덱스가 1부터 실행되는 경우
	맨 위에는 컬럼명이 있기 때문에 0이 아닌 1부터 진행되는거다~
셋 블롭
	블롭유형의 밸류로 설정한다~
	블롭 : 큰 유형을 저장하는 자료형
	동영상, 멀티미디어(음원등)를 저장하는데 사용함!
	
resultset = excuteQuery() 와 같이 씀 왜냐면 셀렉트니까 쿼리가
업데이트는 인서트, 딜리트, 업데이트일 경우 쓰임!

count 변수를 선언하여 사용하는 이유
	1과 0을 반환함! 1일때는 잘 들어갔다 이고 0은 안들어갔다임
	== boolean 타입과 같음!
	

회원 탈퇴 페이지

아이디를 입력하고 그 아이디가 존재한다면 탈퇴가 이뤄져야함

지금 우리가 jsp를 만들었고
회원탈퇴도 jsp를 만들었다!
글 등록도 jsp를 만들었는데
모두 다 user 테이블을 사용하고 잇음
결국에는 user 테이블안의 값들을 공유하고 있기 때문에
우리가 dao를 만들어서 사용함! dao는 테이블마다 하나씩 만들게 될것이야

커넥션 풀

커넥션 객체를 생성할 때 지금 예제에는 forname으로 열었다~닫았다 하고있음
이 객체는 JDBC를 이용할 때 가장 많은 자원이 소요되는 부분임
이럴 경우 시스템성능이 급격히 저하될 수 있음

두둥탁

데이터베이스 커넥션 풀

일정 개수의 커넥션 객체를 미리 생성해 pool에 저장함
사용자가 요청할 때마다 pool 에서 가용한 객체를 할당함
con.colse()를 쓰면 안댐 왜냐면 사용자가 접근할 때마다 열려있어야하기때문에
데이터 소스는 JNDI머시기..
	JNDI

커넥션 풀을 사용하기 위한 인터페이스임!

context.xml

프로젝트 설정파일
db연동에 필요한 URL이나 커넥션 개수등을 설정

여기서 우리가 꼭 봐둬야 하는것
name
type
driverclassname
url : 커넥션을 만들 때 사용
username
password

맨위에는 xml문서를 알려주는 용도 

컨텍스트라는 태그를 통해 > 설정태그

디비연동에 필요한 리소스(자원)를 넣어주는것 > 
	자원생성(JNDI를 통해 자원을 호출할 경우 이용됨)
    
auth : 톰캣 인증과정

type : 자원의 타입(자료형)을 설정해줌 > 
	JNDI에서 실행 객체가 데이터소스라는 말임
    
driverclassname, url, username, password : 접근정보

maxtotal: 커넥션풀의 커넥션 개수를 설정

maxidle : 커넥션풀에 존재하는 커넥션의 최소 개수

maxwaitmills : 사용자가 이 커넥션풀에 있는 커넥션을 사용할 때 
			다 사용하고 있다면 응답이 끝날 때 까지 기다려야함
			그 때 사용할수 없다는걸 바로 알려주려면 -1로 설정
			사용자가 기다리게하려면 1000이라고 적었을 때 1초간 기다리게 함

우리가 고쳐써야할 부분은
driverclassname, url, username, password : 접근정보
뿐 그러니까 이걸 잘 알아두자~

데이터베이스 커넥션 풀

lookup을 쓰고 java:comp/env/ 이후에 접근할 db이름을 적어줘야함

커넥션 풀을 유지하는 공간을 context에 마련해서 
커넥션 풀에 접근하려면 dataSource를 사용해야 함 

컨텍스트.xml에 자원들을 넣어놨음!

서버가 실행되면 이 자원들이 유지될 것임

그런데 내가 지금 이 클래스 이 jsp에서 저 자원에 접근을 하고 싶음!

근데 어디있어? context에 있음

그 context에서 이름이 jdbc/mysns인 db를 가져와줘 인거임


커넥션타입을 반환하는 겟이라는 메소드를 만들어놓음

우리는 이렇게하진않았음 더 복잡해지기 때문에
간단하게 한줄로 썼었지~
우리는 이미 커넥션 풀 등록이 되어있지

만약 성능을 극한으로 뽑아올리고싶으면 
클래스로 만들어서 써주는 것도 좋은 방법중 하나임

요약

stmt와 pstmt

	pstmt가 보안, 간단함에서 우수하다~

커넥션 풀

	메모리의 고갈을 줄이는 방법임
    
	커넥션 객체를 일정개수 미리 생성해서 사용자가 요청할 때마다 할당하는것
    
	톰캣 컨테이너에서 제공함 > auth
    
	데이터소스 인터페이스를 이용해 접근 가능
    
	데이터소스는 JNDI를 통해 호출 가능
	

DAO

data access object

	관리자페이지에서 회원 정보를 출력하는 경우도 있음!
	근데 사용자도 회원정보를 출력할수 있음
	관리자jsp와 사용자jsp끼리 같은 기능을 써먹을 수 도 있음
	>코드 중복이 일어남
	이런 경우 통합할 필요성을 느낌!

DB 접근 공유를 위해 구현된 자바 클래스임
	DB관련된 코드를 DAO로 전부 이관
	jsp에서는 http요청과 응답관련 처리만 구현

일반적으로 테이블당 하나의 DAO를 구현

회원가입.jsp

여기서는 이제 dao 생성만 함
메서드로 만들어진 내용들을 사용함!
jsp에서는 이제 
html에서 요청된 parameter가 유효한 지에 대한 예외처리를 담당하게됨
html에 응답하게 됨
	

세미프로젝트 이식하고 있었는데 내가 똑바로 하고 있었구나.. 다행이야

DAO를 보자

인서트 메서드

ConnectionPool 이라는 객체의 get 메서드로 conn 객체 생성함

매개변수로 유저 id를 전달
true false를 반환함! 

이 예제에서는 
dao는 데이터베이스에 접근할 용도로만 사용함!
jsp에서는 그 접근 결과에 따라 모든 동작과정을 실행

지금 코드가 훨 씬 더 깔끔한 코드임
우리는 냅다 닫아버렸는데
finally에서 처리하고
예외처리를 jsp에서 하기 때문임
협업에서 사용되는 방법

회원 탈퇴

되게 좋은 코드임!
jsp에서 냅다 실행할것임
근데 삭제하려고 했던 아이디가 없을수있잖음!
없으면 삭제할 수가 없음
결국 excuteUpdate를 하면 true나 false가 나올거임
컴퓨터에선 0이 아니면 1이라고 생각하기때문에 리턴을 0보다 크냐라고 물어본것

로그인 기능



profile
개발자가 되려는 학생입니다

0개의 댓글