• 티스토리 홈
  • 프로필사진
    Song hyun
  • 방명록
  • 공지사항
  • 태그
  • 블로그 관리
  • 글 작성
Song hyun
  • 프로필사진
    Song hyun
    • 분류 전체보기 (780)
      • 백준 (0)
      • 일본어 (0)
        • 모모타로TMC (0)
      • 영어 (2)
        • Diary (0)
        • Toast Masters (2)
      • 메모 (13)
      • 설치 메뉴얼 (30)
      • Java (178)
      • MySQL (60)
      • JSP (67)
      • Springboot (46)
      • HTML,CSS, JS (71)
        • HTML (8)
        • CSS (12)
        • JavaScript (37)
        • HTML&CSS 스터디 (13)
      • C++ (7)
      • Linux (7)
      • JPA (34)
      • Kotlin (2)
      • Flutter (42)
      • Error Note (39)
      • 디자인 패턴 (12)
      • 디지털논리회로 (4)
      • 데이터베이스 시스템 (8)
      • 알고리즘 (7)
      • 운영체제 (3)
      • 이산수학 (3)
      • 인공지능 (1)
      • 자료 구조 (14)
        • 기본 개념 (14)
        • 자료구조 스터디 (0)
      • 💡My project (76)
        • 팩맨 : Java Swing 게임 제작 프로젝트 (6)
        • 네이트톡 : Java 소켓 통신 프로젝트 (4)
        • 포켓옥션 : HikariCP&JDBC CRUD 프.. (3)
        • 이지 부산 : BDIA-Devton 2024 프로.. (20)
        • 그린 유니버시티 : JSP를 사용한 학사관리 프로.. (1)
        • 애드 포커 : 웹 소켓과 Spring을 사용한 카.. (1)
        • 셸위 : 게임 친구 매칭 사이트 (21)
        • 다모아 : 개발자 중개 플랫폼 (20)
      • 📗스터디 (13)
        • CNN : 웹개발 스터디 (10)
        • Node&React로 유튜브 사이트 만들기 (3)
      • 📙독서 및 강연 기록 (36)
        • 강연 (14)
        • 독서 (22)
  • 방문자 수
    • 전체:
    • 오늘:
    • 어제:
  • 최근 댓글
      등록된 댓글이 없습니다.
    • 최근 공지
        등록된 공지가 없습니다.
      # Home
      # 공지사항
      #
      # 태그
      # 검색결과
      # 방명록
      • [Java] 126. 연습 : JDBC-HikariCP를 사용해 코드 작성하기
        2024년 06월 18일
        • Song hyun
        • 작성자
        • 2024.06.18.오전10:34
        728x90
        반응형

        [Java] 126. 연습 : JDBC-HikariCP를 사용해 코드 작성하기


         

        (1) DBConnectionManager

        -Connection을 사용해 MySQL에 접속, 연결하는 역할

        -HikariCP를 사용해 커넥션 풀을 활용함 => 커넥션 풀을 사용시, SQL 접속에 들어가는 자원 고갈을 최소화할 수 있음.

        *하지만 커넥션 풀은 메모리 소모가 크다.

        **커넥션(Connection)의 실행 주체는 Thread이다.

        package ver2;
        
        import java.sql.SQLException;
        import java.sql.Connection;
        import com.zaxxer.hikari.HikariConfig;
        import com.zaxxer.hikari.HikariDataSource;
        
        import lombok.Synchronized;
        
        // 싱글톤 패턴 - 단 하나의 객체만 필요함을 보장해야 한다면
        // 싱글톤 패턴으로 설계 할 수 있다.
        // for Example: Timer 클래스
        public class DBConnectionManager {
        	
        	// 자기 자신의 참조 주소값을 담을 변수 생성.
        	// 단, private으로 외부에서 접근 못하도록 막는다.
        	private static DBConnectionManager instance;
        	private HikariDataSource dataSource;
        	
        	// 생성자를 <---- 외부에서 생성자를 호출 못하게 막아야 한다.
        	private DBConnectionManager() {
        		HikariConfig config=new HikariConfig();
        		config.setJdbcUrl("jdbc:mysql://localhost:3306/studentdb?serverTimezone=Asia/Seoul");
        		config.setUsername("root");
        		config.setPassword("asd123");
        		config.setMaximumPoolSize(10);
        		dataSource=new HikariDataSource(config);
        	}
        	
        	// 외부에서 클래스 이름.getOOO 메서드를 만들어주면 된다.
        	// 한 번에 하나의 스레드만 접근하도록 동기화 적용
        	public synchronized DBConnectionManager getInstance() {
        		if(instance==null) {
        			instance=new DBConnectionManager();
        		}
        		return instance;
        	}
        	
        	// Connection 객체를 반환 (구현체-HikariCP)
        	public Connection getConnection() throws SQLException{
        		return dataSource.getConnection();
        	}
        	
        	
        	
        }

         

        (2) StudentDTO (Data Transfer Object)

        -SQL(데이터베이스)에 담긴 레코드들을 담는 클래스(인스턴스화에 사용)

        package ver2.model;
        
        import lombok.AllArgsConstructor;
        import lombok.Data;
        import lombok.NoArgsConstructor;
        import lombok.ToString;
        
        // DTO의 기능은 단지 데이터만 담을 역할을 하는 것은 아니다.
        // 기능 추가도 가능하다.
        @Data // 게터, 세터 생성
        @NoArgsConstructor // 매개변수가 없는 생성자
        @AllArgsConstructor // 매개변수가 모두 있는 생성자
        // 생성자 오버로딩을 통해 빌더 패턴을 사용할 수 있다.
        @ToString
        
        public class StudentDTO {
        	
        	private int id;
        	private String name;
        	private int age;
        	private String email;
        
        	
        }

         

         

        (3) StudentDAO (Data Access Object)

        -SQL(데이터베이스)에서 정보를 받아와, CRUD를 실행하는 주체

        package ver2;
        
        import java.sql.Connection;
        import java.sql.PreparedStatement;
        import java.sql.ResultSet;
        import java.sql.SQLException;
        import java.util.ArrayList;
        import java.util.List;
        
        
        import ver2.model.StudentDTO;
        
        // 물론 기능 설계는 인터페이스를 먼저 작성하고 구현 클래스를 만드는 것이 좋다.
        public class StudentDAO {
        
        	// 학생 정보 추가 기능 만들기
        	// 클래스 = 데이터의 묶음
        	public void addStudent(StudentDTO dto) throws SQLException {
        		String query = " INSERT INTO students(name,age,email) VALUES(?,?,?) ";
        		try (Connection conn = DBConnectionManager.getInstance().getConnection()) {
        			PreparedStatement pstmt = conn.prepareStatement(query);
        			pstmt.setString(1, dto.getName());
        			pstmt.setInt(2, dto.getAge());
        			pstmt.setString(3, dto.getEmail());
        			pstmt.executeUpdate();
        		}
        	}
        
        	// 학생의 ID로 조회하는 기능 만들기 (PK 활용)
        	public StudentDTO getStudentByID(int id) throws SQLException {
        		String query = " SELECT * FROM students WHERE id = ? ";
        		try (Connection conn = DBConnectionManager.getInstance().getConnection()) {
        			PreparedStatement pstmt = conn.prepareStatement(query);
        			pstmt.setInt(1, id);
        
        			try (ResultSet rs = pstmt.executeQuery()) {
        				if (rs.next()) {
        					return new StudentDTO(rs.getInt("id"), rs.getString("name"), rs.getInt("age"),
        							rs.getString("email"));
        				}
        			}
        		}
        		return null;
        	}
        
        	// 학생 전체를 조회하는 기능 만들기
        	public List<StudentDTO> getAllStudents() throws SQLException {
        		// tip: 리스트라면 무조건 리스트를 생성하고 코드 작성
        		List<StudentDTO> list = new ArrayList<>();
        		String query = " SELECT * FROM students ";
        		try (Connection conn = DBConnectionManager.getInstance().getConnection()) {
        			PreparedStatement pstmt = conn.prepareStatement(query);
        			ResultSet rs = pstmt.executeQuery();
        		
        			while(rs.next()){
        				StudentDTO dto = new StudentDTO().builder()
        					.id(rs.getInt("id"))
        					.name(rs.getString("name"))
        					.age(rs.getInt("age"))
        					.email(rs.getString("email"))
        					.build();
        				list.add(dto);
        			}
        		}
        		// todo 수정하기
        		return list;
        	}
        
        	// 학생 정보 수정 기능 만들기
        	public void updateStudent(String name, StudentDTO dto) throws SQLException {
        		String query=" UPDATE students SET name = ? , age = ? , email = ? WHERE name = ? ";
        		try(Connection conn=DBConnectionManager.getInstance().getConnection()){
        			PreparedStatement pstmt=conn.prepareStatement(query);
        			pstmt.setString(1, dto.getName());
        			pstmt.setInt(2, dto.getAge());
        			pstmt.setString(3, dto.getEmail());
        			pstmt.setString(4, name); // 조건값 셋팅
        			pstmt.executeUpdate();
        		}
        	}
        
        	// 학생 정보 삭제하기
        	public void deleteStudent(int id) throws SQLException {
        		String query=" DELETE FROM students WHERE id = ? ";
        		try(Connection conn = DBConnectionManager.getInstance().getConnection()){
        			PreparedStatement pstmt=conn.prepareStatement(query);
        			pstmt.setInt(1, id);
        			pstmt.executeUpdate();
        		}
        
        	}
        
        }

         

         

        (4) StudentManagementSystem

        -DBManager, DAO, DTO를 활용해 프로그램 실행 (main 쓰레드)

        package ver2;
        
        import java.sql.SQLException;
        import java.util.List;
        
        import ver2.model.StudentDTO;
        
        public class StudentManagementSystem {
        	
        	private static final StudentDAO STUDENTDAO = new StudentDAO();
        	
        	public static void main(String[] args) {
        		// 사용자에게 보여지는 부분을 꾸며줘도 된다.
        		try {
        			List<StudentDTO>list = STUDENTDAO.getAllStudents();
        			System.out.println(list.size());
        			System.out.println(list.toString());
        		} catch (SQLException e) {
        			// TODO Auto-generated catch block
        			e.printStackTrace();
        		}
        	}
        
        }
        728x90
        반응형

        'Java' 카테고리의 다른 글

        [입문 문제] 7. 두 수의 합  (0) 2024.06.19
        [입문 문제] 6. 나이 출력  (0) 2024.06.18
        [입문 문제] 5. 나눗셈 - 나머지 구하기  (0) 2024.06.17
        [Java] 125. JDBC 실습 : 학생 정보 관리 시스템 만들기  (0) 2024.06.17
        [Java] 124. JDBC에서의 예외 처리  (0) 2024.06.17
        다음글
        다음 글이 없습니다.
        이전글
        이전 글이 없습니다.
        댓글
      조회된 결과가 없습니다.
      스킨 업데이트 안내
      현재 이용하고 계신 스킨의 버전보다 더 높은 최신 버전이 감지 되었습니다. 최신버전 스킨 파일을 다운로드 받을 수 있는 페이지로 이동하시겠습니까?
      ("아니오" 를 선택할 시 30일 동안 최신 버전이 감지되어도 모달 창이 표시되지 않습니다.)
      목차
      표시할 목차가 없습니다.
      • [Java] 126. 연습 : JDBC-HikariCP를 사용해 코드 작성하기
      • 안녕하세요
      • 감사해요
      • 잘있어요

      티스토리툴바

      단축키

      내 블로그

      내 블로그 - 관리자 홈 전환
      Q
      Q
      새 글 쓰기
      W
      W

      블로그 게시글

      글 수정 (권한 있는 경우)
      E
      E
      댓글 영역으로 이동
      C
      C

      모든 영역

      이 페이지의 URL 복사
      S
      S
      맨 위로 이동
      T
      T
      티스토리 홈 이동
      H
      H
      단축키 안내
      Shift + /
      ⇧ + /

      * 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.