상세 컨텐츠

본문 제목

[인턴 OJT 5일차] Java DB 연동 select, insert

인턴

by 리잼 2022. 12. 16. 17:26

본문

반응형

2. DBEAVER 설치

https://dbeaver.io/download/

위에 사이트에서 설치 후 사진에 보이는대로 DB와 연결을 진행 해준다

마리아 DB는 default port가 3306 이다.

Tcp/Udp port 번호

포트번호
TCP/UDP
서비스
설명
20
TCP
FTP
FTP 전송 포트
21
TCP
FTP
FTP 제어(명령) 포트
22
TCP
SSH
ssh scp, sftp 같은 프로토콜 및 포트 포워딩
23
TCP
Telnet
암호화되지 않은 텍스트 통신
25
TCP
SMTP
Simple Mail Transfer Protocol - 이메일 전송에 사용
37
TCP
TIME
 
37
UDP
TIME
42
TCP
NAME SERVER
호스트 네임 서버
49
UDP
TACACS
 
53
TCP
DNS
Domain Name System
53
UDP
DNS
 
67
UDP
DHCP
DHCP 서버
68
UDP
BOOTP
 
69
UDP
TFTP
Trivial File Transfer (인증없는 파일전송)
70
TCP
GOPHER
 
79
TCP
Finger
핑거
80
TCP
HTTP
World Wide Web HTTP
80
UDP
HTTP
World Wide web HTTP
88
TCP
Kerberos
kerberos 보안 규격
101
TCP
Host Name
NIC Host Name Server
107
TCP
rTelnet
Remote Telnet Service
109
TCP
POP2
Post Office Protocol version 2 - 전자우편 가져오기에 사용
110
TCP
POP3
Post Office Protocol version 3 - 메일 수신
113
TCP
ident
예전 서버 인증 시스템, 현재 IRC 서버에서 사용자 인증에 사용
119
TCP
NNTP
Network News Transfer Protocol - 뉴스 그룹 메시지 가져오기 사용
123
UDP
NTP
Network Time Protocol - 시간 동기화
137
TCP
NetBOIS-ns

138
TCP
NetBIOS-dgm

139
TCP
NetBIOS-ssn
143
TCP
IMAP4
인터넷 메시지 접근 프로토콜 4 - 이메일 가져오기에 사용
161
UDP
SNMP
Simple Network Management Protocol
177
TCP
XDMCP
원격 호스트 접속 포트
179
TCP
BGP
Border Gateway Protocol
194
TCP
IRC
Internet Relay Char
389
TCP
LDAP
Lightweight Directory Access Protocol
443
TCP
HTTPS
HTTP over SSL (암호화 전송)
445
TCP
Microsoft-DS
액티브 디렉터리, 윈도 공유, Sasser-worm, Agobot, Zobotworm
445
UDP
Microsoft-DS
SMB 파일 공유
465
TCP
   
514
UDP
syslog
시스템 로그 작성
515
TCP
LPD
프린터 스풀러
540
TCP
UUCP
Unix-to-Unix Copy Protocol
542
UDP
   
542
UDP
   
554
TCP
rtsp
587
TCP
SMTP
email message submission
593
TCP
RPC over HTTPS
Exchange Server
636
TCP
LDAPS
IDAP Protocol over TLS/SSL
666
TCP
   
873
TCP
rsync
파일 동기화 프로토콜
989
TCP
FTPS
FTP Protocol, Data, over TLS/SSL
993
TCP
IMAPS
IMAP4 Protocol over TLS/SSL
995
TCP
POP3S
POP3 Protocol over TLS/SSL
1521
TCP
Oracle
Oracle
1935
TCP
Wowza
동영상 스트리밍 서버
3306
TCP
MySQL
MySQL 서버
3389
TCP
TERMINAL
넷미팅 원격 데스크탑

3. DB 예제 select, insert

위와 같은 에러가 나오면 DB계정 정보가 틀렸거나

마리아 DB와 Mysql이 같은 3306port를 사용하기 때문에 작업관리자에서 mysql을 종료하면 연결이 된다.

Statement와 Prepared Statement

- sql을 실행시킬 수 있는 객체

- 캐시 사용여부의 차이가 있다.

sql 실행 단계

1. 쿼리문장 분석

2. 컴파일

3. 실행

Statement

쿼리문을 수행할 때마다 SQL 실행단계 1~3 단계를 거친다

sql문을 수행하는 과정에서 매번 컴파일을 하기 때문에 성능상 이슈가 발생한다

			String insertSql = String.format("INSERT INTO tb_addressbook(NAME, GENDER, BIRTH, PHONE, ADDRESS) VALUES ('%s', '%s', '%s', '%s', '%s')", 
									paramData.getName(), paramData.getGender(), paramData.getBirthday(), paramData.getPhoneNumber(), paramData.getAddress());

Prepared Statement

컴파일이 미리 되어있기 때문에 Statement에 비해 좋은 성능

특수문자를 자동으로 파싱해주어 SQL injection 공격을 막을 수 있다.

"?" 부분에만 변화를 주어 쿼리문을 수행하므로 실행되는 sql문을 파악하기 어렵다

