본문 바로가기
다양한 기술들/레거시 Web 실습

[00] 프로젝트 세팅, JDBC 연결 준비

by 예스p 2023. 1. 4.

CRUD 실습

C (create) : INSERT

R (read) : SELECT

U (update) : UPDATE

D (delete) : DELETE

 

이번 프로젝트는 기본 CRUD를 활용하여 웹어플리케이션을 만들어볼 것이다.

이 어플리케이션은 회원가입 및 로그인 기능이 있으며, 

공지사항 게시판, 일반게시판, 사진게시판이 있다.


 

시작하기 전 세팅

  • 서버세팅, 이클립스 프로젝트 생성방법
  • 프로젝트 생성하기
    - New > Dynamic Web Project
    - 프로젝트명 webProject, context root명 web, 서버의 포트번호 8887(이전 프로젝트와 겹치지않게)
      >> url 기본 주소는 http://localhost:8887/web 가 된다.
      ** /web까지가 프로젝트 폴더의 webapp을 가리킨다.
       뒤로 파일의 디렉토리 경로를 입력하면 직접 브라우저에서 확인 가능
  • src/main/java 하위구조
    - 자바 소스파일을 위치시킨다.
    - 배포에 직접 반영되지 않으나 컴파일된 파일이 wbapp의 classes 폴더에 저장된다.
   com \ br  하위로 common, board, member, notice를 만든다.
common을 제외한 세개는 controller, model(아래로 vo, dao, service) 폴더 생성
   db \ driver   
   db \ sql  
  • src/main/webapp 하위구조
    - html, jsp 등의 파일을 저장하는 곳
    - 배포에 실제 쓰이는 폴더
  \ META-INF  
  \ WEB-INF \ classes [Properties]-[Java Build Path]의 output folder의 지정경로.
컴파일 후 자동으로 java 폴더 아래와 구조가 동일해지고 .class파일이 저장된다.
  \ WEB-INF \ lib  외부 라이브러리 파일을 저장할 곳.
ojdbc6.jar 파일을 붙여넣는다.
  \ resources 하위로 image, css, js 폴더를 만든다.
  \ views  하위로 jsp파일을 저장할 common, board, member, notice 폴더를 만든다.

 

 

시작을 위한 기본 클래스, 파일 생성

  • oracle에서 id: SERVER, pwd: SERVER 계정을 등록 및 최소 권한을 부여한다.
    테이블 및 데이터도 세팅해준다.
  •  하위 member\model\vo 패키지 안에 Member 클래스 생성
    - userNo, userId,.. 등의 회원 정보를 필드로 저장하고 기본생성자, 매개변수 생성자, getter/setter 등의 메소드 생성
  •   위치에 driver.properties 파일 만들기 (키=밸류 세트를 저장해놓고 뽑아쓰는 용도)
    **이클립스에서 만들때는 [New]-[File]에서 파일명을 .properties로 지정하면 된다. 
    driver=oracle.jdbc.driver.OracleDriver
    url=jdbc:oracle:thin:@localhost:1521:xe
    username=SERVER
    password=SERVER
  •  위치에 회원관련 sql문을 저장해 둘  member-mapper.xml 파일 만들기
    <entry key="보통 메소드명으로 명명"> PreparedStatement용 sql문 작성 </entry>
    의 형태로 쿼리문을 동적으로 가져온다(서버를 멈추지 않고서도 수정 가능하도록)
  • 위치에 게시판 관련 sql문을 저장할 board-mapper.xml과 공지 관련 sql문을 저장할 board-mapper.xml을 만든다.

 

 


DB 연결 세팅

클래스명 JDBCTemplate

생성위치 : src/main/java/com/br/common

 


간편한 사용 : static 메소드

  • JDBC과정에서 빈번하게 사용되는 코드들을 static 메소드로 활용하면 코드가 줄어든다
    >> 객체생성 없이도 불러올 수 있기 때문
  • 호출방법1)
    import  com.br.JDBCTemplate;
    JDBCTemplate.getConnection(conn);
  • 호출방법2)
    import  static  com.br.JDBCTemplate. * ;
    getConnection(conn);
    >> 클래스명을 붙이지 않고도 불러올 수 있다!
    단, 모든 메소드를 사용한다는 ' * '는 이클립스가 임의로 없애는 경우가 있으니 메소드 적용이 잘 안될경우 import구문을 확인할것

 

 

