์นดํ
๊ณ ๋ฆฌ ์์
[ 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 ๋ธ๋ก๊ทธ ์์ฑ
+์ถ๊ฐ ๊ณํ์ด ์๊ธธ ์๋ ์์ต๋๋ค~_~