[TIL] 2025-02-03_์ˆ™๋ จ_Spring

Yuriยท2025๋…„ 2์›” 3์ผ

TIL

๋ชฉ๋ก ๋ณด๊ธฐ
40/59
post-thumbnail

๐Ÿ“• Today I Learned - ์˜ค๋Š˜ ๋‚ด๊ฐ€ ๊ณต๋ถ€ํ•œ ๊ฒƒ์„ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

์ˆ™๋ จ Spring 2-3์ฃผ์ฐจ

์ธ์ฆ๊ณผ ์ธ๊ฐ€

  1. ์ธ์ฆ(Authentication) ๐Ÿ”‘
    • ์‚ฌ์šฉ์ž๊ฐ€ ๋ˆ„๊ตฌ์ธ์ง€ ํ™•์ธํ•˜๋Š” ๊ณผ์ •
      ex) ๋กœ๊ทธ์ธ
  2. ์ธ๊ฐ€(Authorization) ๐Ÿ”“
    • ์‚ฌ์šฉ์ž๊ฐ€ ์–ด๋–ค ๊ถŒํ•œ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š”์ง€ ๊ฒฐ์ •ํ•˜๋Š” ๊ณผ์ •
    • ๋ฐ˜๋“œ์‹œ ์ธ์ฆ์ด ์„ ํ–‰๋˜์–ด์•ผ ํ•œ๋‹ค.
      ex) ํšŒ์›๋งŒ ์กฐํšŒ ๊ฐ€๋Šฅํ•œ ๊ฒŒ์‹œ๊ธ€, ๋ณธ์ธ์ด ์ž‘์„ฑํ•œ ๊ฒŒ์‹œ๊ธ€ ์ˆ˜์ •

๐Ÿช ์ฟ ํ‚ค(Cookie)

  • ์ •์˜
    • ์›น ๋ธŒ๋ผ์šฐ์ €(Client ์ธก)์— ์ €์žฅ๋˜๋Š” ๋ฐ์ดํ„ฐ
    • ์šฉ๋„
      • ์‚ฌ์šฉ์ž์˜ ๋ฐฉ๋ฌธ ๊ธฐ๋ก, ๋กœ๊ทธ์ธ ์ƒํƒœ ์œ ์ง€, ๊ฐœ์ธ ๋งž์ถค ์„ค์ • ๋“ฑ์„ ์ €์žฅ, HTTP ํŠน์„ฑ ๊ทน๋ณต, ๊ด‘๊ณ  ์ •๋ณด
    • ํŠน์ง•
      • ํด๋ผ์ด์–ธํŠธ ์ธก์— ์ €์žฅ๋˜๋ฉฐ, ์„œ๋ฒ„์— ์š”์ฒญ์„ ๋ณด๋‚ผ ๋•Œ๋งˆ๋‹ค ํฌํ•จ๋˜์–ด ์ „์†ก๋จ.
      • ๋ณด์•ˆ์— ์ทจ์•ฝํ•˜๋‹ค. (๋ฏผ๊ฐํ•œ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜์ง€ ์•Š์•„์•ผ ํ•œ๋‹ค. ์‚ฌ์šฉ์ž ์ž„์˜ ์ˆ˜์ •์ด ๊ฐ€๋Šฅํ•˜๋‹ค.)
    • ์ˆ˜๋ช…
      • ๋งŒ๋ฃŒ ๋‚ ์งœ๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Œ, ์„ธ์…˜ ์ฟ ํ‚ค(๋ธŒ๋ผ์šฐ์ € ์ข…๋ฃŒ ์‹œ ์‚ญ์ œ)์™€ ์˜์† ์ฟ ํ‚ค(์ง€์ •๋œ ๊ธฐ๊ฐ„ ๋™์•ˆ ์œ ์ง€)๋กœ ๊ตฌ๋ถ„๋จ.

