Skip to content

๐Ÿ“ณNews Feed - ํ˜„๋Œ€์ ์ด๊ณ  ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ์†Œ์…œ ๋ฏธ๋””์–ด ํ”Œ๋žซํผ

License

Notifications You must be signed in to change notification settings

n-factorial/news-feed

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

๐ŸŒŸ News Feed - ํ˜„๋Œ€์ ์ด๊ณ  ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ์†Œ์…œ ๋ฏธ๋””์–ด ํ”Œ๋žซํผ

Spring Boot 3.5 ๊ธฐ๋ฐ˜์œผ๋กœ ๊ตฌ์ถ•๋œ, ์‚ฌ์šฉ์ž ์ค‘์‹ฌ์˜ ๋‰ด์Šคํ”ผ๋“œ ๋ฐฑ์—”๋“œ ์„œ๋น„์Šค
์ด ํ”„๋กœ์ ํŠธ๋Š” ์‹ค์‹œ๊ฐ„ ์†Œ์…œ ์ธํ„ฐ๋ž™์…˜๊ณผ ๊ฒฌ๊ณ ํ•œ ๋ณด์•ˆ์„ ์ œ๊ณตํ•˜๋ฉฐ, ํด๋ฆฐ ์•„ํ‚คํ…์ฒ˜๋ฅผ ํ†ตํ•ด ๋†’์€ ํ™•์žฅ์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ์ž๋ž‘ํ•ฉ๋‹ˆ๋‹ค.

Java Spring Boot Spring Data JPA JWT MySQL H2 Gradle JUnit 5 License


ERD - Entity Relationship Diagram ERD (Entity Relationship Diagram) โ€” ์ฃผ์š” ์—”ํ‹ฐํ‹ฐ์™€ ๊ด€๊ณ„๋„.

๐Ÿ“– ๋ชฉ์ฐจ


โœจ ์ฃผ์š” ํŠน์ง•

News Feed๋Š” ํ˜„๋Œ€์ ์ธ ์†Œ์…œ ๋ฏธ๋””์–ด ํ”Œ๋žซํผ์˜ ํ•ต์‹ฌ ๊ธฐ๋Šฅ์„ ๋ชจ๋‘ ๊ฐ–์ถ˜ ์™„์„ฑ๋„ ๋†’์€ ๋ฐฑ์—”๋“œ ์„œ๋น„์Šค์ž…๋‹ˆ๋‹ค. ํ™•์žฅ์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ๊ณ ๋ คํ•œ ์„ค๊ณ„๋กœ, ์‹ค์ œ ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ๋„ ์•ˆ์ •์ ์œผ๋กœ ์šด์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐ŸŽฏ ์™„๋ฒฝํ•œ ์†Œ์…œ ๋ฏธ๋””์–ด ๊ฒฝํ—˜

  • ์‹ค์‹œ๊ฐ„ ๋‰ด์Šคํ”ผ๋“œ: ํŒ”๋กœ์šฐํ•œ ์‚ฌ์šฉ์ž๋“ค์˜ ์ตœ์‹  ํฌ์ŠคํŠธ๋ฅผ ์‹œ๊ฐ„์ˆœ์œผ๋กœ ์ •๋ ฌํ•˜์—ฌ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • ๊ฐœ์ธํ™”๋œ ํ”„๋กœํ•„: MBTI, ์ž๊ธฐ์†Œ๊ฐœ ๋“ฑ ์‚ฌ์šฉ์ž์˜ ๊ฐœ์„ฑ์„ ์ž์œ ๋กญ๊ฒŒ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ์œ ์—ฐํ•œ ํ”„๋กœํ•„ ์‹œ์Šคํ…œ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
  • ์†Œ์…œ ์ธํ„ฐ๋ž™์…˜: ์ข‹์•„์š”, ํŒ”๋กœ์šฐ, ๋Œ“๊ธ€ ๊ธฐ๋Šฅ์„ ํ†ตํ•ด ์‚ฌ์šฉ์ž ๊ฐ„์˜ ํ™œ๋ฐœํ•œ ์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜์„ ์ด‰์ง„ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ”’ ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ๊ธ‰ ๋ณด์•ˆ

  • JWT ๊ธฐ๋ฐ˜ ์ธ์ฆ: ํ™•์žฅ ๊ฐ€๋Šฅํ•˜๊ณ  Statelessํ•œ JSON Web Token (JWT) ๊ธฐ๋ฐ˜์˜ ์ธ์ฆ ์‹œ์Šคํ…œ์„ ๊ตฌํ˜„ํ•˜์—ฌ ์•ˆ์ „ํ•œ API ํ†ต์‹ ์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.
  • ํ† ํฐ ๋ธ”๋ž™๋ฆฌ์ŠคํŠธ: ๋กœ๊ทธ์•„์›ƒ๋œ ํ† ํฐ์„ ์ฆ‰์‹œ ๋ฌดํšจํ™”ํ•˜๋Š” ๋ธ”๋ž™๋ฆฌ์ŠคํŠธ ๊ธฐ๋Šฅ์„ ํ†ตํ•ด ๋ณด์•ˆ์„ ๊ฐ•ํ™”ํ•ฉ๋‹ˆ๋‹ค.
  • ๋น„๋ฐ€๋ฒˆํ˜ธ ์•”ํ˜ธํ™”: ๊ฐ•๋ ฅํ•œ BCrypt ํ•ด์‹ฑ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ—๏ธ ํด๋ฆฐ ์•„ํ‚คํ…์ฒ˜

  • ๋„๋ฉ”์ธ ์ฃผ๋„ ์„ค๊ณ„(DDD): ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๋„๋ฉ”์ธ ์ค‘์‹ฌ์œผ๋กœ ๋ช…ํ™•ํ•˜๊ฒŒ ๋ถ„๋ฆฌํ•˜์—ฌ ๋ณต์žก์„ฑ์„ ๊ด€๋ฆฌํ•˜๊ณ , ๊ฐœ๋ฐœ ํšจ์œจ์„ฑ์„ ๋†’์ž…๋‹ˆ๋‹ค.
  • ๊ณ„์ธตํ˜• ์•„ํ‚คํ…์ฒ˜: Controller โ†’ Service โ†’ Repository ๊ตฌ์กฐ์˜ ๋ช…ํ™•ํ•œ ๊ณ„์ธต ๋ถ„๋ฆฌ๋ฅผ ํ†ตํ•ด ์ฝ”๋“œ์˜ ์‘์ง‘๋„๋ฅผ ๋†’์ด๊ณ  ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถฅ๋‹ˆ๋‹ค.
  • SOLID ์›์น™: ๊ฐ์ฒด ์ง€ํ–ฅ ์„ค๊ณ„์˜ SOLID ์›์น™์„ ์ค€์ˆ˜ํ•˜์—ฌ ์œ ์ง€๋ณด์ˆ˜์„ฑ, ํ™•์žฅ์„ฑ, ์œ ์—ฐ์„ฑ์„ ๊ทน๋Œ€ํ™”ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ“‹ ๊ธฐ๋Šฅ ๋ชฉ๋ก

