본문 바로가기

수업

[17일차] 2021.01.04

1교시

1) has a 관계

has a 관계를 갖는다. 갖고 있다. (멤버 변수를 갖고 있을 때,)

이 표현방법은 관계 설정을 할 때, 사용한다. 

 

CustomerController has a CustomerService.

CustomerController has a CustomerSuccessView.

CustomerController has a FailView.

 

멤버 변수를 가질 때

2) is a 관계

상위 클래스와, 항위 클래스를 만들 경우 is a 관계라고 칭한다. (상속 관계)

CustomerDAOList is a CustomerDAO.

 

ex) 

Person

- name: String

 

3) 다시 코드 리뷰

MainView 역할

(1) 전체 조회 (2) 고객 추가 (3) 고객 삽입 ...(9) 종료 

> 메뉴를 보여주고, 입력받는 역할을 한다. 

> 입력 받은 실제 제어를 하는 것은 Controller이다. 

 

Controller

는 Service 를 사용한다. 

login() 메소드 - Service login() 메소드 호출 - DAO 메소드 호출 selectById() 메소드 (List 오버라이딩되어 selectByID () 메소드 호출)

- 메소드를 호출을 해서, 정상처리와 , 에러처리에 관한 내용만 출력한다. 

백엔드에서 어떤일을 할지, 시키는 역할(제어하는 역할)

- 지시자이자, 일을 시킬뿐이다. 해당하는 역할들은 서비스와 DAO 에서 처리를 하는게 맞다. 

 

Service 

는 임시저장소의 리스트를 저장소삼아서 쓰고 있다. 

- 서비스가 하는 일이 없어보일 수 있지만, 어떤 DAO의 메소드를 호출할지 결정을 한다. Controller는 어떤 메소드를 호출할지 결정을 하지 않는다. 

- 서비스는 사용자의 요구사항 별로 메소드가 생성이 되면 된다. 즉, mainview 에 나와있는 메뉴들 별로 서비스 메소드를 만들면 된다. 

- 즉, usecase별로 서비스를 만들면 된다. 

- 메뉴별 기능이 서비스 메서드에 들어가야 한다. 

 

# 설계는 굉장히 중요하다. 설계도 하고, 구현도 해야 한다. 구현을 하면서, 잘못된 설계를 바로잡을 수 있어야 한다. 

 

-Session (아직 학습하지 못함)

CustomerShare : 로그인을 성공한 ID들이 저장되는 공간

 

1교시 정리: 

- Controller는 메인 뷰에서 어떤 메소드를 써야할지만 지시하는 공간이다. 메서드를 호출해, 정상처리는 어떻게 될지, 에러처리는 어떻게 표기할지 결정을 한다. 

- Service 는 메인뷰 ( 유저가 원하는 케이스들)에 관한 메소드를 관리하는 곳이다. 어떤 DAO 메소드가 어떤 메소드에 쓰여야 하는지 결정을 한다. 

- DAO 는 실제로 메소드가 데이터를 가지고 작업을 하는 공간이다. 


2교시 영구저장소를 만들어보자

FileoutputStream : 바이트 단위 스트림

 


5교시 추가 공부...^^... 

과제 끝낼 수 있을까? 

 

입력 스트림

1) 노드 스트림(Node Stream) : 자원과 직접 만나는 스트림,

ex) InputStream

- 키보드 읽어오기

InputStream is = System.in;

 

- 파일 읽어오기

FileInputStream : 바이트 단위로 읽기

FileInputStream fis = new FileInputStream("a.txt");

 

FileReader : 문자 단위로 읽기

FileReader fr = new FileReader("a.txt");

fr.read(); // 한문자씩 읽기때문에 너무 불편하다. 

 

- 소켓 읽어오기 (네트워크를 이용해, 다른 컴퓨터와 접속할 수 있는 End point)

InputStream is = s.getInputStream();

 

2) 필터 스트림: 노드스트림을 가공하기 위함

InputStreamReader

DataInputStream : DATA 타입별로 읽는다.

DataOutputStream : DATA 타입별로 쓴다.

- writeInt();

- writeLong();

- write Double();

 

FileOutputStream fos = new FileOutputStream("a.txt");

DataOutputStream dos = new DataOutputStream(fos); 

dos.writeShort(1); //short타입은 2바이트를 차지한다.

dos.writeInt(2); //4바이트를 차지한다.

dos.wirteLong (3); //8 바이트를 차지한다. 

dos.close();

for.close();

 

//총 14바이트로 저장. 

 

ex) a.txt 파일에 글 쓰기

FileOutputStream 사용 예정

DataOutputStream을 사용한다. 

 

왜? DataType별로 써야 할까? 

일반 편집기로 읽을 수 없는 장점이 존재한다. (메모장에서 확인이 불가하다.)

