Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[2주차/포비] 워크북 제출합니다. #36

Merged
merged 4 commits into from
Oct 5, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file added keyword/chapter02/2-1.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
60 changes: 60 additions & 0 deletions keyword/chapter02/keyword.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
# 추가 과제

## JVM 메모리의 구조

JVM은 Static, Heap, Stack 영역으로 나뉜다.

### Static 영역

클래스가 로드 될 때 생성됨, 클래스 변수와 **static 변수**가 저장된다.

### Heap 영역

객체와 인스턴스 변수가 저장되는 공간이다.

### Stack 영역

메서드 호출 시 생성되는 지역변수와 매개변수가 저장되는 공간이다.

## Class Loader

### 역할

자바 컴파일러에 의해 컴파일된 .class 파일을 JVM으로 로드하여 런타임 영역에 배치한다.

### 과정

1. Loading: .class 파일을 읽고, JVM의 메모리에 로드
2. Linking: 클래스 파일을 사용하기 위해 검증한다.
3. Initializing: **static 변수**를 비롯한 클래스 변수들을 적절한 값으로 초기화한다.

## Collection Interface

![collection](./2-1.png)

### 정의

- Collection은 Java에서 데이터의 그룹, 즉 여러 개의 객체를 하나의 단위로 표현하는 인터페이스
- List, Set, Queue, Map 인터페이스의 상위 인터페이스로, 컬렉션 프레임워크의 root 인터페이스 역할을 한다.

## 하위 인터페이스

1. List

- 순서가 있는 데이터의 집합으로, 데이터의 중복을 허용한다.
- ArrayList, LinkedList, Vector, Stack 등의 클래스가 List 인터페이스를 구현한다.

2. Set

- 순서가 없고, 데이터의 중복을 허용하지 않는 데이터의 집합이다.
- HashSet, TreeSet, LinkedHashSet 등의 클래스가 Set 인터페이스를 구현한다.

3. Queue

- F~IFO(First In First Out) 형태의 자료구조로, 데이터의 중복을 허용한다.
- PriorityQueue, Deque, ArrayDeque 등의 클래스가 Queue 인터페이스를 구현한다.

4. Map

- key-value 쌍으로 이루어진 데이터의 집합으로, key는 중복을 허용하지 않는다.
- HashMap, TreeMap, LinkedHashMap, Hashtable 등의 클래스가 Map 인터페이스를 구현한다.
Binary file added mission/chapter02/2-1.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/chapter02/2-2.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/chapter02/2-3.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/chapter02/2-4.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/chapter02/erd.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
122 changes: 122 additions & 0 deletions mission/chapter02/mission.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,122 @@
## ERD Preview

![ERD 사진](./erd.png)

## 미션 2-1

![미션 2-1](./2-1.png)

```sql
-- OFFSET 기반 --
SELECT
s.name AS store_name,
m.contents,
m.point,
um.startdate
FROM
mission m
JOIN store s ON m.store_id = s.id
JOIN usermission um ON m.id = um.missionid
WHERE
um.userid = <userid> AND
(um.status = 'PENDING' OR um.status = 'SUCCESS')
ORDER BY um.startdate DESC, m.id, um.userid;
LIMIT <limit_value> OFFSET <offset_value>;
-- CURSOR 기반 --
SELECT
s.name AS store_name,
m.contents,
m.point,
um.startdate
FROM
mission m
JOIN store s ON m.store_id = s.id
JOIN usermission um ON m.id = um.missionid
WHERE
um.userid = <userid> AND
um.missionid = <missionid> AND
(um.status = 'PENDING' OR um.status = 'SUCCESS') AND
(
(um.startdate, m.id, um.userid) > ('<last_startdate>', <last_mission_id>, <last_userid>) OR
(um.startdate = '<last_startdate>' AND m.id > <last_mission_id>) OR
(um.startdate = '<last_startdate>' AND m.id = <last_mission_id> AND um.userid > <last_userid>)
)
ORDER BY um.startdate DESC, m.id, um.userid
LIMIT <limit_value>;
```

## 미션 2-2

![미션 2-2](./2-2.png)

```sql
INSERT INTO Review (reviewid, storeid, score, content)
VALUES ('<reviewid>', '<storeid>', <score>, '<content>');
```

## 미션 2-3

![미션 2-3](./2-3.png)

```sql
-- Cursor 기반 --
SELECT
s.name AS store_name,
s.type,
m.contents,
m.point,
m.duedate
FROM
mission m
JOIN store s ON m.store_id = s.id
LEFT JOIN usermission um ON m.id = um.missionid AND um.userid = <userid>
WHERE
um.missionid IS NULL AND
s.regionid = <regionid> AND
m.duedate > NOW() AND
(
(m.duedate, m.id) > ('<last_duedate>', <last_mission_id>) OR
(m.duedate = '<last_duedate>' AND m.id > <last_mission_id>)
)
ORDER BY m.duedate, m.id
LIMIT <limit_value>;
-- OFFSET 기반 --
SELECT
s.name AS store_name,
s.type,
m.contents,
m.point,
m.duedate,
FROM
mission m
JOIN store s ON m.store_id = s.id
LEFT JOIN usermission um ON m.id = um.missionid
WHERE
um.userid = NULL AND
s.regionid = <regionid>
m.duedate > NOW() AND
ORDER BY um.startdate, m.id, um.userid;
LIMIT <limit_value> OFFSET <offset_value>;
```

## 미션 2-4

![미션 2-4](./2-4.png)

```sql
-- 최신 포인트를 가져오기 위해 LIMIT 1 사용 --
-- 전화번호 인증이 없으면 null 반환 --
SELECT
u.name,
u.nickname,
u.email,
u.phonenum,
p.point,
FROM
user u
JOIN point p ON u.id = p.userid
WHERE
u.id = <userid>
ORDER BY p.id
LIMIT 1;
```