Skip to content

Commit 1fffa61

Browse files
committed
3주차 과제 공개
1 parent 7797270 commit 1fffa61

9 files changed

Lines changed: 340 additions & 36 deletions

File tree

.profileconfig.json

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
{
2+
"jfrConfig": {
3+
"settings": "profile"
4+
},
5+
"asyncProfilerConfig": {
6+
"jfrsync": true,
7+
"alloc": true,
8+
"event": "wall",
9+
"misc": ""
10+
},
11+
"file": "$PROJECT_DIR/profile.jfr",
12+
"conversionConfig": {
13+
"nonProjectPackagePrefixes": [
14+
"java.",
15+
"javax.",
16+
"kotlin.",
17+
"jdk.",
18+
"com.google.",
19+
"org.apache.",
20+
"org.spring.",
21+
"sun.",
22+
"scala."
23+
],
24+
"enableMarkers": true,
25+
"initialVisibleThreads": 10,
26+
"initialSelectedThreads": 10,
27+
"includeGCThreads": false,
28+
"includeInitialSystemProperty": false,
29+
"includeInitialEnvironmentVariables": false,
30+
"includeSystemProcesses": false,
31+
"ignoredEvents": [
32+
"jdk.ActiveSetting",
33+
"jdk.ActiveRecording",
34+
"jdk.BooleanFlag",
35+
"jdk.IntFlag",
36+
"jdk.DoubleFlag",
37+
"jdk.LongFlag",
38+
"jdk.NativeLibrary",
39+
"jdk.StringFlag",
40+
"jdk.UnsignedIntFlag",
41+
"jdk.UnsignedLongFlag",
42+
"jdk.InitialSystemProperty",
43+
"jdk.InitialEnvironmentVariable",
44+
"jdk.SystemProcess",
45+
"jdk.ModuleExport",
46+
"jdk.ModuleRequire"
47+
],
48+
"minRequiredItemsPerThread": 3
49+
},
50+
"additionalGradleTargets": [
51+
{
52+
"targetPrefix": "quarkus",
53+
"optionForVmArgs": "-Djvm.args",
54+
"description": "Example quarkus config, adding profiling arguments via -Djvm.args option to the Gradle task run"
55+
}
56+
],
57+
"additionalMavenTargets": [
58+
{
59+
"targetPrefix": "quarkus:",
60+
"optionForVmArgs": "-Djvm.args",
61+
"description": "Example quarkus config, adding profiling arguments via -Djvm.args option to the Maven goal run"
62+
}
63+
]
64+
}

README.md

Lines changed: 167 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,60 +1,193 @@
1-
안녕! 오랜만입니다 커피요정 개발자 이서현입니다 ㅎㅎ 이번 3주차 과제는 2주차 과제보다는 어렵지 않게 난이도를 조정했습니다.
1+
안녕하십니까. 간만에 돌아온 커피요정 개발자입니다.
22

3-
이번 3주차 과제의 목표는 다양한 도메인에 대해 Aggregate하는 과정을 익혀보겠습니다.
3+
이번 과제는 여러분들이 알고 있는 구분형 권한 분리가 아닌 조건별 권한의 개념을 함께 느끼기 위해 제안된 과제입니다. ADMIN < USER < GUEST 이런 관계형 계층이 아닌 문서로 관리하는 세부 정책에 대해 명시하기 위한 과제입니다.
44

5-
Aggregate란, 여러 도메인을 하나로 합치는 과정을 의미합니다. 이 과정에서 일관되고 클린한 구조로 코드를 작성하지 않으면 극악의 지옥을 맛보게 됩니다. 오늘 여러분은 다양한 자료구조들을 활용해 아래 과제를 도전하며 자료구조를 활용하는 노하우를 익혀보도록 하겠습니다.
5+
## IAM
66

7-
# 1번 문제
7+
권한 부여 및 관리 기능 구현 과제
88

9-
서비스를 개발하다보면 모니터링 서비스도 중요하지만 회원들의 정보를 통계를 내서 가공해 보는 화면이 필요할 때가 많습니다. 이를 어드민 페이지라고 합니다.
9+
아래 이미지는 IAM 서비스의 Data Diagram입니다.
1010

11-
어드민 페이지의 성격은 우선순위는 낮지만 기존에 있는 정보를 이용해 최대한 빠르게 구현해서 보여줘야 한다는 특징이 있습니다. 구현된 어드민 페이지는 개발자나 관리자의 만족도를 직접적으로 높이는데 크게 기여합니다.
11+
(아래 Condition Block은 이번 과제에서 제시하지 않는 필드이니 무시하셔도 됩니다 )
1212

