국비학원 21일차 : 중간 시험 리뷰, DataBase

Digeut·2023년 3월 23일
0

국비학원

목록 보기
15/44

💡18일부터 19일차의 내용은 다시 정리해서 올리기 : 주어진 프론트 화면을 보고 회원가입, 로그인, 게시물 작성, 수정, 삭제까지 진행(CRUD)

중간 시험 리뷰

20일차인 22일에 진행된 중간 시험 문제중에 다시금 풀어보면
좋을 문제를 리뷰 해보았다.

주어진 프로세스도를 확인해서 코드 구현하기

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Review {

	class User{
		String email;
		String password;
		String name;
		String telNumber;
	}
	
	List<User> userList = new ArrayList<>();
	
	public static void main(String[] args) {
		
		String email = null;
		String password = null;
		String passwordCheck = null;
		String name = null;
		String telNumber = null;
		
		Scanner scanner = new Scanner(System.in);
		
		while(true) {
			
			email = scanner.nextLine();
			password = scanner.nextLine();
			passwordCheck = scanner.nextLine();
			name = scanner.nextLine();
			telNumber = scanner.nextLine();
			
			if(email.isBlank() || password.isBlank() || passwordCheck.isBlank() 
				|| name.isBlank() || telNumber.isBlank()) continue;
		
			boolean existEmail = false;
			for(User user : userList) {
				if(email.equals(email)) {
					existEmail = true;
				}
			}
			if(existEmail==false) continue;
			if(!password.equals(passwordCheck)) continue;
			break; // 코드를 다 돌고나서 조건에 맞게 다 끝나면 조건문 탈출해야한다
		}
		
		User user = new User();
		
		//유저정보 객체 리스트 저장
		user.email = email;
		user.password = password;
		user.name = name;
		user.telNumber = telNumber;
		
		userList.add(user);
		System.out.println(user.toString());
		
	}

}
//주어진 조건 코드문
class User {

}

public class MainApplication {

    public static void main(String[] args) {

       
+
    }

}

시험 칠때에는 조건이 위 처럼 주어져있었는데 내가 공부할때는 Entity, DTO, Service, Controller, Repository를 전부 나눠서 진행을 했기때문에 저 틀에 맞게 작성해서 나뉘어진 패키지와 클래스를 모두 입력했는데 선생님은 저 틀안에 맞게 코드를 작성하라는 뜻이였다고 했다🙄 작성하면서도 이게 맞나 싶었는데 아니였다.. 물론 점수는 잘 주셨지만 어떻게 하면 한 틀안에서 다 구성할수 있는지 다시 리뷰하면서 새로 작성해주었다. 나눠서 진행할때와는 달리 인스턴스를 null값으로 메인에 가져와서 진행하는게 포인트였다.

주어진 조건에 맞게 클래스 만들기

import java.text.SimpleDateFormat;
import java.util.Date; //생성당시의 날짜를 알기 위해 Date import
import java.util.UUID; //사용자 아이디 랜덤 생성을 위해 난수 생성가능하게 하는 UUID import

//A 사는 고객 관리를 위해 새로운 시스템을 구축하려 한다.
//고객 정보는 (UUID 형식의 고객번호), (이름), (성별), (yyyy. MM. dd. 형식의 생성 당시 날짜), 
//(주소), (전화번호), (마케팅 수신 여부), (개인정보 수집 동의 여부) 로 구성되어있다고 한다.
//이때 Java 언어로 고객 정보 관련 class를 생성하고 각 필드는 외부에서 직접 접근할 수 없으며 메서드를 통해서 
//접근 및 수정 할 수 있도록 작성할 예정이며 해당 클래스로 객체를 생성할 때 모든 값이 입력되어야 하지만 
//사용자로부터 (이름), (성별), (주소), (전화번호), (마케팅 수신 여부), (개인정보 수집 동의 여부)만 받는다고 할때
//해당 class를 클래스 명명 규칙, 변수 명명 규칙, 함수 명명 규칙을 준수하여 작성하시오. (pacakge 및 import 포함 제출)
//- 특정 class 혹은 library를 import하였다면 해당 import를 한 이유를 작성하시오.
public class CustomerReview {

	private String costomerId;
	private String name;
	private String gender;
	private String todayDate;
	private String address;
	private String telNumber;
	private boolean markettingConsent;
	private boolean privateConsent;
	
