ํ์ฌ ์ฝ๋๋ฅผ ๋ถ์ํ๋ค๊ฐ ํจ์ํ์ธํฐํ์ด์ค๋ฅผ ํ์ฉํ ๋ถ๋ถ์ด ์์ด์ ๊ณต๋ถํด๋ณด์๋ค. ์ฌ์ฉํ ๋ชฉ์ ์ ํด๋น EnumType ์ ์ฌ์ฉํ๋ฉด ๊ทธ Enum์ ๋ง๊ฒ ๋ฐฐ์ด์ ์ ๋ ฌํ์ต๋๋ค. ์ ์ ํ ์ถฉ๊ฒฉ์ ๋ฐ์์ต๋๋ค ..ใ .. ๊ทธ๋์ ์ ๋ ๊ฐ๋จํ๊ฒ ๊ตฌํํด๋ณด๊ณ ๊ณต๋ถํด๋ดค์ต๋๋ค! package com.example.demo; import java.util.function.Function; import lombok.Getter; import lombok.RequiredArgsConstructor; @Getter @RequiredArgsConstructor public enum ItemType { AA("์์",CalRatio::getRatio), BB("์๋ฃ",CalRatio::getRatio), CC("๊ณผ์",CalRatio::get..

๋๊ธฐ๋ถ์ ๋์์ผ๋ก ์ฒ์์ผ๋ก 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..
TDD ๊ฐ๋ฐ ๋ฐฉ์ TDD ๋ ํ ์คํธ ์ฝ๋๋ฅผ ์์ฑํ ๋ค์ ์ค์ ์ฝ๋๋ฅผ ์์ฑํ๋ ๊ฒ์ด๋ค. ํ ์คํธ๊ฐ ํต๊ณผ๋ ์ฝ๋๋ง์ ์ค์ ์ฝ๋๋ก ์์ฑํ๋ค -> ๋ฒ๊ทธ๊ฐ ์ค๊ณ ์์ค๊ฐ ๊ฐ๊ฒฐํด์ง๋ฉฐ ์ค๊ณ๊ฐ ๊ฐ์ ๋๋ค. - ์ค๊ณ ๋จ๊ณ์์ ํ๋ก๊ทธ๋๋ฐ ๋ชฉ์ ์ ๋ฏธ๋ฆฌ ์ ์ํ๋ค. - ๋ฌด์์ ํ ์คํธํด์ผ ํ ์ง ๋ฏธ๋ฆฌ ์ ์ํ๋ค. - ํ ์คํธ ์ฝ๋ ์์ฑ ๋์ค ๋ฐ์ํ๋ ์์ธ ์ฌํญ์ ํ ์คํธ ์ผ์ด์ค์ ์ถ๊ฐํ๋ค. (์ค๊ณ ๊ฐ์ ) TDD ํ๋ก์ธ์ค ์คํจํ๋ ์์ ๋จ์ ํ ์คํธ ์ถ๊ฐ -> ํ ์คํธ ํต๊ณผ, ์ต์ํ์ ์ฝ๋ฉ -> ๊ตฌํ ์ค๊ณ ๊ฐ์ , ์ค๋ณต ์ ๊ฑฐ, ๋ฆฌํฉํ ๋ง , ํ ์คํธ ํต๊ณผ ์ ์ง ์ข์ ํ ์คํธ์ ํน์ง Fast: ํ ์คํธ๋ ๋น ๋ฅด๊ฒ ๋์ํ์ฌ ์์ฃผ ๋๋ฆด ์ ์์ด์ผ ํ๋ค. Independent: ๊ฐ๊ฐ์ ํ ์คํธ๋ ๋ ๋ฆฝ์ ์ด๋ฉฐ ์๋ก ์์กดํด์๋ ์๋๋ค. Repeatable: ์ด๋ ํ๊ฒฝ์์..
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 */ // ..
๐โโ๏ธ ๊ณ์ํด์ ์ ๋ฐ์ดํธ ํ๊ธฐ ๐โโ๏ธ 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..

๐โโ๏ธ ๊ณ์ํด์ ์ ๋ฐ์ดํธ ํ๊ธฐ ๐โโ๏ธ ๋ง์ง๋ง ์ ๋ฐ์ดํธ 2022/03/29 1. Querydsl ์ ์ ์ฌ์ฉํ ๊น? 2. ์๋๋ฐฉ์? 3. ์์กด์ฑ 4. Repository ๊ตฌ์กฐ 5. Projection ์ ๋ํ ๊ณ ์ฐฐ ... 6. ๋์ ์ฟผ๋ฆฌ (BooleanBuilder) 7. ExpressionUtils 8. ์ ๋ ฌ ํ์ ์ ๋ฐ๋ฅธ ์ ๋ ฌ ์ฒ๋ฆฌ Querydsl ์ ์ ์ฌ์ฉํ ๊น? JPA ๋ฅผ ์ฌ์ฉํ๋ฉด์ (@Query ํฌํจ) ์กฐํ ๊ธฐ๋ฅ์ ๋ํ ํ๊ณ๊ฐ ์๋ค. ๋์ ์ธ ์ฟผ๋ฆฌ์ธ ๊ฒฝ์ฐ์ธ๋ฐ ์๋ฅผ ๋ค์ด ์ฃผ๋ฌธ ํ์ด์ง๋ฅผ ๊ฒ์ ํ๋ค๊ณ ํ์ ๋ ์นดํ ๊ณ ๋ฆฌ or ์ํ๋ช or ๊ธฐ์ ๋ช ๋ฑ๋ฑ... ์ผ๋ก ๊ฒ์ ์กฐ๊ฑด์ด ๋ฌ๋ผ์ง๋ ๋ถ๋ถ์ด๋ค. ๊ทธ๋์ ์ฌ์ฉํ๊ฒ ๋ ๊ฒ์ด ๋ฐ๋ก Querydsl ํ๋ ์์ํฌ ์ด๋ค. - ํ์ ์ฒดํฌ๊ฐ ๋ฐ๋ก ๊ฐ๋ฅํ๋ค - ์๋ฐ ์ฝ๋๋ฅผ ๊ธฐ๋ฐ์ผ..
์ปดํ์ผ๊ณผ์ ์์ ์์ฑํด ์ฃผ๋ ๋ฐฉ์์ผ๋ก ๋์ํ๋ java๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค. @Value ๊ธฐ๋ณธ์ ์ผ๋ก ๋ถ๋ณ๊ฐ์ฒด๋ก ๋ง๋ค์ด์ค๋ค. class์ ์ ์ธํ๋ฉด ์๋์ ์ด๋ ธํ ์ด์ ์ด ๊ธฐ๋ณธ์ ์ผ๋ก ํฌํจ๋๋ค. @Getter @AllArgsConstructor @ToString @EqualsAndHashCode @FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE) ํ์ง๋ง @Setter ๋ ํฌํจ๋์ง ์๋๋ค. ์๋ํ๋ฉด ๊ธฐ๋ณธ์ ์ผ๋ก ๋ถ๋ณ์ฑ์ ๋ณด์ฅํ๊ธฐ ๋๋ฌธ์ setter๋ฅผ ์๋ตํ๋ ๊ฒ์ ๋น์ฐํ๋ค @FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE) ๋ private์ด๋ final ์ ์ฌ์ฉํ ์ ์๊ฒ ํด์ค๋ค. ์ต์ข ์ ์ผ๋ก @Value ..

