본문 바로가기

수업 정리

30일차 수업정리

**Log 기록

    => 작업의 내역 같은 내용을 콘솔이나 텍스트 파일, 데이터베이스에 기록하는 것

        - 콘솔 : 코드 작성시 예외나 에러내역 확인을 위해 출력

        - 텍스트 파일 : 빈번히 발생하는 작업을 기록

    => 이전에는 작업 내역 확인 용도로 사용, 최근에는 데이터 분석분야에서 많이 사용

    => 이러한 로그를 전문적으로 수집해주는 Fluentd, Logstash 같은 수집기 프로그램도 있음

        - 웹 로그 : Google Analytics에서 수집, 통계 분석까지 수행

    => 대부분의 기업은 자체적으로 로그 수집을 수행

    => Log 파일은 일정한 주기를 가져야 함

        - 주기는 다양하지만 가장 많이 사용되는 주기는 날짜 별(Log파일 제작시)

        - 누구나 읽을 수 있는 텍스트 파일, 클래스가 없으면 읽지 못하는 Serializable을 이용할 것인지 결정(BlackBox)

 

**어제 프로젝트에서 오늘 날짜.log파일에 전체보기와 데이터 삽입이 발생한 경우 발생한 시간과 작업명 기록

    => 파일입출력

  1) 파일 입출력 스트림을 생성, 이 스트림을 이용하는 버퍼 스트림 제작

    => 파일에 문자단위로 기록하는 스트림 : FileWriter -> PrintWriter(버퍼)

  2) 파일에 기록시 write print메소드를 이용하고 마지막은 flush

 

    => 오늘 날짜를 문자열로 얻어내는 방법

        - java.util.Date 객체를 만들어서 나짜부분만 추출

        - java.util.Calendar 객체를 만들어서 날짜 부분만 추출

        - java.sql.Date 객체를 만들어서 toString()을 호출

 

1. 텍스트로 기록

<소스코드>

// 현재 날짜를 포함한 파일 결로를 만들기
// java.sql.Date 인스턴스 생성

Date today = new Date(System.currentTimeMillis());
String filepath = "./" + today.toString() + ".log";

// try() 안에서 만들면 close를 호출하지 않아도 됨
// true 를 대입한 것은 없으면 만들지만, 있으면 데이터를 뒤에 추가
try (PrintWriter pw = new PrintWriter(new FileOutputStream(filepath, true))) {
           java.util.Date date = new java.util.Date();
           pw.print(date.toString() + "\t" + "ID조회\n");
           //버퍼에 내용이 남아있지 않도록 버퍼의 내용을 모두 출력
           pw.flush();

} catch (FileNotFoundException e) {
           // TODO Auto-generated catch block
           e.printStackTrace();
}

2. Serializable 로 기록

    => Serializable 을 구현하기 위해서는 ObjectInputStream, ObjectOutputStream FileInputStream이나 FileOutputStream 인스턴스를 매개변수로 받아서 생성

  1) 데이터를 묶어서 표현할 클래스를 생성 - Serializable 인터페이스를 implements

    => java.util.Date String 1개를 갖는 클래스를 생성

//Log.java

import java.io.Serializable;

import java.util.Date;

 

public class Log implements Serializable {

           private Date date;

           private String task;

 

           public Date getDate() {

                     return date;

           }

           public void setDate(Date date) {

                     this.date = date;

           }

 

           public String getTask() {

                     return task;

           }

           public void setTask(String task) {

                     this.task = task;

           }

 

           @Override

           public String toString() {

                     return "Log [date=" + date + ", task=" + task + "]";

           }

 

}

  2) DAO 클래스의 필요한 메소드에 작성

    => 전체보기에 추가

// Serializable 방식 로그

Date curdate = new Date(System.currentTimeMillis());

String filename = "./" + curdate.toString() + ".dat";

try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(filename, true))) {

           Log log = new Log();

           log.setDate(new java.util.Date());

           log.setTask("전체보기");

           oos.writeObject(log);

           oos.flush();

}

 

    => 삽입에 읽는 부분 추가

//Serializable 된 데이터 읽어오기

Date today = new Date(System.currentTimeMillis());

String filename = "./" + today.toString() + ".dat";

try(ObjectInputStream oos = new ObjectInputStream(new FileInputStream(filename))) {

           Log log = (Log)oos.readObject();

           System.out.println(log);

}catch (Exception e) {

           System.out.println(e.getMessage());

}

 

**Modeling 순서

1. 개념적 모델링 : 고객의 요구사항을 개략적으로 도식화(그림)

