빅데이터 Java 개발자 교육 - 04일차 [ERD]

Jun_Gyu·2023년 2월 25일
0


오늘도 달려보자


오늘은 Oracle ERD를 이용해서

거래 프로그램을 만들어 볼 것이다.

들어가기 앞서서

먼저 ERD란 무엇일까??

ERD
Entity Relationship Diagram

개체 - 관계 모델을 이야기한다.

일종의 '다이어그램'이라고 볼 수 있으며, 이를 이용해서프로젝트에서 사용하는 DB(Data Base)의 구조를 한눈에 파악 할 수 있게 해주는 API* 설계 구조도이다.


API : 정의 및 프로토콜 집합을 사용하여 두 소프트웨어 구성 요소가 서로 통신할 수 있게 하는 메커니즘.

ex) 기상청 시스템의 날씨정보를 받는 스마트폰 어플


쉽게말해서 개발자들의 설계도(청사진)같은 개념이다.

오늘 4일차에는 Oracle의 ERD를 이용하여 '당근마켓'과 같은 거래 시스템을 한번 만들어보고자 한다.

오늘 참고하고자 하는 ERD는 다음과 같다.

그렇다면 위의 Oracle ERD를 이용해서 나만의 당근마켓을 한번 만들어보자.


원래라면 하나의 메인 클래스를 만들어서 정리를 하려고 하였으나, 코드에 이상이 없는지를 확인하기 위해

각각의 테이블 클래스 마다 메인 클래스를 만들어서 유효성을 검사해보았다.


먼저 회원 테이블의 클래스이다.

package day4;

import java.util.Date;

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;

// lombok 사용하기

@Getter
@Setter
@ToString
@AllArgsConstructor
@NoArgsConstructor
public class MemberTable {

	private String id = null;
	private String password = null;
	private String name = null;
	private String phone = null;// ex) 010-0000-0000
	private String role = null; // 권한설정 고객은(C), 판매자는 (S)
	private Date regdate = null;

/*----------------------------------------------------------------------------------------*/

	// 이름의 길이가 유효한지 확인하는 메소드 만들기 (2~4자만 가능)
	public boolean invalidName() {
		boolean ret = false;

		// 2~4자 사이만 true를, 그 이외에는 false를 반환하기
		if (2 <= this.name.length() && this.name.length() <= 4) { // 만약 2~4자 사이면
			return true; // 메소드 종료.
		}
		return ret;

	}

	// 휴대폰 번호 길이가 정확한지 확인하는 메소드만들기
	public boolean invalidPhone() {
		boolean retphone = false;

		if (this.phone.length() == 13) {
			retphone = true;
		}
		return retphone;

	}

	// 권한이 정보가 C와 S로만 되어있는지 확인하는 메소드
	public boolean invalidRole() {
		// 원시타입 int long
		// Long String ...
		boolean retrole = false;

		if (this.role == "C" || this.role == "S") {
			// this.role.equals("C") || this.role.equals("S")로도 가능!
			return true;
		}
		return retrole;
	}

	// id는 길이가 30자 이내만 가능한지 확인하는메소드
	public boolean invaliId() {

		if (this.id.length() <= 30) {
			return true;
		}
		return false;
	}

	// 연락처 정보가 010-1234-5678인데, 01012345678으로 반환하는 메소드 (split사용하기)
	public String changePhone() {
		/// 000 - 0000 - 0000
		// ret[1] => 000
		// ret[2] => 0000
		// ret[3] => 0000
		// ret.length => 3

		String[] ret = this.phone.split("-"); // - 문자만 구분함

		// System.out.println(ret.length); // 
		// System.out.println(ret[0]); // '010'
		// System.out.println(ret[1]); // '1234'
		// System.out.println(ret[2]); // '5678'

		return (ret[0] + ret[1] + ret[2]);
	}

}

한번 직접 실행시켜보자.

package day4;

import java.util.Date;

public class Day4Main1 {