	public CustomerReview(String name, String gender, String address,
			String telNumber, boolean markettingConsent, boolean privateConsent) {
		Date now = new Date();
		SimpleDateFormat simpleDateForamt = new SimpleDateFormat("yyyy.MM.dd");
		this.costomerId = UUID.randomUUID().toString();
		this.name = name;
		this.gender = gender;
		this.todayDate = simpleDateForamt.format(now);
		this.address = address;
		this.telNumber = telNumber;
		this.markettingConsent = markettingConsent;
		this.privateConsent = privateConsent;
	}
	public String getCostomerId() {
		return costomerId;
	}
	public String getName() {
		return name;
	}
	public String getGender() {
		return gender;
	}
	public String getTodayDate() {
		return todayDate;
	}
	public String getAddress() {
		return address;
	}
	public String getTelNumber() {
		return telNumber;
	}
	public boolean isMarkettingConsent() {
		return markettingConsent;
	}
	public boolean isPrivateConsent() {
		return privateConsent;
	}
	public void setCostomerId(String costomerId) {
		this.costomerId = costomerId;
	}
	public void setName(String name) {
		this.name = name;
	}
	public void setGender(String gender) {
		this.gender = gender;
	}
	public void setTodayDate(String todayDate) {
		this.todayDate = todayDate;
	}
	public void setAddress(String address) {
		this.address = address;
	}
	public void setTelNumber(String telNumber) {
		this.telNumber = telNumber;
	}
	public void setMarkettingConsent(boolean markettingConsent) {
		this.markettingConsent = markettingConsent;
	}
	public void setPrivateConsent(boolean privateConsent) {
		this.privateConsent = privateConsent;
	}
	@Override
	public String toString() {
		return "CustomerReview [costomerId=" + costomerId + ", name=" + name + ", gender=" + gender + ", todayDate="
				+ todayDate + ", address=" + address + ", telNumber=" + telNumber + ", markettingConsent="
				+ markettingConsent + ", privateConsent=" + privateConsent + "]";
	}

}

내가 시험칠때 작성한 코드

import java.util.UUID;  
//customerId의 무작위적 생성을 위해 난수 생성 가능하게 하는 UUID  import

 

public class Customer {

private final UUID customerId; //고객번호

private String name;

private String gender;

private String address;

private String phoneNumber;

private boolean marketingConsent; //마케팅 수신여부

private boolean dataCollectionConsent; //개인정보 수집 동의 여부

private final String createdAt; //생성당시 날짜

 

public Customer(String name, String gender, String address, String phoneNumber, boolean marketingConsent, boolean dataCollectionConsent) {

this.customerId = UUID.randomUUID();

this.name = name;

this.gender = gender;

this.address = address;

this.phoneNumber = phoneNumber;

this.marketingConsent = marketingConsent;

this.dataCollectionConsent = dataCollectionConsent;

this.createdAt = getCurrentDate();

}

 

public UUID getCustomerId() {

return customerId;

}

 

public String getName() {

return name;

}

 

public void setName(String name) {

this.name = name;

}

 

public String getGender() {

return gender;

}

 

public void setGender(String gender) {

this.gender = gender;

}

 

public String getAddress() {

return address;

}

 

public void setAddress(String address) {

this.address = address;

}

 

public String getPhoneNumber() {

return phoneNumber;

}

 

public void setPhoneNumber(String phoneNumber) {

this.phoneNumber = phoneNumber;

}

 

public boolean isMarketingConsent() {

return marketingConsent;

}

 

public void setMarketingConsent(boolean marketingConsent) {

this.marketingConsent = marketingConsent;

}

 

public boolean isDataCollectionConsent() {

return dataCollectionConsent;

}

 

public void setDataCollectionConsent(boolean dataCollectionConsent) {

this.dataCollectionConsent = dataCollectionConsent;

}

 

public String getCreatedAt() {

return createdAt;

}

 

private String getCurrentDate() {

return "yyyy. MM. dd.";

}

}

선생님은 배운 문법을 활용해서 코드를 작성하라고 낸 문제였는데 내가 SimpleDateFormat과 Date util을 사용하지 못했다🙄... 뭔가 새로 작성한 변수명과 코드가 더 직관적으로 알기 쉬운느낌이다. 괜히 이것저것 검색하면서 모르는 개념을 가져와 코드를 만들다 보니 엉망이 되었다.. 이 문제에서 감점이 제일 커서 아쉬움이 많이 든다

Data Base

내 컴퓨터에 저장한 값이나 다른 사람의 컴퓨터에 저장한 값의 경우
실시간 전달이 불가능하다. 작업이 끝난 다음 값을 돌려주거나 하는
형태로 진행이 되어야하는데 이러한 공유는 하는 부분이 불편하다
→데이터베이스의 사용으로 해결할 수 있다.
이러한 데이터 베이스를 관리하는 시스템을 DBSM이라고 한다.

데이터 베이스의 특징

1. 사용자의 질의에 대한 실시간 처리와 응답
2. 생성, 수정, 삭제를 통하여 항상 최신 데이터 유지
3. 사용자들이 원하는 데이터를 동시 공유 가능
4. 사용자가 원하는 데이터를 주소가 아닌 내용에 따라 참조 할 수 있음
5. 응용프로그램과 데이터베이스는 독립되어 있으므로, 데이터의 논리적 구조와 응용프로그램은 별개로 동작됨

WAS가 여러개가 된다고 하더라도 각각 DB 볼 수 있다

데이터 관리하는 방식에 따른 구분

1. Document 형태(객체Object 형태)

