์นดํ…Œ๊ณ ๋ฆฌ ์—†์Œ

[ TIL ] ์ฃผํŠน๊ธฐ ์‹ฌํ™”_Day 5

carrot0911 2025. 1. 3. 20:59

์˜ค๋Š˜ ํ•œ ๊ณต๋ถ€ ๐Ÿง 

  • ๊ฐœ์ธ ๊ณผ์ œ 3๋‹จ๊ณ„ ๋๋‚ด๊ธฐ
  • ๊ฐœ์ธ ๊ณผ์ œ 4๋‹จ๊ณ„ ๋„์ „
  • ์Šคํƒ ๋‹ค๋“œ๋ฐ˜ ํŠธ๋žœ์žญ์…˜ ์„ธ์…˜ ๋ณต์Šต
  • TIL ๋ธ”๋กœ๊ทธ ์ž‘์„ฑ

 

์˜ค๋Š˜ ์–ป์€ ๋‚ด์šฉ ์ •๋ฆฌ โœ๏ธ 

Lv 3. ์ถ”๊ฐ€ ๊ธฐ๋Šฅ ๊ฐœ์„ 

๋จผ์ € ์ฃผ์–ด์ง„ GitHub Repository๋กœ ๋“ค์–ด๊ฐ€์„œ Fork ๊ธฐ๋Šฅ์„ ํ™œ์šฉํ•ด์„œ ๋‚ด Repository๋กœ ๋ณต์‚ฌํ•ด์„œ ๊ฐ€์ ธ์˜จ๋‹ค.

1. ์ฝ”๋“œ ๊ฐœ์„  ํ€ด์ฆˆ: Early Return

์กฐ๊ฑด์— ๋งž์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ์ฆ‰์‹œ ๋ฆฌํ„ดํ•ด์„œ, ๋ถˆํ•„์š”ํ•œ ๋กœ์ง์˜ ์‹คํ–‰์„ ๋ฐฉ์ง€ํ•˜๊ณ  ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚จ๋‹ค.

  • AuthService ํด๋ž˜์Šค ์•ˆ์— ์žˆ๋Š” signup( ) ๋ฉ”์„œ๋“œ ๋‚ด์˜ ์ฝ”๋“œ ์ผ๋ถ€์˜ ์œ„์น˜๋ฅผ ๋ฆฌํŒฉํ† ๋งํ•ด์„œ passwordEncoder์˜ encode() ๋™์ž‘์ด ๋ถˆํ•„์š”ํ•˜๊ฒŒ ์ผ์–ด๋‚˜์ง€ ์•Š๊ฒŒ ์ฝ”๋“œ๋ฅผ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.
if (userRepository.existsByEmail(signupRequest.getEmail())) {
    throw new InvalidRequestException("์ด๋ฏธ ์กด์žฌํ•˜๋Š” ์ด๋ฉ”์ผ์ž…๋‹ˆ๋‹ค.");
}

2. ๋ฆฌํŒฉํ† ๋ง ํ€ด์ฆˆ: ๋ถˆํ•„์š”ํ•œ if-else ํ”ผํ•˜๊ธฐ

๋ณต์žกํ•œ if-else ๊ตฌ์กฐ๋Š” ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ์„ ๋–จ์–ด๋œจ๋ฆฌ๊ณ  ์œ ์ง€๋ณด์ˆ˜๋ฅผ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ ๋‹ค. ๋ถˆํ•„์š”ํ•œ else ๋ธ”๋ก์„ ์—†์•  ์ฝ”๋“œ๋ฅผ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ํ•œ๋‹ค.

  • WeatherClient ํด๋ž˜์Šค์— ์žˆ๋Š” getTodayWeather() ๋ฉ”์„œ๋“œ ๋‚ด์˜ if-else๋ฌธ์„ ๋ฆฌํŒฉํ† ๋งํ•ด์„œ ๋ถˆํ•„์š”ํ•œ if-else๋ฌธ์„ ํ”ผํ•  ์ˆ˜ ์žˆ๋‹ค.
WeatherDto[] weatherArray = responseEntity.getBody(); 
if (!HttpStatus.OK.equals(responseEntity.getStatusCode())) { 
	throw new ServerException("๋‚ ์”จ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š”๋ฐ ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค. ์ƒํƒœ ์ฝ”๋“œ: " + responseEntity.getStatusCode());
} else { 
	if (weatherArray == null || weatherArray.length == 0) { 
		throw new ServerException("๋‚ ์”จ ๋ฐ์ดํ„ฐ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค."); 
    } 
}
  • ์ˆ˜์ • ํ›„