13-
더불어 웹/앱 호환성을 제공하는 데이터 제공은 중요합니다. 앱 서버의 특징은 웹 서버와는 다르게 화면(컴포넌트)단위로 데이터를 전송해야 하면 프론트 친구들이 좋아한다는 특징이 있습니다. (궁금하신 분들은 Http Capture라는 앱을 깔아서 앱에서 패킷을 뜯어보세용)
13+
<img width="621" alt="image" src="https://github.com/JNU-econovation/Spring_Hell_Study/assets/54030889/84ccf69f-f8bb-4ea7-99cf-109e4bb3b63a">
1414

15-
때문에 아래 요구사항을 빠르게 구현하고 어드민 페이지를 구현해보도록 합시다.
1615

16+
특정 서비스 및 리소스에 대한 접근 제어 및 권한 부여를 위한 서비스입니다.
1717

18-
아래 페이지는 신입모집 어드민 페이지입니다.
18+
## 구조
1919

20-
하나의 API 요청에 모든 데이터를 담을 수 있도록 구성해봅시다.
20+
IAM Policy는 AWS 리소스에 대한 권한을 정의하는 JSON 문서입니다. 이 문서는 Optional top-level elements와 statement 두 가지 필드로 구성됩니다.
2121

22-
요구사항
22+
### **1. Optional top-level elements**
2323

24-
- (현 지원 기수의) 지원자 누적 합계
25-
- 희망 분야 합계 (1순위 / 2순위)분리
26-
- 소속 학과 합계
27-
- 지원 경로 통계
28-
- 면접 희망시간
29-
- 위 면접 희망 시간은 인당 여러개를 선택할 수 있습니다. (3월 19일 3시, 4시, 5시)
30-
- 특정 날짜에 대한 명시는 하지 않으며 다음과 같은 데이터형을 따릅니다,.
24+
```java
25+
{
26+
"Version": "2012-10-17"
27+
}
28+
```
3129

32-
`“desiredTime” : {{0,1}, {0,2}, {0,4}}` 이런식으로 각각의 좌표를 표현하시면 됩니다.
30+
### **1.1 Version**
3331

34-
- 화면의 표시 시간은 front에 처리를 위임합니다.
35-
- desiredTime에 해당하는 userId List를 매핑시켜서 어드민 페이지에 포함하시면 됩니다.
36-
- (0,1) → 4명, (2,5) → 2명, (3,4) → 0명 이런식으로 매핑시켜 API에 명시하세요.
32+
```json
3733

38-
모든 합계 요구사항은 모두 내림차순으로 데이터를 제공합니다.
34+
{
35+
"Statement": [
36+
{
37+
"Sid": "ExampleStatement1",
38+
"Effect": "Allow",
39+
"Principal": "*",
40+
"Action": "s3:ListBucket",
41+
"Resource": "arn:aws:s3:::example_bucket"
42+
},
43+
{
44+
"Sid": "ExampleStatement2",
45+
"Effect": "Deny",
46+
"Principal": "*",
47+
"Action": "s3:DeleteObject",
48+
"Resource": "s3:::example_bucket/*"
49+
}
50+
]
51+
}
52+
```
3953

40-
관리자는 기본적으로 모든 데이터를 **생성/조회/수정/삭제**가 가능하고, 일반 회원은 아래의 정보를 **검색**만 할 수 있습니다.
54+
- **설명**: 정책 언어의 버전을 지정하는 필드입니다.
55+
- **제한 사항**:
56+
- **`2012-10-17`**: 현재 정책 언어 버전입니다. 새로운 정책 작성 시 반드시 이 값을 사용해야 합니다. 이 버전을 사용하지 않으면 최신 기능을 사용할 수 없습니다.
57+
- **`2008-10-17`**: 이전 정책 언어 버전입니다. 새로운 정책 작성이나 기존 정책 업데이트 시 사용하지 마세요. 최신 기능이 작동하지 않습니다. 예를 들어, **`${aws:username}`** 같은 변수는 문자열로 인식됩니다.
4158

42-
# 2번 문제
59+
### **1.2 ID**
4360

44-
각 DB를 여러번 조회하는 과정에서 기존에 의미없는 요청 순서에서 지연 문제가 발생했습니다.
61+
- **설명**: 정책의 고유 식별자입니다. 자동으로 생성됩니다.
62+
- **제한 사항**: 없음
4563

