-
37일차 - 자바에서 DB 연결백엔드(웹 서버, WAS)/Spring 2024. 3. 14. 22:48
JDBC 에서 DBMS 연결하는 과정
1. DB 접속 정보를 준비한다
서버에 저장된 context.xml 파일에서 자바 데이터인 객체화하여 DB 접속에 필요한 정보들을 준비한다
2. 추가한 라이브러리 드라이버를 불러온다
3. 드라이버 매니저를 불러 접속 정보를 준다
4. 드라이버 매니저가 가져온 커넥션을 받는다
5. Connection을 이용하여 데이터를 처리하고 닫아준다
context.xml 에서 DB 연결에 필요한 정보를 읽어 온 후 연결하기
1. Context.xml 에서 자바 객체로 불러온 후 연결 객체를 생성한다
<<< Context.xml >>> <Resource name="jdbc/MariaDB" auth="Container" type="javax.sql.DataSource" driverClassName="org.mariadb.jdbc.Driver" url="jdbc:mariadb://localhost:3306/mydb" username="web_user" password="pass" />
try { // context.xml 파일을 자바 데이터인 객체화하고 Context ctx = new InitialContext(); // 자바 컴파일 환경이고 이름인 jdbc/MariaDB 리소스 태그를 찾아서 그 데이터를 ds 에 저장합니다 DataSource ds = (DataSource) ctx.lookup("java:comp/env/jdbc/MariaDB"); // DB 연결에 필요한 정보가 담긴 ds로 커넥션 conn 객체를 생성한다 this.conn = ds.getConnection(); logger.info("constructors connection : " + this.conn); } catch (Exception e) { e.printStackTrace(); }
2. 회원 테이블을 연결 객체(커넥션)을 통해 생성한다
■ 연결 객체(커넥션)으로 부터 createStatement() statement 객체가 생성된다 생성된 객체에서 쿼리문을 실행할 수 있다
■ 반대로 DB에 변화를 주는 경우 executeUpdate()를 사용한다 (UPDATE, DELETE, INSERT)
- DB 에 적용에 성공한 행의 개수를 int 형으로 반환해준다
public boolean createTable() throws SQLException { boolean success = false; // 1. 쿼리문을 준비한다(당연히 테이블 생성하는 쿼리문이 준비되어야한다) // DBeaver 에서 복사 붙여넣기 할때 주의사항 // 쿼리문의 마지막에 세미콜론(;) 을 넣어버리면 안된다 // 안그러면 오류 난다 // 쿼리문이 굉장히 길어지면 Stringbuilder 나 버퍼를 쓰는게 좋다 String sql = "create table member(" + " id VARCHAR(50) primary key" + " ,pw VARCHAR(100)" + " ,name VARCHAR(50)" + " ,age INT(4)" + " ,gender VARCHAR(4)" + " ,email VARCHAR(100)" + ")"; // 2. 쿼리문을 실행해줄 객체가 준비되어야한다(Statement | PreparedStatement) // SQLException 를 HomeService 에게 예외를 전가해버려서 // Service 가 빨간불 들어온다 Statement stmt = conn.createStatement(); // 3. 데이터베이스에 쿼리문을 실행한다(executeQuery, executeUpdate) // executeQuery(Select) 나머지는 executeUpdate 를 쓰면 된다 int row = stmt.executeUpdate(sql); // 만약에 위에서 이미 에러가 발생했다면 HomeService 로 이동한다 logger.info("createTable() : 영향받는 행의 갯수 : " + row); success = true; // 4. 자원 반납 stmt.close(); conn.close(); return success; }
3. 생성된 테이블(값은 임의로 추가하였다)에서 모든 회원의 정보를 조회한다
■ DB로부터 반환되는 데이터가 있을 경우 executeQuery()를 사용한다 (SELECT)
- ResultSet 형태로 메소드가 반환해주기 때문에 하나씩 가져와서 처리해야한다
public void list() { // 쿼리문 안에 세미클론은 빼주자 // db 에 요청할 쿼리문을 준비한다 String sql = "SELECT * FROM member"; try { // conn 연결 객체에 준비한 쿼리문을 입력하여 쿼리를 실행할 ps를 생성한다 PreparedStatement ps = conn.prepareStatement(sql); // 쿼리문의 실행 결과는 ResultSet 형태로 반환해준다 ResultSet rs = ps.executeQuery(sql); /* (5-2) * ResultSet 자료의 형태는 Set 이므로 하나씩 가져와야한다 * while 문을 이용해 rs.next() 는 가져올 요소가 있으면 true 반환하므로 * 가져올 요소가 있다면 반복문은 계속 실행된다 */ while(rs.next()) { /* (6-2) * getString 은 입력받은 컬럼의 이름 또는 인덱스로 컬럼에 접근해 * 하나씩 값을 가져온다 */ logger.info("id : {}", rs.getString("id")); // column label logger.info("pw : {}", rs.getString(2)); // column index logger.info("name : {}", rs.getString("name")); logger.info("age : {}", rs.getInt("age")); logger.info("gender : {}", rs.getString("gender")); logger.info("email : {}", rs.getString("email")); logger.info("================================="); } // ps rs conn 는 모든 작업을 끝냈기 때문에 자원을 반납해준다 ps.close(); rs.close(); conn.close(); } catch (SQLException e) { e.printStackTrace(); } // 이 메소드는 끝났으므로 컨트롤러로 이동 }
Prepared Statement
? 는 입력 받은 매개변수들을 넣어 쿼리문을 실행할 수 있다
executeQurey() 는 반환되는 데이터가 있을 경우 사용 한다.(SELECT)
executeUpdate() 는DB 에 변화를 줄 경우 사용 한다.(UPDATE, DELETE, INSERT)
사용시 반환되는 int는 적용에 성공한 데이터 행(row) 개수 이다.
테이블 생성 예제
컨트롤러는 서비스에서 테이블을 만들어달라고 요청
서비스는 다오에게 데이터베이스
'백엔드(웹 서버, WAS) > Spring' 카테고리의 다른 글
41일차 - 게시판 구현 & 문제 (0) 2024.03.20 39,40일차 - Mybatis (0) 2024.03.19 38일차-회원 가입 시스템 구현 (0) 2024.03.15 36일차 - 기초적인 MVC와 DB(JDBC) 연결 (0) 2024.03.13 35일차-JSTL TAG (0) 2024.03.12