๐ ๋ณธ ํ๋ก์ ํธ๋ LG U+ ์ ๋ ์นด 1๊ธฐ ๋ฐฑ์๋ ๋น๋๋ฉด ์ต์ฐ์์ ์ข ํฉ ํ๋ก์ ํธ์ ๋๋ค.
๊ฐ๋ฐ๊ธฐ๊ฐ: 2024.10.15 ~ 2024.11.03 (3์ฃผ)
ํ๋ก์ ํธ ์ฃผ์ ๊ธฐ๋ฅ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ์๋ ์ฑํฅ ์ง๋จ ์์คํ : ์๋ ์ MBTI ์ฑํฅ์ ์ง๋จ ๋ฐ ์กฐํํ ์ ์์ต๋๋ค. ์ฌ์ฉ์์ ์ญ์ ์์ฒญ์ ๋ฐ๋ผ ์ง๋จ ๋ฐ์ดํฐ๊ฐ ๋ ผ๋ฆฌ์ ์ผ๋ก ์ญ์ ๋๋ฉฐ, ํ๋ฌ ํ ๋ฌผ๋ฆฌ์ ์ผ๋ก ์ญ์ ๋ฉ๋๋ค.
- ๋ง์ถคํ ์ฝํ ์ธ ์ถ์ฒ ์์คํ : ์๋ ์ ์ฑํฅ์ ๋ง๋ ๋์ ์ฝํ ์ธ ๋ฅผ ์ถ์ฒํฉ๋๋ค. ์ฌ์ฉ์์ ์ข์์/์ซ์ด์ ํผ๋๋ฐฑ์ ๋ฐ๋ผ ์ถ์ฒ ์ฑ ์ด ์ต์ผ ์๋ฒฝ์ ๋ณ๊ฒฝ๋ฉ๋๋ค.
- ์ ์ฐฉ์ ์ด๋ฒคํธ ์์คํ : ๋งค์ผ ์คํ 1์์ 10๋ง ์์ฒญ์ ์ฒ๋ฆฌํ ์ ์๋ ์ด๋ฒคํธ ์์คํ ์ ๋๋ค.
- ํ์๋ก
- API ๋ช ์ธ์
- ํ๋ก ํธ ๋ช ์ธ์
- ํ์ด ํ๋ก๊ทธ๋๋ฐํ๋ฉด์ ํ์ต/๊ณ ๋ฏผํ๋ ๋ด์ฉ
- Coding Convention
- Commit Convention
Backend
- Java 17, SpringBoot 3.3.4
- JWT, Spring Security, OAuth 2.0
- Spring Data JPA, JDBC
- Spring Batch
- MySQL 8.0, Redis
- ChatGPT API
- JUnit5, Mockito, JMeter
Frontend
- HTML, JavaScript
Collaborations
- Jira
- Slack
- Notion
๊น๋ฒ์ | ๋ฐ์์ | ์ด๋๋ฆผ | ์ด๋ฏผ์ | ์ด์นํฌ | ์ด์ ์ง |
---|---|---|---|---|---|
@KIMBUMSU123 |
@ssIIIn |
@LeeDoRim |
@99MinSu |
@leeseunghee00 |
@kuma0112 |
ํจ์จ์ ์ธ ํ์
๊ณผ ์ฝ๋ ํ์ง ํฅ์์ ์ํด ํ์ด ํ๋ก๊ทธ๋๋ฐ์ผ๋ก ์งํํ์ต๋๋ค.
๊ฐ๋ฐ ์๋ฃ ์ ์ฝ๋ ๋ฆฌ๋ทฐ๋ฅผ ํตํด ์ค๋ฅ๋ฅผ ์ต์ํํ๊ณ ์์ ์ ์ธ ๊ธฐ๋ฅ์ ๊ตฌํํฉ๋๋ค.
์ธ์ฆ/์ธ๊ฐ
: ๊น๋ฒ์, ๋ฐ์์์ฑํฅ ์ง๋จ
: ์ด๋๋ฆผ, ์ด๋ฏผ์ํผ๋๋ฐฑ
&์ถ์ฒ
: ์ด์นํฌ, ์ด์ ์ง์๋ชจ ์ด๋ฒคํธ
: ๋ฐ์์, ์ด๋๋ฆผ, ์ด๋ฏผ์AI
&๋ฐฐ์น ์ฑ๋ฅํ ์คํธ
: ๊น๋ฒ์, ์ด์นํฌ, ์ด์ ์ง
- ์ผ๋ฐ ๋ก๊ทธ์ธ: ์ด๋ฉ์ผ๊ณผ ๋น๋ฐ๋ฒํธ๋ก ๋ก๊ทธ์ธ ์์ฒญ โ ์กด์ฌํ๋ ํ์์ผ ๊ฒฝ์ฐ, ํค๋์ AccessToken, ์ฟ ํค์ RefreshToken ๋ด์์ ์ ๋ฌ
- ์นด์นด์ค ๋ก๊ทธ์ธ:
/oauth2/authorization/kakao
๋ก ์ธ์ฆ ์์ฒญ โ OAuth Success Handler ๊ฐ ์ฑ๊ณต ์์ฒญ์ ์ธ์งํ๋ฉด ์ฌ์ฉ์ ์ ๋ณด ํ๋ โ ํ ํฐ ๋ฐ๊ธ
- ํผ๋๋ฐฑ: ์ข์์/์ซ์ด์ ๋ฐ์ดํฐ๊ฐ ๋ค๋ ๋ฐ์ํ ๊ฒ์ ๊ณ ๋ คํ์ฌ Redis ์ ์ ์ฅ ํ, ์ต์ผ ์๋ฒฝ์ ๋ฐฐ์น ์ฒ๋ฆฌ๋ฅผ ํตํด MySQL ๋ก ์ด๊ด
- ํผ๋๋ฐฑ ๋ฐฐ์น: ์ด 4๊ฐ์ Step ์ผ๋ก ๊ตฌ์ฑํ์ฌ ์๋
์ฑํฅ์ ๋ฐ์
- Step1. Redis ์ ์์ ์ ์ฅ๋์ด ์๋ ์ข์์/์ซ์ด์๋ฅผ MySQL ์ ์ด๊ด
- Step2. ์ค๋์ ํผ๋๋ฐฑ์ ์ฝ์ด ์ฑํฅ์ ๋ฐ์๋ ์ ์ ๊ณ์ฐ ๋ฐ ๋์ ๋ ์ฑํฅ ๋ณํ๋ ์ ๋ฐ์ดํธ
- Step3. ๋์ ๋ณํ๋ โฅ 5 ์ผ ๊ฒฝ์ฐ, ์๋ ์ฑํฅ ๋ ์ฝ๋ ์์ฑ
- Step4. MBTI ๋ณํ๊ฐ ๊ฐ์ง๋ ๊ฒฝ์ฐ, ์๋ก์ด MBTI ๋ ์ฝ๋ ์์ฑ
- ๋๋์ ๋ฐ์ดํฐ๋ฅผ ํ์ด์ง ๋ฐฉ์์ผ๋ก ๋ถํ ์ฒ๋ฆฌํ์ฌ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ์ต์ํํ ์ ์๋ JdbcPagingItemReader ์ฌ์ฉ
- ๋ฌธ์ ์์ธ: PasswordEncoder ๊ฐ ๋น์ผ๋ก ๋ฑ๋ก๋์ด ์๋ SecurityConfig ๊ฐ ๋ค์ MemberService ๋ฅผ ์ฐธ์กฐํ๋ฉด์ ์ํ์ฐธ์กฐ๊ฐ ๋ฐ์ํจ์ ์ธ์ง
- ํด๊ฒฐ: PasswordEncoder ๋ฅผ ๋ ๋ฆฝ์ ์ธ Config ํด๋์ค๋ก ๋ถ๋ฆฌํ์ฌ ํด๊ฒฐ
- ์ ๋ฆฌํ ๋ฌธ์: ์ํ ์ฐธ์กฐ ๋ฌธ์ ํด๊ฒฐ ๊ณผ์
2. ์นด์นด์ค ๋ก๊ทธ์ธ ์ฑ๊ณต ํ, ๋ฉ์ธ ํ์ด์ง ๋ฆฌ๋ค์ด๋ ํธ ์ ํค๋์ ๋ด์ AccessToken ์ด ์ ์ก๋์ง ์๋ ๋ฌธ์
- ํด๊ฒฐ1: ์์ ๋ก๊ทธ์ธ ์ฑ๊ณต ํ RefreshToken ์ ์ฟ ํค์, AccessToken ์ ๋ฆฌ๋ค์ด๋ ํธ URL ์ ๋ด์์ ์ ๋ฌ.
- ํด๊ฒฐ2: url ์ ์ง์ ์ ์ผ๋ก AccessToken ๋ด๋ ๋ฐฉ์์ ํ ํฐ ํ์ทจ์ ๋งค์ฐ ์ทจ์ฝํ๋ฏ๋ก, OTT(One-Time Token) ์ ์ฌ์ฉํ์ฌ ๋ณด์์ ๊ฐํํจ.
- ์ ๋ฆฌํ ๋ฌธ์: ํ ํฐํ์ทจ ๋ฐ CSRF
- ๋ฌธ์ ์์ธ:
deleteAll()
์ ์คํํ์ง๋ง ์ค์ delete ์ฟผ๋ฆฌ๊ฐ ํ๋์ฉ ๋ ์๊ฐ. - ํด๊ฒฐ:
deleteAllBatch()
๋ฅผ ์ฌ์ฉํด ํ ๋ฒ์ delete ์ฟผ๋ฆฌ๋ก ๋ฐ์ดํฐ๋ฅผ ์ญ์ ํ ์ ์๋๋ก ๋ณ๊ฒฝ โ ๋ถํ๋ฅผ ์ค์.
- ๋ฌธ์ ์์ธ: ์ด๊ธฐ ๋ถ์ฐ๋ฝ์ ๊ณ ๋ คํ์ผ๋, ๋ฐ๋๋ฝ ์ํ๊ณผ ์ฑ๋ฅ ์ค๋ฒํค๋๊ฐ ์กด์ฌ
- ํด๊ฒฐ: Lua Script ๋ฅผ ํ์ฉํ์ฌ Atomic ์ฐ์ฐ ๋ณด์ฅ
- ๋ฌธ์ ์์ธ: ๋ฑ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ณ ์ ๋ ฌํ๋ ๋ฐ ZSET ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ ์ ์์์ผ๋, ๋ชจ๋ ์์์ score๊ฐ ์ถ๊ฐ๋จ์ ๋ฐ๋ผ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ด ์ฆ๊ฐํ๋ ๋ฌธ์ ๋ฐ์
- ํด๊ฒฐ:
Set + CreatedAt
์ผ๋ก ํ์ํ ์ ๋ณด๋ง ์ต์ํ์ผ๋ก ์ ์ฅ ํ, ์ด๋ฒคํธ ์ข ๋ฃ ์ ์๊ฐ ์์ผ๋ก ์ ๋ ฌํ๋ ๋ฐฉ์ ์ฑํ โ INCR ๋ฅผ ํตํ ์๊ฐ ๋ณต์ก๋ O(1) & ์ค๋ณต ์ฒดํฌ ๋ฉฑ๋ฑ์ฑ ๋ณด์ฅ
- ํ๋ก์ ํธ์ ์ ํฉํ OpenAI ๋ชจ๋ธ ์์๋ณด๊ธฐ
- ํผ๋๋ฐฑ ๊ตฌํ์ ์ํ Redis ๊ตฌ์กฐ ๊ณ ๋ฏผ
- ๋์ ๊ฒ์ ์ฑ๋ฅ ํฅ์์ ์ํ Full-text Search ์ ์ฉ
- Put vs. Patch
- ์ ๊ตฌํ์ฒด๊ฐ 1๊ฐ์ธ๋ฐ service impl ํด์ผ ํ๋์?
- PK 2๊ฐ vs. PK 1๊ฐ(feat.FK 2๊ฐ)
๋ชจ๋ ํ ์คํธ๋ ๋ฐ์ดํฐ 10๋ง์ ๊ธฐ์ค์ผ๋ก ์งํํฉ๋๋ค.
- ๊ฐ์ ๋ฐฐ์น: ์ด๊ธฐ step ์ 2๊ฐ๋ก ๊ตฌ์ฑํ์๋ค๊ฐ 4๊ฐ๋ก ๋ถ๋ฆฌํ์ฌ ์์ฐจ์ ์ผ๋ก ํ ์ด๋ธ์ ์ ๋ฐ์ดํธํ๋๋ก ๋ณ๊ฒฝ
- Step๋ณ ํ ์คํธ ๊ฒฐ๊ณผ: 1m 1s โ 6m 6s โ 22s โ 46s = 8m 5s
- Job ํ ์คํธ ๊ฒฐ๊ณผ: 7m 22s
- ๊ฐ์ ํ์: ๋ณ๋ชฉ ์ง์ ์ธ step2 ์์ ์๋
์ ์ฑ
์ฑํฅ์ ์กฐํํ๋ ์ฟผ๋ฆฌ๊ฐ ํ๋์ฉ ๋ ์๊ฐ๋ ๋ฌธ์ ํด๊ฒฐ
- ๊ธฐ์กด ๋ฐฐ์น: JPA Identity ์ ๋ต์ผ๋ก ์ธํ Bulk Insert ๋ถ๊ฐ๋ฅ
- ๊ฐ์ ํ ๋ฐฐ์น: ๋๋์ ๋ฐ์ดํฐ๋ฅผ ํ๊บผ๋ฒ์ ์ฝ์ ํ INSERT ์์ ์ ์ฒ๋ฆฌํ ์ ์๋๋ก ์์ ํ ์ด๋ธ ์์ฑ & NamedParameterTemplate ์ผ๋ก Batch Insert ์ฒ๋ฆฌ
- ๊ฐ์ ํ์: reader ์ processor ์ฟผ๋ฆฌ ์ต์ ํ