본문 바로가기

카테고리 없음

30일차 공부 Log, 모델링,eXERD,완전수

1 교시

 

** Log 기록

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

코드 작성 시 예외나 에러 내역같은 것들을 확인할 때는 콘솔에 출력하고 빈번히 발생하는 작업은 텍스트 파일에 기록한다.

=> 전에는 작업 내역을 확인하는 용도로 많이 사용되었는데 최근에 데이터 분석 분야에서 만힝 사용

=> 이러한 로그를 전문적으로 수집해주는 Fluentd, LogStash 같은 수집기 프로그램도 만들어져 있다.

웹 로그의 경우 Google Analytics 에서 수집 및 통계 분석까지 수행해 준다.

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

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

주기는 다양하다.

가장 많이 사용되는 주기가 날짜별이다.

log파일을 만들 때 날짜별로 만드는 것이 중요하고 누구나 읽을 수 있는 텍스트 파일 형태로 할 것인지 아니면 클래스가 없으면 읽지 못하도록 하는 Serializable을 이용할 것인지 결정해야 한다.

Serializable을 이용하는 대표적인 경우가 BlackBox이다.

 

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

 

=> 파일 입출력

1) 파일 입출력 스트림을 생성하고 이 스트림을 이용하는 버퍼 스트림을 만들어야 한다.

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

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

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

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

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

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

 

1. 텍스트로 기록

Date today = new Date(System.currentTimeMillis());
// 현재 디렉토리에 오늘날짜.log 문자열 생성
String filepath = "./" + today.toString() + ".log";
try(PrintWriter pw = new PrintWriter(new FileOutputStream(filepath, true))){
    // 현재 날자 및 시간까지 갖는 java.util.Date 인스턴스를 생성
    java.util.Date date = new java.util.Date();
    // 필요한 내용을 기록
    pw.print(date.toString() + "\t" + "삽입" + "\n");
    // 버퍼에 내용이 남아있지 않도록 버퍼의 내용을 모두 출력
    pw.flush();
}
결과: 전체보기(1)와 데이터삽입(5)을 하면 로그파일이 생성된다.

 

 

 

 

2 교시

 

 

2. Serializable로 기록

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

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

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

package javaapp0518;

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 클래스의 필요한 메소드에 작성

=> 전체보기에 추가

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();
}

 

=> 삽입에 추가

public int insertNBAPlayer(NBAPlayer nbaplayer){
    // Serializable 된 데이터 읽어오기
    Date today1 = new Date(System.currentTimeMillis());
    String filename = "./" + today1.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. 완전성 - 고객이 필요로 하는 모든 업무의 Data가 전부 정의

2. 중복배제

3. 확장성이 있어야 함

 

** 관계형 데이터베이스 모델

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

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

Oracle(대기업, 공공기관 등),

MySQL(Maria DB - 소규모 개발에 많이 사용),

MS-SQL Server(Windows Server에 설치가능한 데이터베이스 미국에서 많이 사용),

Sqlite(Smartphone이나 브라우저에 내장되서 로컬에 저장할 목적으로 사용),

PostgreSQL(무료),

HANA DB(Sybase- 최근에 대기업에서 많이 채택-SAP),

Tibero(우리나라 제품으로 공공기관에서 주로 이용),

DB2(금융기관에서 많이 사용) 등

 

1. 6가지 특징

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

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

3) 하나의 행은다른 행과 구별되어야 한다. 구별을 해주는 컬럼이 Primary Key

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. Date Model 표현법 : ER-Diagram

=> Entity : 사각형

=> RelationShip : 마름모

=> Attribute : 원

=> 연결은 선

=> 기본키는 밑줄을 긋거나 색칠

 

5. 개념 모델링

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

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

 

** Plug-In

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

 

** eXERD

=> Datebase Modeling 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

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

 

 

 

완전수

package javaapp0520;

public class PerfectMain {

    public static void main(String[] args) {
        // 완전수 : 자신을 제외한 약수의 합이 자신과 동일한 수
        // 6: 1,2,3,6 - 1+2+3+6 완전수
        // 2부터 1000까지 완전수의 개수 : 3

        int cnt = 0; // 개수를 구할 변수
        for (int i = 2; i <= 1000; i = i + 1) {
               // 나누어 떨어지는 수 : 자신을 제외하는 경우에는 1부터 자신/2 까지만 확인

                int sum = 1; // 합을 구할 변수
               for (int j = 2; j <= i / 2; j = j + 1) {
                       // 나누어 떨어지는 경우에만 더하기
                       if (i % j == 0) {
                               sum = sum + j;
                       }
                }
                // 완전수인지 확인
                if (i == sum) {
                      cnt = cnt + 1;
                      System.out.println(i);
                }
        }
        System.out.println("완전수 개수:" + cnt);
     }
}