LOAD DATA LOCAL INFILE '파일 경로' INTO TABLE [데이터를 넣을 테이블명] FIELDS TERMINATED BY "열구분자" LINES TERMINATED BY '행구분자';
예)
LOAD DATA LOCAL INFILE 'D:\covid.csv' INTO TABLE covid_org FIELDS TERMINATED BY "," ENCLOSED BY '\"' LINES TERMINATED BY '\r\n';
D:\covid.csv 파일을 covid_org 테이블에 insert 하는데 열 구분자는 , 이고 내용에 ,가 들어간 경우 ENCLOSE BY를 통해 내용에 ,를 예외처리해준다.
행 구분자는 \r\n이다. (내용에 , 가 없는 경우 ENCLOSED BY를 제외해도된다)
이 쿼리문으로 CSV 파일로 대량 데이터 넣을 수 있습니다.
CREAT TABLE [테이블명] ( SELECT * FROM [복사할 테이블명])
이 쿼리문으로 기존 테이블의 내용을 카피하거나 특정 필드를 뽑아내거나 JOIN등으로 한번에 넣을 수 있습니다.
테이블을 삭제하고 새로운 테이블(뷰, 프로시저 .. 등)을 만들면 되겠지만 다시 만드는 순간 다른 db user(account)와의 관계(grant 해서 권한 준 것들)가 단절된다 겉으로는 테이블을 지우고 테이블을 수정해서 다시 만들었으니까 됐다고 생각하겠지만 이는 눈에 보이지 않는 관리번호의 변화를 불러오게 되어 관계단절을 불러오게 된다. 따라서 변경을 원할 때는 CREATE OR REPLACE를 사용을 권장한다.
어떤 테이블의 CRUD가 이루어졌을 때 어떤 전처리나 후처리를 하고 싶을 때 거는 조건이다.
delimiter | -- SQL문의 끝맺음기호를 ' | ' 로 바꿈
CREATE TRIGGER [트리거이름]
[BEFORE|AFTER] [INSERT|UPDATE|DELETE] ON [테이블이름]
FOR EACH ROW
[실행문];
|
delimiter ; -- SQL문의 끝맺음기호를 ' ; ' 로 원상복구시킴
BEFORE -- CURD 적용 전에 실행문을 적용시키겠다.
AFTER -- CRUD 적용 후에 실행문을 적용시키겠다.
참고로 테이블 전체의 변화도 읽지만 컬럼 하나의 변화도 트리거를 걸 수 있다
예) Update of [컬럼명] on [테이블명]
-- 예시)
DELIMITER |
CREATE OR REPLACE TRIGGER covidTrigger -- 트리거명 covidTrigger
AFTER UPDATE ON test -- test 테이블에 업데이트가 된 후에 적용 시키겠다.
FOR EACH ROW -- 모든 row에 적용시키겠다는 의미
'
BEGIN
UPDATE test SET modi_date = NOW() WHERE id = 1;
END |
'
DELIMITER ;
drop table map1;
drop table map2;
create table map1(
name varchar(500) primary key,
lat decimal(18,10),
logt decimal(18,10)
);
create table map2(
name varchar(500) primary key,
lat decimal(18,10),
logt decimal(18,10)
);
insert into map1 values ('map1',37.49268,126.78442);
insert into map2 values ('map2',37.49084,126.78518);
# 0.00899 lat 1m
# 0.01133 logt 1m
delete from map1 where `name` = 'map1';
delete from map2 where `name` = 'map2';
SELECT
(6371*acos(cos(radians(b.lat))*cos(radians(a.lat))*cos(radians(a.logt)
-radians(b.logt))+sin(radians(b.lat))*sin(radians(a.lat))))
AS distance
FROM map1 as a, map2 as b
참고로 구글지도의 좌표간 거리와 네이버지도의 좌표간 거리는 차이가 있습니다(네이버 지도가 약 100m 더 멀음)
package com.jsp.study;
import java.io.IOException;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
@WebFilter("/*") // 모든 url 호출에 대해서 이 필터를 거친다.
public class Filter implements javax.servlet.Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
response.setCharacterEncoding("UTF-8"); // 서블릿에서 직접 브라우저에 출력해줄 경우 쓴다 (out.print를 사용할 시)
response.setContentType("text/html; charset=UTF-8"); // HTML이 UTF-8 형식이라는 것을 브라우저에게 전달한다.
request.setCharacterEncoding("UTF-8"); // 파라미터에 해당하는 값을 UTF-8로 보내준다는 의미 (해당 로직에 POST 방식으로 데이터 보낼시)
System.out.println("before filter");
chain.doFilter(request, response); // 중간에 다른 Filter로 전이 시킬 수 있다.
System.out.println("after filter");
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// 서블릿 컨테이너가 필터를 초기화 시킨다.
}
@Override
public void destroy() {
// 인스턴스를 소멸하기 전에 호출하는 메소드
}
}
annotation을 이용한 방법입니다.
- 동작 방식
init으로 서블릿 컨테이너가 필터를 초기화시킵니다. 그 후 doFilter로 원하는 행위를 진행 시킨 후에 ServletRequest(Controller)에 전달합니다. 처리 후 destory를 실행시킵니다. 만약 종료하기 전에 해주고 싶은 행위가 있으면 destory를 실행하면 됩니다.
1계층은 물리계층으로 보낼 데이터 정보(0 또는 1로 되어있는 디지털 신호)를 아날로그 신호(전기적 신호)로 바꾸고 그와 반대 역할을 수행합니다 해당 장치로는 통신 케이블, 허브 등이 있습니다.
📝 OSI 2 계층
2계층은 데이터링크계층으로 여러 컴퓨터가 데이터를 보낼 때 데이터가 꼬일 수 있기 때문에 보내는 데이터에 특정 비트열을 붙여서 어디서부터 어디까지 읽어야하는지 정해준다 → 프레이밍
이 계층에서 전송되는 데이터 단위를 프레임이라고 한다.
예) "안녕하세요"를 보낼 경우 "안녕하세요"(프레임)까지 읽어야하는데 "안ㄴ"(프레임)까지만 읽는 경우 문제가 생기기 때문에 이렇게 보낸다
또한 같은 네트워내에 있는 MAC주소 기반으로 데이터를 보내는 역할도 합니다. 해당 장치로는 스위치와 브리지가 존재합니다.
📝 OSI 3 계층
3계층은 네트워크계층으로 받은 데이터를 목적지(IP)까지 가장 안전하고 빠르게 전달하는 기능이다. 2계층에서는 MAC주소 기반으로 같은 네트워크 내에 보내지만 서로 다른 네트워크에 대해서는 3계층을 이용한다. 전송 데이터 단위는 Packet이며 Packet단위로 전달한다 → 해당 장치로는 라우터가 있습니다. (공유기도 3계층 역할을 한다)
개인적인 생각으로 2계층으로 처리할 수 있으면 2계층으로 안 되면 3계층으로 처리하는 것 같다.
📝 OSI 4 계층
4계층은 전송계층으로 3계층으로 받은 데이터의 데이터의 무결성을 위해 오류검출(데이터 누락시 재전송 요청)및 복구, 흐름 제어와 중복검사 등을 수행한다 데이터 전송 단위는 Segment이다
대표적 프로토콜로 TCP와 UDP가 있다 → 운영체제의 커널에 소프트웨어적으로 구현되어 있다
TCP
연결을 설정하고, 데이터의 정확한 순서와 정합성을 보장하며, 수신 확인(ACK) 및 재전송을 관리합니다 [웹 브라우징(HTTP/HTTPS)]
UDP
빠른 전송이 필요한 경우 사용됩니다. 연결 설정 없이 데이터를 전송하며, 순서 보장이나 수신 확인이 필요 없고, 속도가 중요한 경우에 적합합니다 [실시간 스트리밍, 온라인 게임]
📝 OSI 5 계층
5계층은 세션계층으로 세션 계층으로, 통신 세션을 설정, 유지, 종료하는 역할을 담당합니다.
📝 OSI 6 계층
6계층은 표현계층으로 송수신자가 공통으로 이해 할 수 있도록 정보의 데이터 표현방식을 바꾸는 기능을 담당한다
데이터의 보안과 효율적인 전송을 위해 암호화와 압축을 수행하여 세션 계층 데이터를 암복호화(인코딩, 디코딩) 또는 압축하는 역할 → JPEG, MP3 등...
📝 OSI 7 계층
7계층은 응용계층으로 사용자가 네트워크 자원(보낸 데이터)에 접근하는 방법을 제공한다. HTTP를 통해 해당 데이터를 요청하고 7계층은 사용자가 볼 수 있는 유일 계층으로 모든 네트워크 활동 기반 인터페이스를 제공하는데 사용자가 이용하는 응용 프로그램들이 이에 포함된다고 생각하면 된다. (HTTP, HTTPS, FTP, SSH, 등)
예를 들면 HTTP의 경우 GET방식, Host, User-Agent정보 등이 포함되고 SSH의 경우 ssh 정보, SMTP의 경우 이메일 정보, FTP의 경우 user, password 정보가 포함된다.
📝 동작 순서
출발지에서 각 계층에 따른 역할을 붙히고 목적지에서는 그걸 해석하는 작업을 가진다
위에 그림과 같이 7 계층 → 6 계층 .... 1계층 → 1계층 → ... 7계층 보내는 쪽에서는 점점 데이터가 붙어서 전달하고 받는 쪽에서는 각각의 역할을 맡은 레이어별로 해당 부분의 데이터를 빼가면서 해석하며 전해준다
📝 TCP / IP 모델
현재는 OSI 7계층이 아니라 TCP / IP 모델을 쓴다 → OSI 7 layer가 시장 점유율에서 패배 (이론적으로는 OSI 7 layer로 설명) 5 ~ 7 계층을 TCP / IP 모델에서는 하나의 응용 계층으로 묶는 점이 다르다
📝 TCP/IP 1 계층
링크계층으로 OSI 1계층처럼 패킷을 하드웨어로 보낸다
📝 TCP/IP 2 계층
네트워크 계층으로 OSI 3계층처럼 수신지에 MAC 주소및 목적지 포트를 붙여서 전달한다
📝 TCP/IP 3 계층
트랜스포트 계층으로 OSI 4계층처럼 TCP프로토콜 기반으로 데이터를 패킷화 시켜서 보낸다
📝 TCP/IP 4 계층
애플리케이션 계층으로 OSI 5 ~ 7 계층에 해당하는 부분으로 어떻게 데이터를 요청할 지 등을 정한다 → HTTP , Telnet 등...
📝 TCP
연결지향이며 자체적으로 패킷을 이용해서 정보를 전달하므로 패킷은 규약이 있다 TCP는 전달받은 패킷을 재조립하고, 패킷에 손상이 있거나 손실된 패킷이 있다면 재전송을 요청한다.