ํ˜„์žฌ ๊ตฌํ˜„๋œ ์ฃผ์š” ๊ธฐ๋Šฅ๋“ค์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

๐Ÿ‘ค ์‚ฌ์šฉ์ž ๊ด€๋ฆฌ

  • ํšŒ์›๊ฐ€์ž… / ๋กœ๊ทธ์ธ / ๋กœ๊ทธ์•„์›ƒ
  • ๋น„๋ฐ€๋ฒˆํ˜ธ ๋ณ€๊ฒฝ
  • ํšŒ์› ํƒˆํ‡ด (Soft Delete)
  • ํ”„๋กœํ•„ ์ƒ์„ฑ ๋ฐ ์ˆ˜์ •
  • ํ”„๋กœํ•„ ์กฐํšŒ (๋ณธ์ธ/ํƒ€์ธ)

๐Ÿ“ ํฌ์ŠคํŠธ ๊ด€๋ฆฌ

  • ํฌ์ŠคํŠธ ์ž‘์„ฑ / ์ˆ˜์ • / ์‚ญ์ œ
  • ํฌ์ŠคํŠธ ์กฐํšŒ (์กฐํšŒ์ˆ˜ ์ž๋™ ์ฆ๊ฐ€)
  • ์ข‹์•„์š” / ์ข‹์•„์š” ์ทจ์†Œ

๐Ÿ’ฌ ๋Œ“๊ธ€ ์‹œ์Šคํ…œ

  • ๋Œ“๊ธ€ ์ž‘์„ฑ / ์ˆ˜์ • / ์‚ญ์ œ
  • ํฌ์ŠคํŠธ๋ณ„ ๋Œ“๊ธ€ ๋ชฉ๋ก ์กฐํšŒ

๐Ÿ‘ฅ ์†Œ์…œ ๊ธฐ๋Šฅ

  • ํŒ”๋กœ์šฐ / ์–ธํŒ”๋กœ์šฐ
  • ํŒ”๋กœ์ž‰ ๋ชฉ๋ก ์กฐํšŒ
  • ํŒ”๋กœ์šฐ ์ƒํƒœ ํ™•์ธ