WeatherDto[] weatherArray = responseEntity.getBody(); 
if (!HttpStatus.OK.equals(responseEntity.getStatusCode())) { 
	throw new ServerException("๋‚ ์”จ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š”๋ฐ ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค. ์ƒํƒœ ์ฝ”๋“œ: " + responseEntity.getStatusCode()); 
} 

if (weatherArray == null || weatherArray.length == 0) { 
	throw new ServerException("๋‚ ์”จ ๋ฐ์ดํ„ฐ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค."); 
}

3. ์ฝ”๋“œ ํด๋ฆฐ์—…: ๋ถˆํ•„์š”ํ•œ ์ฃผ์„ ์ œ๊ฑฐ, ์ฝ”๋“œ ํฌ๋งทํŒ…, ์ผ๊ด€๋œ ๋„ค์ด๋ฐ ์ปจ๋ฒค์…˜ ์ ์šฉ

  • ๋ถˆํ•„์š”ํ•œ ์ฃผ์„ ์ œ๊ฑฐ
    • ์ฝ”๋“œ๊ฐ€ ๋ช…ํ™•ํ•˜๊ฒŒ ์ดํ•ด๋  ์ˆ˜ ์žˆ๋„๋ก ๋ถˆํ•„์š”ํ•œ ์ฃผ์„์€ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.
      • ์ฃผ์„์˜ ์ถ”์ƒํ™” ์ˆ˜์ค€๊ณผ ์ฝ”๋“œ์˜ ์ถ”์ƒํ™” ์ˆ˜์ค€์˜ ๋™์ผํ•œ ๊ฒฝ์šฐ
      • ์ฃผ์„์ด ์ฝ”๋“œ์˜ ๋‚ด์šฉ์„ ์ค‘๋ณตํ•˜๋Š” ๊ฒฝ์šฐ ์ œ๊ฑฐ
      • ์„ค๋ช…์ด ๋ถˆ๋ช…ํ™•ํ•˜๊ฑฐ๋‚˜ ํ˜ผ๋ž€์Šค๋Ÿฌ์šด ์ฃผ์„ ์‚ญ์ œ
      • ์ฝ”๋“œ์˜ ๋™์ž‘์„ ์„ค๋ช…ํ•˜๊ธฐ๋ณด๋‹ค๋Š” '์™œ' ํ•ด๋‹น ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ–ˆ๋Š”์ง€๋ฅผ ์„ค๋ช…ํ•˜๋Š” ์ฃผ์„์€ ๋‚จ๊น€ → ์ฃผ์„์„ ํ†ตํ•œ ์˜์‚ฌ์†Œํ†ต์„ ์œ„ํ•ด ์‚ฌ์šฉํ•œ๋‹ค.
  • ์ฝ”๋“œ ํฌ๋งทํŒ…
    • ์ผ๊ด€๋œ ์ฝ”๋“œ ์Šคํƒ€์ผ์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์ฝ”๋“œ ํฌ๋งทํŒ…์„ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.
      • ๊ฐ ํด๋ž˜์Šค, ๋ฉ”์„œ๋“œ, ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ์ ์ ˆํ•œ ๊ณต๋ฐฑ ๋ฐ ์ค„๋ฐ”๊ฟˆ ์ ์šฉ
      • 2์นธ ๋˜๋Š” 4์นธ์˜ ์ŠคํŽ˜์ด์Šค(ํƒญ) ์‚ฌ์šฉ, ํŒ€ ๋‚ด ํ•ฉ์˜๋œ ๋ฐฉ์‹์— ๋”ฐ๋ฆ„
      • ๊ด„ํ˜ธ {}๋Š” ๋‹ค์Œ ์ค„์— ์œ„์น˜์‹œํ‚ค๊ฑฐ๋‚˜ ๊ฐ™์€ ์ค„์— ์œ„์น˜์‹œํ‚ค๋Š” ๊ทœ์น™์„ ํŒ€ ๋‚ด์—์„œ ์ •ํ•˜๊ณ  ์ ์šฉ
      • ํ•œ ์ค„์˜ ์ตœ๋Œ€ ๊ธธ์ด๋Š” 80~120์ž๋กœ ์ œํ•œ
      • ๋ฉ”์„œ๋“œ ์ธ์ž์™€ ํŒŒ๋ผ๋ฏธํ„ฐ ๋ชฉ๋ก ๊ฐ„์˜ ๊ณต๋ฐฑ ์ ์šฉ
      • ์ฝ”๋“œ ์ •๋ ฌ ๋ฐ ์ •๋ฆฌ(์˜ˆ: import ๋ฌธ ์ •๋ฆฌ)
      • Hint! google-java-formatter, ktlint ์™€ ๊ฐ™์€ ๋ฆฐํŠธ๋„ ์ฐพ์•„์„œ ํ™œ์šฉํ•ด๋ณด์„ธ์š”!
  • ์ผ๊ด€๋œ ๋„ค์ด๋ฐ ์ปจ๋ฒค์…˜ ์ ์šฉ
    • ๋ณ€์ˆ˜๋ช…, ๋ฉ”์„œ๋“œ๋ช…, ํด๋ž˜์Šค๋ช… ๋“ฑ ๋ชจ๋“  ๋„ค์ด๋ฐ์— ๋Œ€ํ•ด ์ผ๊ด€๋œ ๊ทœ์น™์„ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.
      • ํด๋ž˜์Šค ์ด๋ฆ„์€ ๋Œ€๋ฌธ์ž๋กœ ์‹œ์ž‘ํ•˜๋Š” ํŒŒ์Šค์นผ ์ผ€์ด์Šค(PascalCase) ์‚ฌ์šฉ
      • ๋ฉ”์„œ๋“œ ์ด๋ฆ„ ๋ฐ ๋ณ€์ˆ˜ ์ด๋ฆ„์€ ์†Œ๋ฌธ์ž๋กœ ์‹œ์ž‘ํ•˜๋Š” ์นด๋ฉœ ์ผ€์ด์Šค(camelCase) ์‚ฌ์šฉ
      • ์ƒ์ˆ˜ ์ด๋ฆ„์€ ๋ชจ๋‘ ๋Œ€๋ฌธ์ž๋กœ ์ž‘์„ฑํ•˜๊ณ  ๋‹จ์–ด ์‚ฌ์ด์— ์–ธ๋”์Šค์ฝ”์–ด(_) ์‚ฌ์šฉ (์˜ˆ: MAX_LENGTH)
      • ์ด๋ฆ„์ด ๊ทธ ํ–‰์œ„๋ฅผ ์ถฉ๋ถ„ํžˆ ์„ค๋ช…ํ•˜๊ณ  ์žˆ๋Š”์ง€? ๋„ค์ด๋ฐ์€ ์˜๋ฏธ๋ฅผ ๋ช…ํ™•ํžˆ ์ „๋‹ฌํ•˜๋„๋ก ์ž‘์„ฑ (์˜ˆ: getUserById๋Š” findUserById๋กœ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ)
      • ์ ‘๋‘์‚ฌ ๋˜๋Š” ์ ‘๋ฏธ์‚ฌ๋ฅผ ํ†ตํ•œ ์ผ๊ด€์„ฑ ์œ ์ง€ (์˜ˆ: DTO๋Š” UserDTO, Service๋Š” UserService ๋“ฑ)

