백엔드 8일차 - 데이터베이스, JDBC 연결 (feat. DAO, DTO)

parang·2025년 4월 17일

LG CNS AM Inspire Camp 2기

목록 보기
19/50
post-thumbnail

오늘은 자바가 끝나고 데이터베이스 시작날이다! 벌써 자바가 끝난 게 믿기지 않지만... 나의 반려 복습 친구들만 늘어난다 ㅎ

스프링부트로 넘어 가기 전, 데이터베이스를 다뤄야 하기 때문에 기본적인 sql은 다룰줄 알아야 한다.

강의에서는 MariaDB를 이용하지만 sql을 다루는데 tool은 별로 상관이 없다. 나는 주로 oracle을 사용 했지만 차이점은 거의 없는 것 같다. 마리아디비를 쓰는게 훨씬 직관적이라서 편한 것 같긴 하다.

중요 sql 사항들

SELECT FROM WHERE

쿼리를 작성할 때 가장 기본이 되는 형태이다.
SELECT 출력할 컬럼, FROM 테이블 이름, WHERE 조건

AS

AS는 기존에 있는 이름명이 아니고 새롭게 별칭을 붙이는 걸 말한다. 예를 들어 FROM 직업 AS 미래직업 이렇게 표현하면, 직접 테이블명이 미래직업이라는 별칭을 갖게 된다.

LIKE와 %

LIKE와 %는 거의 같이 쓰이는 코드이다.

LIKE '%a%'; -> a를 포함. 
퍼센트 앞뒤로!

AND, OR

AND 연산자는 OR 연산자 보다 우선순위가 높다.

LIMIT

 LIMIT 0, 10;
 시작하는 인덱스, 개수. 

ORDER BY

정렬을 할 때 디폴트 값은 오름차순이다. 쿼리를 넣는 순서를 잘 고려해야 한다.

자바와 DB 연결하기

사용 툴 : 인텔리제이 (무료 버전)
DB : MariaDB.

  1. mariaDB jar 설치
    https://mvnrepository.com/

  2. 설치한 jar 파일을 프로젝트에 옮기고 라이브러리에 추가한다.

  3. DB 연결 코드 작성
    연결 코드는 공통!

연결 코드 흐름

드라이버 로딩 
Class.forName("org.mariadb.jdbc.Driver");

DB 연결
Connection con = DriverManager.getConnection(url, id, pw); 
String url = "jdbc:mariadb://localhost:3306/java";

명령문 실행하기 위한 
PreparedStatement stmt = conn.prepareStatement(sql);

String sql = "select * from emp limit 0, 10";

쿼리 실행 코드
ResultSet rs = stmt.executeQuery(); 

데이터 가리키는 커서 역할 
rs.next();

int id2 = rs.getInt("id");
String address = rs.getString("address");
String name = rs.getString("name");

닫는 코드
rs.close();
stmt.close();
con.close();

순서 중요!

예외처리

기본적으로 try - catch - finally를 사용한다.
close() 문장들은 빼고, 모두 try 에 집어 넣고, close는 finally로 넣는다.
finally 에 있는 rs, stmt, con 변수를 모두 사용하기 위해서는 try 위에서 선언이 되어야 하기 때문에,

Connection con = null;
PreparedStatement stmt = null; ->+ sql injection 방어
ResultSet rs = null;

위처럼 null로 선언해 주어야 한다.

그리고, finally에 있는 코드들도 try - catch로 예외처리를 하고, if 문으로 null이 아니라는 조건문을 주면 예외처리가 모두 완성된다.

완성된 코드 전체

import java.sql.*;

public class Jdbc {
    public static void main(String[] args) {
        Connection con = null;
        PreparedStatement stmt = null;
        ResultSet rs = null;

        try {
            Class.forName("org.mariadb.jdbc.Driver");//로
            String url = "jdbc:mariadb://localhost:3306/java"; //연결
            String id = "아이디 이름";
            String pw = "비밀번호";
            con = DriverManager.getConnection(url, id, pw);

            String sql = "select * from holiday_parking limit 0, 10";

            stmt = con.prepareStatement(sql);
            rs = stmt.executeQuery(); //sql 조회된 모습

            while(rs.next()) {
                // rs.next(); 커서로 데이터 가리키게 됨
                int id2 = rs.getInt("id");
                String address = rs.getString("address");
                String name = rs.getString("name");
                System.out.println(id2);
                System.out.println(address);
                System.out.println(name);

            }
        } catch (ClassNotFoundException e) {
            throw new RuntimeException(e);
        } catch (SQLException e) {
            throw new RuntimeException(e);
        } finally {
            try {
                if(rs != null) rs.close();
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }
            try {
                if(stmt != null) stmt.close();
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }
            try {
                if(con != null) con.close();
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }
        }
    }
}

DB 연결 코드를 클래스로 묶기

DAO -> 데이터 제어 객체
DTO -> 데이터 전송 객체

empDAO를 만들면 그 안에 SELECT, INSERT, UPDATE, DELETE가 들어 있다. 그러면, 이곳에 db연결 코드도 같이 들어가고, 연결해서 이곳에서 sql문을 제어하는 것이다.

empDTO
-> emp테이블에 있는 객체 속성들이 모두 들어 있어야 한다.
-> getter, setter 생성
-> 우리가 보기 쉬운 형태로 바꾸기 위해서 toString()을 오버라이드 해야 한다.

empDTO.java

1. 생성자 생성
empDTO dto = new empDTO();
int empno;
String name;
String job;
-> emp 테이블에 있는 속성들

2. 스트링 오버라이드 (결과 출력 알 수 있게 들어오도록)
@Override
   public String toString() {
       return "HoildayParkingDTO{" +
              "사번=" + empno +
              ", 이름='" + name + '\'' +
              ", 부서='" + job + '\'' +
              '}';
    }
    
3. getter setter

    public int getEmpno() {
        return empno;
    }

    public void setEmpno(int empno) {
        this.empno = empno;
    }
    
...etc....

empDAO.java

public class empDAO {
	public List<empDTO> select() { // 여러 값을 담기 위해서 리스트로 변경
    	 List<HoildayParkingDTO> list = new ArrayList<>(); 리스트 객체 생성
         
         위에서 봤던 db 연결 코드
		 ...
         while(rs.next()) {
                empDTO dto = new empDTO(); // dto 객체 생성
                rs.next(); 
                int empno2 = rs.getInt("empno");
                String job = rs.getString("job");
                String name = rs.getString("name");
                dto.setId(id2);
                dto.setAddress(job);
                dto.setName(name);
        ->  생성한 dto 객체를 이용해서 dto안에 있는 도구들 사용.
                list.add(dto);
                -> 리스트에 dto 담기.
          }
  ...
  
  
		return list;

Jdbc.java (main)

empDAO dao = new empDAO();
List<empDTO> result = dao.select(); 
       
System.out.println(result);

이렇게 실행하면 값이 잘 들어오는 것을 확인할 수 있다.

이로써.. db와 자바의 연결이 끝났다. 이 형식은 공통이므로 눈을 감더라도 쓸 수 있게 익숙해져야 한다고 한다. 틈날때마다 코드를 들여봐야겠다.

profile
파랑입니다.

0개의 댓글