String pstmtSql = String.format("INSERT INTO tb_addressbook(NAME, GENDER, BIRTH, PHONE, ADDRESS) " + "VALUES (?, ?, ?, ?, ?)");

Prepared Statement를 사용해야 하는 경우

1.사용자 입력값으로 쿼리문을 실행하는 경우

- 특수 기호가 들어오더라도 알아서 파싱해주므로 이로 인한 에러를 막을 우 있음

2. 쿼리 반복 수행 작업일 경우

Statement와 PreparedStatement의 아주 큰 차이는 바로 캐시 사용여부이다.

Statement를 사용하면 매번 쿼리를 수행할 때마다 계속적으로 단계를 거치면서 수행하지만 PreparedStatement는

처음 한 번만 세 단계를 거친 후 캐시에 담아 재사용을 한다. 만약 동일한 쿼리를 반복적으로 수행한다면

PrepardStatement가 DB에 훨씬 적은 부하를 주며, 성능도 좋다.

FileAddressBookImpl

package com.barunsw.ojt.jmlee.day05;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.barunsw.ojt.constants.Gender;
import com.barunsw.ojt.vo.AddressBookVo;

public class FileAddressBookImpl {

	private List<AddressBookVo> addresBookList = new ArrayList<AddressBookVo>();
	
	private static Logger LOGGER = LoggerFactory.getLogger(FileAddressBookImpl.class);
	
	private static final String DB_URL = "jdbc:mysql://localhost:3306/ojt"; // DB 주소

	private static final String DB_USERNAME = "root";						// DB 사용자

	private static final String DB_PASSWORD = "1234";						// DB PW
	
	
	public FileAddressBookImpl() throws Exception {
		Class.forName("org.mariadb.jdbc.Driver");
	}
	
	public List<AddressBookVo> selectAddressBookVos(AddressBookVo paramData){
		
		try (Connection conn = DriverManager.getConnection(DB_URL, DB_USERNAME, DB_PASSWORD);
				Statement stmt = conn.createStatement();) {
			
			ResultSet resultSet = stmt.executeQuery("SELECT * FROM tb_addressbook");
			while (resultSet.next()) {						// next()는 데이터를 처음부터 읽어오기 때문에 roof를 돌면서 한줄 씩 출력하게 하는 함수
				String seq		= resultSet.getString(1); 
				String name		= resultSet.getString(2);
				String birth	= resultSet.getString(3);
				String gender	= resultSet.getString(4);
				String phone	= resultSet.getString(5);
				String address	= resultSet.getString(6);
				
				LOGGER.debug(String.format("seq : %s, name : %s, gender : %s, birth : %s, phone : %s, address : %s", seq, name, gender, birth, phone, address ));
			}
			
		} catch (SQLException sqle) {
			sqle.printStackTrace();
		}
		return addresBookList;
	}
	
	public int insertAddressBook(AddressBookVo paramData) throws Exception {
		String pstmtSql = String.format("INSERT INTO tb_addressbook(NAME, GENDER, BIRTH, PHONE, ADDRESS) "
				+ "VALUES (?, ?, ?, ?, ?)");
		
		try (Connection conn = DriverManager.getConnection(DB_URL, DB_USERNAME, DB_PASSWORD);
				PreparedStatement pstmt = conn.prepareStatement(pstmtSql);
				Statement stmt = conn.createStatement();) {
			
			//1 Statement 방식
			String insertSql = String.format("INSERT INTO tb_addressbook(NAME, GENDER, BIRTH, PHONE, ADDRESS) VALUES ('%s', '%s', '%s', '%s', '%s')", 
									paramData.getName(), paramData.getGender(), paramData.getBirthday(), paramData.getPhoneNumber(), paramData.getAddress());
			int result = stmt.executeUpdate(insertSql);
			LOGGER.debug("result:" + result);
			
			// 2 PreparedStatement 방식
			pstmt.setString(1, "김재민");
			pstmt.setString(2, "");
			pstmt.setString(3, "1995");
			pstmt.setString(4, "2509");
			pstmt.setString(5, "서울");

			int result2 = pstmt.executeUpdate();
			LOGGER.debug("result2:" + result2);
			
		}
		return 0;
	}
	
	public int updataAddressBook(AddressBookVo paramData) throws Exception {
		return 0;
	}
	
	public int deleteAddressBook(AddressBookVo paramData) throws Exception {
		return 0;
	}
	
	
}
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.barunsw.ojt.constants.Gender;
import com.barunsw.ojt.vo.AddressBookVo;


public class DbTest {

	private static Logger LOGGER = LoggerFactory.getLogger(DbTest.class);
	
	public static void main(String[] args) throws Exception {

		FileAddressBookImpl addressBook = new FileAddressBookImpl();
		
		addressBook.selectAddressBookVos(null);		
//		AddressBookVo paramVo = new AddressBookVo();
		
//		paramVo.setName("이재민");
//		paramVo.setGender(Gender.MAN);
//		paramVo.setBirthday("1995");
//		paramVo.setPhoneNumber("1234");
//		paramVo.setAddress("서울");
//		
//		addressBook.insertAddressBook(paramVo);
//		addressBook.selectAddressBookVos(null);		

	}

}

출력 결과

DB

반응형

관련글 더보기

댓글 영역