4. ์ค‘๋ณต ์ฝ”๋“œ ์ œ๊ฑฐ: ๋ฐ˜๋ณต์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ์ฝ”๋“œ์˜ ์žฌ์‚ฌ์šฉ์„ฑ ํ–ฅ์ƒ

  • ์ค‘๋ณต ์ฝ”๋“œ ์‹๋ณ„
    • ํ”„๋กœ์ ํŠธ ๋‚ด์—์„œ ๋ฐ˜๋ณต์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ์ฝ”๋“œ๋ฅผ ์ฐพ์•„๋ƒ…๋‹ˆ๋‹ค.
      • ์œ ์‚ฌํ•œ ๋กœ์ง์ด ์—ฌ๋Ÿฌ ๊ณณ์—์„œ ์‚ฌ์šฉ๋˜๋Š”์ง€ ํ™•์ธ
      • ๋™์ผํ•œ ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์ฝ”๋“œ ๋ธ”๋ก์„ ๊ฒ€์ƒ‰
      • ๋ฉ”์„œ๋“œ ๋‚ด์˜ ๋ฐ˜๋ณต์ ์ธ ์ฝ”๋“œ๋‚˜ ํด๋ž˜์Šค ๊ฐ„์˜ ์ค‘๋ณต ์ฝ”๋“œ ํŒŒ์•…
  • ๋ฉ”์„œ๋“œ๋กœ ์ถ”์ถœ
    • ์ค‘๋ณต๋œ ์ฝ”๋“œ๋ฅผ ์œ ํ‹ธ๋ฆฌํ‹ฐ ๋ฉ”์„œ๋“œ๋กœ ์ถ”์ถœํ•˜์—ฌ ์žฌ์‚ฌ์šฉ์„ฑ์„ ๋†’์ž…๋‹ˆ๋‹ค.
      • ์ค‘๋ณต ์ฝ”๋“œ์˜ ๊ธฐ๋Šฅ์„ ๋ถ„์„ํ•˜๊ณ , ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ฉ”์„œ๋“œ๋ฅผ ์ƒ์„ฑ
      • ๋ฉ”์„œ๋“œ ์ด๋ฆ„์€ ๊ธฐ๋Šฅ์„ ๋ช…ํ™•ํžˆ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋„๋ก ์ž‘์„ฑ
      • ๋ฉ”์„œ๋“œ๋Š” ๋‹จ์ผ ์ฑ…์ž„ ์›์น™(SRP)์„ ์ค€์ˆ˜ํ•ด์•ผ ํ•˜๋ฉฐ, ํ•œ ๊ฐ€์ง€ ๊ธฐ๋Šฅ๋งŒ ์ˆ˜ํ–‰ํ•˜๋„๋ก ๊ตฌํ˜„

