Skip to content

Commit

Permalink
Merge pull request #15 from meoraeng/main
Browse files Browse the repository at this point in the history
[1주차/머랭] 워크북 제출합니다.
  • Loading branch information
meoraeng authored Sep 26, 2024
2 parents 7011f26 + 11e629f commit 2f6f527
Show file tree
Hide file tree
Showing 9 changed files with 297 additions and 0 deletions.
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
.github
.idea
83 changes: 83 additions & 0 deletions keyword/chpater01/keyword.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
- 외래키
- 외래키는 한 테이블의 필드(컬럼)가 다른 테이블의 기본키(PK)를 참조하는 제약조건이다.
- 어떤 테이블의 외래키 값은 다른 테이블의 기본키 값과 동일해야한다. → **데이터 무결성**

외래키를 활용하여 데이터베이스에서 관련된 테이블 간의 관계를 정의하고, 데이터 무결성을 유지할 수 있다.

- 기본키
- 관계형 데이터베이스에서 각 레코드(행)을 고유하게 식별하기 위해 사용하는 필드(컬럼)이다.
- 기본키는 해당 테이블에서 중복되지 않는 값이어야 한다

<기본키의 주요 특징>

1. 고유성 : 기본키 값은 테이블 내에서 중복되지 않아야 한다 → 각 레코드는 서로 다른 기본값을 가짐
2. 존재성 : 모든 레코드는 기본키 값을 가져야 한다. → 기본키는 NULL이 될 수 없음
3. 불변성 : 기본키 값은 변경되면 안된다. → 한번 설정된 기본키 값은 변경 불가

주로 기본키는 식별자로 사용되며, 다른 테이블에서 해당 테이블의 레코드를 참조하거나 할 때 주로 쓰인다.

주로 특정 필드를 기본키로 지정하거나, 복합 기본키를 사용하여 여러 필드의 조합으로 기본키를 정의.

- ER 다이어그램

ERD(Entity Relationship Diagram)

- 데이터베이스 구조를 한눈에 알아보기 위해 쓰인다.
- DB를 개발하기 전 아이디어 도출, DB 설계 이해를 높이기 위해 모델링을 한다.
- 쿼리문을 작성할 때 다이어그램을 참고하여 작성 가능
- 데이터 특징 확인 → 요구사항에 맞는 개발 가능
- 복합 키

관계형 데이터베이스에서 두 개 이상의 필드(컬럼)로 구성된 키를 말한다.

이러한 키는 두개 이상의 필드 값 조합으로 레코드를 고유하게 식별한다.

- 연관관계

Relationship

- Entity간의 관계를 의미
- 엔터티 간에 선을 긋고, 관계 명칭을 기록
- 선택 사항 표시
- 점선→선택적인 사항
- 실선→필수적인 사항
- 관계형태 표시
- 삼지창 모양 → 하나 이상
- 단선 → 하나

Cardinality

- 1:1 관계

: 양쪽 모두 하나씩 존재

- 1:N 관계

: 하나의 원소가 두개 이상의 원소와 관계를 맺는 것

- N:M 관계

: 다대다 관계, 양쪽 모두 하나 이상과 연관될 수 있다.

- 정규화

ERD내에서 중복요소를 찾아 최소화하고 종속관계에 있는 속성을 제거하는 과정을 말한다.

(중복된 데이터는 많은 문제를 일으킨다)

중복을 완전히 없애는 것은 어렵고 최소화를 목적으로 하면 무리가 없다.

정규화는 기본 정규형(1,2,3보이스/코드 정규형), 고급 정규형(4,5정규형)으로 분류

- 1 정규화: 같은 성격과 내용의 컬럼이 연속적으로 나타나는 컬럼이 존재할 때, 컬럼을 제거하고 기본테이블의 PK를 추가해 새 테이블을 생성하고 기존 테이블과 1:N 관계를 형성
- 하나의 테이블에 값이 여러개인 경우 → 필드 하나에 값여러개 X
- 2 정규화: PK가 여러 키로 구성된 복합키로 구성된 경우, 복합키 전체가 아닌 일부에만 종속되는 속성을 분리한다.
- 3 정규화: 이전적 함수 종속 관계와 같이 PK가 아닌 일반컬럼에 의존하는 컬럼들을 분리한다.
- 반 정규화

역 정규화: 정규화된 표가 있을 때 개발과정에서 성능이나 편의성을 위해 되돌아가는 과정