46-
- 데이터에 의존 관계가 없는데 조회 요청에 순서 때문에, API 지연이 발생했습니다
64+
### **2. Statement**
4765

48-
위 문제를 개선하세요.
66+
### **2.1 Statement List**
4967

50-
## 3번 문제
68+
- **설명**: 하나 이상의 단일 문 또는 개별 문의 배열을 포함합니다.
69+
- **제한 사항**: 리스트 형태로 여러 문을 포함할 수 있습니다.
5170

52-
위 구현 과제를 추상화 하세요.
71+
### **2.2 Sid (Statement ID)**
5372

54-
# 4번 문제
73+
- **설명**: 정책 내 개별 문에 대한 설명 또는 고유 식별자로 사용됩니다.
74+
- **제한 사항**:
75+
- ASCII 대문자(A~~Z), 소문자(a~~z) 및 숫자(0~9)만 사용 가능합니다.
76+
- JSON 내에서 고유해야 합니다. 중복되면 안 됩니다.
5577

56-
위 문제를 해결하면서 해결한 과정을 정리하여 pdf로 제출하시길 바랍니다.
78+
### **2.3 Effect (필수 항목)**
5779

58-
제출지 : ymecca730135@gmail.com
80+
- **설명**: 명시적인 허용(Allow) 또는 거부(Deny)를 지정하는 필드입니다.
81+
- **제한 사항**:
82+
- **`Allow`** 또는 **`Deny`** 중 하나를 선택해야 합니다.
83+
- 기본적으로 모든 리소스는 거부됩니다. 명시적으로 허용하지 않으면 모두 거부됩니다.
84+
- 동일한 규제에 대해 Allow와 Deny가 동시에 존재하면 Deny가 우선 적용됩니다.
5985