Lv 4. N+1 ๋ฌธ์ œ ๊ฐœ์„ ํ•˜๊ธฐ

์ฐจ์ด์ ์„ ์ฐพ๊ณ  ์ ์šฉํ•˜๋Š” ์ด์œ ๊นŒ์ง€ ์ƒ๊ฐํ•ด๋ณด๊ธฐ

Fetch join

  • SQL Join์˜ ์ข…๋ฅ˜๋Š” ์•„๋‹ˆ๋‹ค.
  • JPQL์—์„œ ์„ฑ๋Šฅ ์ตœ์ ํ™”๋ฅผ ์œ„ํ•ด ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ์ด๋‹ค.
  • ์—ฐ๊ด€๋œ Entity๋‚˜ ์ปฌ๋ ‰์…˜์„ SQL ํ•œ ๋ฒˆ์— ํ•จ๊ป˜ ์กฐํšŒํ•˜๋Š” ๊ธฐ๋Šฅ์ด๋‹ค.
  • join fetch ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
  • [LEFT [OUTER] | INNER] JOIN FETCH ์กฐ์ธ๊ฒฝ๋กœ
  • ์˜ˆ์‹œ
    • JPQL: SELECT m FROM Member m JOIN FETCH m.team
    • SQL: SELECT m.*, t.* FROM Member m INNER JOIN TEAM t ON m.team_id = t.id
  • Fetch Join๋ฅผ ์จ์•ผํ•˜๋Š” ์ด์œ 
    • Fetch Join์„ ์“ธ ๊ฒฝ์šฐ, join fetch ๋กœ ์„ค์ •๋œ ์—ฐ๊ด€๊ด€๊ณ„ ์—”ํ‹ฐํ‹ฐ์˜ ์ •๋ณด๊นŒ์ง€ ํ•œ ๋ฒˆ์˜ ์ฟผ๋ฆฌ๋กœ ๋‹ค ๊ฐ€์ ธ์˜ค๊ฒŒ ๋œ๋‹ค. (ํ”„๋ก์‹œ ๊ฐ์ฒด๋กœ ๋‘์ง€ ์•Š๋Š”๋‹ค.)
    • ๋ชจ๋“  ํŒ€ ์ •๋ณด๋“ค์ด ํ•œ๋ฒˆ์— ์กฐํšŒ๋˜๊ณ , ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ 1์ฐจ ์บ์‹œ์— ์ €์žฅ๋˜์–ด ์ฟผ๋ฆฌ ์ „์†ก ์—†์ด ๋ฐ”๋กœ ํ™œ์šฉ๋  ์ˆ˜ ์žˆ๋‹ค.

@EntityGraph

์Šคํƒ ๋‹ค๋“œ๋ฐ˜ ํŠธ๋žœ์žญ์…˜ ์„ธ์…˜ ๋ณต์Šต

 

์˜ค๋Š˜ ํ•˜๋ฃจ ์ •๋ฆฌ โœ๏ธ

 

๋‚ด์ผ ๊ณ„ํš โฐ

  • ๊ฐœ์ธ ๊ณผ์ œ 4๋‹จ๊ณ„ ๋๋‚ด๊ธฐ
  • ์Šคํƒ ๋‹ค๋“œ๋ฐ˜ ํŠธ๋žœ์žญ์…˜ ๋ธ”๋กœ๊ทธ ์ •๋ฆฌ
  • TIL ๋ธ”๋กœ๊ทธ ์ž‘์„ฑ

+์ถ”๊ฐ€ ๊ณ„ํš์ด ์ƒ๊ธธ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค~_~