Connection 객체를 반환하는 메소드

  • prop.load(new FileInputStream(파일의 경로))
    1.커넥션 객체를 만들때 필요한 값들은 driver.properties 파일 안에 있다.
      이것을 Properties 객체인 prop에 담아보자.
    2. load() 메소드는 외부에 있는 properties 파일을 읽어들일 수 있게 한다.
    3. 이때, 파일과 직접적으로 연결되는 기반스트림이 필요함 == FileInputStream
      객체 생성시 매개변수로 파일의 경로를 입력해야한다.
    4. 단, src/main/java 폴더 안에 직접 저장한 파일 말고, 자동으로 동기화된
    [ src/main/webapp/WEB-INF/classes/db/driver/driver.properties ] 파일로 읽어들여야 한다!
    이것이 실제로 배포되는 폴더이기 때문
    5. 해당 파일의 물리적인 경로 (C:/부터 시작하는 경로)를 확보해서 FileInputStream 생성자 매개변수로 제시해야함.
    해당 경로를 변수 filePath에 담자.
      5-1) 작업중인클래스명.class  >> 컴파일된 클래스의 위치로부터 경로를 탐색한다.
      5-2) .getResource("/경로")  >> 파일을 찾는 메소드. 
      매개변수의 첫번째 / 는 5-1위치의 최상위폴더를 가르킨다. 현재의 경우 classes
      5-3) .getResource("/db/driver/driver.properties") 
      >> 거기서부터 내가 원하는 경로 및 파일을 제시한다.
      5-4)  JDBCTemplate.class.getResource("/db/driver/driver.properties")
      >> 내가 작업중인 클래스를 이용해서 driver.properties의 파일을 찾아냄.
      5-5) .getPath()  >>  해당 파일의 물리적인 경로를 반환함.
      5-6) filePath에 담기는 문자열 =
      "C:/workspaces/06_web-workspace/webProject/src/main/webapp/WEB-INF/classes/~~~"
  • ojdbc6 연동
    >> 그냥 바로 WEB-INF/lib 폴더 안에 붙여놓음으로써 연동과정 필요 없음.
  • conn.setAutoCommit(false);
    >>팀 구성원중에 맥 유저가 있을 수 있어서 추가한다.
    sql 실행시마다 수기로 commit을 진행할것이므로 자동commit은 꺼도 상관없음 
public static Connection getConnection() {
	Connection conn = null;
	Properties prop = new Properties();
	String filePath = JDBCTemplate.class.getResource("/db/driver/driver.properties").getPath();
	try {
		prop.load(new FileInputStream(filePath));
	} catch (IOException e) {
		e.printStackTrace();
	}
	try {
		// jdbc driver 등록
		Class.forName(prop.getProperty("driver")); 
		// db의 url, 계정명, 비밀번호 제시해서 Connection 생성
		conn = DriverManager.getConnection(
				prop.getProperty("url"),
				prop.getProperty("username"),
				prop.getProperty("password"));
		conn.setAutoCommit(false);
	} catch (ClassNotFoundException e) {
		e.printStackTrace();
	} catch (SQLException e) {
		e.printStackTrace();
	}
	return conn;
}

 

 

commit을 수행하는 메소드

  • Connection 객체를 전달받아 commit을 수행한다
public static void commit(Connection conn) {
    try {
        if(conn != null && !conn.isClosed()) {
            conn.commit();
        }
    } catch (SQLException e) {
        e.printStackTrace();
    }
}

 

 

rollback을 수행하는 메소드

  • Connection 객체를 전달받아 rollback을 수행한다
public static void rollback(Connection conn) {
	try {
		if(conn != null && !conn.isClosed()) {
			conn.rollback();
		}
	} catch (SQLException e) {
		e.printStackTrace();
	}
}

 

 

객체를 반납하는 메소드 (오버로딩)

  • Connection객체, Statement객체, ResultSet객체 를 전달받아 반납하는 메소드
  • 매개변수를 달리해서 각각 오버로딩 한다
  • PreparedStatement는 Statement의 자손으로 다형성을 적용받아 메소드 사용 가능하다
public static void close(Connection conn) {
	try {
		if(conn != null && !conn.isClosed()) {
			conn.close();
		}
	} catch (SQLException e) {
		e.printStackTrace();
	}
}
.....

 

 

 

 

 

 

 

 

'다양한 기술들 > 레거시 Web 실습' 카테고리의 다른 글

[05] 모달을 사용한 비밀번호변경  (0) 2023.01.06
[04] 회원정보변경  (0) 2023.01.06
[03] 마이페이지  (0) 2023.01.05
[02] 회원가입 기능  (0) 2023.01.05
[01] 메뉴바와 로그인  (0) 2023.01.04

댓글