2022/03
Interceptor ํ์ฉํ๊ธฐ ( feat . ArgumentResolver, Custom Annotation )
๋๊ธฐ๋ถ์ ๋์์ผ๋ก ์ฒ์์ผ๋ก Interceptor ๋ฅผ ์ ์ฉํด๋ณด์์ ๋์ค์ ์ฌ์ฉํ ์ผ์ด ์์ ๋ ์ฐพ์๋ณด๋ ค๊ณ ์จ๋ด ๋๋ค! ์๋์ ๊ฐ์ Controller ์ Header ์์ ์ธ์ฆ์ ์ํ ๊ฐ์ ๋ฐ์์ผ์ง๋ง ์ ๊ทผํ ์ ์๋๋ก ์ค์ ํ๊ฒ ์ต๋๋ค! @RestController @RequestMapping("/orders") @RequiredArgsConstructor public class OrdersController { private final OrdersService ordersService; @Auth(type = ApiServiceType.HOMEPAGE) @GetMapping public ResponseEntity getOrders( @RequestParam(required = false) String sear..
Test-Driven-Development ํ ์คํธ ์ฃผ๋ ๊ฐ๋ฐ
TDD ๊ฐ๋ฐ ๋ฐฉ์ TDD ๋ ํ ์คํธ ์ฝ๋๋ฅผ ์์ฑํ ๋ค์ ์ค์ ์ฝ๋๋ฅผ ์์ฑํ๋ ๊ฒ์ด๋ค. ํ ์คํธ๊ฐ ํต๊ณผ๋ ์ฝ๋๋ง์ ์ค์ ์ฝ๋๋ก ์์ฑํ๋ค -> ๋ฒ๊ทธ๊ฐ ์ค๊ณ ์์ค๊ฐ ๊ฐ๊ฒฐํด์ง๋ฉฐ ์ค๊ณ๊ฐ ๊ฐ์ ๋๋ค. - ์ค๊ณ ๋จ๊ณ์์ ํ๋ก๊ทธ๋๋ฐ ๋ชฉ์ ์ ๋ฏธ๋ฆฌ ์ ์ํ๋ค. - ๋ฌด์์ ํ ์คํธํด์ผ ํ ์ง ๋ฏธ๋ฆฌ ์ ์ํ๋ค. - ํ ์คํธ ์ฝ๋ ์์ฑ ๋์ค ๋ฐ์ํ๋ ์์ธ ์ฌํญ์ ํ ์คํธ ์ผ์ด์ค์ ์ถ๊ฐํ๋ค. (์ค๊ณ ๊ฐ์ ) TDD ํ๋ก์ธ์ค ์คํจํ๋ ์์ ๋จ์ ํ ์คํธ ์ถ๊ฐ -> ํ ์คํธ ํต๊ณผ, ์ต์ํ์ ์ฝ๋ฉ -> ๊ตฌํ ์ค๊ณ ๊ฐ์ , ์ค๋ณต ์ ๊ฑฐ, ๋ฆฌํฉํ ๋ง , ํ ์คํธ ํต๊ณผ ์ ์ง ์ข์ ํ ์คํธ์ ํน์ง Fast: ํ ์คํธ๋ ๋น ๋ฅด๊ฒ ๋์ํ์ฌ ์์ฃผ ๋๋ฆด ์ ์์ด์ผ ํ๋ค. Independent: ๊ฐ๊ฐ์ ํ ์คํธ๋ ๋ ๋ฆฝ์ ์ด๋ฉฐ ์๋ก ์์กดํด์๋ ์๋๋ค. Repeatable: ์ด๋ ํ๊ฒฝ์์..
Java 8 Interface - default ๋ฉ์๋, static ๋ฉ์๋
Java 8 ์ดํ๋ก interface์ ๋ํ ์ ์๊ฐ ๋ช๊ฐ์ง ๋ณ๊ฒฝ๋์๋ค. ์ํฉ ์ด๋ฏธ ๋ง๋ค์ด์ ธ ์๋ Interface ์ ๊ธฐ๋ฅ์ ์ถ๊ฐ ํ๊ณ ์ถ๋ค. ํ์ง๋ง ์ด Interface๋ฅผ implemnets ๋ฐ๊ณ ์๋ class ๋ชจ๋๊ฐ ์ด ๊ธฐ๋ฅ์ ๊ตฌํ์ฒด๋ฅผ ์์ฑํด์ผ๋ง ํ๋ค. default ๋ฉ์๋ ์ธํฐํ์ด์ค๊ฐ default ํค์๋๋ก ์ ์ธ๋๋ฉด ๋ฉ์๋๋ฅผ ๊ตฌํํ ์ ์๊ฒ ๋๋ค. -> ๊ตฌํ์ฒด๋ค์ ์ค๋ฒ๋ผ์ด๋ฉ์ด ๊ฐ๋ฅํ๋ค. package com.example.demo; public interface UserService { String getName(Long userId); int getAge(Long userId); /** * @implSpec ์ด ๊ตฌํ์ฒด๋ ์ฃผ์๋ฅผ ๋ฐํํ๋ค. * @param userId * @return */ // ..
[MapStruct] ๋ด๊ฐ ์ฐพ์ ์ฐ๋ ค๊ณ ์ ๋ฆฌํ ๊ธ
๐โโ๏ธ ๊ณ์ํด์ ์ ๋ฐ์ดํธ ํ๊ธฐ ๐โโ๏ธ 1. ๊ณต์๋ฌธ์ 2. ์ ์ฌ์ฉํ ๊น? 3. ๋์๋ฐฉ์ 4. ์์กด์ฑ 5. Mapper Inteface ์์ฑ 6. Mapper ๊ตฌํ์ฒด ์ดํด๋ณด๊ธฐ ๊ณต์๋ฌธ์ https://mapstruct.org/documentation/stable/reference/pdf/mapstruct-reference-guide.pdf MapStruct ์ ์ฌ์ฉํ ๊น? ๋ณดํต DB์์ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ๊ณ ์๋น์ค๋จ์์ ๋ก์ง์ ์ค๊ณ ํ๊ธฐ ์ํด Entity -> Dto , Dto -> Entity ์์ ์ ํ๊ฒ ๋๋๋ฐ ์ด๋ฌํ Mapping ์์ ์ ํด์ฃผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ๋ง์ด ์กด์ฌํ๋ค ๊ทธ์ค ์๋์ ๋งํฌ๋ฅผ ํ์ธํด๋ณด๋ฉด MapStruct ํผํฌ๋จผ์ค๊ฐ ๋น ๋ฅธ ๊ฒ์ ํ์ธํ ์ ์๋ค. https://www.baeldung.com/j..
[Querydsl] ๋ด๊ฐ ์ฐพ์ ์ฐ๋ ค๊ณ ์ ๋ฆฌํ ๊ธ
๐โโ๏ธ ๊ณ์ํด์ ์ ๋ฐ์ดํธ ํ๊ธฐ ๐โโ๏ธ ๋ง์ง๋ง ์ ๋ฐ์ดํธ 2022/03/29 1. Querydsl ์ ์ ์ฌ์ฉํ ๊น? 2. ์๋๋ฐฉ์? 3. ์์กด์ฑ 4. Repository ๊ตฌ์กฐ 5. Projection ์ ๋ํ ๊ณ ์ฐฐ ... 6. ๋์ ์ฟผ๋ฆฌ (BooleanBuilder) 7. ExpressionUtils 8. ์ ๋ ฌ ํ์ ์ ๋ฐ๋ฅธ ์ ๋ ฌ ์ฒ๋ฆฌ Querydsl ์ ์ ์ฌ์ฉํ ๊น? JPA ๋ฅผ ์ฌ์ฉํ๋ฉด์ (@Query ํฌํจ) ์กฐํ ๊ธฐ๋ฅ์ ๋ํ ํ๊ณ๊ฐ ์๋ค. ๋์ ์ธ ์ฟผ๋ฆฌ์ธ ๊ฒฝ์ฐ์ธ๋ฐ ์๋ฅผ ๋ค์ด ์ฃผ๋ฌธ ํ์ด์ง๋ฅผ ๊ฒ์ ํ๋ค๊ณ ํ์ ๋ ์นดํ ๊ณ ๋ฆฌ or ์ํ๋ช or ๊ธฐ์ ๋ช ๋ฑ๋ฑ... ์ผ๋ก ๊ฒ์ ์กฐ๊ฑด์ด ๋ฌ๋ผ์ง๋ ๋ถ๋ถ์ด๋ค. ๊ทธ๋์ ์ฌ์ฉํ๊ฒ ๋ ๊ฒ์ด ๋ฐ๋ก Querydsl ํ๋ ์์ํฌ ์ด๋ค. - ํ์ ์ฒดํฌ๊ฐ ๋ฐ๋ก ๊ฐ๋ฅํ๋ค - ์๋ฐ ์ฝ๋๋ฅผ ๊ธฐ๋ฐ์ผ..
[Lombok] Difference Between @Value and @Data
์ปดํ์ผ๊ณผ์ ์์ ์์ฑํด ์ฃผ๋ ๋ฐฉ์์ผ๋ก ๋์ํ๋ java๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค. @Value ๊ธฐ๋ณธ์ ์ผ๋ก ๋ถ๋ณ๊ฐ์ฒด๋ก ๋ง๋ค์ด์ค๋ค. class์ ์ ์ธํ๋ฉด ์๋์ ์ด๋ ธํ ์ด์ ์ด ๊ธฐ๋ณธ์ ์ผ๋ก ํฌํจ๋๋ค. @Getter @AllArgsConstructor @ToString @EqualsAndHashCode @FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE) ํ์ง๋ง @Setter ๋ ํฌํจ๋์ง ์๋๋ค. ์๋ํ๋ฉด ๊ธฐ๋ณธ์ ์ผ๋ก ๋ถ๋ณ์ฑ์ ๋ณด์ฅํ๊ธฐ ๋๋ฌธ์ setter๋ฅผ ์๋ตํ๋ ๊ฒ์ ๋น์ฐํ๋ค @FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE) ๋ private์ด๋ final ์ ์ฌ์ฉํ ์ ์๊ฒ ํด์ค๋ค. ์ต์ข ์ ์ผ๋ก @Value ..