[21.10.01] DBCP

yed·2021년 10월 1일
0

java.sql.SQLException: ORA-28000: the account is locked
db 비밀번호가 틀린 채로 계속 커넥트해서 db가 잠겨버렸다ㅠ
그래서 /as sysdba로 로그인해
alter user 사용자아이디 account unlock; 을 입력해주세요~

서버에서 클라이언트로 리스트 돌려주기

org.json.simple.JSONArray

서버

request.setCharacterEncoding("UTF-8");
String keyword=request.getParameter("keyword");
System.out.println(keyword);
		
List<String> list=dao.select(keyword);
JSONArray jsonArray=new JSONArray();
for(String title:list) {
	JSONObject jsonObject=new JSONObject();
	jsonObject.put("title", title);
jsonArray.add(jsonObject);
}
response.setCharacterEncoding("UTF-8");
response.getWriter().append(jsonArray.toString());

클라이언트

$.ajax({
	type:'get',
	url:'../search.do',
	data:{keyword:val},
	success:function(result){
		console.log(result);
		var obj=JSON.parse(result);
		var list="";
		for(var x in obj){
			list+="<a href='../title.do?title="+obj[x].title+"'>"+obj[x].title+"</a><br>";
		}
		var txtHint = $('#txtHint');
		txtHint.html(list);
	}
}); //end ajax

MVC 아키텍처 패턴

이 때 잠깐 배우고 갔었습니다

애플리케이션 전체를 역할에 따라 모델(Model)-뷰(View)-컨트롤러(Controler)로 구분하는 패턴이다.

Spring같은 프레임워크는 MVC 패턴을 적용함

  • 하나의 데이터 VO(모델)로 여러가지 인터페이스(뷰)를 만들 수 있다.
  • 컴포넌트 재사용

모델

처리할 데이터를 묶은 클래스

애플리케이션 사용자의 인터페이스 영역

컨트롤러

인터페이스와 데이터 처리를 중개. 애플리케이션 전체 흐름제어

일반적인 웹 애플리케이션 구조

  • VO. DTO. domain
    DB의 모델. 클래스. 같은 데이터타입을 가진 데이터들의 집합
  • JSP
    view.
  • Servlet
    controller
  • Service 클래스
  • DAO
    CRUD 수행.

DBCP(Data Base Connection Pool)

jdbc의 요청이 올때마다 연결해야하는 단점을 보완해서 미리 연결된 커넥션을 준비해 커넥션 풀에 저장해놓고 요청이 오면 바로 쓰고 다시 풀에 반환하는 방식이다. 트래픽을 더 빠르게 처리할 수 있다.

브라우저에서 서버로 호출 시 매번 DB 연결 객체를 생성하면 과부하가 발생할 수 있음. 이를 해결하기 위해 다수의 연결을 컨트롤하는 기법

커넥션 생성을 위한 준비시간은 길지만 연결시간이 줄어들었음

커넥션 풀은 loop형태로 계속 동작하고 있음

DBCP 원리

1) 웹 컨테이너가 실행되면서 커넥션(Connection) 객체를 미리 풀(Pool)에 생성
2) 풀에 저장된 커넥션 객체를 필요할 때 쓰고 반환
3) 미리 생성하기 때문에 데이터베이스에 부하를 줄이고 유동적으로 연결을 관리

DBCP 설치

  1. ojdbc6.jar 파일을 \webapp\WEB-INF\lib 폴더에 저장

  2. ..\apache-tomcat-9.0.52\lib 톰캣 설치 폴더에 있는 tomcat-dbcp.jar 파일을\webapp\WEB-INF\lib 폴더에 저장

  3. \META-INF\context.xml 파일에 Resource 태그 추가

<?xml version="1.0" encoding="UTF-8"?>
<Context>
	<!-- DBCP(Database Connection Pool)을 사용하기 위한 Java Bean 설정 -->
	<Resource 
		auth="Container"
		driverClassName="oracle.jdbc.driver.OracleDriver"
		url="jdbc:oracle:thin:@localhost:1521:xe"
		username="scott"
		password="tiger"
		name="dbcp/orcl"
		type="javax.sql.DataSource"
		maxTotal="50"
		maxWaitMillis="1000"/>
</Context>
  • url : 연결 DB 경로
  • username : DB 사용자 이름
  • password : DB 사용자 비밀번호
  • name : JNDI에서 찾아올 이름
  • maxTotal : 동시에 접속할 수 있는 최대 연결 개수
  • maxWait : 접속 지연 시 기다릴 시간(millisecond)

기존 jdbc를 사용했을땐 db연결관련 상수를 인터페이스에서 작성하고 connection을 직접 했다면
DBCP가 db 연결할 수 있도록 xml파일에 설정관련 정보를 저장해놓음.

  1. \webapp\WEB-INF\web.xml 파일에 resource-ref 태그 추가
  <resource-ref>
  	<description>Oracle DBCP Example</description>
  	<res-ref-name>dbcp/orcl</res-ref-name>
  	<res-type>javax.sql.DataSource</res-type>
  	<res-auth>Container</res-auth>
  </resource-ref>

Connection 연결/해제 유틸리티 클래스

public class ConnMgr {
	
	private ConnMgr() {}
	
	public static Connection getConnection() throws SQLException{
		Connection conn = null;
		
		try {
			Context initContext = new InitialContext();
			Context envContext = 
					(Context) initContext.lookup("java:comp/env");
			DataSource ds = (DataSource) envContext.lookup("dbcp/orcl");
			conn = ds.getConnection();
			System.out.println("DBCP 연결 성공");
		} catch (Exception e) {
			e.printStackTrace();
		} 
		
		return conn;
	}
	
	public static void close(Connection conn, Statement stmt) {
		try {
			stmt.close();
			conn.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
	
	public static void close(Connection conn, Statement stmt, ResultSet rs) {
		try {
			rs.close();
			close(conn, stmt);
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
}

rownum으로 글번호 나누기

글번호는 제일 큰 수가 최신글이기때문에 내림차순으로 최신글이 상단에 노출되어야 함.

select b.*
from(
    select rownum rn, a.* 
    from (
        select * from board order by bno desc
    )a
)b
where rn between 1 and 5;
  1. select * from board order by bno desc : 전체 데이터(내림차순 정렬된) 가져오기

  2. select rownum rn, a.* ... : 내림차순 정렬된 데이터에 rownum으로 1번부터 번호 부여하기
    ex) 글번호가 10~1번까지 있으면 글번호 10번==rownum 1번

  3. 전체 쿼리 : rownum이 1부터 5까지인 데이터가 출력됨.


프로그램 제작 시 사용할 라이브러리 설정하기가 첫번째@@

profile
6개월 국비과정 기록하기

0개의 댓글

관련 채용 정보