๐Ÿ“ฐ ๋‰ด์Šคํ”ผ๋“œ

  • ์ „์ฒด ํฌ์ŠคํŠธ ํ”ผ๋“œ (ํŽ˜์ด์ง€๋„ค์ด์…˜ ์ง€์›)
  • ํŒ”๋กœ์šฐํ•œ ์‚ฌ์šฉ์ž ํฌ์ŠคํŠธ ํ”ผ๋“œ
  • ํŠน์ • ์‚ฌ์šฉ์ž์˜ ํฌ์ŠคํŠธ ๋ชจ์Œ
  • ๊ธฐ๊ฐ„๋ณ„ ํ”ผ๋“œ ์กฐํšŒ (์‹œ์ž‘์ผ ๋ฐ ์ข…๋ฃŒ์ผ ํ•„ํ„ฐ๋ง)

๐Ÿ› ๏ธ ๊ธฐ์ˆ  ์Šคํƒ

ํ”„๋กœ์ ํŠธ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ตœ์‹  ๊ธฐ์ˆ  ์Šคํƒ์„ ํ™œ์šฉํ•˜์—ฌ ๊ฐœ๋ฐœ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

Backend Core

  • Java 17 - ์ตœ์‹  LTS(Long Term Support) ๋ฒ„์ „์œผ๋กœ, ์„ฑ๋Šฅ๊ณผ ์•ˆ์ •์„ฑ์„ ํ™•๋ณดํ•ฉ๋‹ˆ๋‹ค.
  • Spring Boot 3.5.4 - ๋น ๋ฅด๊ณ  ์‰ฝ๊ฒŒ ๋…๋ฆฝ ์‹คํ–‰ํ˜•, ํ”„๋กœ๋•์…˜ ๋“ฑ๊ธ‰์˜ Spring ๊ธฐ๋ฐ˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ํ˜„๋Œ€์ ์ธ ์›น ํ”„๋ ˆ์ž„์›Œํฌ์ž…๋‹ˆ๋‹ค.
  • Spring Data JPA - Java Persistence API๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ฐ์ดํ„ฐ ์•ก์„ธ์Šค ๊ณ„์ธต์„ ํšจ์œจ์ ์œผ๋กœ ๊ตฌํ˜„ํ•˜๊ณ , ๊ฐ์ฒด ๊ด€๊ณ„ ๋งคํ•‘(ORM)์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

Security & Authentication

  • JWT (Auth0) - ํ† ํฐ ๊ธฐ๋ฐ˜ ์ธ์ฆ์„ ์œ„ํ•œ ํ‘œ์ค€์œผ๋กœ, ํ™•์žฅ ๊ฐ€๋Šฅํ•˜๊ณ  ์•ˆ์ „ํ•œ ์ธ์ฆ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • BCrypt - ๊ฐ•๋ ฅํ•œ ๋‹จ๋ฐฉํ–ฅ ํ•ด์‹ฑ ํ•จ์ˆ˜๋กœ, ์‚ฌ์šฉ์ž ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ์•”ํ˜ธํ™”ํ•˜์—ฌ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

Database

  • MySQL - ์•ˆ์ •์ ์ด๊ณ  ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๋Š” ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ด€๋ฆฌ ์‹œ์Šคํ…œ์œผ๋กœ, ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์— ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค.
  • H2 - ๊ฒฝ๋Ÿ‰ ์ธ๋ฉ”๋ชจ๋ฆฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋กœ, ๊ฐœ๋ฐœ ๋ฐ ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ์—์„œ ๋น ๋ฅธ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

Build & Test

  • Gradle - ์œ ์—ฐํ•˜๊ณ  ๊ฐ•๋ ฅํ•œ ๋นŒ๋“œ ์ž๋™ํ™” ๋„๊ตฌ๋กœ, ์˜์กด์„ฑ ๊ด€๋ฆฌ ๋ฐ ํ”„๋กœ์ ํŠธ ๋นŒ๋“œ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  • JUnit 5 - Java๋ฅผ ์œ„ํ•œ ์ตœ์‹  ํ…Œ์ŠคํŠธ ํ”„๋ ˆ์ž„์›Œํฌ๋กœ, ๋‹จ์œ„ ํ…Œ์ŠคํŠธ ๋ฐ ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • TestRestTemplate - Spring Boot ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ E2E(End-to-End) ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•œ ์œ ํ‹ธ๋ฆฌํ‹ฐ๋กœ, ์‹ค์ œ HTTP ์š”์ฒญ์„ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ•ฉ๋‹ˆ๋‹ค.

