AWS BACK DAY 18. 데이터베이스 - JDBC

이강용·2023년 1월 29일

Java 기초

목록 보기
16/26
post-thumbnail

📌 JDBC(Java Database Connectivity)

  • JDBC는 Java에서 DB에 접속할 수 있도록 연결해주는 자바 API(Application Programming Interface)이다. JDBC는 DB에서 자료를 Query하거나 업데이트 하는 방법을 제공한다.
    • JAVA를 이용하여 DB 접속과 SQL문장을 실행하고 그 결과로 얻어진 데이터의 핸들링을 제공하는 방법과 절차에 관한 규약
    • JAVA 프로그램 내에서 SQL문을 실행하기 위한 자바 API
    • SQL 프로그래밍 언어의 통합 접근 중 한 형태

pom.xml 파일 의존성 추가

<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
	<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.32</version>
	</dependency>
JAVA - DB 연동 JDBC 클래스 전체 구조

JDBC를 이용한 DB 연동과정

Package Import → JDBC Driver Load → Connection 객체(인스턴스) 생성 → Statement 객체 생성 → Query 실행 → ResultSet 객체로부터 데이터 추출 → ResultSet Close → Statement 객체 Clase → Connection 객체 Close  

DBConnectionMgr.java 👈🏻 전 포스팅 참고

 private Vector connections = new Vector(10);
    private String _driver = "com.mysql.cj.jdbc.Driver", 
    _url = "jdbc:mysql://127.0.0.1:8080/example",
    _user = "root",
    _password = "@@@@;

JDBC Driver Load & DB Connection

  • MySQL에서 제공하는 Driver 클래스를 JVM method aread에 로딩
  • localhost:8080 (로컬 환경에서의 MySQL 포트번호 기입). DB(MySQL) 스키마 명 기입
  • DB(MySQL)에 연결하기 위한 접속 정보 (User명, Password) 입력
private DBConnectionMgr pool ;
	
	public UserInsert() {
		pool = DBConnectionMgr.getInstance(); //Singleton
	}

Singleton pattern(싱글톤 패턴) 사용

  • ❗️ 커넥션 풀 또는 쓰레드 풀과 같이 객체 생성 자체에 비용이 많이 드는 객체들을 여러 개 생성하는 것은 그만큼 불필요한 자원을 사용하는 것이기 때문에 이런 경우
    싱글톤 패턴(Singleton pattern)을 사용한다.
  • new 연산자를 제한하기 위해 생성자의 접근 제한자는 항상 private으로 선언
  • 유일한 단일 객체를 반환하기 위해 static method가 필요
  • 유일한 단일 객체를 참조할 수 있는 static 참조 변수가 필요

DBConnectionMgr.java 👈🏻

private static DBConnectionMgr instance = null;

public static DBConnectionMgr getInstance() {
        if (instance == null) {
            synchronized (DBConnectionMgr.class) {
                if (instance == null) {
                    instance = new DBConnectionMgr();
                }
            }
        }

        return instance;
    }
	public int saveUser(User user) {
		
		int successCount = 0;
		String sql = null;
		Connection connection = null; // 전역변수로 빼줌
		PreparedStatement preparedStatement = null;
		ResultSet resultSet = null;
  • User user을 매개변수로 하는 public int saveUser 메서드를 생성

  • User user (command enter로 해당 메서드로 이동)

@Data
@Builder
//@AllArgsConstructor //builer pattern  필수
public class User {
	private int userId;
	private String username;
	private String password;
	private String name;
	private String email;

User class는 빌더패턴으로 구현

Builder Pattern (빌더 패턴) 사용

  • 빌더 패턴은 생성 패턴(Credential Pattern) 중 하나
  • 객체의 생성을 유연하게 해주는 패턴
  • 객체의 생성과정과 객체의 표현 방법을 분리

why?

  • 가독성이 이전보다 좋아지며 인자의 의미를 코드에서 명확히 알 수 있음
  • Setter() 메서드가 없으므로 변경이 불가능한 객체를 만들 수 있음
  • 한 번에 객체를 반환하므로 객체의 일관성이 깨지지 않음
  • 간편하게 사용할 수 있으며 필수 인자를 지정할 수 있음

⁉️ 주의점

  • 추가적인 빌더 클래스를 구현

  • 빌더의 생성 비용이 크지는 않지만, 성능이 민감할 경우 문제가 될 수도?!

    롬복(Lombok)을 사용한 @Builder

  • 롬복이란?

    • 반복적인 method 코드 작성을 줄여주는 Java 라이브러리
    • @Getter, @Setter, @Builder 어노테이션을 사용하면 메서드가 자동으로 생성

📌 workbench 연결

		try { // why??? 
			 connection = pool.getConnection();  //workbench 에 접속
			 
			 sql = "insert into user_mst\r\n"
			 		+ "values (0,?,?,?,?)";
			 /*
			  * ? 쓰는 이유 : 어떤 값이 들어갈지 모르니
			  *  
			  */
			 
  • 위에서 멤버변수로 선언한 private DBConnectionMgr pool(DBConnectionMgr클래스)Connection 클래스 connection 객체에 대입 → MySQL workbench에 접속

sql = "insert into user_mst\r\n"
			 		+ "values (0,?,?,?,?)";

MySQL에 insert into user_mst values (0,~) 기입하는거와 동일한 원리, 뒤에 0은 MySQL의 user_id AI(Auto increse) index 번호, ? 는 변수가 무엇으로 기입될지 모르기 때문

profile
HW + SW = 1

0개의 댓글