Skip to content

Commit f9cec0d

Browse files
committed
Feat: ReadMe 추가
1 parent 72c6b2b commit f9cec0d

1 file changed

Lines changed: 354 additions & 0 deletions

File tree

MemberReadme.md

Lines changed: 354 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,354 @@
1+
# 👁️‍🗨️ 개요
2+
3+
회원가입 및 로그인에 필요한 로직을 처리하는 서버입니다.
4+
5+
<br>
6+
7+
# 🌆 기능 및 아키텍처
8+
9+
10+
<details>
11+
<summary> 📝 API 명세서 </summary>
12+
13+
<div markdown="1">
14+
<br>
15+
16+
- [signup](#signup)
17+
- [checkDuplicateMember](#checkDuplicateMember)
18+
- [login](#login)
19+
- [checkValidation](#checkValidation)
20+
- [getMemberInfo](#getMemberInfo)
21+
22+
<br>
23+
24+
## signup
25+
26+
회원가입 요청을 처리합니다.
27+
28+
<br>
29+
30+
### URL
31+
32+
- POST `/member/signup`
33+
34+
<br>
35+
36+
37+
### 요청 예시
38+
39+
```json
40+
{
41+
"email": "go123@gmail.com" ,
42+
"name" : "노희재",
43+
"password": "Testing" ,
44+
"birth": "1997-08-30" ,
45+
"phone" : "010-1234-5678" ,
46+
"gender" : ""
47+
}
48+
```
49+
<br>
50+
51+
52+
53+
### 응답 예시
54+
55+
- ✅ 성공
56+
57+
```json
58+
{
59+
"code": 200,
60+
"description": "성공"
61+
}
62+
```
63+
<br>
64+
65+
- ⚠️ 이미 존재하는 회원인 경우
66+
```json
67+
{
68+
"code": 409,
69+
"description": "이미 존재하는 회원입니다"
70+
}
71+
```
72+
<br>
73+
74+
---
75+
<br>
76+
77+
## checkDuplicateMember
78+
79+
이메일 중복체크를 합니다.
80+
81+
중복체크를 통과한다면, 이메일에 인증번호를 전송합니다.
82+
83+
<br>
84+
85+
### URL
86+
87+
- POST `/member/checkDuplicateEmail`
88+
89+
<br>
90+
91+
### 요청 예시
92+
93+
```json
94+
{
95+
"email": "go123@gmail.com"
96+
}
97+
```
98+
99+
<br>
100+
101+
102+
### 응답 예시
103+
104+
- ✅ 성공
105+
106+
```json
107+
{
108+
"code": 200,
109+
"description": "성공"
110+
}
111+
```
112+
113+
<br>
114+
115+
116+
- ⚠️ 중복된 이메일인 경우
117+
```json
118+
{
119+
"code": 409,
120+
"description": "중복된 이메일 입니다"
121+
}
122+
```
123+
124+
<br>
125+
126+
---
127+
<br>
128+
129+
## login
130+
로그인 요청을 처리합니다.
131+
132+
<br>
133+
134+
### URL
135+
136+
- POST `/member/login`
137+
- Parameter
138+
- email: string
139+
- password: string
140+
141+
<br>
142+
143+
### 요청 예시
144+
145+
```json
146+
{
147+
"email": "go123@gmail.com" ,
148+
"password": "Testing" ,
149+
}
150+
```
151+
<br>
152+
153+
### 응답 예시
154+
155+
- ✅ 성공
156+
157+
- header
158+
```json
159+
{
160+
"authorization": ...
161+
}
162+
```
163+
164+
- Body
165+
```json
166+
{
167+
"code": 200,
168+
"description": "성공"
169+
}
170+
```
171+
172+
<br>
173+
174+
- 실패
175+
- ⚠️ 존재하지않는 회원정보일 경우
176+
```json
177+
{
178+
"code": 404,
179+
"description": "존재하지 않는 회원입니다"
180+
}
181+
```
182+
183+
<br>
184+
185+
---
186+
<br>
187+
188+
## checkValidation
189+
190+
올바른 인증번호인지 확인합니다.
191+
192+
<br>
193+
194+
### URL
195+
196+
- POST `/member/validation`
197+
- Parameter
198+
- email: string
199+
- authNum:
200+
201+
<br>
202+
203+
204+
### 요청 예시
205+
206+
```json
207+
{
208+
"email": "go123@gmail.com" ,
209+
"authNum": 123456
210+
}
211+
```
212+
213+
<br>
214+
215+
216+
### 응답 예시
217+
218+
- ✅ 성공
219+
220+
```json
221+
{
222+
"code": 200,
223+
"description": "성공"
224+
}
225+
```
226+
227+
<br>
228+
229+
- 실패
230+
- ⚠️ 잘못된 인증번호
231+
```json
232+
{
233+
"code": 404,
234+
"description": "잘못된 인증번호입니다"
235+
}
236+
```
237+
238+
<br>
239+
240+
---
241+
<br>
242+
243+
## getMemberInfo
244+
245+
JWT 토큰으로 회원을 식별하고 회원의 정보를 가져옵니다.
246+
247+
<br>
248+
249+
### URL
250+
251+
- GET `/member/info`
252+
- Headers
253+
- Authorization: login token
254+
255+
<br>
256+
257+
258+
### 요청 예시
259+
260+
```json
261+
{
262+
"email": "go123@gmail.com" ,
263+
"name" : "노희재",
264+
"password": "Testing" ,
265+
"birth": "1997-08-30" ,
266+
"phone" : "010-1234-5678" ,
267+
"gender" : ""
268+
}
269+
```
270+
271+
<br>
272+
273+
274+
### 응답 예시
275+
276+
```json
277+
{
278+
"code": 200,
279+
"data": {
280+
"name": "노희재",
281+
"email": "go123@gmail.com",
282+
"phone": "010-1234-5678",
283+
"birth": "1997-08-30"
284+
},
285+
"description": "성공"
286+
}
287+
```
288+
</div>
289+
</details>
290+
291+
<br>
292+
293+
- 이메일 인증 절차
294+
295+
![이메일 인증 절차](https://user-images.githubusercontent.com/80504636/231195742-634eaef7-d77e-4e1c-a9d1-ffdc21f532e0.png)
296+
297+
1. **checkDuplicateMember** 로 요청이 오면, 백엔드 서버가 이메일 중복체크 로직을 거친 뒤 인증번호를 생성하며 이를 Redis 에 저장합니다. (만료시간 - 5분)
298+
299+
2. 생성된 인증번호를 RabbitMQ 에 전송요청(메세지)을 보냅니다.
300+
301+
3. RabbitMQ 는 Queue 에 메세지를 쌓아두고 순차적으로 Python 에 메일 전송요청을 보내게 됩니다.
302+
303+
4. Python 은 사용자에게 인증번호를 전송합니다.
304+
305+
5. 사용자는 인증번호를 입력하고, **checkValidation** 요청을 보냅니다.
306+
307+
6. Spring 은 사용자가 입력한 인증번호와 Redis 에 저장되어있는 인증번호를 비교하여 일치한다면 Redis 에 저장되어있는 값을 삭제하고 인증 성공 응답을 보냅니다.
308+
309+
310+
<br>
311+
312+
# 💽 ERD
313+
314+
![ERD](https://user-images.githubusercontent.com/80248626/231385844-44efb68f-9c16-49fb-a2af-ed0298982d5d.png)
315+
316+
<br>
317+
318+
# 🪵 개발환경
319+
320+
- Java 11
321+
322+
- Spring Boot 2.X
323+
- Spring Cloud Open Feign
324+
325+
- Spring Data JPA
326+
327+
- Spring Data Redis
328+
329+
- Spring AMPQ
330+
331+
- MariaDB : 10.3
332+
333+
- Redis : 7.0.10
334+
335+
- RabbitMQ:3.11.10
336+
337+
338+
<br>
339+
340+
# 💬 회고
341+
342+
### 프로젝트 진행시 주안점
343+
344+
- 다양한 로그인 처리 방법을 비교해 보고 프로젝트에 적합한 방법을 선택하고자 하였습니다.
345+
346+
- Redis, RabbitMQ 등 처음 써보는 소프트웨어를 적절한 사용처에 사용할 수 있도록 하였습니다.
347+
348+
<br>
349+
350+
### 한계점 및 개선 사항
351+
352+
- 초기에는 Refresh Token + Access Token 방식을 사용하여 인증, 인가 처리를 하였지만 Istio 에서 Refresh 토큰을 처리할 방법이 마땅치 않고, 처리할 방법들이 너무나 비효율적인 방법들이라고 생각하여 Access 토큰만을 이용한 인증,인가를 하였다는 점이 아쉽습니다.
353+
354+
- 예외처리, 테스트 코드 작성 등 미숙한 부분이 보여 아쉽습니다. 이 부분을 조금 더 보완하여 리팩토링을 진행하면 좋을것 같습니다.

0 commit comments

Comments
 (0)