๋ํ๊ต ํํ์ด์ง์ ๊ณต์ง์ฌํญ์ด ์ฌ๋ผ์ค๋ฉด ์๋์ผ๋ก ํธ์ ์๋ฆผ์ ์ ์กํ๋ ์๋น์ค์ ๋๋ค.
ํ์ฌ ์ฝ 700๋ช ์ด์์ ์ฌ์ฉ์๋ฅผ ํ๋ณดํ์ผ๋ฉฐ, ์ง์์ ์ผ๋ก ๊ฐ์ ํ๋ฉฐ ์ด์ ์ค์ ๋๋ค.
- ์ํคํ ์ฒ
- ๊ธฐ์ ์คํ
- ๋ฆด๋ฆฌ์ฆ ๋ ธํธ
- ๊ฐ๋ฐ ๊ฒฝํ
- ๊ฐ์ ๊ฒฝํ
- ํธ๋ฌ๋ธ ์ํ
- ๋ธ๋ก๊ทธ ํฌ์คํ
- Languages & Frameworks: Kotlin 1.9.25, Spring Boot 3.3.4
- Database: MySQL 8.0.35, MongoDB 7.0.15
- Infrastructure: AWS (EC2, RDS, SQS, Lambda), Docker
- CI/CD & Monitoring: Jenkins, GitHub Actions, Prometheus, Grafana
- Testing & Quality: JUnit5, JaCoCo, Codecov
- Release 1.0.0 (2024.01 ~ 2024.04) - ๊ฐ๋ฐ ๋ฐ ์ถ์
- Release 1.0.1 (2024.05) - ๋ฒ๊ทธ ์์
- Release 1.1.0 (2024.07) - ์๋น์ค ๊ฐ์
- Release 1.1.1 (2024.09) - ๋ฒ๊ทธ ์์
- Release 1.2.0 (2024.10 ~ 2024.11) - ์ํคํ ์ฒ ๊ฐ์
- Release 1.2.1 (2025.02 ~ 2025.03) - ํ๊ณผ๋ช ๋ณ๊ฒฝ ๋ฐ ์ ์ค ํ๊ณผ ๋์
- Release 1.2.2 (2025.03) - ํ๊ต ํํ์ด์ง ๋ฆฌ๋ด์ผ ๋์
Release 1.0.0 ~ 1.1.1 ์์ค ์ฝ๋๋ GitHub ํ๋ก์ ํธ์์ ํ์ธ ๊ฐ๋ฅํฉ๋๋ค.
- ๋ํ๊ต ํํ์ด์ง ์คํฌ๋ํ ๋ก์ง ๊ฐ๋ฐ (๊ณต์ง์ฌํญ, ํ์ฌ์ผ์ , ์๋จํ)
- ๊ณต์ง์ฌํญ, ํ์ฌ์ผ์ , ์๋จํ ์กฐํ API ๊ฐ๋ฐ
- CI/CD ํ์ดํ๋ผ์ธ ๊ตฌ์ถ
- Java์์ Kotlin์ผ๋ก ๋ง์ด๊ทธ๋ ์ด์ ๋ฐ ๋ฆฌํฉํ ๋ง
- API ๋ฆฌํฉํ ๋ง (Restful API ์ ์ฉ)
- ์๋ฆผ ์ค์ API ์ฑ๋ฅ 99% ๊ฐ์
- ๋จ์ผ ๋ชจ๋์์ ๋ฉํฐ ๋ชจ๋์ ์ ์ฉํ์ฌ ์ํคํ ์ฒ๋ฅผ ๋ณ๊ฒฝ
- API ์๋ฒ์ Admin ์๋ฒ ๋ถ๋ฆฌ
- ์ธ์ปจ๋๋ฆฌ ์ธ๋ฑ์ค๋ฅผ ์ถ๊ฐํ์ฌ, ์ฟผ๋ฆฌ ์ฑ๋ฅ ์ต์ ํ
- ์๋จํ๋ฅผ ๋ถ๋ฌ์ค์ง ๋ชปํ๋ ๋ฌธ์
- ํธ์ ์๋ฆผ 24๊ฑด ์ค์ ์ก
- FCM ํ ํฐ ์ ์ค
- ํธ์ ์๋ฆผ์ด ์ ์ก๋์ง ์๋ ๋ฌธ์
- ๋น์ผ์ด ์๋ ๋ค์๋ ํธ์ ์๋ฆผ์ด ์ ์ก๋๋ ๋ฌธ์
- ์๋ฒ ์์ผ๋ก์ ๊ฐ์ ๋ฐฉํฅ
- Kotlin + Spring / Multi-Module ์ ์ฉ
- Jnuit5, Mocktito ํ ์คํธ ์ฝ๋ ์์ฑ
- ํ ์คํธ ์ปค๋ฒ๋ฆฌ์ง ๊ด๋ฆฌ ๋ฐ ํ ์คํธ ์๋ํ
- Jenkins CI / CD ๊ตฌ์ถ
- Prometheus + Grafana ๋ชจ๋ํฐ๋ง ์์คํ ๊ตฌ์ถ
- FCM ๋ฉ์์ง ์ ์ก์ SQS ํ์ฉ
- Release 1.2.0 ๋ฐฐํฌ ์๋ฃ
- MySQL ์ธ์ปจ๋๋ฆฌ ์ธ๋ฑ์ค๋ฅผ ํ์ฉํ ์ฑ๋ฅ ๊ฐ์
๊ธฐ์ ์คํ: Java 17, Spring Boot, Spring JPA, MySQL, Redis, FCM, AWS(EC2, RDS)
- Jsoup ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํ์ฉํ์ฌ ์ ์ ์คํฌ๋ํ ๋ก์ง์ ๊ฐ๋ฐ
- ์ ์ ์คํฌ๋ํ์ ์ ํํ ์ด์
- ๋น์ฉ ํจ์จ์ฑ: ๋์ ์คํฌ๋ํ์ ๋ธ๋ผ์ฐ์ ๋ ๋๋ง์ ํ์๋ก ํ์ฌ ๋ฆฌ์์ค์ ์คํ ์๋์ ๋ถ๋ด์ด ํผ ๋ฐ๋ฉด, ์ ์ ์คํฌ๋ํ์ HTML ์์ค๋ฅผ ์ง์ ํ์ฑํ์ฌ ๋น ๋ฅด๊ณ ์๋ฒ ๋ถ๋ด์ด ์ ์
- ๋ฐ์ดํฐ ํน์ฑ: ์๋ฒ์์ ์ ๊ณตํ๋ ์ ์ HTML๋ก ์ถฉ๋ถํ ์ฒ๋ฆฌ ๊ฐ๋ฅํ์ฌ ๋์ ์คํฌ๋ํ์ ํ์์ฑ ์์
์์ธ: Redis์ ์ฌ์ฉ์์ ํธ์ ์๋ฆผ ํ ํฐ์ ์ ์ฅํ์ผ๋ TTL ์ค์ ์ด ๋์ด ์์๊ณ , ํ ํฐ ๊ฐฑ์ API๊ฐ ์์๋ ์ํฉ์ผ๋ก ํ ํฐ์ด ๋ง๋ฃ๋จ
ํด๊ฒฐ ๋ฐฉ๋ฒ:
- Redis TTL์ 1๊ฐ์๋ก ์ค์ ํ ๊ฒ์ ํ์ธํ๊ณ , ํ ํฐ์ TTL์ ํด์ ํ์ฌ ๋ฌธ์ ํด๊ฒฐ
- ์ถ์ ์งํ๋ผ ๋ฌธ์ ๋ ๊ฐ๋ฐ์ ํ ํฐ์์๋ง ๋ฐ์ํ์ผ๋ฉฐ, ์ฌ์ฉ์ ํ ํฐ์๋ ์ํฅ์ ๋ฏธ์น์ง ์์
๊ฐ์ ์ฌํญ: FCM ํธ์ ์๋ฆผ ๊ด๋ จ ๋๋ฃ ๊ฐ ์ปค๋ฎค๋์ผ์ด์ ๋ถ์กฑ์ผ๋ก ๋ฐ์ํ ๋ฌธ์ ์์ ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ํ์ ๋ด์ฉ์ ๋ฌธ์ํํ์ฌ ํฅํ ์ปค๋ฎค๋์ผ์ด์ ๋ฌธ์ ๋ฅผ ๋ฐฉ์งํจ
๊ธฐ์ ์คํ: 1.0.0 ๋ฒ์ ๊ณผ ๋์ผ
๊ธฐ์กด์ [POST] /department/v1/dmu/updateDepartment์์ [PUT] /api/v1/subscribe/department์ ๊ฐ์ RESTfulํ ๋ฐฉ์์ผ๋ก ๋ฆฌํฉํ ๋งํ์ฌ ๋ฉฑ๋ฑ์ฑ๊ณผ ํต์ผ์ฑ์ ๋ณด์ฅ
๋ฌธ์ ์ํฉ
- ๊ธฐ์กด FCM Topic API๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ Topic์ ํ ํฐ์ ์ ์ฅํ์ง๋ง, 1์ด์ ์๋ต ์๊ฐ์ด ๊ฑธ๋ฆฌ๋ ๋ฌธ์ ๋ฅผ ํ์ธ
- ์๋ฆผ ์ค์ ์ ์ํ 20๊ฐ์ ํค์๋์ ๋ํด ์ต๋ 20์ด๊ฐ ์์๋์์
ํด๊ฒฐ ๋ฐฉ๋ฒ
- FCM Topic API๋ฅผ ์ฌ์ฉํ์ง ์๊ณ , MySQL์์ ์๋ฆผ ๊ด๋ จ ์ ๋ณด(Token, ํ๊ณผ, ํค์๋ ๋ฑ)๋ฅผ ๊ด๋ฆฌํ๋๋ก ๋ณ๊ฒฝ
- FCM Topic API๋ฅผ ๋น๋๊ธฐ๋ก ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ๋ ๊ณ ๋ คํ์ง๋ง, ๋ค์๊ณผ ๊ฐ์ ์ํฉ์ ๊ณ ๋ คํจ
- ์ฌ์ฉ์๊ฐ ๋ฐ๋ณต์ ์ผ๋ก ์๋ฆผ์ ๊ป๋ค ์ผฐ๋ค ํ ๊ฒฝ์ฐ, ๋ฐ๋ณตํ๋ฉด ๋จ๊ธฐ๊ฐ์ ๋๋ฌด ๋ง์ API๋ฅผ ํธ์ถ์ด ๋ฐ์ํ ์ ์๋ ๋ฌธ์ ๊ฐ ์์
๊ฒฐ๋ก
- ์๋ฆผ ์ค์ API ์๋ต ์๊ฐ์ 127ms๋ก ๊ฐ์
- ํธ์ ์๋ฆผ ์ค์ ์ ๋ณด๋ฅผ ์๋ฒ์์ ๊ด๋ฆฌํจ์ผ๋ก์จ ํ์ฅ์ฑ(ํน์ ์ฌ์ฉ์ ๋๋ ์ ์ฒด ์ฌ์ฉ์ ํธ์ ์๋ฆผ ์ ์ก)์ ๊ณ ๋ คํ, ์ ์ฐํ ํ๊ฒฝ์ผ๋ก ์ ํ๋จ
์์ธ: ๊ณต์ง์ฌํญ์ ์คํฌ๋ฉํ ํ๋ ๋ก์ง์ ์ค์ 10์์ ์คํ 5์ ์ด 2๋ฒ ์๋ํ๊ฒ ๋์ด์์๋๋ฐ, ํด๊ทผ ์๊ฐ ์ดํ์ ๊ณต์ง์ฌํญ์ ์ ๋ก๋ ํ๋ ์ข ์ข ์ผ์ด ๋ฐ์
ํด๊ฒฐ๋ฐฉ๋ฒ: ์คํฌ๋ํ ๋ก์ง์ 6์์ ๋์ํ๋๋ก ๋ณ๊ฒฝ
ํ์ง๋ง, ์ด๋ ๊ทผ๋ณธ์ ์ธ ํด๊ฒฐ์ฑ ์ด ์๋๋ผ๊ณ ํ๋จํ์๊ณ , ์ถํ Release 1.2.0์์ 10๋ถ ๋จ์๋ก ์ค์ 9์๋ถํฐ ์คํ 7์๊น์ง ์ฃผ๊ธฐ์ ์ผ๋ก ์คํฌ๋ํํ๋๋ก ๋ณ๊ฒฝํจ
๊ธฐ์ ์คํ: Kotlin, Spring Boot, Spring JPA, MySQL, MongoDB, Docker, Jenkins, FCM, AWS (EC2, RDS, SQS, Lambda), Prometheus, Grafana
- Null ์์ ์ฑ๊ณผ ์ฝ๋ ๊ฐ๋ ์ฑ์ ์ํด Java์์ Kotlin์ผ๋ก ๋ฆฌํฉํ ๋ง
- ๊ฐ์ธ์ ์ผ๋ก Kotlin์ ์ฃผ ์ธ์ด๋ก ์ฌ์ฉํ๊ธฐ ์ํ ํ์ต ๋ชฉ์ ๋ ์์์
- ํด๋ฆฐ ์ํคํ ์ฒ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก Presentation, Domain, Infrastructure ๋ชจ๋๋ก ๋ถ๋ฆฌํ์ฌ ํ์ฅ์ฑ๊ณผ ์ ์ง๋ณด์์ฑ์ ํฅ์
- ์คํฌ๋ํ ๋ก์ง๋ ๋ ๋ฆฝ์ ์ธ ๋ชจ๋๋ก ๋ถ๋ฆฌํ์ฌ ๊ฐ ๊ณ์ธต ๊ฐ ์์กด์ฑ์ ์ต์ํ
- Spring Batch ๋์ , ์ฃผ๊ธฐ์ ์ธ ์คํฌ๋ํ๊ณผ ํธ์ ์๋ฆผ ์ ์ก ๋ก์ง์ Admin ์๋ฒ๋ก ๋ถ๋ฆฌํ์ฌ ๊ด๋ฆฌ
- ํธ๋ํฝ ์ฆ๊ฐ ์ ์ค์ผ์ผ ์์์ ๊ณ ๋ คํ ๋ถ๋ฆฌ
- SQS์ Lambda๋ฅผ ์ฌ์ฉํ์ฌ ํธ์ ์๋ฆผ ๋ถํ๋ฅผ ๋ถ์ฐ์ํค๊ณ , FCM ์์กด์ฑ ์ ๊ฑฐ
- Jenkins๋ฅผ ์ด์ฉํ์ฌ CI/CD ํ์ดํ๋ผ์ธ์ ๊ตฌ์ถํ์ฌ ์๋ํ๋ ๋ฐฐํฌ ํ๋ก์ธ์ค ๊ตฌํ
- ์ธ์ปจ๋๋ฆฌ ์ธ๋ฑ์ค์ ์ฟผ๋ฆฌ ์ฑ๋ฅ ์ต์ ํ ์์ ์ ํตํด ์์คํ ์ ์๋ต ์๋ ๊ฐ์
- ๊ตฌ ๋ฒ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฌ์ฉํ๊ณ ์๋ ์ฌ์ฉ์๋ฅผ ๊ฐ์ ํ์์
- ์ ํ๋ฆฌ์ผ์ด์
๋ฒ์ ์ ์๊ด์์ด API๋ฅผ ์ ๊ณตํ๊ธฐ ์ํด ํ๊ณผ๋ช
์ ํธ๋ค๋ง ํ๋๋ก ์์ ํจ
- ์ถํ, ์ ๋ฒ์ ์ผ๋ก ์ ๋ถ ์ด์ ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์, ๊ตฌ ํ๊ณผ๋ช ์ ์๋ก์ด ํ๊ณผ๋ช ์ผ๋ก ๋ณ๊ฒฝํ๋ ์ ํธ ํด๋์ค๋ฅผ ์ถ๊ฐ
- ์ ์ค ํ๊ณผ ๊ณต์ง์ฌํญ์ ์คํฌ๋ํ ๋ก์ง์ ์ถ๊ฐ ์์ฑ
- CSS๋ง ๋ณ๊ฒฝ๋ ๊ฒ์ผ๋ก ์์๋์์ง๋ง, HTML ๊ตฌ์กฐ๋ ์ ๋ถ ๋ณ๊ฒฝ๋์ด์ ์คํฌ๋ํ ๋ก์ง์์ ์๋ฌ๊ฐ ๋ฐ์ํ๋ค๋ ์ฌ์ค์ ๋ชจ๋ํฐ๋ง์ ํตํด์ ํ์ธ
- ๋ณ๊ฒฝ๋ ํ๊ต ํํ์ด์ง HTML๊ตฌ์กฐ๋ฅผ ๋ถ์ํ๊ณ , ์คํฌ๋ํ ๋ก์ง์ ์ผ๊ด ์์