Spring Boot 3.5 ๊ธฐ๋ฐ์ผ๋ก ๊ตฌ์ถ๋, ์ฌ์ฉ์ ์ค์ฌ์ ๋ด์คํผ๋ ๋ฐฑ์๋ ์๋น์ค
์ด ํ๋ก์ ํธ๋ ์ค์๊ฐ ์์ ์ธํฐ๋์ ๊ณผ ๊ฒฌ๊ณ ํ ๋ณด์์ ์ ๊ณตํ๋ฉฐ, ํด๋ฆฐ ์ํคํ ์ฒ๋ฅผ ํตํด ๋์ ํ์ฅ์ฑ๊ณผ ์ ์ง๋ณด์์ฑ์ ์๋ํฉ๋๋ค.
ERD (Entity Relationship Diagram) โ ์ฃผ์ ์ํฐํฐ์ ๊ด๊ณ๋.
- ๐ News Feed - ํ๋์ ์ด๊ณ ํ์ฅ ๊ฐ๋ฅํ ์์ ๋ฏธ๋์ด ํ๋ซํผ
- โจ ์ฃผ์ ํน์ง
- ๐ ๊ธฐ๋ฅ ๋ชฉ๋ก
- ๐ ๏ธ ๊ธฐ์ ์คํ
- ๐ ๋น ๋ฅธ ์์
- ๐ก API ์๋ํฌ์ธํธ
- ๐๏ธ ํ๋ก์ ํธ ๊ตฌ์กฐ
- ๐งช ํ ์คํธ
- ๐จ API ์๋ต ํ์
- ๐ง ํ๊ฒฝ ์ค์
- ๐ ํต์ฌ ์ค๊ณ ์์น
- ๐ค ๊ธฐ์ฌ
- ๐ ๋ผ์ด์ ์ค
- ๐ ๋ฌธ์
News Feed๋ ํ๋์ ์ธ ์์ ๋ฏธ๋์ด ํ๋ซํผ์ ํต์ฌ ๊ธฐ๋ฅ์ ๋ชจ๋ ๊ฐ์ถ ์์ฑ๋ ๋์ ๋ฐฑ์๋ ์๋น์ค์ ๋๋ค. ํ์ฅ์ฑ๊ณผ ์ ์ง๋ณด์์ฑ์ ๊ณ ๋ คํ ์ค๊ณ๋ก, ์ค์ ํ๋ก๋์ ํ๊ฒฝ์์๋ ์์ ์ ์ผ๋ก ์ด์ํ ์ ์์ต๋๋ค.
- ์ค์๊ฐ ๋ด์คํผ๋: ํ๋ก์ฐํ ์ฌ์ฉ์๋ค์ ์ต์ ํฌ์คํธ๋ฅผ ์๊ฐ์์ผ๋ก ์ ๋ ฌํ์ฌ ์ ๊ณตํฉ๋๋ค.
- ๊ฐ์ธํ๋ ํ๋กํ: MBTI, ์๊ธฐ์๊ฐ ๋ฑ ์ฌ์ฉ์์ ๊ฐ์ฑ์ ์์ ๋กญ๊ฒ ํํํ ์ ์๋ ์ ์ฐํ ํ๋กํ ์์คํ ์ ์ง์ํฉ๋๋ค.
- ์์ ์ธํฐ๋์ : ์ข์์, ํ๋ก์ฐ, ๋๊ธ ๊ธฐ๋ฅ์ ํตํด ์ฌ์ฉ์ ๊ฐ์ ํ๋ฐํ ์ปค๋ฎค๋์ผ์ด์ ์ ์ด์งํฉ๋๋ค.
- JWT ๊ธฐ๋ฐ ์ธ์ฆ: ํ์ฅ ๊ฐ๋ฅํ๊ณ Statelessํ JSON Web Token (JWT) ๊ธฐ๋ฐ์ ์ธ์ฆ ์์คํ ์ ๊ตฌํํ์ฌ ์์ ํ API ํต์ ์ ๋ณด์ฅํฉ๋๋ค.
- ํ ํฐ ๋ธ๋๋ฆฌ์คํธ: ๋ก๊ทธ์์๋ ํ ํฐ์ ์ฆ์ ๋ฌดํจํํ๋ ๋ธ๋๋ฆฌ์คํธ ๊ธฐ๋ฅ์ ํตํด ๋ณด์์ ๊ฐํํฉ๋๋ค.
- ๋น๋ฐ๋ฒํธ ์ํธํ: ๊ฐ๋ ฅํ BCrypt ํด์ฑ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ์ฌ ์ฌ์ฉ์ ๋น๋ฐ๋ฒํธ๋ฅผ ์์ ํ๊ฒ ์ ์ฅํฉ๋๋ค.
- ๋๋ฉ์ธ ์ฃผ๋ ์ค๊ณ(DDD): ๋น์ฆ๋์ค ๋ก์ง์ ๋๋ฉ์ธ ์ค์ฌ์ผ๋ก ๋ช ํํ๊ฒ ๋ถ๋ฆฌํ์ฌ ๋ณต์ก์ฑ์ ๊ด๋ฆฌํ๊ณ , ๊ฐ๋ฐ ํจ์จ์ฑ์ ๋์ ๋๋ค.
- ๊ณ์ธตํ ์ํคํ
์ฒ:
ControllerโServiceโRepository๊ตฌ์กฐ์ ๋ช ํํ ๊ณ์ธต ๋ถ๋ฆฌ๋ฅผ ํตํด ์ฝ๋์ ์์ง๋๋ฅผ ๋์ด๊ณ ๊ฒฐํฉ๋๋ฅผ ๋ฎ์ถฅ๋๋ค. - SOLID ์์น: ๊ฐ์ฒด ์งํฅ ์ค๊ณ์ SOLID ์์น์ ์ค์ํ์ฌ ์ ์ง๋ณด์์ฑ, ํ์ฅ์ฑ, ์ ์ฐ์ฑ์ ๊ทน๋ํํฉ๋๋ค.
ํ์ฌ ๊ตฌํ๋ ์ฃผ์ ๊ธฐ๋ฅ๋ค์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ํ์๊ฐ์ / ๋ก๊ทธ์ธ / ๋ก๊ทธ์์
- ๋น๋ฐ๋ฒํธ ๋ณ๊ฒฝ
- ํ์ ํํด (Soft Delete)
- ํ๋กํ ์์ฑ ๋ฐ ์์
- ํ๋กํ ์กฐํ (๋ณธ์ธ/ํ์ธ)
- ํฌ์คํธ ์์ฑ / ์์ / ์ญ์
- ํฌ์คํธ ์กฐํ (์กฐํ์ ์๋ ์ฆ๊ฐ)
- ์ข์์ / ์ข์์ ์ทจ์
- ๋๊ธ ์์ฑ / ์์ / ์ญ์
- ํฌ์คํธ๋ณ ๋๊ธ ๋ชฉ๋ก ์กฐํ
- ํ๋ก์ฐ / ์ธํ๋ก์ฐ
- ํ๋ก์ ๋ชฉ๋ก ์กฐํ
- ํ๋ก์ฐ ์ํ ํ์ธ
- ์ ์ฒด ํฌ์คํธ ํผ๋ (ํ์ด์ง๋ค์ด์ ์ง์)
- ํ๋ก์ฐํ ์ฌ์ฉ์ ํฌ์คํธ ํผ๋
- ํน์ ์ฌ์ฉ์์ ํฌ์คํธ ๋ชจ์
- ๊ธฐ๊ฐ๋ณ ํผ๋ ์กฐํ (์์์ผ ๋ฐ ์ข ๋ฃ์ผ ํํฐ๋ง)
ํ๋ก์ ํธ๋ ๋ค์๊ณผ ๊ฐ์ ์ต์ ๊ธฐ์ ์คํ์ ํ์ฉํ์ฌ ๊ฐ๋ฐ๋์์ต๋๋ค.
- Java 17 - ์ต์ LTS(Long Term Support) ๋ฒ์ ์ผ๋ก, ์ฑ๋ฅ๊ณผ ์์ ์ฑ์ ํ๋ณดํฉ๋๋ค.
- Spring Boot 3.5.4 - ๋น ๋ฅด๊ณ ์ฝ๊ฒ ๋ ๋ฆฝ ์คํํ, ํ๋ก๋์ ๋ฑ๊ธ์ Spring ๊ธฐ๋ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ค ์ ์๋ ํ๋์ ์ธ ์น ํ๋ ์์ํฌ์ ๋๋ค.
- Spring Data JPA - Java Persistence API๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋ฐ์ดํฐ ์ก์ธ์ค ๊ณ์ธต์ ํจ์จ์ ์ผ๋ก ๊ตฌํํ๊ณ , ๊ฐ์ฒด ๊ด๊ณ ๋งคํ(ORM)์ ์ง์ํฉ๋๋ค.
- JWT (Auth0) - ํ ํฐ ๊ธฐ๋ฐ ์ธ์ฆ์ ์ํ ํ์ค์ผ๋ก, ํ์ฅ ๊ฐ๋ฅํ๊ณ ์์ ํ ์ธ์ฆ ๋ฉ์ปค๋์ฆ์ ์ ๊ณตํฉ๋๋ค.
- BCrypt - ๊ฐ๋ ฅํ ๋จ๋ฐฉํฅ ํด์ฑ ํจ์๋ก, ์ฌ์ฉ์ ๋น๋ฐ๋ฒํธ๋ฅผ ์์ ํ๊ฒ ์ํธํํ์ฌ ์ ์ฅํฉ๋๋ค.
- MySQL - ์์ ์ ์ด๊ณ ๋๋ฆฌ ์ฌ์ฉ๋๋ ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ด๋ฆฌ ์์คํ ์ผ๋ก, ํ๋ก๋์ ํ๊ฒฝ์ ์ ํฉํฉ๋๋ค.
- H2 - ๊ฒฝ๋ ์ธ๋ฉ๋ชจ๋ฆฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ก, ๊ฐ๋ฐ ๋ฐ ํ ์คํธ ํ๊ฒฝ์์ ๋น ๋ฅธ ๋ฐ์ดํฐ ์ฒ๋ฆฌ๋ฅผ ์ํด ์ฌ์ฉ๋ฉ๋๋ค.
- Gradle - ์ ์ฐํ๊ณ ๊ฐ๋ ฅํ ๋น๋ ์๋ํ ๋๊ตฌ๋ก, ์์กด์ฑ ๊ด๋ฆฌ ๋ฐ ํ๋ก์ ํธ ๋น๋๋ฅผ ํจ์จ์ ์ผ๋ก ์ํํฉ๋๋ค.
- JUnit 5 - Java๋ฅผ ์ํ ์ต์ ํ ์คํธ ํ๋ ์์ํฌ๋ก, ๋จ์ ํ ์คํธ ๋ฐ ํตํฉ ํ ์คํธ๋ฅผ ์์ฑํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
- TestRestTemplate - Spring Boot ์ ํ๋ฆฌ์ผ์ด์ ์ E2E(End-to-End) ํ ์คํธ๋ฅผ ์ํ ์ ํธ๋ฆฌํฐ๋ก, ์ค์ HTTP ์์ฒญ์ ์๋ฎฌ๋ ์ด์ ํฉ๋๋ค.
- Spring Validation - Spring ํ๋ ์์ํฌ์์ ์ ๊ณตํ๋ ๊ฐ๋ ฅํ ์ ๋ ฅ๊ฐ ๊ฒ์ฆ ๊ธฐ๋ฅ์ผ๋ก, ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ์ ๋ณด์ฅํฉ๋๋ค.
- Lombok - Java ๊ฐ๋ฐ ์ ๋ฐ๋ณต์ ์ธ ์ฝ๋๋ฅผ ์ค์ฌ์ฃผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก, Getter, Setter, ์์ฑ์ ๋ฑ์ ์๋์ผ๋ก ์์ฑํ์ฌ ์ฝ๋ ๊ฐ๋ ์ฑ์ ๋์ ๋๋ค.
ํ๋ก์ ํธ๋ฅผ ๋ก์ปฌ ํ๊ฒฝ์์ ์คํํ๊ธฐ ์ํ ๋จ๊ณ๋ณ ๊ฐ์ด๋์ ๋๋ค.
- Java Development Kit (JDK) 17 ์ด์
- MySQL 8.0 ์ด์ (ํ๋ก๋์ ํ๊ฒฝ ๊ตฌ์ฑ ์)
# 1. ํ๋ก์ ํธ ํด๋ก
git clone https://github.com/n-factorial/news-feed.git
cd news-feed
# 2. ์์กด์ฑ ์ค์น ๋ฐ ๋น๋
./gradlew build
# 3. ์ ํ๋ฆฌ์ผ์ด์
์คํ
./gradlew bootRun์๋ฒ๊ฐ ์ฑ๊ณต์ ์ผ๋ก ์์๋๋ฉด http://localhost:8080์์ API๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
News Feed ๋ฐฑ์๋ ์๋น์ค์์ ์ ๊ณตํ๋ ์ฃผ์ API ์๋ํฌ์ธํธ ๋ชฉ๋ก์ ๋๋ค. ๋ชจ๋ API๋ ์ผ๊ด๋ RESTful ์์น์ ๋ฐ๋ฆ ๋๋ค.
| HTTP Method | Endpoint | Description |
|---|---|---|
POST |
/api/v1/auth/signup |
ํ์๊ฐ์ |
POST |
/api/v1/auth/login |
๋ก๊ทธ์ธ |
POST |
/api/v1/auth/logout |
๋ก๊ทธ์์ |
POST |
/api/v1/auth/withdraw |
ํ์ํํด |
PATCH |
/api/v1/auth/me/password |
๋น๋ฐ๋ฒํธ ๋ณ๊ฒฝ |
| HTTP Method | Endpoint | Description |
|---|---|---|
POST |
/api/v1/posts |
ํฌ์คํธ ์์ฑ |
GET |
/api/v1/posts/{postId} |
ํฌ์คํธ ์กฐํ |
PATCH |
/api/v1/posts/{postId} |
ํฌ์คํธ ์์ |
DELETE |
/api/v1/posts/{postId} |
ํฌ์คํธ ์ญ์ |
| HTTP Method | Endpoint | Description |
|---|---|---|
GET |
/api/v1/profiles/{id} |
ํ๋กํ ์กฐํ |
PUT |
/api/v1/profiles/me |
๋ด ํ๋กํ ์์ |
| HTTP Method | Endpoint | Description |
|---|---|---|
POST |
/api/v1/posts/{postId}/comments |
๋๊ธ ์์ฑ |
GET |
/api/v1/posts/{postId}/comments |
๋๊ธ ๋ชฉ๋ก ์กฐํ |
PATCH |
/api/v1/comments/{commentId} |
๋๊ธ ์์ |
DELETE |
/api/v1/comments/{commentId} |
๋๊ธ ์ญ์ |
| HTTP Method | Endpoint | Description |
|---|---|---|
POST |
/api/v1/posts/{postId}/likes |
์ข์์ |
DELETE |
/api/v1/posts/{postId}/likes |
์ข์์ ์ทจ์ |
POST |
/api/v1/profiles/{profileId}/follows |
ํ๋ก์ฐ |
DELETE |
/api/v1/profiles/{profileId}/follows |
์ธํ๋ก์ฐ |
GET |
/api/v1/profiles/{profileId}/followed |
ํ๋ก์ฐ ์ํ ํ์ธ |
GET |
/api/v1/profiles/{profileId}/followings |
ํ๋ก์ ๋ชฉ๋ก |
GET |
/api/v1/profiles/me/followings |
๋ด ํ๋ก์ ๋ชฉ๋ก |
| HTTP Method | Endpoint | Description |
|---|---|---|
GET |
/api/v1/feeds |
์ ์ฒด ํผ๋ (์ต์
: startDate=YYYY-MM-DD, endDate=YYYY-MM-DD) |
GET |
/api/v1/feeds/following |
ํ๋ก์ ํผ๋ (์ต์
: startDate=YYYY-MM-DD, endDate=YYYY-MM-DD) |
GET |
/api/v1/profiles/{profileId}/feeds |
ํน์ ์ฌ์ฉ์ ํผ๋ |
ํ๋ก์ ํธ๋ ํด๋ฆฐ ์ํคํ ์ฒ ์์น์ ๊ธฐ๋ฐ์ผ๋ก ๋ชจ๋ํ๋์ด ์์ผ๋ฉฐ, ๊ฐ ๋๋ฉ์ธ์ด ๋ ๋ฆฝ์ ์ผ๋ก ๊ด๋ฆฌ๋ฉ๋๋ค.
src/main/java/org/nfactorial/newsfeed/
โโโ ๐ common/ # ๊ณตํต ๊ธฐ๋ฅ (์ค์ , DTO, ์์ธ ์ฒ๋ฆฌ, ๋ณด์ ๋ฑ)
โ โโโ ๐ config/ # Spring ์ค์ ํด๋์ค
โ โโโ ๐ dto/ # ๊ณตํต ์๋ต DTO
โ โโโ ๐ entity/ # ๊ธฐ๋ณธ ์ํฐํฐ (BaseTimeEntity ๋ฑ)
โ โโโ ๐ exception/ # ์ ์ญ ์์ธ ์ฒ๋ฆฌ ํธ๋ค๋ฌ
โ โโโ ๐ security/ # JWT ๊ธฐ๋ฐ ๋ณด์ ๊ด๋ จ ํด๋์ค
โโโ ๐ domain/ # ํต์ฌ ๋น์ฆ๋์ค ๋๋ฉ์ธ๋ณ ๊ตฌํ
โ โโโ ๐ auth/ # ์ธ์ฆ ๋ฐ ๊ณ์ ๊ด๋ฆฌ (ํ์๊ฐ์
, ๋ก๊ทธ์ธ ๋ฑ)
โ โโโ ๐ post/ # ํฌ์คํธ ์์ฑ, ์กฐํ, ์์ , ์ญ์
โ โโโ ๐ comment/ # ๋๊ธ ์์ฑ์ฑ, ์กฐํ, ์์ , ์ญ์
โ โโโ ๐ feed/ # ๋ด์คํผ๋ ์์ฑ ๋ฐ ์กฐํ ๋ก์ง
โ โโโ ๐ interaction/ # ์ข์์ ๋ฐ ํ๋ก์ฐ ๊ธฐ๋ฅ
โ โโโ ๐ profile/ # ์ฌ์ฉ์ ํ๋กํ ๊ด๋ฆฌ
- ๋๋ฉ์ธ๋ณ ํจํค์ง ๋ถ๋ฆฌ: ๊ฐ ๋๋ฉ์ธ(์:
auth,post,comment)์ด ๋ ๋ฆฝ์ ์ธ ํจํค์ง๋ก ๋ถ๋ฆฌ๋์ด ์์ด, ์ฝ๋์ ์์ง๋๋ฅผ ๋์ด๊ณ ๋ชจ๋์ฑ์ ๊ฐํํฉ๋๋ค. - ๊ณ์ธตํ ๊ตฌ์กฐ:
controller(API ์๋ํฌ์ธํธ),service(๋น์ฆ๋์ค ๋ก์ง),repository(๋ฐ์ดํฐ ์ ๊ทผ),entity(๋ฐ์ดํฐ ๋ชจ๋ธ)์ ๋ช ํํ ๊ณ์ธต ๋ถ๋ฆฌ๋ฅผ ํตํด ์ญํ ๊ณผ ์ฑ ์์ ๋ช ํํ ํฉ๋๋ค. - DTO ํจํด: ์์ฒญ(Request) ๋ฐ ์๋ต(Response) ๊ฐ์ฒด๋ฅผ ์ํฐํฐ์ ๋ถ๋ฆฌํ์ฌ, ๋ฐ์ดํฐ ์ ์ก ๊ฐ์ฒด(DTO)๋ฅผ ํตํด ๊ณ์ธต ๊ฐ ๋ฐ์ดํฐ ๊ตํ์ ์์ ํ๊ณ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํฉ๋๋ค.
- Global Exception Handling:
@RestControllerAdvice๋ฅผ ํ์ฉํ ์ ์ญ ์์ธ ์ฒ๋ฆฌ ์์คํ ์ ๊ตฌ์ถํ์ฌ, ๋ชจ๋ API ์์ฒญ์ ๋ํด ์ผ๊ด๋ ์๋ฌ ์๋ต ํ์์ ์ ๊ณตํฉ๋๋ค.
ํ๋ก์ ํธ๋ ๋์ ์ฝ๋ ํ์ง๊ณผ ์์ ์ฑ์ ๋ณด์ฅํ๊ธฐ ์ํด ํฌ๊ด์ ์ธ ํ ์คํธ ์ค์ํธ๋ฅผ ํฌํจํฉ๋๋ค.
# ์ ์ฒด ํ
์คํธ ์คํ
./gradlew test
# ํน์ ํ
์คํธ ํด๋์ค ์คํ (์: ์ธ์ฆ ๊ด๋ จ E2E ํ
์คํธ)
./gradlew test --tests "AuthE2ETest"- E2E ํ ์คํธ: ์ค์ HTTP ์์ฒญ์ ์๋ฎฌ๋ ์ด์ ํ์ฌ ์์คํ ์ ์๋-ํฌ-์๋ ํ๋ฆ์ ๊ฒ์ฆํ๋ ํตํฉ ํ ์คํธ์ ๋๋ค.
- H2 ์ธ๋ฉ๋ชจ๋ฆฌ DB: ํ ์คํธ ์คํ ์ H2 ์ธ๋ฉ๋ชจ๋ฆฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฌ์ฉํ์ฌ, ํ ์คํธ ๊ฐ์ ๊ฒฉ๋ฆฌ์ฑ์ ๋ณด์ฅํ๊ณ ์คํ ์๋๋ฅผ ํฅ์์ํต๋๋ค.
- ์๋ ๋ฐ์ดํฐ ์ ๋ฆฌ: ๊ฐ ํ ์คํธ ์ผ์ด์ค ์คํ ํ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์๋์ผ๋ก ์ด๊ธฐํํ์ฌ, ํ ์คํธ์ ๋ ๋ฆฝ์ฑ๊ณผ ์ฌํ ๊ฐ๋ฅ์ฑ์ ๋ณด์ฅํฉ๋๋ค.
๋ชจ๋ API๋ ์ผ๊ด๋ JSON ์๋ต ํ์์ ์ฌ์ฉํ์ฌ ํด๋ผ์ด์ธํธ์์ ํต์ ์ ํ์คํํฉ๋๋ค.
{
"code": "SUCC-200",
"message": "์์ฒญ ์ฑ๊ณต",
"data": {
// ์ค์ ์๋ต ๋ฐ์ดํฐ (์ฑ๊ณต ์)
}
}์ค๋ฅ ๋ฐ์ ์์๋ ๋ค์๊ณผ ๊ฐ์ ํ์์ผ๋ก ์๋ตํฉ๋๋ค.
{
"code": "AUTH-401",
"message": "์ธ์ฆ์ด ํ์ํฉ๋๋ค.",
"data": null
}ํ๋ก์ ํธ๋ ๊ฐ๋ฐ ๋ฐ ํ ์คํธ ํ๊ฒฝ์ ๋ฐ๋ผ ์ ์ฐํ๊ฒ ์ค์ ํ ์ ์์ต๋๋ค.
- ํ๋กํ:
dev(Spring Profile) - ๋ฐ์ดํฐ๋ฒ ์ด์ค: ๊ฐ๋ฐ์ฉ MySQL ๋๋ H2 ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฌ์ฉํ๋๋ก ์ค์ ํ ์ ์์ต๋๋ค.
- ๋ฐ์ดํฐ๋ฒ ์ด์ค: H2 ์ธ๋ฉ๋ชจ๋ฆฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฌ์ฉํฉ๋๋ค.
- DDL ์ค์ :
create-dropDDL(Data Definition Language) ์ค์ ์ ํตํด ๊ฐ ํ ์คํธ ์คํ ํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์คํค๋ง๋ฅผ ์ด๊ธฐํํ์ฌ ํ ์คํธ ๊ฒฉ๋ฆฌ์ฑ์ ํ๋ณดํฉ๋๋ค.
News Feed ํ๋ก์ ํธ๋ ๋ค์๊ณผ ๊ฐ์ ํต์ฌ ์ค๊ณ ์์น์ ๊ธฐ๋ฐ์ผ๋ก ๊ตฌ์ถ๋์์ต๋๋ค.
๊ฐ ๋๋ฉ์ธ์ ๋ ๋ฆฝ์ ์ผ๋ก ๊ด๋ฆฌ๋๋ฉฐ, ๋น์ฆ๋์ค ๋ก์ง์ด ๋ช ํํ๊ฒ ๋ถ๋ฆฌ๋์ด ์์ต๋๋ค. ์ด๋ ๋ณต์กํ ๋น์ฆ๋์ค ์๊ตฌ์ฌํญ์ ํจ๊ณผ์ ์ผ๋ก ๋ชจ๋ธ๋งํ๊ณ ๊ด๋ฆฌํ๋ ๋ฐ ๋์์ ์ค๋๋ค.
์๋ก์ด ๊ธฐ๋ฅ ์ถ๊ฐ๋ ์๊ตฌ์ฌํญ ๋ณ๊ฒฝ์ ์ ์ฐํ๊ฒ ๋์ํ ์ ์๋ ๋ชจ๋ํ๋ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค. ์ด๋ ์ฅ๊ธฐ์ ์ธ ํ๋ก์ ํธ ์ ์ง๋ณด์์ ์ฑ์ฅ์ ํ์์ ์ ๋๋ค.
JWT ํ ํฐ ๊ด๋ฆฌ, ๋น๋ฐ๋ฒํธ ์ํธํ, ํ ํฐ ๋ธ๋๋ฆฌ์คํธ ๋ฑ ์ํฐํ๋ผ์ด์ฆ๊ธ ๋ณด์ ๊ธฐ๋ฅ์ ๊ตฌํํ์ฌ ์ฌ์ฉ์ ๋ฐ์ดํฐ๋ฅผ ์์ ํ๊ฒ ๋ณดํธํฉ๋๋ค.
์ด ํ๋ก์ ํธ์ ๊ธฐ์ฌํ๊ณ ์ถ์ผ์๋ค๋ฉด, ๋ค์ ๊ฐ์ด๋๋ผ์ธ์ ๋ฐ๋ผ์ฃผ์ธ์:
- ์ ์ฅ์๋ฅผ ํฌํฌ(Fork)ํฉ๋๋ค.
- ์๋ก์ด ๊ธฐ๋ฅ ๋๋ ๋ฒ๊ทธ ์์ ์ ์ํ ๋ธ๋์น๋ฅผ ์์ฑํฉ๋๋ค (
git checkout -b feature/your-feature-name). - ๋ณ๊ฒฝ ์ฌํญ์ ์ปค๋ฐํ๊ณ ํธ์ํฉ๋๋ค.
- Pull Request๋ฅผ ์์ฑํ์ฌ ๋ณ๊ฒฝ ์ฌํญ์ ์ค๋ช ํฉ๋๋ค.
์ด ํ๋ก์ ํธ๋ MIT ๋ผ์ด์ ์ค์ ๋ฐ๋ผ ๋ฐฐํฌ๋ฉ๋๋ค. ์์ธํ ๋ด์ฉ์ LICENSE ํ์ผ์ ์ฐธ์กฐํ์ธ์.
ํ๋ก์ ํธ์ ๋ํ ์ง๋ฌธ์ด๋ ์ ์์ด ์์ผ์๋ฉด, ๋ค์ ์ฐ๋ฝ์ฒ๋ก ๋ฌธ์ํด์ฃผ์ธ์:
- ์ด๋ฉ์ผ: ๋ฐ์ํ ํ์ฅ๋
- GitHub Issues: Issues Page
News Feed๋ ํ๋์ ์ธ ์์ ๋ฏธ๋์ด ํ๋ซํผ์ ํต์ฌ ๊ธฐ๋ฅ์ ๋ชจ๋ ๊ฐ์ถ ์์ฑ๋ ๋์ ๋ฐฑ์๋ ์๋น์ค์ ๋๋ค. ํ์ฅ์ฑ๊ณผ ์ ์ง๋ณด์์ฑ์ ๊ณ ๋ คํ ์ค๊ณ๋ก, ์ค์ ํ๋ก๋์ ํ๊ฒฝ์์๋ ์์ ์ ์ผ๋ก ์ด์ํ ์ ์์ต๋๋ค. ๐