- JOIN 줄이기
- 계산작업 줄이기
- 테이블 분리
- 외래키 줄이기
File renamed without changes.
Binary file added mission/chapter01/image/image.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added mission/chapter01/image/image1.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added mission/chapter01/image/image2.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added mission/chapter01/image/image3.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
184 changes: 184 additions & 0 deletions mission/chapter01/java_mission.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,184 @@
# Chapter1. 추가 미션

## 자바 접근제어자

자바의 접근제어자는 아래와 같이 4가지가 존재한다.

- `public`: 모든 클래스에서 접근이 가능
- `protected` : **같은 패키지나 상속받은 클래스**에서 접근 가능
- `default`: **같은 패키지**에서만 접근 가능하며 명시적으로 `default` 키워드는 X
- `private`: **같은 클래스** 내에서만 접근 가능

### 접근제어자 예제 코드

packageA/MyClassA:

```java
package packageA;

public class MyClassA {
public void publicMethod() {
System.out.println("Public method in myClassA");
}
protected void protectedMethod() {
System.out.println("Protected method in myClassA");
}

void defaultMethod(){
System.out.println("Default method in myClassA");
}

private void privateMethod(){
System.out.println("Private method in myClassA");
}

public void callPrivateMethod() {
privateMethod(); // 같은 클래스에서 private 메서드 호출 가능
}
}
```

packageA에서 하나의 클래스를 만들고 그 안에 4가지 접근 제어자가 적용된 메서드를 정의

packageA/ChildClassA:

```java
package packageA;

public class ChildClassA extends MyClassA {
public void testMethods() {
publicMethod(); // 접근 가능 (상속받은 클래스, public)
protectedMethod(); // 접근 가능 (상속받은 클래스, protected)
defaultMethod(); // 접근 가능 (같은 패키지, default)
//privateMethod(); // 접근 불가 (private)
}
}
```

MyClassA로부터 상속 받아온, 동일 패키지의 클래스 ChildCalssA에서 `public`, `protected`, `default`만 접근 가능

packageB/OtherClassB:

```java
package packageB;

import packageA.MyClassA;

public class OtherClassB {
public void testMethods() {
MyClassA obj = new MyClassA();
obj.publicMethod(); // 접근 가능 (public)
// obj.protectedMethod(); // 접근 불가 (다른 패키지에서 protected)
// obj.defaultMethod(); // 접근 불가 (다른 패키지에서 default)
// obj.privateMethod(); // 접근 불가 (private)
}
}
```

다른 패키지인 packageB에 만들어진 OtherClassB는 public에만 접근 가능

Main.java:

```java
import packageA.MyClassA;
import packageA.ChildClassA;
import packageB.OtherClassB;

public class Main {
public static void main(String[] args) {
// 1. 같은 패키지의 클래스에서 호출하는 경우
ChildClassA child = new ChildClassA();
child.testMethods(); // public, protected, default 접근 가능

// 2. 다른 패키지의 클래스에서 호출하는 경우
OtherClassB other = new OtherClassB();
other.testMethods(); // public '만' 접근 가능

// 3. 같은 클래스 내에서 private 메서드를 호출하는 경우
MyClassA obj = new MyClassA();
obj.callPrivateMethod(); // 같은 클래스 내에서는 private 도 호출 가능!
}
}
```

상속받은 ChildClass가 아닌 MyClassA에서는 private접근 가능

위 예제코드 출력:

![image.png](./image/image.png)

## 클래스와 인터페이스

- 클래스 : 클래스는 객체를 생성할 수 있는 틀의 역할이며, 멤버 변수(필드)와 메서드로 구성된다.
- 인터페이스 : 자바에서 클래스를 통한 다중 상속은 지원되지 않는다. 그러나 다중상속의 이점을 버릴 수는 없기에 인터페이스를 통해 다중 상속을 지원한다. **인터페이스란 다른 클래스를 작성할 때 기본이 되는 틀을 제공하면서, 다른 클래스 사이의 중간 매개 역할까지 담당하는 일종의 추상 클래스**
- 차이점: 클래스는 객체를 생성할 수 있고 상태(필드)를 가질 수 있지만, 인터페이스는 오로지 메서드의 선언만 포함

### 클래스/인터페이스 예제코드

