์ค๋ ํ ๊ณต๋ถ ๐ง
- ๊ฐ์ธ ๊ณผ์ ๋ ๋ฒจ 5 - 2๊น์ง ๋ง๋ฌด๋ฆฌ ํ ์ ์ถ
- ๊ณผ์ ํด์ค ์ธ์ ๋ฃ๊ธฐ
- ์คํ ๋ค๋๋ฐ ์ธ์ ๋ฃ๊ธฐ
- ์๊ฐ์ ๋ฏธ๋ ์ธ์ ๋ฃ๊ธฐ
- TIL ๋ธ๋ก๊ทธ ์์ฑ
์ค๋ ์ป์ ๋ด์ฉ ์ ๋ฆฌ โ๏ธ
์คํ ๋ค๋๋ฐ ์ธ์ - AOP
AOP: ๊ด์ ์งํฅ ํ๋ก๊ทธ๋๋ฐ์ด๋ผ๊ณ ๋ ๋ถ๋ฅธ๋ค.
ํน์ ํ ๋๋ฉ์ธ์ ์ข
์๋์ง ์๊ณ ๋ด๊ฐ ์ด๋ค ์์ ์ ์ผ๊ด์ ์ผ๋ก ๋ชจ๋ ์ ์ฉํด์ฃผ๊ณ ์ถ์ ๋ ์ฌ์ฉํ๋ค.
๊ณ์ฐ๋ ๊ฒฐ๊ณผ๊ฐ์ ๋ํด์ ์ถ๋ ฅํด ์ฃผ๋ ๊ธฐ๋ฅ์ ์ถ๊ฐ → ๋ชจ๋๊ฐ ํ์๋ก ํ๋ ๊ธฐ๋ฅ → AOP๋ก ๋ง๋ค์ด์ ์ถ๊ฐํ๋ฉด ํธํ๋ค.
๋ํ์ ์ผ๋ก ์ฌ์ฉํ๋ ๊ฒฝ์ฐ
- ๋ฉ์๋๊ฐ ์คํ๋์๋์ง ์คํ๋์ง ์์๋์ง ์ถ๋ ฅํด ์ฃผ๋ ๋ก๊ทธ
- ๊ฐ๊ฐ์ ๋ฉ์๋๊ฐ ์ผ๋ง๋ ๊ฑธ๋ ธ๋์ง ์ฑ๋ฅ์ ๊ตฌํ ๋ ์ฌ์ฉํ ์ ์๋ค.
- ๊ถํ ๊ฒ์ฌํ ๋ ์ฌ์ฉํ ์ ์๋ค.
๊ทธ๋ ๋ค๋ฉด ์ด๋ค ๊ฒ์? ์ธ์ ? ์ด๋ป๊ฒ? → ์ง์ ํด์ค์ผ ํ๋ค.
- ๋์ ์ง์ → PointCut์ ํตํด์ ๋์์ ์ง์ ํด์ค๋ค.
- ์์ ์ง์ → Advice๋ฅผ ํตํด์ ์คํ๋๋ ์์ ์ ์ง์ ํด ์ค๋ค. ex) @Before, @After
- ์ด๋ป๊ฒ๋ Advice๋ก ์ธ์ ์คํ๋ ๊ฑด์ง ์ ์ํ ๋ฉ์๋ ๋ด๋ถ์ ์ด๋ป๊ฒ ์คํํ ๊ฒ์ธ์ง๋ฅผ ์์ฑํด ์ฃผ๋ฉด ๋๋ค.
์ข ๋ ๋ํ ์ผํ๊ณ ์ถ๋ค.
๋์์ ์ก์๋๋ฐ ๊ทธ ๋์์ ๋ํด์ ์ ๋ณด๋ฅผ ๋ฐ๊ณ ์ถ์ ๋ JoinPoint๋ฅผ ์ฌ์ฉํ๋ค.
๊ฐ๊ฐ์ ๋ฉ์๋๊ฐ ์คํ๋๊ธฐ ์ ์ ์ด๋ค ๋ฉ์๋๊ฐ ์คํ๋๋์ง ๋ก๊ทธ๋ฅผ ์ฐ๊ณ ์ถ๋ค. (์ด๋ค ๊ฒ์ ๋ํ ์ ๋ณด๋ฅผ ์ป๊ณ ์ถ๋ค. → JoinPoint๋ฅผ ์ฌ์ฉํ๋ค.)
JoinPoint๋ฅผ ํตํด์ ์ด๋ค ๋ฉ์๋๊ฐ ์ด๋ค ๊ฐ์ ๊ฐ์ง๊ณ ์๋์ง๋ฅผ ํ์ธํ ์ ์๋ค.
๊ฐ์ธ ๊ณผ์ ๋ ๋ฒจ 5 ๋์
๋ ๋ฒจ 5 - 1
@ExtendWith(SpringExtension.class)
class PasswordEncoderTest {
@InjectMocks
private PasswordEncoder passwordEncoder;
@Test
void ๋น๋ฐ๋ฒํธ_๊ฒ์ฌ_์ฑ๊ณต() {
// given
String rawPassword = "testPassword";
String encodedPassword = passwordEncoder.encode(rawPassword);
// when
// matches ๋ฉ์๋์ ๋งค๊ฐ๋ณ์ ์์๋ (์๋ณธ ๋น๋ฐ๋ฒํธ, ์ธ์ฝ๋ฉ๋ ๋น๋ฐ๋ฒํธ)์ด๋ค.
// ๋ฐ๋ผ์ ๋งค๊ฐ๋ณ์์ ์์๊ฐ ๋ฐ๋์ด์ผ ํ๋ค.
boolean actualResult = passwordEncoder.matches(rawPassword, encodedPassword);
// then
// ๋ฐฉ๋ฒ 1. isEqualTo ๋ฉ์๋๋ฅผ ํตํด ๊ฐ ๋น๊ตํ๊ธฐ
boolean expectedResult = true;
assertThat(actualResult).isEqualTo(expectedResult);
// ๋ฐฉ๋ฒ 2. assertTrue ๋ฉ์๋๋ฅผ ํตํด true์ธ์ง ํ์ธํ๊ธฐ
// assertTrue(actualResult);
}
}
๋ ๋ฒจ 5 - 2
- 1๋ฒ ์ผ์ด์ค
- NullPointerException์์ InvalidRequestException์ผ๋ก ์์
- ์์ธ ๋ฐ์ ์ ๋ฉ์์ง ์์
@Test
// NullPointerException์ด ์๋๋ผ InvalidRequestException์ด ๋ฐ์ํ๋ค.
public void manager_๋ชฉ๋ก_์กฐํ_์_Todo๊ฐ_์๋ค๋ฉด_InvalidRequestException_์๋ฌ๋ฅผ_๋์ง๋ค() {
// given
long todoId = 1L;
given(todoRepository.findById(todoId)).willReturn(Optional.empty());
// when & then
InvalidRequestException exception = assertThrows(InvalidRequestException.class, () -> managerService.getManagers(todoId));
// ์ผ์ ์ด ์์ ๋์ ์์ธ ๋ฉ์์ง๋ "ํฌ๋ not found"์ด๋ค.
assertEquals("Todo not found", exception.getMessage());
}
- 2๋ฒ ์ผ์ด์ค
- ํ ์คํธ ์ฝ๋์์๋ ServerException์ ๋์ง๊ณ ์๋๋ฐ, ์ค์ ๋ก์ง์์๋ InvalidReqeustException์ ๋์ง๊ณ ์๋ค.
- ์ค์ ๋ก์ง์ ๋ง์ถฐ์ InvalidRequestException์ผ๋ก ์์ ํ๋ค.
@Test
public void comment_๋ฑ๋ก_์ค_ํ ์ผ์_์ฐพ์ง_๋ชปํด_์๋ฌ๊ฐ_๋ฐ์ํ๋ค() {
// given
long todoId = 1;
CommentSaveRequest request = new CommentSaveRequest("contents");
AuthUser authUser = new AuthUser(1L, "email", UserRole.USER);
given(todoRepository.findById(anyLong())).willReturn(Optional.empty());
// when
// ์ค์ ์๋น์ค ์ฝ๋์์ InvalidRequestException๋ฅผ ๋์ง๊ณ ์๋ค.
// ํ
์คํธ ์ฝ๋์์๋ ๋์ผํ๊ฒ InvalidRequestException์ ์์ํ๋๋ก ์์ ํด์ผ ํ๋ค.
InvalidRequestException exception = assertThrows(InvalidRequestException.class, () -> {
commentService.saveComment(authUser, todoId, request);
});
// then
assertEquals("Todo not found", exception.getMessage());
}
- 3๋ฒ ์ผ์ด์ค
- ํ ์คํธ ์ฝ๋๊ฐ ์ฑ๊ณตํ ์ ์๋๋ก ์๋น์ค ๋ก์ง์ ์์ ํด์ผ ํ๋ค.
@Transactional
public ManagerSaveResponse saveManager(AuthUser authUser, long todoId, ManagerSaveRequest managerSaveRequest) {
// ์ผ์ ์ ๋ง๋ ์ ์
User user = User.fromAuthUser(authUser);
Todo todo = todoRepository.findById(todoId)
.orElseThrow(() -> new InvalidRequestException("Todo not found"));
if (ObjectUtils.nullSafeEquals(todo.getUser(), null)) {
throw new InvalidRequestException("๋ด๋น์๋ฅผ ๋ฑ๋กํ๋ ค๊ณ ํ๋ ์ ์ ๊ฐ ์ผ์ ์ ๋ง๋ ์ ์ ๊ฐ ์ ํจํ์ง ์์ต๋๋ค.");
}
if (!ObjectUtils.nullSafeEquals(user.getId(), todo.getUser().getId())) {
throw new InvalidRequestException("๋ด๋น์๋ฅผ ๋ฑ๋กํ๋ ค๊ณ ํ๋ ์ ์ ๊ฐ ์ผ์ ์ ๋ง๋ ์ ์ ๊ฐ ์ ํจํ์ง ์์ต๋๋ค.");
}
User managerUser = userRepository.findById(managerSaveRequest.getManagerUserId())
.orElseThrow(() -> new InvalidRequestException("๋ฑ๋กํ๋ ค๊ณ ํ๋ ๋ด๋น์ ์ ์ ๊ฐ ์กด์ฌํ์ง ์์ต๋๋ค."));
if (ObjectUtils.nullSafeEquals(user.getId(), managerUser.getId())) {
throw new InvalidRequestException("์ผ์ ์์ฑ์๋ ๋ณธ์ธ์ ๋ด๋น์๋ก ๋ฑ๋กํ ์ ์์ต๋๋ค.");
}
Manager newManagerUser = new Manager(managerUser, todo);
Manager savedManagerUser = managerRepository.save(newManagerUser);
return new ManagerSaveResponse(
savedManagerUser.getId(),
new UserResponse(managerUser.getId(), managerUser.getEmail())
);
}
์ค๋ ํ๋ฃจ ์ ๋ฆฌ โ๏ธ
์ค๋์ ๊ฐ์ธ ๊ณผ์ ๋ง๋ฌด๋ฆฌํ๊ณ ์ ์ถํ๋ ๋ ์ด์๋ค.
์ค์ ๋์ ๋ ๋ฒจ 5์ ํด๋นํ๋ ๋ถ๋ถ์ธ ํ
์คํธ ์ฝ๋ ๋ฐ ์๋น์ค ๋ก์ง ์์ ์ ๊ณ์ ์งํํ๋ค.
์ ์ฌ์๊ฐ๊น์ง ํ์ฉํด์ ๋ ๋ฒจ 5 - 2๊น์ง ๋๋ผ ์ ์์๊ณ , ์คํ์๋ ์ธ์
์ ์ฐ์์ด์๋ค.
๊ณผ์ ํด์ค ์ธ์
์ ์ด์ฌํ ๋ค์ ํ์ ์ด์ด์ ์คํ ๋ค๋๋ฐ ์ธ์
์ ๋ค์๋ค.
์คํ ๋ค๋๋ฐ ์ธ์
์ ์ฃผ์ ๋ AOP์๋๋ฐ ํํฐ๋์ด ์ดํดํ๊ธฐ ์ฝ๋๋ก ์ค๋ช
ํด ์ฃผ์
์ @Around์ ๊ฐ๋
์ด ๋ค์ด๊ฐ๊ธฐ ์ ๊น์ง ์ดํด๊ฐ ์ ๋๋ค. ํ์ง๋ง ๋ฌธ์ ๋ ๊ทธ ์ดํ์๋ค... ๋ญ๊ฐ ์ดํด๊ฐ ๋์ง ์๊ธฐ ์์ํ๋ฉด์ ๊ทธ๋ฅ ์ฝ๋๋ฅผ ๋ฐ๋ผ์น๊ฒ ๋๋ ๋๋์ด ๊ฐํด์ก๋ค... ๊ทธ๋์ ํํฐ๋์ด ๊ทธ๊ฑธ ์บ์นํ์๊ณ ์ธ์
์ด ๋๋ ํ ๋ณด์ถฉ ์ธ์
์ ํตํด ์ดํด๊ฐ ๊ฐ์ง ์๋ ๋ถ๋ถ์ ์ข ๋ ์ฝ๊ฒ ์ค๋ช
ํด ์ฃผ์๋ฉด์ ์ด๋ ์ ๋(?) ์ดํดํ ์ ์๊ฒ ๋์๋ค.
ํ์ง๋ง ์ดํด๋ก ๋๋๋ฉด ์ ๋๋๊น... ๋น ๋ฅธ ์๊ฐ ๋ด์ ๋ค์ ๋ณต์ตํ๋ฉด์ ์ค์ ๋ก ๋ด๊ฐ ์ฝ๋๋ฅผ ์์ฑํด ๋ณด๋ ์๊ฐ๋ ๊ฐ์ ธ์ผ ํ ๊ฒ ๊ฐ๋ค.
๋ด์ผ์ ๋๋์ด ๋ ํํ๋ก์ ํธ ์์์ด๋ค!! ์ด๋ค ์ฃผ์ ์ ํ๋ก์ ํธ๊ฐ ๊ธฐ๋ค๋ฆฌ๊ณ ์์์ง... ๋๋ ต๊ธฐ๋ ํ์ง๋ง ํ๋ก์ ํธ๋ฅผ ํตํด ๋ง์ด ์ฑ์ฅํ ์ ์์ผ๋๊น ๊ธฐ๋๋ ๋๋ค.
๋ด๊ฐ ํ ์ ์๋ ์ญํ ์ ์ต๋ํ ๋ด๋นํด์ ๋น ๋ฅธ ๊ธฐ๊ฐ ๋ด์ ๋ง์ด ์ฑ์ฅํ ์ ์๋ ์๊ฐ์ด ๋์์ผ๋ฉด ์ข๊ฒ ๋ค.
์ด๋ฒ ํ ํ๋ก์ ํธ๋ ํ์ดํ
ํด๋ณด์!!!!!!
๋ด์ผ ๊ณํ โฐ
- ํํ๋ก์ ํธ ์์
- TIL ๋ธ๋ก๊ทธ ์์ฑ
+์ถ๊ฐ ๊ณํ์ด ๋ ์๊ธธ ์๋ ์์ด๋น~_~
'โ๏ธ Today I Learned(TIL) > ์คํ๋ฅดํ ๋ด์ผ๋ฐฐ์์บ ํ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[ TIL ] ์ฃผํน๊ธฐ ์ฌํ_Day 10 (0) | 2025.01.08 |
---|---|
[ TIL ] ์ฃผํน๊ธฐ ์ฌํ_Day 9 (0) | 2025.01.07 |
[ TIL ] ์ฃผํน๊ธฐ ์ฌํ_Day 4 (1) | 2025.01.02 |
[ TIL ] ์ฃผํน๊ธฐ ์ฌํ_Day 3 (1) | 2025.01.01 |
[ TIL ] ์ฃผํน๊ธฐ ์ฌํ_Day 2 (0) | 2024.12.31 |