ํ๋ก์ ํธ ์ค ๋ด๋น ๊ธฐ๋ฅ์ ์๋์ง๋ง JWT ๊ฐ ์/์ด๋ป๊ฒ ๋๋์ง ๊ถ๊ธํด์ ๊ณต๋ถํด๋ณด์ JWT๋ ๋น๋ฐํค๋ฅผ ์ด์ฉํ์ฌ ์๋ช
๋ JSON ํํ์ ๋ฐ์ดํฐ์ด๋ค. ์ฌ๊ธฐ์ ์ฌ์ฉ์ ์ธ์ฆ ์ ๋ณด๋ฅผ ๋ฃ์ด์ ํ ํฐ์ ๋ฐ๊ธํด์ฃผ๋ฉด ์ถํ ์ธ์ฆ์ด ํ์ํ ๋ฆฌ์์ค์ ์ ๊ทผ ์ ์ฌ์ฉ์๊ฐ ์๋ฒ์ ์๋ฒ์ ํ ํฐ์ ํฌํจํด์ ์ ์กํ์ฌ ์๋ฒ์ ํ ํฐ์ ํฌํจํด์ ์ ์กํ์ฌ ์๋ฒ์ธก์์๋ ๋ณต์กํ ์ธ์ฆ ๊ณผ์ ์์ด ํ ํฐ๋ง์ผ๋ก ์ฌ์ฉ์๋ฅผ ์ธ์ฆ ๋ฐ ์ธ๊ฐํ ์ ์๋ ๊ฒ์ด๋ค. JWT๋ ํค๋, ํ์ด๋ก๋, ์๋ช
์ธ ๊ฐ์ง ์ ๋ณด๋ฅผ base64๋ก ์ธ์ฝ๋ฉํ ๊ฐ์ ์ฝค๋ง('.')๋ฅผ ์ฌ์ด์ ๋๊ณ ์ด์ด๋ถ์ธ ํํ๋ก ์์ฑ๋๋ค. ํค๋ : JWT ์๋ช
์ ์ฌ์ฉ๋ ์๊ณ ๋ฆฌ์ฆ ์ ๋ณด ํ์ด๋ก๋ : ํ ํฐ์ ๋ด๊ธด ์ฃผ์ฒด, ๋ง๋ฃ์ผ, ์์ฑ์ ๋ฑ ์๊ทธ๋์ฒ : ํค๋์ ํ์ด๋ก๋๋ฅผ ๊ฐ๊ฐ base64๋ก ์ธ์ฝ๋ฉํ ํ ์ฝค..
๋ถ๋ฅ ์ ์ฒด๋ณด๊ธฐ
์ค๋์ ์๋ฌ ๐ฅ ์ฒ์์ Order์ User๋ฅผ Lazy ์ ๋ต์ผ๋ก ์ค์ ํ์๋ค ๊ทธ๋ฐ๋ฐ @Transactional public void updateInCart(Long orderId, BasketRequestDto requestDto, User user) { Order order = orderRepository.findByIdAndIsOrdered(orderId, false).orElseThrow( () -> new ApiException(ErrorCode.INVALID_CART) ); checkUserOrRole(user, order); menuService.findMenu(requestDto.getMenu_id()); for (Basket basket : order.getBaskets()) { if (Ob..
์ค๋์ ์๋ฌ ๐ฅ ๋ด ๋ด๋น ๊ธฐ๋ฅ ์ฝ๋๋ฅผ ์ง๋ ๊ฒ์๋ง ์ง์คํ ๋๋จธ์ง,,,,,, pull ์ ๋ฐ์ง ์๊ณ commit -> push ๋ฅผ ํด๋ฒ๋ ค์ ๋ค๋ฅธ ๋ถ๋ค์ ์ฝ๋๊ฐ ์ธ์์์์์์ใฑ ๋ ๋ผ๊ฐ๋ฒ๋ฆผ.//ใ
๋ค๋ค ๋๋ฌด ์ด์ฌํ ํ์
์, ๋ญ๊ฐ ๋ง์๋๋ฆฌ๊ธฐ ์ฃ์กํด์ ๊ทธ๋ฅ merge ๋ฅผ revert ํด๋ฒ๋ ธ๋ค. ๊ทธ ํ, ๋ค์ pull ์ ํ๋๊น ์ค๋ง๋ ์ธ์์ ๋ง์์ ๐ญ ์ด๋ฒ์๋ ๋ด ์ฝ๋๊ฐ ์ธ์์์์์์
๋ ๋ผ๊ฐ๋ค ๐ช๏ธ ๋ด๊ฐ pull ์ ์ค์์ฑ์ ์์ด๋ฒ๋ฆฐ ๊ฒ์ด๊ธฐ์ ๋ด ์๋ชป์ด๊ธฐ์,, ๋ฐ์ฑํ๋ ๋ง์๊ฐ์ง์ผ๋ก ๋ค์ ์งฐ๋ค.ใ
๊ตํ ๐ PULL ์ ์ํ์ 2. git pull ์ ํ๋๊น, ๋ ์ค๋ฅ pull ๋ฐฉ์์ ๋ช
์ํ๋ผ๋ ๊ฒ git pull ์ git fetch์ merge๋ฅผ ํฉ์น ๋ช
๋ น์ด์ธ๋ฐ, ๊ทธ ์ค merge ์ ๋ฐฉ์์ ๋ช
์ํ๋ผ๋ ์๋ฌ์ด๋ค. ..
์คํ๋ง ์ฌํ ํํ๋ก์ ํธ ์์ ์ค๋์ ํ๋ก์ ํธ ํ ์ง๊ธฐ ERD ์์ฑ์ด ๊ฐ์ฅ ๋ฌธ์ ์๋
ERD๋ฅผ ์๋ง๋ค์ด๋์ผ ์ฝ๋๋ฅผ ์งค ๋, ๋ช
ํํ๊ฒ ๊ตฌํํ ์ ์๊ธฐ ๋๋ฌธ์ ํ์๋ค๊ณผ ๊ฐ์ฅ ์ค๋ซ๋์ ๊ณ ๋ฏผํด์ ๋ง๋ค์๋ค. ์๋ฐ ์ฝ๋๋ก๋ ํ๋ ๋ฐ ๋ค๋ฅธ ์ํฐํฐ์์ ๊ด๊ณ๋ฅผ ๊ทธ๋ ค๋ผ ์ ์์๋๋ฐ, ๊ทธ๊ฑฐ๋ฅผ ERD๋ก ๊ทธ๋ฆด๋ ค๋๊น ํ๋๋ ๋ชจ๋ฅด๊ฒ ์ด์ ํํฐ๋๊ป Help ์ณค๋ค..ใ
์ฌ์ค ์ค๋ช
ํด์ฃผ์๋๊ฑฐ๋ฅผ 100% ๋ช
ํํ๊ฒ ์ดํดํ๋์ง๋ ๋ชจ๋ฅด๊ฒ ์ง๋ง, ๊ต์ฅํ ๋์์ด ๋์๋ค ์ํฐํฐ์์ ์ค์ํ๊ฒ ๋ด์ผํ ๊ฒ๊ณผ ์ด๋ ๋ถ๋ถ์ ์ข ๋ ์ค์ ์ผ๋ก ๋๊ณ ๊ตฌ์กฐ๋ฅผ ์ง์ผํ ์ง ์๋ ค์ฃผ์
จ๋ค. ํนํ, ์ฃผ๋ฌธ ๋ด์ญ๊ณผ ๋ฉ๋ด์ ๊ด๊ณ๊ฐ ๋ค๋๋ค ์ธ๋ฐ, ๋ฉ๋ด์์๋ ์ฃผ๋ฌธ ๋ด์ญ์ ๋ํ ์ ๋ณด๋ฅผ ๊ฐ์ง ํ์๊ฐ ์์ด์ ์ด์ ๋ํด์ ์ด๋ป๊ฒ ํํํด์ผ ํ ์ง๊ฐ ๐ป์ธ! ํํฐ๋๊ป์๋ ์ฃผ๋ฌธ ๋ด์ญ๊ณผ ๋ฉ๋ด ์ฌ์ด์ Bask..
๋จ์ ํ
์คํธ? ๋จ์ ํ
์คํธ๋ ํ๋์ ๋ชจ๋์ ๊ธฐ์ค์ผ๋ก ๋
๋ฆฝ์ ์ผ๋ก ์งํ๋๋ ๊ฐ์ฅ ์์ ๋จ์์ ํ
์คํธ์
๋๋ค. ์ฌ๊ธฐ์ ๋ชจ๋์ ์ ํ๋ฆฌ์ผ์ด์
์์ ์๋ํ๋ ํ๋์ ๊ธฐ๋ฅ ๋๋ ๋ฉ์๋๋ก ์ดํดํ ์ ์์ต๋๋ค. ์ฆ, ๋จ์ ํ
์คํธ๋ ์ ํ๋ฆฌ์ผ์ด์
์ ๊ตฌ์ฑํ๋ ํ๋์ ๊ธฐ๋ฅ์ด ์ฌ๋ฐ๋ฅด๊ฒ ๋์ํ๋์ง๋ฅผ ๋
๋ฆฝ์ ์ผ๋ก ํ
์คํธํ๋ ๊ฒ์ผ๋ก, ์ด๋ค ๊ธฐ๋ฅ์ด ์คํ๋๋ฉด ์ด๋ค ๊ฒฐ๊ณผ๊ฐ ๋์จ๋ค. ์ ๋๋ก ํ
์คํธ๋ฅผ ์งํํฉ๋๋ค. ํตํฉ ํ
์คํธ? ํตํฉ ํ
์คํธ๋ ๋ชจ๋์ ํตํฉํ๋ ๊ณผ์ ์์ ๋ชจ๋ ๊ฐ์ ํธํ์ฑ์ ํ์ธํ๊ธฐ ์ํด ์ํ๋๋ ํ
์คํธ์
๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ์ ํ๋ฆฌ์ผ์ด์
์ ์ฌ๋ฌ ๊ฐ์ ๋ชจ๋๋ค๋ก ๊ตฌ์ฑ์ด ๋๊ณ , ๋ชจ๋๋ค๋ผ๋ฆฌ ๋ฉ์ธ์ง๋ฅผ ์ฃผ๊ณ ๋ฐ์ผ๋ฉด์(ํจ์ ํธ์ถ) ๊ธฐ๋ฅ์ ์ํํฉ๋๋ค. ๊ทธ๋ ๊ธฐ์ ํตํฉ๋ ๋ชจ๋๋ค์ด ์ฌ๋ฐ๋ฅด๊ฒ ์ฐ๊ณ๋์ด ๋์ํ๋์ง ๊ฒ์ฆ์ด ํ์ํ๋ฐ, ์ด๋ฌํ ๋ชฉ์ ์ผ๋ก ์งํ๋๋ ํ
์คํธ๊ฐ..
@InjectMocks UserService userService; @Mock UserRepository userRepository; @Mock PasswordEncoder passwordEncoder; @Test @DisplayName("์ค๋ณต๋ ์์ด๋ ์
๋ ฅ ์, ํ์ ๊ฐ์
์คํจ") void givenIsExistedUsername_whenSignup_thenFail() { // Given String username = "tester"; String password = "123456789"; SignupRequestDto requestDto = new SignupRequestDto(); requestDto.setUsername(username); requestDto.setPassword(password..
Spring AOP Annotation @Aspect Spring Bean ํด๋์ค์๋ง ์ ์ฉ ๊ฐ๋ฅ ์ด๋๋ฐ์ด์ค ์ข
๋ฅ @Around: ํต์ฌ๊ธฐ๋ฅ ์ํ ์ ๊ณผ ํ(@Before + @After) @Before: ํต์ฌ๊ธฐ๋ฅ ํธ์ถ ์ (ex. Client์ ์
๋ ฅ ๊ฐ Validation ์ํ) @After : ํต์ฌ๊ธฐ๋ฅ ์ํ ์ฑ๊ณต/์คํจ ์ฌ๋ถ์ ์๊ด์์ด ์ธ์ ๋ ๋์(try, catch์ finally() ์ฒ๋ผ ๋์) @AfterReturning : ํต์ฌ๊ธฐ๋ฅ ํธ์ถ ์ฑ๊ณต ์ (ํจ์์ Return ๊ฐ ์ฌ์ฉ ๊ฐ๋ฅ) @AfterThrowing : ํต์ฌ๊ธฐ๋ฅ ํธ์ถ ์คํจ ์, ์ฆ ์์ธ(Exception)๊ฐ ๋ฐ์ํ ๊ฒฝ์ฐ์๋ง ๋์(ex. ์์ธ๊ฐ ๋ฐ์ํ์ ๋ ๊ฐ๋ฐ์์๊ฒ email์ด๋ SMS ๋ณด๋) ํฌ์ธํธ์ปท ํฌ์ธํธ์ปท Expression Langua..
์ค๋ ์คํ๋ง ์๋ จ์ฃผ์ฐจ ์๋ฃ ๐ ์ค์ต ์งํํ๋ฉด์ ๋๋ Entity ๋ฅผ ์์ฑ์๋ฅผ ๋ง๋ค๋ ๊ฒ์ ๋ณ๋ก ์ ํธํ์ง ์๊ณ , @Builder ํจํด์ ์์ฑํ๋ ๊ฒ์ ๊ฐ์ฅ ์ข์ํจ! ๐ฅ ๊ทธ๋ฆฌ๊ณ RequestDto ์์ toEntity(), ResponseDto ์์ of() ๋ก Entity -> dto, dto -> Entity ๋ฅผ ํด์ค๋ค! public static ProductResponseDto of(Product product) { return ProductResponseDto.builder() .id(product.getId()) .title(product.getTitle()) .link(product.getLink()) .image(product.getImage()) .lprice(product.getLprice(..