short 타입인지, int 타입인지 알아낼 가능성이 없다. 

Data타입 별로 타입 순서만 아는 사람만 알게하려고 한다. 

프로토콜을 아는 사람만 읽을 수 있도록 한다. 

쓰는방법을 아는 사람만 쓸 수 있다. 

 

자료형별로 쓴 순서대로 읽기를 원할 경우, Data라는 필터를 사용하면 된다. >> 네트워크에도 다시 사용된다.

 

2-1)그 외 필터 스트림

ObjectInputStream

ObjectOutputStream

 

ex) a.ser

FileOutputStream 사용 예정

ObjectOutputStream 사용

 

FileOutputStream fos = new FileOutputStream();

ObjectOutputStream oos = new ObjectOutputStream(fos);

 

oos.writeObject(new Date()); // 객체를 쓰기가 가능하다. JVM 밖에 있는 파일에 JVM에서 생성한 객체를 내보내는 것

//writeObject를 만나면, 파일에 쓸수있는 상태로 만든다. : 객체 직렬화

객체 직렬화: JVM에서 만든 객체를 JVM 밖으로 내보내기 위해 일렬로 있다. 

직렬: 객체의 내용을 일렬로 나열시키기

가장 앞은? 자료형이 어떤 타입인지 setting , 객체의 멤버 변수들이 차례대로 대입된다. (1롤로 나열)

사용하면, 내부에서 직렬화 작업이 완성된다. 

 

직렬화? 객체의 내용을 일렬로 나열시키는 것.

가장 앞에는? 객체의 타입, 객체에 대한 자료형, 

객체가 가지고있는 멤버 변수의 값이 채워진다. 

이 내용이 그대로 파일에 들어감. 

하지만, 이 내용은 일반 편집기로 확인이 불가하다. 그렇다면, 어떻게 하면 정확히 읽을 수 있을까? 

 

 

FileInputStream fos = new FileInputStream();

ObjectInputStream oos = new ObjectInputStream(fos);

 

객체 역질렬화 : 직렬로 정렬된 것을 읽는 것, JVM 밖에 있는 것을 JVM안쪽에 넣기

 

직렬화는 객체를 얼린다고 생각하면 쉽다. - writeObject

역질렬화는 객체를 녹인다라고 생각하면 쉽다. - ReadObject

 

5교시 정리

1. 필터스트림에는 Data와 Object를 활용한 것들이 존재한다. 

DataOutputStream을 이용하면, 특정 크기의 데이터를 write할 수 있으며, 이때, write한 순서대로 read해야만 한다. 

2. ObjectOutputStream을 이용하면, JVM에 저장된 객체의 내용을 밖으로 출력이 가능하다. 이를 객체 직렬화라고 한다. 즉 객체의 내용이 직렬로 나열 된다. 

3. 이렇게 객체 직렬화 된 내용을 읽기 위해서는 ObjectInputStream을 통해서만 읽을 수 있다. 이를 객체 역질렬화를 한다고 칭한다. 


6교시

객체 직렬화는 어떤건 되고, 어떤것은 안 되는 것이 존재한다. 

java.io.Serializable interface를 implement를 하지 않은 클래스 타입의 객체는 에러가 발생한다. 

 

이를 해결하기 위해서는 해당 객체를 implements 해주면 된다. (구현부가 되도록 바꾼다.)

 

직렬화는 JVM의 밖을 보내는 것으로, 보안상 위험하다. 그렇기 때문에 아무 객체만 보내는 것이 아니라, 특정 조건을 만족하는 객체만 해당이 된다. 

 

 

쓰기한 고객객체와 읽기한 고객객체가 다르면, error가 발생할 수 있다. 

 

1) 직렬화를 할 때, 객체의 특정 내용을 제외하고 싶은 경우

보안 문제 때문에

transient 예약어를 사용하면, 객체 직렬화에서 예외 대상이 된다. (직렬화를 할 때만 제외하고 싶을 때 사용한다.)

 

2) static 멤버 변수들은 직렬화 대상일까? 

되지 않는다. why? JVM 메모리 영역중에서 heap에 저장되지 않는다. Class Area에 저장이되어 있음. 

객체 직렬화에 포함이 되지 않는다.

객체 직렬화는 JVM 메모리 영역중에서 Heap을 불러온다. 

 

객체직렬화는 스프링프레임워크에서 매우 중요하다.

 

 

 

 

'수업' 카테고리의 다른 글

[20일차] 2021.01.06 네트워크 프로그래밍  (0) 2021.01.06
[19일차] 2021.01.05  (0) 2021.01.05
[2020.12.17] static  (0) 2020.12.17
[5일차 예습] 정렬  (0) 2020.12.13