(ex. Board라는 클래스에 게시자와 댓글관련한 데이터들 관리)

  • 장점 : 구조자체로 무엇이 들어있는지 한번에 찾을수 있다. 데이터를 저장하는 방식과 읽을때가 편하게 된다.
  • 단점 : 중복된 데이터를 계속 생성해줘야한다. 전부 각각 집어넣어줘야한다. 데이터의 신뢰성을 잃을 수 있다. User가 프로필 사진을 수정했는데, User 클래스 와 Board의 클래스에 프로필URL다 수정해줘야한다

2. Relation 형태

Board와User 어떤것이 누군가에 의해서 이루어진다. = 관계
사람이 게시물을 작성한다는 행위를 할때, 게시물은 작성자의 데이터가 들어있다. 이 자료들을 User에서 가져와서 관리하게 된다. User중 누구인지 구분하는 형태의 데이터만 남아있게된다. 필요한 자료를 User에서 가져와 사용하는 형태

  • 장점 : 메서드의 장점과 동일하다. 중복데이터를 처리하지않는다. 프로필 이미지 변경시 Board가 참조하고 있다면 다 하나하나 비교하지 않고 바로 처리가능하다. 수정작업에서 엄청난 이로운 점이 있다.
  • 단점 : 수정을 제외한 나머지 작업이 모두 힘들어진다. 일 대 다관계에 넣을때 서로 없는 형태를 넣을수 없다. 이럴때 계속해서 제약이 걸리고, 읽기도 힘들어진다. 형식도 다 맞춰줘야하고, 삭제가 제일 힘들게 된다. User가 탈퇴를 한다고 했을때 다른 Table에 하나라도 포함되어 있다면 탈퇴가 되지 않는다.

    Documnet형과 Realtion형의 장점을 모두다 갖고 있는건없을까?
    →객체관계형!

3. 객체 관계 형태

RDBMS 처음에 제약조건 잘 걸어주고 사용하면 불편함을 잘 못느끼는데 관계형일적에 리스트를 객체로 취급하지 못한다. List형태를 전부다 테이블로 다 빼줘야한다. 배열형태의 데이터를 저장할 수 없다는 단점. ORDBMS는 객체의 성질도 갖고 있고, 배열도 객체로 넣을수 있다 들어오는 데이터들의 관계까지도 만들어줄수있다. 객체형과 관계형의 장점을 모아둔게 객체 관계형태

관계형 데이터베이스

관계형 데이터베이스의 특징

  1. 데이터의 분류, 정렬, 탐색 속도가 빠름
    (Document 형태가 검색속도가 더 빠르다 하는 것은 테이블로 정의되어있지 않은경우를 말한다. 하나의 테이블을 검색하는 속도는 관계형이 좀 더 빠르다. 실제 결과물을 내는 속도는 느리다.)
  2. 신뢰성이 높음, 데이터의 무결성 보장
  3. 기존에 작성된 스키마를 수정하기 어려움
  4. 데이터베이스의 부하를 분석하는 것이 어려움

키 (Key)

테이블에서 행의 식별자로 이용되는 열을 키(key) 또는 기본 키(primary key)라고 한다. 테이블에 저장된 레코드를 고유하게 식별하는 후보 키(candidate key) 중에서 데이터베이스 설계자가 지정한 속성을 의미

  1. 기본키와 후보키 : User 테이블에서 User를 독립적으로 설명해줄수 있는 요소는 id,email,phonNumber,nickname이다. 이 요소 중 중복이 없는 것들을 후보키라고 하고, 이 중에 선택해서 이 비즈니스 상 어떤 것을 사용해서 관리하는게 맞겠다라고 판단하면 (보통은 id) 그게 기본키가 된다.(빈값이 오면 안되는 것이어야한다) 후보키 중 비즈니스 상으로 적합하다고 판단한걸 그게 기본키가 되게 된다.
    private String id; //후보키
	private String email; //후보키
	private String password;
	private String passwordCheck;
	private String nickname; //후보키 (중복 허용 하지 않는 경우)
	private String phonNumber; //후보키
	private String address;
	private String addressDetail;
	private String profileImageUrl;
  1. 외래키 : 관계의 접점이 되는 요소를 외래키라고 한다. 보통 그 클래스의 기본키를 참조키로 사용한다.
	private int boardNumber; 
	private String boardImageUrl; 
	private String writerEmail; 

//User 클래스에도 있는 요소
//Board 클래스와 관계를 갖고있다
	private String writerNickname; //외래키
	private String writerProfileImageUrl;
	private String writeDate; 

	private String title; 
	private String content;
	private int viewCount;
	private List<Like> likeList;
	private List<Comment> commentList;

관계

  1. 일 대 일 관계 :
  2. 일 대 다 관계 : 한 작성자가 여러개의 게시글을 작성할 수 있는 관계
  3. 다 대 다 관계 : 한 게시글에 여러명이 댓글을 달 수 있고, 한 작성자가 여러개의 게시글에 댓글을 달 수 있는 관계
profile
개발자가 될 거야!

0개의 댓글