```java
interface Animal {
void sound(); // 추상 메서드
}

class Cat implements Animal {
public void sound() {
System.out.println("Cat🐱");
}
}
// Main.java
class Main {
public static void main(String[] args) {
Animal animal = new Cat();
animal.sound();
}
}
```

### 클래스/인터페이스 실행 결과:

![image.png](./image/image1.png)

## 상속

OOP에서는 부모(상위) 클래스와 자식(하위) 클래스가 있으며, 자식 클래스는 부모 클래스를 선택해서 그 부모의 멤버를 상속받아 그대로 쓸 수 있게 된다.

이런 상속을 통해 이미 마련되어 있던 클래스를 재사용해서 만들 수 있기에 효율적으로 개발이 가능, 하지만 상속을 하더라도 자식 클래스가 부모의 모든 것을 물려받는것은 아니다.

- 앞서 접근제어자에서 다룬 대로, 부모 클래스의 `private` 접근 제한을 갖는 필드 및 메소드는 자식이 물려받을 수 없다.
- 부모와 자식클래스가 서로 다른 패키지에 있을 경우, 부모의 `default` 접근 제한을 갖는 필드 및 메소드도 자식이 물려받을 수 없다.

자바에서는 `extends` 키워드를 사용하여 상속을 구현

### 상속 예제 코드:

```java
class People {
void eat() {
System.out.println("This people is eating");
}
}

class Student extends People {
void studying() {
System.out.println("This student is studying");
}
}
// Main.java
class Main {
public static void main(String[] args) {
Student student = new Student();
student.eat(); // 부모 클래스의 메서드
student.studying(); // 자식 클래스의 메서드
}
}
```

### 상속 실행결과:

![image.png](./image/image2.png)

### 면접 질문

- 자바에서 `protected``default` 접근 제어자의 차이
- 인터페이스와 추상 클래스의 차이
- 상속과 인터페이스 구현의 차이점은 무엇
28 changes: 28 additions & 0 deletions mission/chapter01/mission.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
# Chpater1. 미션

![ERD](./image/image3.png)

- **member (회원)**
- `member` 테이블은 서비스 사용자에 대한 정보를 저장
- 사용자 이름, 성별, 생년월일, 주소 등의 정보를 포함하며, 사용자의 소셜 로그인 정보 (네이버, 카카오, 애플 등)도 관리합니다.
- 사용자는 선호하는 음식 카테고리와 총 포인트, 그리고 참여한 미션에 대한 정보를 가짐
- 사용자는 미션에 참여할 수 있으며, 미션 수행을 통해 포인트를 적립 가능
- **store (상점)**
- `store` 테이블은 서비스에서 리뷰를 남길 수 있는 상점들에 대한 정보를 저장
- 상점의 이름, 지역, 카테고리, 이미지, 주소 등의 정보가 포함
- 각 상점은 특정 지역(`region`)과 카테고리(`category`)에 속함
- 상점 정보는 사용자가 리뷰를 남길 수 있음
- **review (리뷰)**
- `review` 테이블은 각 사용자가 상점에 남긴 리뷰를 저장합니다. 리뷰에는 사용자의 점수, 내용, 이미지 등이 포함되며, 리뷰를 남긴 사용자(`member_id`)와 상점(`store_id`)의 관계를 나타냄
- 이를 통해 사용자는 상점에 대한 리뷰를 작성하고, 다른 사용자는 해당 상점에 대한 평점과 리뷰를 확인 가능
- **region (지역)**
- `region` 테이블은 상점이 위치한 지역 정보를 저장
- 지역의 이름과 생성일, 수정일 등의 정보가 기록
- 이를 통해 사용자는 특정 지역에 있는 상점만을 탐색
- **category (카테고리)**
- `category` 테이블은 상점의 카테고리 정보를 저장합니다.
- 각 상점은 특정 카테고리에 속하며, 사용자는 카테고리별로 상점을 탐색
- **mission (미션)**
- `mission` 테이블은 서비스 내에서 사용자가 수행할 수 있는 미션 정보를 담고 있음.
- 각 미션에는 미션 이름, 인증 번호(`auth_number`), 미션을 수행하면 얻을 수 있는 포인트(`point`), 그리고 해당 미션이 활성화된 상태(`state`) 등의 정보가 기록
- 미션은 특정 지역(`region_id`)과 연결되어 있어, 사용자는 미션을 수행하여 포인트를 적립할 수 있음

0 comments on commit 2f6f527

Please sign in to comment.