	public static void main(String[] args) {

		// 1. 객체 생성 (값 세팅)
		MemberTable obj = new MemberTable("id", "Pw", "123준규", "010-1234-1233", "C", new Date());

		// 현재 클래스 값 확인용도\
		System.out.println(obj.toString());

		// 2. 세팅된 이름값이 유효한지 확인하기
		boolean result = obj.invalidName();
		System.out.println(result);

		// 3. 휴대폰 번호 길이가 맞는지 확인하는 메소드 만들기
		boolean result1 = obj.invalidPhone();
		System.out.println(result1);

		// 4. 권한정보가 C나 S로만 되어있는지 확인하기
		boolean result2 = obj.invalidRole();
		System.out.println(result2);

		// 5. 연락처 '-' 빼고 출력하기
		String ret = obj.changePhone();
		System.out.println(ret); // "-"만 빼고 출력. obj.changePhone 참고

	}

}

아래는 출력 결과이다.

MemberTable(id=id, password=Pw, name=123준규, phone=010-1234-1233, role=C, regdate=Thu Feb 02 17:24:27 KST 2023)
false
true
true
010
1234
1233
01012341233

그 다음으로는 주소 테이블

package day4;

import java.text.SimpleDateFormat;
import java.util.Date;

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;

@Getter
@Setter
@ToString
@AllArgsConstructor
@NoArgsConstructor

public class AddressTable {

	private long code = 0;
	private String address = null;
	private String postcode = null;
	private Date regdate = null;
	private MemberTable memberid = null;
	
	/*----------------------------------------------------------------------------------------*/
	
	// 코드는 1000~9999 사이인지 확인
	public boolean invalidCode() {
		if (1000 <= this.code && // .찍어서 안나오면 못쓰는것.
				this.code <= 9999) { // code는 long(실수)이기때문에 length사용 불가
			return true;
		}
		return false;
	}

	
	// 주소는 100자 미만
	public boolean invalidAddress() {
		if (this.address.length() < 100) {
			return true;
		}
		return false;
	}

	
	// 우편번호가 5자리인지 확인
	public void invalidPostcode() {
		String result1 = "우편코드가 5자리입니다.";
	    String result2 = "우편코드가 5자리가 아닙니다.";

		if (this.postcode.length()== 5 ) {
			System.out.println(result1); 
		}
			System.out.println(result2);
	}

	// 날짜에서 년만 반환하기 (문자로)
	public String showYear() {
		SimpleDateFormat year = new SimpleDateFormat("yyyy-MM-dd"); // 날짜를 바꾸기 위해서 다른 클래스가 필요함.
		String str = year.format(regdate); //year에 현재 날자값 저장
		//2023-02-02
		System.out.println(str); // str을 그대로 출력하나,
		return str.substring(0, 4); // substring를 이용하여 구간 출력. 년도만 출력
	}
	// 날짜에서 월만 반환하기 (문자로)
    public String showMonth() {
		SimpleDateFormat month = new SimpleDateFormat("MM");
		String str = month.format(regdate);

		return str;
    }
    
	// 날짜에서 일만 반환하기 (문자로)
    public String showDay() {
		SimpleDateFormat day = new SimpleDateFormat("dd");
		String str = day.format(regdate);

		return str;
    }
}

실행해보자

package day4;

import java.util.Date;

public class AdressMain {

	public static void main(String[] args) {

		
		MemberTable obj = new MemberTable("id", "Pw", "123준규", 
				"010-1234-1233", "C", new Date());
		
		AddressTable address = new AddressTable(1000, "busan", "1234", new Date(), obj);
		//값 입력받기
		
		// 우편번호 5자리 확인
		address.invalidPostcode();
		
		// 날짜에서 월만 반환해보기
		System.out.println(address.showMonth());
		
		
		System.out.println(); // 줄바꿈
		
		// 전화번호에서 "-" 빼기
		obj.changePhone();
	}

}

결과는 다음처럼 나왔다.

우편코드가 5자리가 아닙니다.
02

010
1234
1233

다음은 물품 테이블 클래스이다.

package day4;

import java.util.Date;

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;

@Getter
@Setter
@ToString
@NoArgsConstructor
@AllArgsConstructor

