userRes에서 Select query문을 통해 데이터를 가져오는것같다. 받은 데이터를 GetUserRes의 각 getInt, getString을 통해 각각 데이터를 넣어준다. BaeMin.user 테이블의 모든 데이터를 가져와서 GetUserRes 오브젝트에 저장하고 해당 결과를 return해준다.
Post를 통해 테이블에 유저를 추가해주는 addUser이다. Insert into 를 통해 각각 데이터들을 createUserParams 오브젝트에 담아 디비에 삽입한다. 이후 리턴값으로는 addUser된 User의 idx가 반환된다.
Get메서드로 users에 데이터를 보낸후 반환결과이다.(GET localhost:8080/users)
User 테이블의 데이터들을 모두 가져온다.
Post메소드로 데이터를 전송했을 때 이다. Body에 필요한 값들을 채워주고 데이터를 전송한경우 return으로 해당 User의 userIdx를 가져오는것을 볼 수 있다.
이후 UserTable이다.
Post메소드로 해당 값들을 전송한경우 테이블에 값이 추가된것을 볼 수 있다.
어노테이션이나 데이터의 플로우를 아직 정확하게 모르는 상황이다. 이후 추가적인 학습을 통해 어노테이션과 Spring boot에서의 데이터 플로우 등을 더 학습할 예정이다.
키워드정리
API
API(Application Programming Interface) : 응용 프로그램에서 사용가능하도록 운영체제나 프로그래밍 언어가 제공하는 기능을 제어할수 있게 만든 인터페이스
API를 사용하면 개발자들이 어플리케이션 코드를 작성하는 방법을 표준화 함으로써, 개발자간의 협업을 용이하게 만들어주고 간소화를 통해 빠른 프로세스 처리를 가능하게 해준다.
Http 패킷
웹의 어플리케이션 계층 프로토콜이며 웹 상(웹서버 ↔ 웹 클라이언트) 에서의 통신에 사용되는 프로토콜이다.
Http 메소드
GET
서버의 정보를 조회 하기 위해 설계된 메서드이다.
데이터를 Body에 담지않고 URL에 쿼리스트링을 붙여 전송합니다.
대량 데이터전송이 불가능하다.
POST
데이터 생성/변경 등을 위해 설계된 메서드이다.
GET 메소드와 다르게 Body에 정보를 담아서 서버에 전송합니다.
GET과 달리 대용량 데이터전송이 가능하며 Body에 데이터가 전송되기 때문에 url에서 확인되지않는다.
데이터 포맷
Header와 Body로 구성된다.
Header
1.요청 메소드 : GET, POST, PUT, OPTIONS 등이 명시된다.
2.요청 URL : 요청하는 서버의 URL
3.HTTP 프로토콜 버전 : 웹 브라우저가 사용하는 프로토콜 버전
4.상태코드 : 응답 헤더에 존재하는 요청의 성공 여부 (200, 400, 402)전송할 데이터
Body
전송할 데이터를 입력한다.
API Sheet
구현할 기능, HTTP메소드, URL, 개발여부 등을 정리하여 표로 만든것이다.
path variable
경로를 변수로서 사용하는 것이다.
게시물의 경우 각각의 유저가 본인들의 게시글을 확인해야한다.
/post/6 이라고 설정해주면 userIdx가 6인 user의 게시물들을 볼수 있게 처리하는것이다.
HTTP(Hypertext Protocol) : 웹상에서 사용하는 프로토콜 일반적으로 80포트 사용
HTTPS보안기술이 적용되어 통신의 안전성이 확보되었다. 보통 443포트사용Secure Sockets Layer라는 암호규약
전달되는 내용이 다른사람에게 노출되거나 전달되는 내용이 악의적으로 변경되는것을 막을 수 있다.
SSL
Secure Sockets Layer라는 암호규약
전달되는 내용이 다른사람에게 노출되거나 전달되는 내용이 악의적으로 변경되는것을 막을 수 있다.
FTP
TCP/IP기반에서 서버와 클라이언트 사이의 파일전송을 위한 프로토콜이다. 보통 20, 21번포트를 사용한다.
File Transfer Protocol
SFTP
보안 파일 전송 프로토콜로 불리며 22번 포트를 사용한다. ssh와 같은 방식을 사용한다고 한다. ssh는 secure shell이다.
MYSQL
SQL을 사용하는 공개소스의 관계형 데이터베이스 관리 시스템(RDBMS)를 사용하기 위한 포트로 일반적으로 3306번을 사용한다.
SSH
시큐어 쉘(Secure Shell)은 네트워크 상의 다른 컴퓨터에 로그인하거나 원격 시스템에서 명령을 실행하고 다른 시스템으로 파일을 복사할 수 있도록 해주는 포트입니다.
OSI 7 계층
네트워크 계층
1Layer - Physical Layer : 하드웨어 전송 기술로 이루어진 계층이다. 전기적인, 기계적인 신호를 주고받는 역할을 한다. 비트 0,1의 통신단위로 통신한다.
2Layer - Data Link Layer : 데이터 링크 계층은 Point to Point간의 전송을 보장하기 위한 계층이다. DataLink 계층의 대표적인 장비로는 스위치와 브릿지가 있다. MAC주소가 Data Link계층에 해당한다. 전송단위는 Frame이다.
3Layer - Network Layer : IP주소를 제공하는 계층이다. 네트워크 계층에서는 대표적으로 노드들을 거칠 때 마다 라우팅 해주는 역할을 담당한다. 대표적인 라우팅 장비로는 공유기가 있다. 전송단위는 Packet이다.
2Layer - Data Link Layer : 데이터 링크 계층은 Point to Point간의 전송을 보장하기 위한 계층이다. DataLink 계층의 대표적인 장비로는 스위치와 브릿지가 있다. MAC주소가 Data Link계층에 해당한다. 전송단위는 Frame이다.
5Layer - Session Layer : 데이터를 만들어내는 계층이다. 양 끝단의 응용 프로세스가 통신을 관리하기 위한 방법을 제공한다. 해당 계층에서 TCP/IP 세션을 만들고 없애는 책임을 진다.
6Layer - Presentation Layer : 표현 계층은 코드간의 번역을 담당하여 사용자 시스템에서 데이터 형식상 차이를 다루는 부담을 덜어준다. MIME 인코딩이나 암호화 등의 동작이 이 계층에서 이루어진다. 데이터의 압축 인코딩 등이 이 계층에서 다루어진다.
7Layer-Application Layer : 응용 계층은 응용 프로세스와 직접 관계하여 일반적인 응용 서비스를 수행한다. 우리가 사용하는 사용자 인터페이스를 제공하는 프로그램등을 말한다. HTTP, FTP등의 프로토콜이 응용 계층에 속한다.
TCP/IP
TCP
TCP(Transmission Control Protocol)은 IP 네트워크의 두 컴퓨터 간의 연결 지향 통신을 위한 전송 계층 호스트 간 프로토콜 입니다.
TCP의 경우 신뢰성있는 통신을 보장한다. 데이터가 전달되는 과정에서 여러 스위치 라우터 등등을 거치면서 데이터가 잘못 전달되는 현상이나 전달이 안되는 경우 오류제어, 흐름제어를 통해 신뢰성있는 데이터가 전달될 수 있도록 한다.
TCP는 4Layer인 TransPort 계층에 위치한다. 웹 브라우저들이 서버에 연결할 때도 사용한다.
IP
IP는 패킷 전달 여부를 보증하지 않고, 패킷을 보낸 순서가 다를 수 있다.
Internet Protocol의 패킷 전송과 정확한 순서를 보장하기 위해 TCP를 사용한다.
패킷 통신방식의 인터넷 프로토콜IP(인터넷 프로토콜)이다.
IP
Packet
Header
HTTP 메시지를 생성한 일시, 클라이언트와 서버간 연결에 대한 옵션 설정 등이 포함되어있다.
HTTP Method, Request target, HTTP Version 등이 명시되어있다.
Host : 요청이 전송되는 target의 host url
User-Agent : 요청을 보내는 클라이언트에 대한 정보(웹브라우저 정보)
Accept : 해당 요청이 받을 수 있는 응답(response) 타입.
Connection : 해당 요청이 끝난후 클라이언트와 서버가 계속해서 네트워크 커넥션을 유지할 것인지, 끊을 것인지에 대해 지시하는 부분Content-Length : 메세지 body의 길이
또한 Body에 대한 정보들이나 Cookie등도 가지고 있다.
Content-Type : 해당 요청이 보내는 메시지 Body의 타입(JSON, application/json)
Content-Length : 메세지 body의 길이
Body
Body가 없는 request도 많다.
Request의 실제 메세지/내용
IPv4
IP주소의 종류중 하나로 32비트 길이의 식별자로 0.0.0.0 ~ 255.255.255.255까지의 숫자의 조합으로 이루어진다. 총 네구간으로 나누어져 있으며 최대 12자리 번호로 이루어져 있다. 전세계 공용으로 사용되어왔으며 인터넷 사용자 수가 급증하면서 IPv4주소가 고갈될 문제에 쳐해있다. 이러한 고갈문제를 해결하기 위해 IPv6가 등장했다.
IPv6
IPv4주소체계를 128비트 크기로 확장한 차세대 인터넷 프로토콜 주소이다. 16비트씩 8부분으로 16진수로 표기
좌측의 코드를 수정하여 우측의 데이터들을 제어할 수 있으며, Entity들의 경우 마우스 드래그를 통해 원하는 위치에 지정시킬 수 있다.
테이블의 내부 정보중 열쇠모양이 있는데 저것은 Primary key를 표시한것이다. 이처럼 한눈에 데이터베이스의 구조와 내부 데이터들 정보까지 확인할 수 있는 편한 툴 인것 같다.
상단의 EXPORT를 통해 sql 데이터를 추출하여 다른 프로그램에서 사용하능하다. 또한 추출을 이미지 파일이나 pdf파일로도 추출이 가능하여 편리하게 다양한곳에 사용가능하다.
또한 IMPORT를 통해 다른곳에서 사용한 sql데이터를 가져와 시각화 및 데이터 수정 구조 이해 등이 가능하다.
QuickDBD를 통해 훨신 쉽고 편하게 DB설계가 가능하고 개발중 수정이나 데이터 삭제 또한 매우 쉽게 가능할것으로 보인다.
DB설계는 해본적이 없으며 이론만 가볍게 접해본 입장에서도 이러한 프로그램은 디비 구조를 이해하는데 정말 많은 도움이 될것으로 보인다. 또한 프론트, 디자이너와의 협업에 있어서도 DB구조 이해에 많은 도움이 될것으로 보인다.
졸업 프로젝트 혹은 그외의 많은 프로젝트를 수행하는데 있어 Quick DBD는 많이 활용할 예정이다.
UMC 프로젝트 기간에 협업 툴로 사용하면 좋을것으로 보이며 앞으로 백엔드 개발할때 DB를 관리하고 이해하는데 사용하면 매우 좋을것 같다. 프로젝트의 전반적인 계획과 구상할 때에도 해당 툴을 활용할 예정이며 개발 중간 보고 최종보고 시에도 QuickDBD를 사용하여 정리된 데이터베이스를 보여줄 예정이다.
FilterInputStream과 FilterOutputStream은 InputStream/OutputStream의 자손이면서 모든 보조스트림의 조상이다.
보조스트림은 자체적으로 입출력을 수행할 수 없기 때문에 기반 스트림을 필요로한다.
protected(FilterInputStream(InputStream in)
public FilterOutputStream(OutputStream out)
FilterI/OStream의 모든 메서드는 기반스트림의 메서드를 그대로 호출하고 Filter보조스트림은 아무런 일을 하지않는다. FilterInputStream, FilterOutputStream은 상속을 통해 원하는 작업을 수행하도록 읽고쓰는 메서드를 오버라이딩 해야한다.
FilterInputStream의 자손 BufferedInputStream, DataInputStream, PushbackInputStream 등
FilterOutputStream의 자손 BufferedOutputStream, DataOutputStream, PrintStream 등
BufferedInputStream, BufferedOutputStream
버퍼 보조스트림은 입출력의 효율을 높이기 위해 사용된다. 버퍼를 이용해서 한번에 여러 바이트를 입출력하는것이 빨라지기 떄문이다.
BufferedInputStream(InputStream in, int size) : InputStream인스턴스와 버퍼 사이즈를 지정하여 버퍼 InputStream을 생성한다.
BufferedInputStream은 입력소스로부터 데이터를 buffer크기만큼 데이터를 읽어 내부 버퍼에 저장해놓는다. 프로그램에서는 외부가 아닌 내부 버퍼에 저장된 데이터를 읽어들이기 때문에 효율적인 데이터 처리가 가능하다.
내부 버퍼에 저장된 모든 데이터를 읽어들인 이후 read메서드가 호출되면 BufferedInputStream은 입력 소스로부터 다시 버퍼크기만큼의 데이터를 읽어다 버퍼에 저장해 놓는다.
BufferedOutputStream(OutputStream out, int size) : OutputStream인스턴스와 버퍼 사이즈를 인자로 던져 내부버퍼를 갖는 BufferedOutputStream 인스턴스를 생성한다.
BufferedOutputStream(OutputStream out) : OutputStream인스턴스를 인자로 주며 사이즈를 지정해주지 않을 경우 기본 버퍼사이즈는 8192byte크기가 된다.
flush() : 버퍼의 모든 내용을 출력하여 버퍼를 비운다.
close() : flush()를 호출해서 버퍼의 모든 내용을 출력하고 BufferedOutputStream인스턴스가 사용하던 모든 자원을 반환한다.
BufferedOutputStream 도 버퍼를 이용하여 출력작업을 하게 된다. write()메소드를 이용하여 BufferedOutputStream의 데이터를 내부 버퍼에 복사하고 버퍼로부터 출력한다. 버퍼의 모든내용을 출력한 후 write()호출 시 버퍼를 비우고 추가적인 데이터들을 내부 버퍼에 복사한다.
출력소스가 버퍼에 남아있는 채로 프로그램이 종료될 수 있기 때문에, BufferedOutputStream을 사용완료한 후에는 반드시 BufferedOutputStream의 close()메소드나 flush() 메소드를 호출해 버퍼의 모든내용이 출력되도록 해야한다.
버퍼의 사이즈가 5기때문에 처음 write호출시 1부터 5까지만 write되고 6,7,8,9는 버퍼에 존재한다.
버퍼를 비우기위해 bos.close()를 호출하여 버퍼에 존재하는 6,7,8,9가 출력되고 버퍼를 비운다.
abstract int read() : 1byte를 읽어온다. 더이상 읽어올 데이터가 없으면 -1을 반환한다.
int read(byte[] b) : 배열 b의 크기만큼 읽어서 배열을 채우고 읽어온 데이터 수를 반환한다.
int read(byte[] b, int off, int len) : len개의 byte를 읽어서, 배열 b의 지정된 위치(off)부터 저장한다. 실제로 읽어오는 데이터의 수는 len보다 작을 수 있다.
void reset() : 스트림에서의 위치(offset)를 마지막으로 mark()이 호출되었던 위치로 되돌린다.
long skip(long n) : 스트림에서 주어진 길이(n)만큼을 건너뛴다.
OutputStream 메서드
void close() : 입력소스를 닫음으로써 사용하고 있던 자원을 반환한다.
void flush() : 스트림의 버퍼에있는 모든 내용을 출력소스에 쓴다.
abstract void write(int b) : 주어진 값을 출력소스에 쓴다.
void write(byte[ ] b) : 주어진 배열 b에 저장된 모든 내용을 출력소스에 쓴다.
void write(byte[ ] b, int off, int len) : 주어진 배열 b에 저장된 내용 중에서 off번째부터 len개 만큼만을 읽어서 출력소스에 쓴다.
flush()는 버퍼가 있는 출력스트림에서만 의미가 있다.
프로그램이 종료될 때, 사용하고 close하지 않은 스트림을 JVM이 자동적으로 닫아주기는 하지만 스트림을 사용 완료한 이후에는 close()를 호출하여 반드시 닫아주는 것이 좋다.
ByteArrayInputStream처럼 메모리를 사용하는 스트림, System.in, System.out과 같은 표준 입출력 스트림은 닫아주지 않아도 된다.
ByteArrayInputStream과 ByteArrayOutput
바이트배열에 데이터를 입출력하는데 사용되는 스트림이다. 입출력하기 전에 데이터를 임시로 바이트배열에 담아서 변환 등의 작업을 하는데 사용된다.
스트림의 종류가 달라도 읽고 쓰는 방법은 동일하다.
ByteArrayInputStream()에 읽을 데이터를 매개변수로 주어 읽기 스트림을 주고 ByteArrayOutputStream을 생성해주어 각InputStream에 저장된 데이터를 하나씩 입력받아 출력 스트림에 쓴다. 이후 스트림에 적은내용을 배열에 옮긴다.
배열을 스트림을 통해 복사하는 방법이다.
배열 크기 복사
InputStream의 offset 0부터 temp.length만큼 데이터를 읽어 temp에 저장한다.
이후 temp에 저장된 내용을 temp의 offset 5부터 길이 5만큼 outputStream에 쓴다.
available()을 통해 스트림에 읽을 데이터가 남아있는경우 반복문이 계속 실행되게하고 내부에서는 데이터를 temp의 크기(4byte)만큼씩 temp에 저장하고 output.write를 통해 temp 에 저장된 데이터를 outputStream에 temp크기만큼씩 쓴다.
tmep의 마지막 저장결과를 보면 4바이트씩 읽다가 마지막에 입력스트림에 2바이트밖에 남지않아 2바이트를 읽은 경우이다. 기존의 데이터를 가지고있는상태에서 2바이만 새로읽어 뒷내용이 유지된다. 이후 OutputStream의 결과처럼 temp의 모든내용이 저장된다.
위의 예제에서의 temp에서 저장된 데이터가 변하지 않는 문제점을 해결한 예제이다. 읽은 크기만큼만 write하기 때문에 마지막에 2byte를 읽은경우 2byte만 write하여 배열이 그대로 복사된다.