2. DBEAVER 설치
위에 사이트에서 설치 후 사진에 보이는대로 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
'인턴' 카테고리의 다른 글
[인턴 OJT 7일차] mybatis (0) | 2022.12.21 |
---|---|
[인턴 OJT 6일차] File I/O , DBAddressImpl 수정 및 복습 (0) | 2022.12.20 |
[인턴 OJT 4일차] 직렬화 ( serialization ), file i/o 기반 주소록 (0) | 2022.12.15 |
[인턴 OJT 3일차] Static, File I/O, Static, bit/byte (0) | 2022.12.14 |
[인턴 OJT 2일차] slf4j, java.lang.*, String 메서드, Wrapper Class(래퍼 클래스) (1) | 2022.12.13 |