๐ Today I Learned - ์ค๋ ๋ด๊ฐ ๊ณต๋ถํ ๊ฒ์ ์ ๋ฆฌํฉ๋๋ค.
์๋ จ Spring 2-3์ฃผ์ฐจ
์ธ์ฆ๊ณผ ์ธ๊ฐ
- ์ธ์ฆ(Authentication) ๐
- ์ฌ์ฉ์๊ฐ ๋๊ตฌ์ธ์ง ํ์ธํ๋ ๊ณผ์
ex) ๋ก๊ทธ์ธ
- ์ธ๊ฐ(Authorization) ๐
- ์ฌ์ฉ์๊ฐ ์ด๋ค ๊ถํ์ ๊ฐ์ง๊ณ ์๋์ง ๊ฒฐ์ ํ๋ ๊ณผ์
- ๋ฐ๋์ ์ธ์ฆ์ด ์ ํ๋์ด์ผ ํ๋ค.
ex) ํ์๋ง ์กฐํ ๊ฐ๋ฅํ ๊ฒ์๊ธ, ๋ณธ์ธ์ด ์์ฑํ ๊ฒ์๊ธ ์์
๐ช ์ฟ ํค(Cookie)
- ์ ์
- ์น ๋ธ๋ผ์ฐ์ (Client ์ธก)์ ์ ์ฅ๋๋ ๋ฐ์ดํฐ
- ์ฉ๋
- ์ฌ์ฉ์์ ๋ฐฉ๋ฌธ ๊ธฐ๋ก, ๋ก๊ทธ์ธ ์ํ ์ ์ง, ๊ฐ์ธ ๋ง์ถค ์ค์ ๋ฑ์ ์ ์ฅ, HTTP ํน์ฑ ๊ทน๋ณต, ๊ด๊ณ ์ ๋ณด
- ํน์ง
- ํด๋ผ์ด์ธํธ ์ธก์ ์ ์ฅ๋๋ฉฐ, ์๋ฒ์ ์์ฒญ์ ๋ณด๋ผ ๋๋ง๋ค ํฌํจ๋์ด ์ ์ก๋จ.
- ๋ณด์์ ์ทจ์ฝํ๋ค. (๋ฏผ๊ฐํ ์ ๋ณด๋ฅผ ์ ์ฅํ์ง ์์์ผ ํ๋ค. ์ฌ์ฉ์ ์์ ์์ ์ด ๊ฐ๋ฅํ๋ค.)
- ์๋ช
- ๋ง๋ฃ ๋ ์ง๋ฅผ ์ค์ ํ ์ ์์, ์ธ์
์ฟ ํค(๋ธ๋ผ์ฐ์ ์ข
๋ฃ ์ ์ญ์ )์ ์์ ์ฟ ํค(์ง์ ๋ ๊ธฐ๊ฐ ๋์ ์ ์ง)๋ก ๊ตฌ๋ถ๋จ.
๐ผ ์ธ์
(Session)
- ์ ์
- ์ฌ์ฉ์์ ์๋ฒ ๊ฐ์ ์ํ๋ฅผ ์ ์งํ๊ธฐ ์ํ ๋ฐฉ๋ฒ.
- ์ฉ๋
- ๋ก๊ทธ์ธ ์ ๋ณด, ์ฌ์ฉ์ ํ๋ ๋ฑ์ ์๋ฒ ์ธก์์ ๊ด๋ฆฌ.
- ํน์ง
- ์๋ฒ ์ธก์์ ์ ์ฅ๋๋ฉฐ, ์ธ์
ID๊ฐ ์ฟ ํค์ ์ ์ฅ๋์ด ํด๋ผ์ด์ธํธ์ ์ฐ๊ฒฐ๋จ.
- ์ธ์
ID๋ฅผ ํ์ทจํ์ฌ๋ ๋ฏผ๊ฐํ ์ ๋ณด๊ฐ ์๋ค.
- ์๋ช
- ๋ธ๋ผ์ฐ์ ๋ฅผ ๋ซ๊ฑฐ๋ ์ผ์ ์๊ฐ์ด ์ง๋๋ฉด ๋ง๋ฃ๋จ.
- Session ๊ด๋ฆฌ
- ์ธ์
์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ค.
- ์ธ์
์ด ๋ง์์ง๋ฉด ์๋ฒ์ ์ฅ์ ๊ฐ ๋ฐ์ํ ์ ์๋ค.(๋ฉ๋ชจ๋ฆฌ ๋ฆฌ์์ค ๋ถ์กฑ)
- ์ต์ํ์ ๋ฐ์ดํฐ๋ง ์ ์ฅํด์ผ ํ๋ค.
HttpSession์ LastAccessedTime์ ๊ธฐ์ค์ผ๋ก 30๋ถ์ ์๋ช
์ฃผ๊ธฐ๋ฅผ ๊ฐ์ง๊ณ ์๋ค.
- ์ธ์
์ ์๊ฐ์ ๋๋ฌด ์ค๋ ์ ์งํ์ฌ๋ ๋ฉ๋ชจ๋ฆฌ ๋ฆฌ์์ค๊ฐ ๋ถ์กฑํ ์ ์๋ค.
- ์ ๋นํ ์๊ฐ ์ค์ ์ด ๊ผญ ํ์ํ๋ค.(Default 30๋ถ)
๐ช Token
- ์ ์
- ์ธ์ฆ/์ธ๊ฐ ๊ณผ์ ์์ ์ฌ์ฉ๋๋ฉฐ ์ฌ์ฉ์ ๋๋ ์์คํ
์ ์ ์๊ณผ ๊ถํ์ ์ฆ๋ช
ํ๊ณ ์์ฒญ์ ์ ํจ์ฑ์ ๊ฒ์ฆํ๋ ๋ฐ ์ฌ์ฉ๋๋ ๋์งํธ ๋ฌธ์์ด
- ํน์ง
- Session๊ณผ๋ ๋ค๋ฅด๊ฒ Client๊ฐ ๋ฐ์ดํฐ(Token)๋ฅผ ์ ์ฅํ๊ณ ์๋ค.
- Stateless๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ์ฌ ํ์ฅ์ฑ์ด ๋ฐ์ด๋๋ค.
- Mobile๊ณผ ๊ฐ์ด Cookie๋ฅผ ์ฌ์ฉํ ์ ์๋ ๊ฒฝ์ฐ์๋ ์ฌ์ฉํ ์ ์๋ค.
- Payload๋ ์ํธํ๋์ง ์๋๋ค. (๋ฏผ๊ฐํ ์ ๋ณด๋ฅผ ์ ์ฅํ์ง ์์์ผ ํ๋ค.)
- ์๋ช
- ๋ง๋ฃ ์๊ฐ์ผ๋ก Token ํ์ทจ๋ฅผ ๋๋นํ๋ค.
๐ฎ JWT (JSON Web Token) 
- ์ธ์ฆ์ ํ์ํ ์ ๋ณด๋ค์ ์ํธํ์ํจ JSON ํํ์ Token
- Signature๋ฅผ ํตํด Token์ ์์ ํ๊ฒ ๊ด๋ฆฌํ๋ค.
- JWT์ ๋ชฉ์ ์ ์ ๋ณด ๋ณดํธ๊ฐ ์๋, ์์กฐ ๋ฐฉ์ง์ ์๋ค. (๋ฏผ๊ฐํ ์ ๋ณด๋ฅผ ์ ์ฅํ์ง ์์์ผ ํ๋ค.)
๐ช Filter
- ๊ณตํต ๊ด์ฌ ์ฌํญ์ ํ๋์ ์
๊ตฌ์์ ์ฒ๋ฆฌํ ์ ์๊ฒ ๋ง๋ค์ด์ค๋ค.
Spring Data JPA
๐ Spring Data JPA๋ Spring Framework์์ ์ ๊ณตํ๋ ๋ชจ๋๋ก JPA๋ฅผ ์ฝ๊ฒ ์ฌ์ฉํ ์ ์๋๋ก ์ง์ํ๋ค. ์ด๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ํธ์์ฉ์ ๊ฐํธํ๊ฒ ๊ตฌํํ ์ ์๊ณ ์ฝ๋๋ฅผ ๊ฐ์ํํ ์ ์๋ค.
- Spring Data JPA
- Spring Framework์์ JPA๋ฅผ ์ฝ๊ฒ ์ฌ์ฉํ ์ ์๋๋ก ์ ๊ณตํ๋ ๋ชจ๋
- Java์์ ORM ๊ธฐ์ ํ์ค์ผ๋ก ์ฌ์ฉํ๋ ์ธํฐํ์ด์ค ๋ชจ๋
- ์ธํฐํ์ด์ค์ด๊ธฐ ๋๋ฌธ์ Hibernate, OpenJPA ๋ฑ์ด JPA๋ฅผ ๊ตฌํํ๊ณ ์๋ค.