2. 논리적 모델링 : 실제 구축하기 직전의 모형(테이블, , 관계등을 모델링)

3. 물리적 모델링 : 실제 구현

 

**좋은 모델링

1. 완전성 - 고객이 필요로하는 모든 업무의 데이터가 전부 정의

2. 중복 배제

3. 확장성이 있어야 함

 

**관계형 데이터베이스 모델(RDBMS)

    => 테이블의 집합으로 데이터를 표현하고, SQL을 이용하여 사용하는 데이터 베이스

        <대표적인 관계형 데이터베이스 관리 시스템>

        - Oracle : 대기업, 공공기관등

        - MySQL : MariaDB라고도 하며, 소규모 개발에 많이 사용

        - MS-SQL Server : Window Server에 설치가능한 데이터베이스 미국에서 많이 사용

        - Splite : Smartphone이나 브라우저에 내장되서 로컬에 저장할 목적으로 사용

        - PostgreSQL : 무료

        - HANA DB : sybase - 최근에 대기업에서 많이 채택 - SQL

        - Tibero : 우리나라 제품으로 공공기관에서 주로 이용

        - DB2 : 금융기관에서 많이 사용등

1. 6가지 특징

  1) 하나의 컬럼은 하나의 값만 가져야 한다

  2) 하나의 컬럼에 저장되는 데이터는 성격이 같아야 한다

  3) 하나의 행은 다른 행과 구별되어야 한다(구별속성 - 기본키)

  4) 열의 순서는 없다 - select insert할때 열 이름을 기재해 주는 것이 좋음

  5) 행의 순서는 없다 - 2개 이상의 행이 리턴되는 경우 order by를 이용하여 정렬

  6) 하나의 테이블에서 컬럼명은 중복되서는 안됨

 

2. Data Integrity(무결성)

  1) Entity Integrity(개체 무결성)

    => Primary Key NULL 이거나 중복 될 수 없음

    => 값을 갱신하면 안됨

  2) Referential Integrity(참조 무결성)

    => Foreign Key NULL이거나 참조할 수 있는 값만 가져야 한다

    => 입력 규칙 : Foreign Key는 참조하는 테이블에 존재하는 값만 가져야 함

    => 삭제 규칙 : Foreign Key는 부모 테이블에서 삭제될 때 같이 삭제되거나 NULL로 변경되야 함

  3) Domain Integrity(도메인 무결성)

    => 처음 설정된 도메인(Data Type, Length, Permitted Value, Range Value) 값만을 가져야 함

 

3. Data Model 3요소

  1) Entity : 테이블

  2) RelationShip : 테이블간의 관계

  3) Attribute : 테이블내의 속성(컬럼, 필드등)

 

4. Data Model 표현법 : ER-Diagram

    => Entity : 사각형

    => RelationShip : 마름모

    => Attribute :

    => 연결은 선, 기본키는 밑줄을 긋거나 색칠

 

5. 개념 모델링

    => 하나의 Entity에 성격이 다른 Attribute가 같이 있으면 안됨

    => Entity는 반드시 하나 이상의 관계를 가져야 함

 

**Plug-in

    => 독립적으로 실행하지 않고, 다른 프로그램의 일부분으로 설치하여 실행하는 프로그램

 

**eXERD

    => Database Model Tool

    => 이런 용도로 사용되는 프로그램 중에서 가장 유명한 프로그램은 ERWin

1. 모델링

    => 릴레이션(Entity, Table)

    => 속성(Attribute, Column, Field)

    => 관계(RelationShip)

  1) 테이블 만들기 : 도서, 출판사, 고객

 

  2) 컬럼 만들기 : 테이블을 선택하고, 스페이스바를 선택

 

  3) 관계 만들기 : 식별관계를 선택하고, 1쪽의 테이블에서 M쪽으로 드래그

    -> M:M 관계의 경우 : 별도의 테이블 제작 후 1:M 관계 2개를 생성

 

2. Forward Engineering

    => 일반적인 개발 순서대로 작업

    => 모델링 -> 데이터베이스에 구현

 

3. Reverse Engineering(역공학)

    => 일반적인 개발 순서의 반대로 작업

    => 구현된 데이터 베이스에서 설계 정보를 가져오는 것

 

 

포트폴리오 참고사항

1. 설명 + 왜 만들었나

2. 사용한 기술

3. 클래스, 데이터베이스 다이어그램

(상속은 꼭 들어가야 함 - 그래야 보이니까)

4.

5. 마지막으로는 내가 뭘 추가할건지