Validation & Utilities

  • 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๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


๐Ÿ“ก API ์—”๋“œํฌ์ธํŠธ

News Feed ๋ฐฑ์—”๋“œ ์„œ๋น„์Šค์—์„œ ์ œ๊ณตํ•˜๋Š” ์ฃผ์š” API ์—”๋“œํฌ์ธํŠธ ๋ชฉ๋ก์ž…๋‹ˆ๋‹ค. ๋ชจ๋“  API๋Š” ์ผ๊ด€๋œ RESTful ์›์น™์„ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.

๐Ÿ” ์ธ์ฆ (Authentication)

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 ๋น„๋ฐ€๋ฒˆํ˜ธ ๋ณ€๊ฒฝ

๐Ÿ“ ํฌ์ŠคํŠธ (Posts)

HTTP Method Endpoint Description
POST /api/v1/posts ํฌ์ŠคํŠธ ์ž‘์„ฑ
GET /api/v1/posts/{postId} ํฌ์ŠคํŠธ ์กฐํšŒ
PATCH /api/v1/posts/{postId} ํฌ์ŠคํŠธ ์ˆ˜์ •
DELETE /api/v1/posts/{postId} ํฌ์ŠคํŠธ ์‚ญ์ œ

๐Ÿ‘ค ํ”„๋กœํ•„ (Profile)

HTTP Method Endpoint Description
GET /api/v1/profiles/{id} ํ”„๋กœํ•„ ์กฐํšŒ
PUT /api/v1/profiles/me ๋‚ด ํ”„๋กœํ•„ ์ˆ˜์ •

๐Ÿ’ฌ ๋Œ“๊ธ€ (Comments)

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 ๋‚ด ํŒ”๋กœ์ž‰ ๋ชฉ๋ก

๐Ÿ“ฐ ํ”ผ๋“œ (Feed)

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 ์‘๋‹ต ํ˜•์‹

๋ชจ๋“  API๋Š” ์ผ๊ด€๋œ JSON ์‘๋‹ต ํ˜•์‹์„ ์‚ฌ์šฉํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ์™€์˜ ํ†ต์‹ ์„ ํ‘œ์ค€ํ™”ํ•ฉ๋‹ˆ๋‹ค.

{
  "code": "SUCC-200",
  "message": "์š”์ฒญ ์„ฑ๊ณต",
  "data": {
    // ์‹ค์ œ ์‘๋‹ต ๋ฐ์ดํ„ฐ (์„ฑ๊ณต ์‹œ)
  }
}

์—๋Ÿฌ ์‘๋‹ต ์˜ˆ์‹œ

์˜ค๋ฅ˜ ๋ฐœ์ƒ ์‹œ์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ˜•์‹์œผ๋กœ ์‘๋‹ตํ•ฉ๋‹ˆ๋‹ค.

{
  "code": "AUTH-401",
  "message": "์ธ์ฆ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.",
  "data": null
}

๐Ÿ”ง ํ™˜๊ฒฝ ์„ค์ •

ํ”„๋กœ์ ํŠธ๋Š” ๊ฐœ๋ฐœ ๋ฐ ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ์— ๋”ฐ๋ผ ์œ ์—ฐํ•˜๊ฒŒ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐœ๋ฐœ ํ™˜๊ฒฝ

  • ํ”„๋กœํ•„: dev (Spring Profile)
  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค: ๊ฐœ๋ฐœ์šฉ MySQL ๋˜๋Š” H2 ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ

  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค: H2 ์ธ๋ฉ”๋ชจ๋ฆฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • DDL ์„ค์ •: create-drop DDL(Data Definition Language) ์„ค์ •์„ ํ†ตํ•ด ๊ฐ ํ…Œ์ŠคํŠธ ์‹คํ–‰ ํ›„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์Šคํ‚ค๋งˆ๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜์—ฌ ํ…Œ์ŠคํŠธ ๊ฒฉ๋ฆฌ์„ฑ์„ ํ™•๋ณดํ•ฉ๋‹ˆ๋‹ค.

๐ŸŒŸ ํ•ต์‹ฌ ์„ค๊ณ„ ์›์น™

News Feed ํ”„๋กœ์ ํŠธ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ•ต์‹ฌ ์„ค๊ณ„ ์›์น™์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ตฌ์ถ•๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

1. ๋„๋ฉ”์ธ ์ฃผ๋„ ์„ค๊ณ„ (Domain-Driven Design)