- JPA ์ถ์ํ Repository ์ ๊ณต
CrudRepository, JpaRepository ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํ๋ค.
- SQL์ด๋
EntityManager๋ฅผ ์ง์ ํธ์ถํ์ง ์์๋ ๊ธฐ๋ณธ์ ์ธ CRUD ๊ธฐ๋ฅ์ ์์ฝ๊ฒ ๊ตฌํํ ์ ์๋ค.
- JPA ๊ตฌํ์ฒด์ ํตํฉ
- ์ผ๋ฐ์ ์ผ๋ก Hibernate๋ฅผ ํตํด ์๋์ผ๋ก SQL์ด ์์ฑ๋๋ค.
- QueryMethods
- Method ์ด๋ฆ๋ง์ผ๋ก SQL์ ์๋์ผ๋ก ์์ฑํ๋ค.
@Query ๋ฅผ ์ฌ์ฉํ์ฌ JPQL ๋๋ Native Query๋ฅผ ์ ์ํ ์ ์๋ค.
- ๋ณต์กํ SQL์ ์ง์ ๊ตฌํํ ๋ ์ฌ์ฉ
- ํธ๋์ญ์
๊ด๋ฆฌ์ LazyLoading
- ํธ๋์ญ์
๊ธฐ๋ฅ์ Spring๊ณผ ํตํฉํ์ฌ ์ ๊ณตํ๋ค.
- ์ฐ๊ด๋ Entity๋ฅผ ํ์ํ ๋ ๋ก๋ฉํ๋ ์ง์ฐ๋ก๋ฉ ๊ธฐ๋ฅ์ ์ง์ํ๋ค.
ORM (Object-Relational Mapping)
๐ ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ฅผ ์ฌ์ฉํ์ฌ ํธํ๋์ง ์๋ ์ ํ์ ์์คํ
๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๋ณํํ๋ ํ๋ก๊ทธ๋๋ฐ ๊ธฐ์ . ์ฆ, ๊ฐ์ฒด์ ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฐ์ดํฐ๋ฅผ ๋งคํํ๋ ๊ฒ์ ์๋ฏธํ๋ค.
์ฃผ์ ๊ธฐ๋ฅ์ผ๋ก๋ ๊ฐ์ฒด์ ํ
์ด๋ธ ๊ฐ์ ๋งคํ, ๋ฐ์ดํฐ ์ฟผ๋ฆฌ ๋ฐ ์กฐ์, ํธ๋์ญ์
๊ด๋ฆฌ ๋ฑ์ด ์๋ค.
์ด ๊ธฐ๋ฅ๋ค์ ๊ฐ๋ฐ์๊ฐ ๋ณต์กํ SQL ์ฟผ๋ฆฌ ์์ด๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ํจ๊ณผ์ ์ผ๋ก ๋ค๋ฃฐ ์ ์๊ฒ ํด์ค๋ค.
- ๊ฐ๋ฐ์๊ฐ ๊ฐ์ฒด ์งํฅ์ ์ธ ๋ฐฉ์์ผ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์กฐ์ํ ์ ์๊ฒ ํด์ค๋ค.
- ๊ฐ๋ฐ ๊ณผ์ ์ ๋จ์ํ์ํค๊ณ , ๊ฐ๋ฐ ์๊ฐ์ ๋จ์ถ์ํจ๋ค.
- ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๊ตฌ์กฐ๊ฐ ๋ณ๊ฒฝ๋์ด๋ ๊ฐ์ฒด ๋ชจ๋ธ์ ์ฝ๊ฒ ์์ ํ ์ ์๊ธฐ ๋๋ฌธ์ ๋น ๋ฅด๊ฒ ๋ณํํ๋ ๊ฐ๋ฐ ํ๊ฒฝ์์ ํฐ ์ฅ์ ์ ์ ๊ณตํ๋ค.
๐ ์ฐธ๊ณ
๋ฐฑ์๋ ๊ฐ๋ฐ์๋ฅผ ์ํ ORM(Object-Relational Mapping) ์ดํดํ๊ธฐ
ํ์ต๋
ธํธ
Git for Pair Programming
JIRA
์ง๋ผ(JIRA)๋ ์ํ๋ผ์์์ด ๊ฐ๋ฐํ ์ฌ์ ์ด์ ์ถ์ ์ ํ์ด๋ค. ๋ฒ๊ทธ ์ถ์ , ์ด์ ์ถ์ , ํ๋ก์ ํธ ๊ด๋ฆฌ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ์ํํธ์จ์ด์ด๋ค.
commit
์์
์ ์๋์ ํ์คํ ๋ฆฌ๋ฅผ ํ์
ํ ์ ์๋ ๋ฌธ์ฅ
- type(scope): commit type(ticket number, domain...) + subject
- body
- footer
merge
merge ์ ๋ต์ ๋ชจ๋ฅด๊ฒ ๋๋ค๋ฉด Git graph๊ฐ ์๋ง์ด ๋๋ค โฐ๏ธ
- merge ์ ๋ต
- merge commit
- squash
- rebase โ
: ๋ธ๋์น์ ์ปค๋ฐ ํ์คํ ๋ฆฌ๋ฅผ ๋ค๋ฅธ ๋ธ๋์น ์๋ก ์ฌ์ ๋ ฌ
- ๊น๋ํ๊ณ ์๊ฐ๋๋ณ๋ก ์ปค๋ฐ ํ์คํ ๋ฆฌ๋ฅผ ํ์ธํ ์ ์๋ค.
โ ์ฃผ์ด์ง ์ํฉ์ ๋ฐ๋ผ ๊ฐ merge ๋ฐฉ๋ฒ์ ์๊ณ ์ฌ์ฉํ๋ค.
๐ dev ๋ธ๋์น์์ ๋ด ๋ธ๋์น์์ ๊ฐ์ ์์
ํ ์ปค๋ฐํ๋ ๊ฒฝ์ฐ
- merge commit ์ ๊ฒฝ์ฐ merge๋ฅผ ์ํ ์ปค๋ฐ์ด ํ๋ ๋ ์์ฑ๋๋ค.
๐ merge๊ฐ ๊ฒน์ณ์ง๋ ์๊ฐ ์ฐ ๊ทธ๋ํ๊ฐ ์๊ธด๋ค.

git merge feat/1 --no-ff -m "merge pr from feat/1"
git merge feat/2 --no-ff -m "merge pr from feat/2"
๐ ๊ทธ๋ํ๊ฐ ๊ทธ๋๋ก ํ ์นธ ์ฌ๋ผ๊ฐ ๋ชจ์์ผ๋ก ์ปค๋ฐ๋จ(default)
git merge --ff feat/1
rebase
์์
์์ ๋ธ๋์น๋ฅผ "์์ ๊ธฐ์ค ๋ธ๋์น"๋ก ์ฌ์ ๋ ฌํ ๋ ์ฌ์ฉ
dev์ ๋ฐ์๋ ์ปค๋ฐ์ ๊ธฐ์ค์ผ๋ก ํ์ฌ rebaseํ๋ค

git rebase dev
โ dev๋ก base๋ฅผ ๋ง์ถฐ๋๊ณ merge --ff
โ๏ธ ์ด๋ ฅ์ ๋จ๊ธฐ๋ ๊ฒ ํ์ํ ๊ฒฝ์ฐ(์: release)์๋ merge commit (--no-ff)๋ก ๋จ๊ธด๋ค.