60-
### 마감시간 : 2024:05:11/21:30
86+
### **2.4 Principal**
87+
88+
- **설명**: 보안 주체(사용자, 그룹, 역할 등)를 지정합니다. 주로 리소스 기반 정책의 요소로 사용되는데,
89+
90+
```json
91+
"Principal" : {
92+
"ECONO": [
93+
"123456789012",
94+
"555555555555"
95+
]
96+
}
97+
98+
"Principal" : "*"
99+
위 2가지 형태 모두 표시가 가능합니다.
100+
101+
```
102+
103+
- **제한 사항**: 특정 형식의 문자열로 지정해야 합니다.
104+
- Principal에 ECONO라고 적힌 경우 리스트로 해당하여 특정 계정의 Id의 list 형태를 받을 수 있습니다.
105+
106+
### **2.5 NotPrincipal**
107+
108+
- **설명**: 보안 주체를 제외하는 필드입니다.
109+
- **제한 사항**: Principal과 동일하게 특정 형식의 문자열로 지정해야 합니다. 제한 사항은 Principal과 동일합니다.
110+
111+
### **2.6 Action**
112+
113+
- **설명**: 정책에서 허용하거나 거부하는 작업(액션)을 지정합니다.
114+
- **제한 사항**: `:` 문자를 seperator로 지정합니다. : 의 좌측은 정책을 허용할 서비스의 이름(s3, iam, sqs, sns, s3 … ) 를 명시할 수 있습니다.
115+
- : 우측에 존재하는 문자는 GET, PUT, POST, DELETE 4가지만을 허용합니다.
116+
- `MARK` 를 적용한 경우 들어오는 PII에 대해 비식별 처리를 진행합니다.
117+
- **비식별 처리의 구현은 아래 3번 내용을 확인하세요**
118+
119+
### **2.7 NotAction**
120+
121+
- **설명**: 정책에서 제외할 작업(액션)을 지정합니다.
122+
- **제한 사항**: Effect : Allow와 혼합해서 사용할 수 있습니다.
123+
124+
```json
125+
"Effect": "Allow",
126+
"NotAction": "DELETE",
127+
"Resource": "s3:*",
128+
```
129+
130+
위 예시를 살펴 보면 s3의 모든 리소스에 대해서 모든 행위를 허용하겠다라는 의미입니다. ( 단, DELETE 행위에 대해서는 위 정책을 포함하지 않겠다라는 의미입니다. )
131+
132+
### **2.8 Resource**
133+
134+
- **설명**: 정책에서 적용할 리소스를 지정합니다.
135+
- **제한 사항**: *를 작성할 경우 모든 동작(GET, PUT, POST, DELETE)을 허용합니다.
136+
137+
```json
138+
"Resource": "sqs"
139+
```
140+
141+
위 예제는 sqs라는 서비스를 타겟으로 제한하는 것입니다.
142+
143+
String으로 자유롭게 명시는 가능합니다.
144+
145+
### **2.9 NotResource**
146+
147+
- **설명**: 정책에서 제외할 리소스를 지정합니다.
148+
- **제한 사항**: Resource와 동일하게 특정 형식의 문자열로 지정해야 합니다.
149+
- 다른 제한사항은 Resource와 동일합니다.
150+
151+
### **리터럴 문자열 변환 기능**
152+
153+
- **설명**: 정책 변수의 리터럴 문자열 변환 기능을 on/off하는 기능입니다.
154+
- **제한 사항**:
155+
- **`2012-10-17`** 버전에서는 정책 변수가 변수로 인식됩니다.
156+
- **`2008-10-17`** 버전에서는 정책 변수가 리터럴 문자열로 취급됩니다.
157+
158+
이 설명을 통해 IAM Policy의 구성 요소와 각 요소의 제한 사항을 이해할 수 있습니다. 정책을 작성할 때 이 지침을 따라야만 정책이 올바르게 작동하며, 최신 기능을 활용할 수 있습니다.
159+
160+
# 3. PII(개인 식별 정보) 비식별화
161+
162+
### 개인 식별 정보란?
163+
164+
개인 식별 정보(PII)는 **개인을 식별하는 데 사용할 수 있는 모든 데이터**입니다. 개인과 직간접적으로 연결되는 모든 정보는 PII로 간주됩니다. 이름, 이메일 주소, 전화번호, 은행 계좌 번호, 정부 발급 신분증 번호는 모두 PII의 예입니다.
165+
166+
이 때 MARK로 IAM Action이 명시된 경우 다음과 같은 비식별화를 진행하세요
167+
168+
### 제한사항
169+
170+
위 과제는 전화번호, 주민등록 번호를 대상으로만 진행하도록 하겠습니다.
171+
172+
전화번호 : (010-1111-2222)의 경우 맨 뒷자리를 제외한 가운데 1111에 대해서 XXXX로 대체합니다. (010-XXXX-2222)
173+
174+
주민등록 번호 : 950000-1234567 일 경우 맨 뒤 번호 6자리를 X로 비식별화합니다. ( 950000-1XXXXXX)
175+
176+
위 2가지 대상에 대한 제한 및 변경 기능을 추가하세요.
177+
178+
위 개인 식별 정보는 모든 사람은(예외 인원은 없습니다) 비식별화된 정보만 열람이 가능하다.
179+
180+
ps) 위 제한사항은 개인정보 보호법 준수를 위한 비식별 조치 가이드라인에 착안하여 제안드리는 과제입니다.
181+
182+
아래 링크를 궁금하시다면 확인해보세요.
183+
https://www.mois.go.kr/frt/bbs/type010/commonSelectBoardArticle.do?bbsId=BBSMSTR_000000000008&nttId=55287
184+
185+
# 요구사항
186+
187+
위 서비스의 제한사항을 구현하고 특정 요청에 대해 요청이 가능한지 true/false를 반환하는 API를 작성하세요.
188+
189+
Http Method : GET , POST, …
190+
191+
url : /check/resource/{resource}
192+
193+
data : {key value형의 Map data ( 자유도에 맏기도록 하겠습니다. )

THIRD_PROJECT.MD

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
안녕! 오랜만입니다 커피요정 개발자 이서현입니다 ㅎㅎ 이번 3주차 과제는 2주차 과제보다는 어렵지 않게 난이도를 조정했습니다.
2+
3+
이번 3주차 과제의 목표는 다양한 도메인에 대해 Aggregate하는 과정을 익혀보겠습니다.
4+
5+
Aggregate란, 여러 도메인을 하나로 합치는 과정을 의미합니다. 이 과정에서 일관되고 클린한 구조로 코드를 작성하지 않으면 극악의 지옥을 맛보게 됩니다. 오늘 여러분은 다양한 자료구조들을 활용해 아래 과제를 도전하며 자료구조를 활용하는 노하우를 익혀보도록 하겠습니다.
6+
7+
# 1번 문제
8+
9+
서비스를 개발하다보면 모니터링 서비스도 중요하지만 회원들의 정보를 통계를 내서 가공해 보는 화면이 필요할 때가 많습니다. 이를 어드민 페이지라고 합니다.
10+
11+
어드민 페이지의 성격은 우선순위는 낮지만 기존에 있는 정보를 이용해 최대한 빠르게 구현해서 보여줘야 한다는 특징이 있습니다. 구현된 어드민 페이지는 개발자나 관리자의 만족도를 직접적으로 높이는데 크게 기여합니다.
12+
13+
더불어 웹/앱 호환성을 제공하는 데이터 제공은 중요합니다. 앱 서버의 특징은 웹 서버와는 다르게 화면(컴포넌트)단위로 데이터를 전송해야 하면 프론트 친구들이 좋아한다는 특징이 있습니다. (궁금하신 분들은 Http Capture라는 앱을 깔아서 앱에서 패킷을 뜯어보세용)
14+
15+
때문에 아래 요구사항을 빠르게 구현하고 어드민 페이지를 구현해보도록 합시다.
16+
17+
18+
아래 페이지는 신입모집 어드민 페이지입니다.
19+
<img width="1062" alt="image" src="https://github.com/JNU-econovation/Spring_Hell_Study/assets/54030889/9cc9bc92-923d-4649-bb92-ac914f4f6ab5">
20+
21+
하나의 API 요청에 모든 데이터를 담을 수 있도록 구성해봅시다.
22+
23+
요구사항
24+
25+
- (현 지원 기수의) 지원자 누적 합계
26+
- 희망 분야 합계 (1순위 / 2순위)분리
27+
- 소속 학과 합계
28+
- 지원 경로 통계
29+
- 면접 희망시간
30+
- 위 면접 희망 시간은 인당 여러개를 선택할 수 있습니다. (3월 19일 3시, 4시, 5시)
31+
- 특정 날짜에 대한 명시는 하지 않으며 다음과 같은 데이터형을 따릅니다,.
32+
33+
`“desiredTime” : {{0,1}, {0,2}, {0,4}}` 이런식으로 각각의 좌표를 표현하시면 됩니다.
34+
35+
- 화면의 표시 시간은 front에 처리를 위임합니다.
36+
- desiredTime에 해당하는 userId List를 매핑시켜서 어드민 페이지에 포함하시면 됩니다.
37+
- (0,1) → 4명, (2,5) → 2명, (3,4) → 0명 이런식으로 매핑시켜 API에 명시하세요.
38+
39+
모든 합계 요구사항은 모두 내림차순으로 데이터를 제공합니다.
40+
41+
관리자는 기본적으로 모든 데이터를 **생성/조회/수정/삭제**가 가능하고, 일반 회원은 아래의 정보를 **검색**만 할 수 있습니다.
42+
43+
# 2번 문제
44+
45+
각 DB를 여러번 조회하는 과정에서 기존에 의미없는 요청 순서에서 지연 문제가 발생했습니다.
46+
47+
- 데이터에 의존 관계가 없는데 조회 요청에 순서 때문에, API 지연이 발생했습니다
48+
49+
위 문제를 개선하세요.
50+
51+
## 3번 문제
52+
53+
위 구현 과제를 추상화 하세요.
54+
55+
# 4번 문제
56+
57+
위 문제를 해결하면서 해결한 과정을 정리하여 pdf로 제출하시길 바랍니다.
58+
59+
제출지 : ymecca730135@gmail.com
60+
61+
### 마감시간 : 2024:05:11/21:30
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package com.econovation.fourth_project;
2+
3+
import org.springframework.boot.SpringApplication;
4+
import org.springframework.boot.autoconfigure.SpringBootApplication;
5+
6+
@SpringBootApplication
7+
public class FourthStudyApplication {
8+
public static void main(String[] args) {
9+
SpringApplication.run(FourthStudyApplication.class, args);
10+
}
11+
}

src/main/java/com/econovation/third_project/controller/AdminQueryController.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
@Controller
1313
@RequiredArgsConstructor
1414
public class AdminQueryController {
15+
1516
private final Database database;
1617

1718
// 예시 코드
@@ -20,9 +21,9 @@ public ResponseEntity<Object> postRegistrate(@RequestBody Registration registrat
2021
database.register(registration);
2122
return ResponseEntity.ok().build();
2223
}
24+
2325
@GetMapping("/registration")
2426
public ResponseEntity<Registration> getRegistration(String userId) {
2527
return ResponseEntity.ok().body(database.getRegistration(userId));
2628
}
27-
28-
}
29+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package com.econovation.third_project.controller;
2+
3+
public abstract class AggregateQuery {
4+
5+
}

0 commit comments

Comments
 (0)