๊ฐ ๋„๋ฉ”์ธ์€ ๋…๋ฆฝ์ ์œผ๋กœ ๊ด€๋ฆฌ๋˜๋ฉฐ, ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์ด ๋ช…ํ™•ํ•˜๊ฒŒ ๋ถ„๋ฆฌ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋ณต์žกํ•œ ๋น„์ฆˆ๋‹ˆ์Šค ์š”๊ตฌ์‚ฌํ•ญ์„ ํšจ๊ณผ์ ์œผ๋กœ ๋ชจ๋ธ๋งํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ๋ฐ ๋„์›€์„ ์ค๋‹ˆ๋‹ค.

2. ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ์•„ํ‚คํ…์ฒ˜ (Scalable Architecture)

์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ ์ถ”๊ฐ€๋‚˜ ์š”๊ตฌ์‚ฌํ•ญ ๋ณ€๊ฒฝ์— ์œ ์—ฐํ•˜๊ฒŒ ๋Œ€์‘ํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“ˆํ™”๋œ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์žฅ๊ธฐ์ ์ธ ํ”„๋กœ์ ํŠธ ์œ ์ง€๋ณด์ˆ˜์™€ ์„ฑ์žฅ์— ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค.

3. ๋ณด์•ˆ ์šฐ์„  (Security First)

JWT ํ† ํฐ ๊ด€๋ฆฌ, ๋น„๋ฐ€๋ฒˆํ˜ธ ์•”ํ˜ธํ™”, ํ† ํฐ ๋ธ”๋ž™๋ฆฌ์ŠคํŠธ ๋“ฑ ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ๊ธ‰ ๋ณด์•ˆ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜์—ฌ ์‚ฌ์šฉ์ž ๋ฐ์ดํ„ฐ๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ๋ณดํ˜ธํ•ฉ๋‹ˆ๋‹ค.


๐Ÿค ๊ธฐ์—ฌ

์ด ํ”„๋กœ์ ํŠธ์— ๊ธฐ์—ฌํ•˜๊ณ  ์‹ถ์œผ์‹œ๋‹ค๋ฉด, ๋‹ค์Œ ๊ฐ€์ด๋“œ๋ผ์ธ์„ ๋”ฐ๋ผ์ฃผ์„ธ์š”:

  1. ์ €์žฅ์†Œ๋ฅผ ํฌํฌ(Fork)ํ•ฉ๋‹ˆ๋‹ค.
  2. ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ ๋˜๋Š” ๋ฒ„๊ทธ ์ˆ˜์ •์„ ์œ„ํ•œ ๋ธŒ๋žœ์น˜๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค (git checkout -b feature/your-feature-name).
  3. ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ปค๋ฐ‹ํ•˜๊ณ  ํ‘ธ์‹œํ•ฉ๋‹ˆ๋‹ค.
  4. Pull Request๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ“„ ๋ผ์ด์„ ์Šค

์ด ํ”„๋กœ์ ํŠธ๋Š” MIT ๋ผ์ด์„ ์Šค์— ๋”ฐ๋ผ ๋ฐฐํฌ๋ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ LICENSE ํŒŒ์ผ์„ ์ฐธ์กฐํ•˜์„ธ์š”.


๐Ÿ“ž ๋ฌธ์˜

ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•œ ์งˆ๋ฌธ์ด๋‚˜ ์ œ์•ˆ์ด ์žˆ์œผ์‹œ๋ฉด, ๋‹ค์Œ ์—ฐ๋ฝ์ฒ˜๋กœ ๋ฌธ์˜ํ•ด์ฃผ์„ธ์š”:


News Feed๋Š” ํ˜„๋Œ€์ ์ธ ์†Œ์…œ ๋ฏธ๋””์–ด ํ”Œ๋žซํผ์˜ ํ•ต์‹ฌ ๊ธฐ๋Šฅ์„ ๋ชจ๋‘ ๊ฐ–์ถ˜ ์™„์„ฑ๋„ ๋†’์€ ๋ฐฑ์—”๋“œ ์„œ๋น„์Šค์ž…๋‹ˆ๋‹ค. ํ™•์žฅ์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ๊ณ ๋ คํ•œ ์„ค๊ณ„๋กœ, ์‹ค์ œ ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ๋„ ์•ˆ์ •์ ์œผ๋กœ ์šด์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๐Ÿš€

About

๐Ÿ“ณNews Feed - ํ˜„๋Œ€์ ์ด๊ณ  ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ์†Œ์…œ ๋ฏธ๋””์–ด ํ”Œ๋žซํผ

Topics

Resources

License

Stars

Watchers

Forks

Contributors 5

Languages