diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ba1bce0 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +.github +.idea diff --git a/keyword/chpater01/keyword.md b/keyword/chpater01/keyword.md new file mode 100644 index 0000000..2e75fd1 --- /dev/null +++ b/keyword/chpater01/keyword.md @@ -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 줄이기 + - 계산작업 줄이기 + - 테이블 분리 + - 외래키 줄이기 \ No newline at end of file diff --git a/mission/mission.md b/mission/chapter00/mission.md similarity index 100% rename from mission/mission.md rename to mission/chapter00/mission.md diff --git a/mission/chapter01/image/image.png b/mission/chapter01/image/image.png new file mode 100644 index 0000000..c480468 Binary files /dev/null and b/mission/chapter01/image/image.png differ diff --git a/mission/chapter01/image/image1.png b/mission/chapter01/image/image1.png new file mode 100644 index 0000000..47c434e Binary files /dev/null and b/mission/chapter01/image/image1.png differ diff --git a/mission/chapter01/image/image2.png b/mission/chapter01/image/image2.png new file mode 100644 index 0000000..cee817a Binary files /dev/null and b/mission/chapter01/image/image2.png differ diff --git a/mission/chapter01/image/image3.png b/mission/chapter01/image/image3.png new file mode 100644 index 0000000..2f7517c Binary files /dev/null and b/mission/chapter01/image/image3.png differ diff --git a/mission/chapter01/java_mission.md b/mission/chapter01/java_mission.md new file mode 100644 index 0000000..9c93b67 --- /dev/null +++ b/mission/chapter01/java_mission.md @@ -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` 접근 제어자의 차이 +- 인터페이스와 추상 클래스의 차이 +- 상속과 인터페이스 구현의 차이점은 무엇 \ No newline at end of file diff --git a/mission/chapter01/mission.md b/mission/chapter01/mission.md new file mode 100644 index 0000000..73d3faf --- /dev/null +++ b/mission/chapter01/mission.md @@ -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`)과 연결되어 있어, 사용자는 미션을 수행하여 포인트를 적립할 수 있음 \ No newline at end of file