HTTP / HTTPS - HTTP : ์๋ก ๋ค๋ฅธ ์์คํ ๋ค ์ฌ์ด์์ ํต์ ์ ์ฃผ๊ณ ๋ฐ๊ฒ ํ๋ ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ํ๋กํ ์ฝ(์๋ฒ์์ ๋ธ๋ผ์ฐ์ ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ์กํ๋ ์ฉ๋๋ก ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉํจ) ๋ฌธ์ ์ - ์๋ฒ์์ ๋ธ๋ผ์ฐ์ ๋ก ์ ์ก๋๋ ์ ๋ณด๊ฐ ์ํธํ๋์ง ์๋๋ค. - HTTPS : SSL(๋ณด์ ์์ผ ๊ณ์ธต) ์ฌ์ฉ, ์๋ฒ์ ๋ธ๋ผ์ฐ์ ์ฌ์ด์ ์์ ํ๊ฒ ์ํธํ๋ ์ฐ๊ฒฐ์ ๋ง๋ค ์ ์๊ฒ ๋์์ค๋ค. ์๋ฒ์ ๋ธ๋ผ์ฐ์ ๊ฐ ๋ฏผ๊ฐํ ์ ๋ณด๋ฅผ ์ฃผ๊ณ ๋ฐ์ ๋ ํด๋น ์ ๋ณด๊ฐ ๋๋๋นํ๋ ๊ฒ์ ๋ง์์ค. HTTP ์์ฒด๋ฅผ ์ํธํํ๋ ๊ฒ์ด ์๋ HTTP Message Body๋ฅผ ์ํธํํ๋ค. (์ฆ, Header๋ ์ํธํ๋์ง ์๋๋ค) HTTPS ์ฌ์ฉํด์ผํ๋ ์ด์ 1. ์ค๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ๋ก์ฑ๋ ์ํธํ๋์ด ์๊ธฐ ๋๋ฌธ์ ์์ ํ๋ค. 2. ๊ตฌ๊ธ์ HTTPS ์น ์ฌ์ดํธ์ ๊ฐ์ฐ์ ์ ..
@RequiredArgsConstructor @Service public class DiaryRegisterService { private final CoupleRepository coupleRepository; private final DiaryRepository diaryRepository; private final UserRepository userRepository; public DiaryRegisterResponse addDiary(DiaryRegisterRequest diaryRegisterRequest) { Couple couple = coupleRepository .findByCoupleToken(diaryRegisterRequest.getCoupleToken()) .orElseThrow(..
๋ฆฌํฉํ ๋ง์ด 30%์ ๋ ๋จ์ ์์ ์์ ์๋ํ ๋ฐฐํฌ๋ฅผ ๊ณํํ๊ณ ์ํฉ๋๋ค! ์ฐ์ ์ฒ์ํด๋ด์ ๊ฒ์์ผ๋ก ์ฐพ์๋ธ ๋ฐฉ๋ฒ์ ์คํํ ํ ๋ฐฉ์์ ์ดํดํ๊ณ ๋ค๋ฅธ๊ฑธ๋ก ๋ฐ๊ฟ๋ณผ ์์ ์ ๋๋ค. ์ ์ผ ๋ง์ด ๋ค์ด๋ดค๋ Jenkins, Docker๋ฅผ ์ฌ์ฉํ ์์ ์ ๋๋ค. 1. GitHub Push. 2. GitHub์์ Jenkins์ Build ์ ๋ฐํ๋ค. 3. Jenkins์์ Gradle Buildํ์ฌ Jar ํ์ผ ์์ฑ ํ๋ค. 4. ์์ ๋ Jar ํ์ผ์ build ํ๋ค. 5. DocerHub์ Push ํ๋ค. 6. Jenkins ๊ฐ DockerHub์ ์๋ ํ์ผ์ pull ํ๋ค. 7. ์ด์ ์ปจํ ์ด๋ ์ญ์ ํ ์๋ก ๋ฐ์์จ ์ด๋ฏธ์ง๋ฅผ ์คํํ๋ค. https://velog.io/@haeny01/AWS-Jenkins%EB%A5%BC-%ED%99%9..

Test ๋์ค ์ด์ํ๊ฒ ResponseFileds๋ฅผ ๋ฐ์ง ๋ชปํ๋ ๋ฌธ์ ๊ฐ ์๋ค. ํน์๋ ํด์ postman์ผ๋ก ํ ์คํธ ํด๋ณด์๋๋ฐ ์๋์ ๊ฐ์ด ์๋์จ๋ค ... ํ ์คํธ๋ ์ฑ๊ณตํ์ง๋ง responseFields ๊ฐ ์๋ค๋ฉฐ ๊ณ์ํด์ ์ค๋ฅ๋ฅผ ๋ฑ๋๋ค ... ใ ใ ๋ฌด์์ด ๋ฌธ์ ์ผ๊น @Test void loginUser() throws Exception { final UserLoginRequest userLoginRequest = UserLoginRequest.builder().socialToken("Asd823daz").pushToken("Wesdf0898dfa").build(); final UserLoginResponse userLoginResponse = UserLoginResponse.builder().coupleT..

์๋น์ค ๊ตฌํ์ ์์ REST API ๋ฌธ์๋ฅผ ์๋ํ ํด์ฃผ๋ Spring REST Docs ๋ฅผ ์ฌ์ฉํด๋ณธ๋ค. Docs๋ฅผ ์ฌ์ฉํ ์ด์ ๋ Test์์ ์ฑ๊ณตํด์ผ๋ง ๋ฌธ์๋ฅผ ๋ง๋ค ์ ์๊ธฐ ๋๋ฌธ์ ์ฌ์ฉํ๊ฒ๋์์ต๋๋ค. ๊ฐ์ ๋ก TEST CODE๋ฅผ ์์ฑํ์ฌ API์ ๋ํ ์ ๋ขฐ์ฑ์ ๋์ผ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค. Gradle 7์ ์ฌ์ฉํ๊ณ ์์๋๋ฐ ๋ฌธ์์์ฑ์ด ์๋์ ๊ฒ์ํด๋ดค๋ค. ์ฐํ๋ฐฉ๋ฒ์ด ์์ง๋ง ๋ณต์กํ๊ธฐ ๋๋ฌธ์ ๋ค์ด๊ทธ๋ ์ด๋๋ฅผ ์ ํํ๋ค. ๊ทธ๋ฆฌ๊ณ Gradle๊ณผ Maven ์์ ๋ค๋ฅด๊ฒ ์ค์ ๋๋ ๋ถ๋ถ์ด ์๊ธฐ ๋๋ฌธ์ ๋งจ์๋ ๋งํฌ๋ฅผ ํตํด ํ์ธํด๋ณด๋ ๊ฒ๋ ์ข๋ค! ํ๊ฒฝ์ค์ Springboot 2.6.1 Gradle 6.9.1 JUnit5 Asciidoctor 1.5.9.2 build.gradle ์ ์ถ๊ฐํ ์ค์ plugins { id "org.a..