public class Itemtable {
	private long code = 0; // 물품코드
	private String name = null; // 물품명
	private String content = null; // 물품설명
	private long price = 0; // 물품가격
	private long quantity = 0; // 물품수량
	private Date regdate = new Date(); // 등록일
	private MemberTable memberid = null; // 판매자

/*----------------------------------------------------------------------------------------*/

	// 수량이 n개 미만이면 n개로 변경하는 메소드
	public long addQuantity(long n) { // n 개를 입력받음
		if (this.quantity < n) { // if 물품수량이 n개 미만일때,
			this.quantity = n; // 수량을 n개로 지정
			}
		System.out.println(this.quantity);
		
		return this.quantity; // 변경된 수량 반환
	}

	// 가격에 할인율만큼 빼서 리턴하는 메소드
	public float disPrice(float f) { // 할인률을 입력받음. 할인률은 소수점으로 곱해서 float!
		this.price = (long) (this.price - (this.price * f)); // (원가 - 할인값)을 가격에 대입
		System.out.println(this.price); //결과출력
		
		return this.price; // 리턴~
	}

	// 총 판매금액을 리턴하는 메소드 (가격*수량)
	public long totalPrice() {
		return (this.price * this.quantity); // 바로 리턴해버려도 됩니다
	}

	
	 // 내용이 20자 이상이면 ex)12345678901234567890... 으로 변환하는 메소드
	public String numContent() {
		if (this.content.length() >= 20) { // if 내용길이가 20 이상이면~                 
		 return (this.content.substring(0,20)+ "..."); //내용 뒤에 "..." 문자 추가해서 출력
		}
		return this.content; // 아니면 그냥 바로 출력
		}
	

	// 이름을 뒤집어서 반환하는 메소드
	// if해서 i--로 역순 출력
	public void revName() {
		/* 이런 방법도 있다!
		 * 
		 * int i = 0;
		 * String ret = "" ; // 문자를 누적할 변수
		 * for(i=this.name.length()-1; i>=0; i--){
		 *     char tmp = this.name.charAt(i);
		 *      ret += tmp;
		 * }
		 * return ret;
		 */
		StringBuffer rev = new StringBuffer(this.name); // StringBuffer라는 새로운함수에 현재 입력된 이름를 지정해주고
        String reversedName = rev.reverse().toString(); // 'rev'를 .reverse를 활용하여 거꾸로 출력하도록 설정 
     
			System.out.println(reversedName); // 쨘
	}
}

위 코드의 유효성을 검사해보자.

package day4;

import java.util.Date;

public class ItemMain {

	public static void main(String[] args) {

		MemberTable obj = new MemberTable("junkue20", "1234", "박준규", "010-3131-1313", "C", new Date());
		Itemtable obj1 = new Itemtable(1000, "화장지", "미용용품입니다 쏼라쏼라쏼라쏼라쏼라쏼라쏼라쏼라쏼라쏼라", 5000, 500, new Date(), obj);

		// 수량이 n개 미만이면 n개로 변경하는 메소드
		obj1.addQuantity(100);

		// 가격에서 할인률만큼 빼서 리턴하는 메소드
		obj1.disPrice(0.3f);

		// 총 판매금액을 리턴하는 메소드 (가격 * 수량)
		obj1.totalPrice();

		// 내용이 20자 이상이면 1234567890...으로 변환하는 메소드
        System.out.println(obj1.numContent());
		
		// 이름을 뒤집어서 반환하는 메소드
		obj1.revName();
	}

}

결과는 아래처럼 나온다.

500
3500
미용용품입니다 쏼라쏼라쏼라쏼라쏼라쏼라...
지장화

강사님께서 제시해주신 상황에 맞게 각각의 테이블마다 해결방법들을 코드로 풀이를 했다.



'주문 테이블 클래스'의 경우에는 물품을 받고, 고객의 정보를 받고난 뒤, 주문을 받는 경우이기때문에 제일 마지막에 만들어야 한다!


profile
시작은 미약하지만, 그 끝은 창대하리라

0개의 댓글