이하 구디아카데미 김지훈 강사님의 수업자료와 강의 내용 정리, 실습한 내용을 정리함
시간이 왜 이리 빠르지🤷♀️
보조 스트림
- 보조 스트림은 다른 스트림과 연결되어 추가 기능을 제공해주는 스트림이다.
- 사용하고 싶은 추가 기능과 관련된 보조 스트림을 추가한다.
- 보조 스트림은 계속해서 붙일 수가 있다.
- 아래에서 주 스트림과 보조 스트림을 구분해 보자.
- 주 스트림은 보조 스트림을 사용하기 위해 탑승해야 한다.
- 보조 스트림 추가 구문
보조 스트림 종류 - Buffered
- 보조 스트림에서는 성능 향상을 위한 Buffer 를 제공한다.
- Buffering 은 매우 유용한 기능임에도 부정적인 인식이 많다.
- buffer 는 전송 받은 내용들을 모아서 한꺼번에 전송할 수 있도록 해주는 임시 저장소다.
- buffered 보조 스트림 생성 시 8192 byte(i/o) 또는 8192(r/w)자의 저장소가 생긴다.
Buffered code
- BufferedInputStram 클래스에 메인 스트림인 is 를 담아 bis 로 객체화
- BufferedOutStrem 클래에서 메인 스트림인 fos 를 담아 bos 로 객체화
보조 스트림 종류 - Data
- 스트림은 java 의 데이터타입 int , boolean , long, 데이터를 전송할 수가 없다.
- 하지만 DataInputStream , DataOutputStream 을 이용하면 가능하다.
- 회원 가입 시 회원 정보 파일로 저장 순서
Data 회원가입 code
- index
- login 폼 생성
- id가 regist인 것을 가져와 click 이벤트를 걸면 콜백 함수 실행 / joinForm.jsp 로 보냄
- msg 변수 선언 msg 를 EL 태그로 가져옴 / 만약 msg 가 공백이 아니면 alert 메시지를 띄움
- join
회원가입 폼 생성
- controller
-
webservler 어노테이션으로 /join 경로, /login 경로로 들어오는 것들을 처리함
-
doPost 오버라이드 / 캐릭터인코딩을 UTF-8 로 세팅해줌
-
MemberModel 클래스 객체화 해옴
-
URI, contextPath 객체화해서 uri 에서 ctx 만큼 뺀 나머지 글자 sub 에 저장
-
msg 미리 선언
-
만약 sub 에 저장된 값이 /login 이라면 / id 의 파라메터를 변수 id 에 담고 / pw 의 파라메터를 변수 pw 에 담음 / id, pw 에 model 의 login 메서드 실행한 반환값을 msg 에 담음
-
만약 sub 에 저장된 값이 /join 이라면 / String 키와 String 값의 형태인 HashMap 클래스를 param 으로 객체화
param 에 id 라는 이름으로 id 의 파라메터 넣음
param 에 pw 라는 이름으로 pw 의 파라메터 넣음
param 에 name 라는 이름으로 name 의 파라메터 넣음
param 에 email 라는 이름으로 email 의 파라메터 넣음
param 에 gender 라는 이름으로 gender 의 파라메터 넣음
변수에 param 에 model 의 join 메서드를 실행한 값을 msg 변수에 담음
-
"msg"라는 이름으로 msg 값을 세팅함
-
index.jsp 로 값을 보냄
- memberModel
- join 메서드는 param 매개변수로 실행
msg 의 기본 값은 "해당 아이디가 이미 존재합니다."
- File 클래스에 c:/img/temp/(id).dat 파일이 존재하는지 확인해서 file 객체에 담음
- 만약 file 이 없으면 file 을 넣어 아웃풋스트림할 수 있도록 fos 로 준비 > fos 를 다시 Data아웃풋스트림할 수 있도록 dos 로 준비
- dos 에 id, pw, name, email, gender 를 입력한다.
- msg 에 "회원가입이 완료되었습니다." 를 넣는다.
- dos 를 flush 해준다 / dos 를 닫아준다.
- 반환값은 msg;
- login 메서드는 id, pw 매개변수로 실행
- msg 기본 문구는 "아이디 또는 비밀번호를 확인해 주세요!";
- file 클래스에 c:/img/temp/(id).dat 이 있는지 확인해서 file 객체에 담으
- 만약 file 이 있다면 아래 실행
파일인풋스트림 클래스에 file 을 넣어 인풋스트림할 수 있도록 fis 로 준비 > fis 를 다시 data인풋스트림할 수 있게 dis 로 준비
- dis 에 UTF 를 읽어와서 read_id 에 담음 / dis 에 UTF 를 읽어와서 read_id 에 담음 / gender 까지 반복
- 만약 pw 가 read_pw 와 같다면 msg 에 "로그인에 성공했습니다!" 넣음
- 사용한 dis 스트림 닫음
- msg 반환
보조 스트림 종류 - Object
- Data 로는 모든 type 을 보내긴 무리가 있다.
- 그래서 java 에서 최상위 객체인 Object 를 다룰 수 있는 보조 스트림이 있다.
- 객체 , 배열 , 컬렉션 등 다양한 데이터 형태가 들어갈 수 있다.
- Class 객체의 경우는 직렬화 (serialize) 를 하지 않으면 전달되지 않는다.
- Object 보조 스트림을 이용하면 Java 의 자료구조를 영구적으로 저장시킬 수 있다.
- 그럼으로써 서버가 종료되어도 Java 객체의 내용을 보존할 수 있게 된다.
- ArrayList 로 만들었던 게시판을 Object Stream 을 이용해 저장할 수 있도록 변경
게시판 code
BoardBean
- Object 를 쪼개 보내고자 직렬화/역직렬화를 수행하는 규격(interface) 로 Serializable 받아옴
list
1. 글을 작성할 수 있는 폼 작성
2. list 의 사이즈가 0이면 "아직 작성된 글이 없습니다." 출력
3. list 의 사이즈가 0보다 크면 forEach 문을 이용해 list를 items 에 넣고 board 라고 호출명을 부여함. 값은 stat라고 부름
4. 첫 번째 열에는 stat 의 index 를 출력
5. 두 번째 열에는 stat 의 index 로 가는 링크를 board(가져온 리스트를 호출하는 이름) 의 subject 로 출력
6. 세 번째 열에는 board 의 user_name(작성자) 를 출력
7. 네 번째 열에는 stat.index 로 가는 링크를 삭제로 출력
8. 테이블 아래에 list 의 size를 출력
9. 그 아래 list 값 출력
1. 글을 작성하는 폼 출력
2. action 속성은 write, 메서드는 post, 작성자, 제목, 내용의 각 name 속성은 user_name,subject,content
BoardController
1. webservlet 어노테이션을 사용해 / , write, detail, remove 라는 url 패턴으로 오는 것들을 처리함
2. doGet 과 doPost 메서드를 오버라이드 해옴 / dual 이라는 메서드를 실행
3. dual 메서드를 실행
4. 캐릭터를 UTF-8 로 인코딩해줌 / uri 를 요청해 와서 uri 변수에 담음 / contextpath 를 요청해서 ctx 에 담음 / sub 변수에 uri 에서 ctx 의 길이를 자른 값을 담음
5. 작업을 처리할 BoardModel 을 객체화해옴 / RequestDispatcher 타입의 dis 변수를 먼저 선언해 놓음(데이터를 페이지로 전송하기 위한)
6. 만약 sub 의 값이 "/" 라면 > model 객체의 getList 메서드를 실행해서 ArrayList<BoardBean>
타입의 list 변수에 담음
7. list.jsp 로 보내도록 dis 에 담고 forword 로 값 전송
8. 만약 sub 가 /write 라면
"user_name" 의 파라메터 값을 변수 user_name에 담음 "subject","content"도 담아줌
subject,content,user_name를 넣어 model 객체의 write 메서드를 실행
ctx 를 sendRedirect 를 이용해서 보냄(list 로 돌아간다)
BoardModel
- ArrayList 클래스를 가져와서 list 변수 선언
- ArrayList 타입의 getlist 함수는 list 를 반환한다.
- write 함수는 subject/content/user_name 을 매개변수로 하여 실행
BoardBean 클래스를 bean으로 객체화해옴
bean에 setSubject 라는 메서드를 subject 를 넣어서 실행 / content 와 user_name 도 동일 실행
그 후 list 에 bean 들을 추가함
내일 이어서...
- java i/O 기능의 종류 2가지를 설명하고 각 기능의 역할은?
- 자바 i/o에는 Input Stream, Output Stream 이 있고
Input Stream 파일을 읽어올 때 통로 역할을 하고 Output Stream 은 파일을 내보낼 때 통로 역할을 한다.
- 파일 ,디렉토리 등을 다룰떄 사용하는 객체와 디렉토리 존재여부를 확인하는 메서드는? - File 객체 / exists??
- 읽어올때 필요한 Stream 과 내보낼때 필요한 Stream은?
- 모든 Stream 은 사용후 반드시 이것을 해줘야한다. 이것은?
- form 태그의 enctype 속성에서 multipart/form-data가 의미하는 것은?
- form 이 보낼 데이터 타입이 여러 타입이다.
- @MultipartConfig의 maxRequestSize가 설정할 수 있는 값은?
- InputStream과는 다르게 OutPutStream을 사용할 때 필수로 해줘야 하는것은?
- read()를 사용해 데이터를 읽는 루프를 생성할 떄 조건에 != -1이 들어간다. 이 조건이 들어가는 이유는?
- read 가 숫자를 반환하기 때문에 더 읽을 내용이 없으면 -1을 반환하고,
이를 근거로 data 가 모두 읽혔음을 알 수 있다.
- Object 타입을 한번에 보내기엔 무리가있는데 데이터를 나눠서 보낼때 사용하는 보조 스트림은?
- 직렬화와 역직렬화의 역할에 대해 설명하고, 그 사이에 필요한 기능은?
- 오브젝트를 serialize 해서 스트림을 통해 보내는 것을 직렬화라고 하고
쪼개져서 전달된 오브젝트를 다시 구성하는 것을 역직렬화라고 한다.
- public static ArratsList<>에서 static을 붙여주는 이유는?
- 배열이기 때문에 값이 덮어쓰이는 것을 방지하기 위해 변수에 귀속시키지 않고 클래스에 귀속시킨다(모든 곳에서 하나의 값으로 사용하기 위해)
-
데이터를 변환해주어서 파일을 읽고 쓸수있는 보조스트림 2가지는?
buffered 보조스트림: 전송받은 내용들을 모아서 한꺼번에 전송할 수 있도록 해주는 임시저장소
data 보조스트림: 데이터타입 데이터를 전송하게 하기 위해 변환해 주는 보조 스트림
-
OutputStream은 byte 기반 최 상위 class이다. OutputStream의 하위 클래스 3가지는?
File InputStream / Buffered InputStream / Data InputStream
- buffer를 사용하면 입출력작용에 좋은점은?
일단 내일 다 완성하고 모르는 부분을 짚어보자