๐Ÿ’ผ ์„ธ์…˜(Session)

  • ์ •์˜
    • ์‚ฌ์šฉ์ž์™€ ์„œ๋ฒ„ ๊ฐ„์˜ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•.
    • ์šฉ๋„
      • ๋กœ๊ทธ์ธ ์ •๋ณด, ์‚ฌ์šฉ์ž ํ™œ๋™ ๋“ฑ์„ ์„œ๋ฒ„ ์ธก์—์„œ ๊ด€๋ฆฌ.
    • ํŠน์ง•
      • ์„œ๋ฒ„ ์ธก์—์„œ ์ €์žฅ๋˜๋ฉฐ, ์„ธ์…˜ ID๊ฐ€ ์ฟ ํ‚ค์— ์ €์žฅ๋˜์–ด ํด๋ผ์ด์–ธํŠธ์™€ ์—ฐ๊ฒฐ๋จ.
      • ์„ธ์…˜ ID๋ฅผ ํƒˆ์ทจํ•˜์—ฌ๋„ ๋ฏผ๊ฐํ•œ ์ •๋ณด๊ฐ€ ์—†๋‹ค.
    • ์ˆ˜๋ช…
      • ๋ธŒ๋ผ์šฐ์ €๋ฅผ ๋‹ซ๊ฑฐ๋‚˜ ์ผ์ • ์‹œ๊ฐ„์ด ์ง€๋‚˜๋ฉด ๋งŒ๋ฃŒ๋จ.
    • Session ๊ด€๋ฆฌ
      1. ์„ธ์…˜์€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
        • ์„ธ์…˜์ด ๋งŽ์•„์ง€๋ฉด ์„œ๋ฒ„์˜ ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.(๋ฉ”๋ชจ๋ฆฌ ๋ฆฌ์†Œ์Šค ๋ถ€์กฑ)
        • ์ตœ์†Œํ•œ์˜ ๋ฐ์ดํ„ฐ๋งŒ ์ €์žฅํ•ด์•ผ ํ•œ๋‹ค.
      2. HttpSession์€ LastAccessedTime์„ ๊ธฐ์ค€์œผ๋กœ 30๋ถ„์˜ ์ƒ๋ช…์ฃผ๊ธฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.
      3. ์„ธ์…˜์˜ ์‹œ๊ฐ„์„ ๋„ˆ๋ฌด ์˜ค๋ž˜ ์œ ์ง€ํ•˜์—ฌ๋„ ๋ฉ”๋ชจ๋ฆฌ ๋ฆฌ์†Œ์Šค๊ฐ€ ๋ถ€์กฑํ•  ์ˆ˜ ์žˆ๋‹ค.
        • ์ ๋‹นํ•œ ์‹œ๊ฐ„ ์„ค์ •์ด ๊ผญ ํ•„์š”ํ•˜๋‹ค.(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 ์‚ฌ์šฉ
    public interface MemberRepository extends JpaRepository<Member, Long> {
    		// JPA Query Methods
    		public Member findById(Long id);
    
    }
    • JpaRepository ์ธํ„ฐํŽ˜์ด์Šค์™€ Query Methods ๊ธฐ๋Šฅ์œผ๋กœ ๋น„์•ฝ์ ์œผ๋กœ ์ƒ์‚ฐ์„ฑ์ด ์ƒ์Šนํ•œ๋‹ค.
    • ๋ฐ˜๋ณต์ ์ธ CRUD ์ž‘์—…๋“ค์„ ๊ตฌํ˜„ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค.
  • Spring Data JPA
    • Spring Framework์—์„œ JPA๋ฅผ ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์ œ๊ณตํ•˜๋Š” ๋ชจ๋“ˆ
    • Java์—์„œ ORM ๊ธฐ์ˆ  ํ‘œ์ค€์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค ๋ชจ๋“ˆ
    • ์ธํ„ฐํŽ˜์ด์Šค์ด๊ธฐ ๋•Œ๋ฌธ์— Hibernate, OpenJPA ๋“ฑ์ด JPA๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ  ์žˆ๋‹ค.
  1. JPA ์ถ”์ƒํ™” Repository ์ œ๊ณต
    • CrudRepository, JpaRepository ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•œ๋‹ค.
    • SQL์ด๋‚˜ EntityManager๋ฅผ ์ง์ ‘ ํ˜ธ์ถœํ•˜์ง€ ์•Š์•„๋„ ๊ธฐ๋ณธ์ ์ธ CRUD ๊ธฐ๋Šฅ์„ ์†์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.
  2. JPA ๊ตฌํ˜„์ฒด์™€ ํ†ตํ•ฉ
    • ์ผ๋ฐ˜์ ์œผ๋กœ Hibernate๋ฅผ ํ†ตํ•ด ์ž๋™์œผ๋กœ SQL์ด ์ƒ์„ฑ๋œ๋‹ค.
  3. QueryMethods
    • Method ์ด๋ฆ„๋งŒ์œผ๋กœ SQL์„ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•œ๋‹ค.
    • @Query ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ JPQL ๋˜๋Š” Native Query๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ๋ณต์žกํ•œ SQL์„ ์ง์ ‘ ๊ตฌํ˜„ํ•  ๋•Œ ์‚ฌ์šฉ
  4. ํŠธ๋žœ์žญ์…˜ ๊ด€๋ฆฌ์™€ 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)๋กœ ๋‚จ๊ธด๋‹ค.

profile
์•ˆ๋…•ํ•˜์„ธ์š” :)

0๊ฐœ์˜ ๋Œ“๊ธ€