ํฐ์คํ ๋ฆฌ์ฑ๋ฆฐ์ง10 [Spring Boot] ๊ฐ๋จํ gRPC ๊ตฌํํ๊ธฐ ๋ชฉํ์คํ๋ง ๋ถํธ, java๋ฅผ ์ฌ์ฉํด์ ๊ฐ๋จํ gRPC๋ฅผ ๊ตฌํํด ๋ด ๋๋ค. ํด๋ผ์ด์ธํธ์ ์๋ฒ ์ธก์ ๋ง๋ค์ด ๋ณด๊ณ localhost์์ ์คํํด ๋ด ๋๋ค๊ฐ๋ฐ ํ๊ฒฝ Spring Boot version 3.4.0 java version Java 17 build tool Gradle 8.11 database h2 os macOS Sonoma 14.4.1 IDE IntelliJ IDEA CE 2023.3.3 ๐ฆ SERVER build.gradleplugins { id 'java' id 'org.springframework.boot' version '3.3.6' id 'io.spring.dependency-management' version '1.1.6' id 'com.google.protobuf' version '0... 2024. 11. 26. [gRPC]์ ๋ํด ์์๋ณด๊ธฐ RPC๋ Remote Procedure Call๋คํธ์ํฌ ์์ ๋ค๋ฅธ ์๋ฒ๋ ์์คํ ์ ์๋ ๊ธฐ๋ฅ์ ๋ง์น ๋ก์ปฌ ๊ธฐ๋ฅ์ฒ๋ผ ํธ์ถํ ์ ์๊ฒ ํด์ฃผ๋ ํ๋กํ ์ฝํด๋ผ์ด์ธํธ๊ฐ ๋ก์ปฌ ํจ์ ํธ์ถ -> ์์ฒญ์ด ์ง๋ ฌํ ๋์ด ๋คํธ์ํฌ๋ก ์ ์ก -> ์๊ฒฉ ์๋ฒ๊ฐ ์ด๋ฅผ ๋ฐ์ ์ฒ๋ฆฌ ํ ์๋ต -> ์๋ต์ด ์ง๋ ฌํ ๋์ด ํด๋ผ์ด์ธํธ์๊ฒ ๋ฐํ :: ์ฌ์ฉ์๋ ์๊ฒฉ ์๋ฒ์ ์ง์ ์ํธ์์ฉํ์ง ์๊ณ ๋ก์ปฌ ํจ์ ํธ์ถ ๋ฐฉ์์ผ๋ก ์์ ์ ์ํํ ์ ์์ gRPC ํน์งGoogle์์ ๊ฐ๋ฐํ ์คํ ์์ค RPC ํ๋ ์์ํฌํ๋กํ ์ฝ ๋ฒํผ๋ฅผ ์ฌ์ฉํ ๋ฐ์ดํฐ ์ง๋ ฌํ๋ค์ํ ์ธ์ด ์ง์ ๋ฐ ์ธ์ด ๋ ๋ฆฝ์ฑ์๋ก ๋ค๋ฅธ ์ธ์ด๋ฅผ ์ฌ์ฉํ๋ ์๋ฒ์ ํด๋ผ์ด์ธํธ์์๋ ํด๋ผ์ด์ธํธ๋ ์๋ฒ์ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์์HTTP/2 ๊ธฐ๋ฐ์ฌ๋ฌ ๋ฉ์ธ์ง๋ฅผ ํ๋ฒ์ ๋์์ ๋ณด๋ผ ์๋ ์์๋ฐ์ด๋๋ฆฌ ํํ์ ๋ฉ์ธ์ง๋ฅผ ๋น ๋ฅด๊ฒ.. 2024. 11. 24. [Spring Boot] AOP๋ฅผ ํ์ฉํ ์ปค์คํ ์ ๋ ธํ ์ด์ ๋ง๋ค๊ธฐ 2024.11.17 - [BE/๐ Spring] - [Spring Boot] AOP ๊ฐ๋ ์ ๋ฆฌ2024.11.18 - [BE/๐ Spring] - [Spring Boot] AOP ์ฌ์ฉ ๋ฐฉ๋ฒ๊ณผ ์์์ฝ๋ ํ์ฌ ์งํํ๊ณ ์๋ ํ๋ก์ ํธ์ ์ผ๋ถ API์์ ์์ฒญ/์๋ต ๋ฐ์ดํฐ๋ฅผ End-to-End ์ํธํ ํด์ ํต์ ํ๊ณ ์์ต๋๋ค. ๊ทธ๋ฌ๋ค ๋ณด๋ Controller ํน์ ์๋ณตํธํ์ ๊ด๋ จ ์๋ ๋ก์ง์ ์ํธํ ๊ด๋ จ ์ฝ๋๊ฐ ๋ค์ด๊ฐ์ผ ํ๋ ๊ฒฝ์ฐ๊ฐ ์์์ต๋๋ค. ์๋ณตํธํ๋ฅผ ์ํํ๋ static object๋ฅผ ๋ง๋ค์ด ์ฌ์ฉ์ ํด์์๋๋ฐ, AOP๋ฅผ ์ด์ฉํด์ ์ด๋ฅผ ๊ฐ์ ํด ๋ณด๋ฉด ์ด๋จ๊น ์ถ์์ต๋๋ค. ์์ฒญ ๊ฐ์ฒด ์์ฒด๋ฅผ ๊ฐ๋ก์ฑ ๋ณตํธํ ํด์ ํ๋ฌธ๊ฐ์ ๋ฐ๋ก Controller์์ ์ฌ์ฉํ ์ ์๊ฒ ํ๊ณ , ์๋ต์ ํด๋ผ์ด์ธํธ์ ์ ๋ฌํ๊ธฐ ์ ์ ์๋ต ๊ฐ์ .. 2024. 11. 19. [Spring Boot] AOP ์ฌ์ฉ ๋ฐฉ๋ฒ๊ณผ ์์์ฝ๋ ์์กด์ฑ ์ถ๊ฐdependencies { implementation 'org.springframework.boot:spring-boot-starter-aop'} ์ฌ์ฉ ๋ฐฉ์Aspect ์ ์ : @Aspect ์ ๋ํ ์ด์ ์ ์ฌ์ฉํด์ Aspect ํด๋์ค๋ฅผ ์ ์ํ๋คAdvice ์ ์ฉ : @Before, @After, @Around ๋ฑ ๋ค์ํ Advice๋ฅผ ๋ฉ์๋์ ์ ์ฉํ๋ค. ํน์ ์์ ์ ์ด๋ค ์คํ ๋ก์ง์ ์คํํ ์ง ์ ์ํ๋ค.Pointcut ์ค์ : execution ํํ์ ๋ฑ์ ํตํด ํน์ ๋ฉ์๋, ํจํค์ง ๋ฑ์๋ง Aspect๊ฐ ์ ์ฉ๋๋๋ก ์ค์ ํ๋คAOP ํ์ฑํ : @EnableAspectJAuotProxy ์ ๋ํ ์ด์ ์ Spring Boot ์ ํ๋ฆฌ์ผ์ด์ ํด๋์ค์ ์ถ๊ฐํด AOP๋ฅผ ํ์ฑํ ํ๋ค @EnableAspectJA.. 2024. 11. 18. [Spring Boot] AOP ๊ฐ๋ ์ ๋ฆฌ ์์ ์ฝ๋์ ์์ธํ ์ฌ์ฉ๋ฒ์ ๋ค์ ํฌ์คํ ์์ ๋ค๋ฃน๋๋ค. AOP๋Aspect-Orineted Programing, ๊ด์ ์งํฅ ํ๋ก๊ทธ๋๋ฐ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฝ๋์์ ํต์ฌ ๋น์ฆ๋์ค ๋ก์ง๊ณผ ํน์ ๊ด์ฌ์ฌ(๊ธฐ๋ฅ)์ ๋ถ๋ฆฌํ ํ์ฌ ์บก์ํ๋ชจ๋ํ ํฅ์cross-cutting concerns (ํก๋จ ๊ด์ฌ์ฌ) ์ฒ๋ฆฌ์ ์ ์ฉ๋ก๊น , ํธ๋์ญ์ ๊ด๋ฆฌ, ์ธ์ฆ/๊ถํ ๋ถ์ฌ, ์ฑ๋ฅ ๋ชจ๋ํฐ๋ง ๊ตฌํ๊ณผ ๊ฐ์ ํน์ ๊ด์ฌ์ฌ ๋ถ๋ฆฌ์ ์ฌ์ฉ๋ ์ ์์ AOP๋ ์ ํ์ํ ๊น?๋ฐ๋ณต์ ์ผ๋ก ์ฌ์ฉ๋๋ ํน์ ๊ธฐ๋ฅ์ธ ํก๋จ ๊ด์ฌ์ฌ๋ฅผ ๋น์ฆ๋์ค ๋ก์ง๊ณผ ๋ถ๋ฆฌํ์ฌ ์ฝ๋์ ์ฌ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋๋ก ํด์คํก๋จ ๊ด์ฌ์ฌํต์ฌ ๋น์ฆ๋์ค ๋ก์ง๊ณผ ์ง์ ์ ์ธ ๊ด๋ จ์ด ์๋ ๊ด์ฌ์ฌํก๋จ ๊ด์ฌ์ฌ๋ฅผ ๋ฉ์๋ ๋ง๋ค ์ถ๊ฐํ๊ฒ ๋๋ฉด ๋ฐ๋ณต๋๋ ์ฝ๋๋ก ์ธํด ์ฝ๋๊ฐ ์ง์ ๋ถํด์ง๊ณ , ๋ณ๊ฒฝ์ ์ฌ๋ฌ ๊ณณ์ ๋ณ๊ฒฝํด์ผ ํ๊ธฐ ๋๋ฌธ์ ์ ์ง๋ณด์.. 2024. 11. 17. [MQTT] Spring Boot ์์ MQTT(mosquitto) ์ฌ์ฉํ๊ธฐ ํ๋ก ํธ์์ ํน์ api๋ฅผ ํธ์ถํ๋ฉด ๋น์ฆ๋์ค ๋ก์ง์ ์ํํ๊ณ mqtt๋ฅผ ์ฌ์ฉํด์ ์๋์ฐ PC๋ ํค์ค์คํฌ์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํด์ผ ํ๋ค. ์์ ์์ ๋ฐ์ดํฐ ์๊ณ , ์ด์ ์ ๋น์ทํ ํ๋ก์ ํธ์์ mosquitto๋ฅผ ์ฌ์ฉํด์ ๊ตฌํํ ๋ ํผ๋ฐ์ค๊ฐ ์์ด MQTT๋ก ์ด๋ฅผ ๊ตฌํํ๋ค.๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์ฌ๊ธฐ์ Spring Boot ์น ์๋ฒ๋ publisher๋ผ๊ณ ํ ์ ์๊ณ , ์๋์ฐ PC๋ subscriber, mosquitto๋ broker ์ญํ ์ ํ๋ค MQTT ํน์ง๊ฒฝ๋ ํ๋กํ ์ฝ ์ต์ํ ๋ ํค๋2๋ฐ์ดํธ ์ ๋์ ์ ์ ์ฉ๋ ๋ฉ์ธ์ง -> ์ ํ๋ ๋์ญํญ ํ๊ฒฝ์์๋ ์ฌ์ฉ ๊ฐ๋ฅ Publish/Subscribe ๋ชจ๋ธPublisher (๋ฐํ ์ฃผ์ฒด) Broker (์ค๊ฐ์๋ฒ) Subscriber (๊ตฌ๋ ์ฃผ์ฒด)Publisher๋ ํน์ topic์ ๋ฉ.. 2024. 11. 13. [Spring Boot] Custom Validation annotation Intro์ฌ์ฉ์ ํน์ ํ๋ก ํธ์๋์์ ์์ฒญํ ๋ฐ์ดํฐ๋ฅผ ๊ฒ์ฆํ๋ ๊ฒ์ ์ค์Spring Boot์ ๊ฐ์ ํ๋ ์์ํฌ์์๋ @Valid, @Validated, validation ๊ด๋ จ ์ ๋ํ ์ด์ ์ ์ฌ์ฉํด์ ์ ํจ์ฑ ๊ฒ์ฆ์ด ๊ฐ๋ฅํจ๋ณต์กํ ๋น์ฆ๋์ค ๋ก์ง์ด๋ ํน์ ์๊ตฌ์ฌํญ์์๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ๊ณตํ๋ ๊ฒ์ฆ ์ ๋ํ ์ด์ ์ ์ฌ์ฉํ๊ธฐ ์ด๋ ค์ธ ์ ์์Spring Boot์์๋ ์ฌ์ฉ์ ์ ์์ validation์ ์์ฑํ ์ ์์์์ ์ฝ๋@Getter@ToString@JsonNaming(value = PropertyNamingStrategies.SnakeCaseStrategy.class)public class RegistUserRequest { @Pattern(regexp = "^[A-Za-z0-9+_.-]+@[A-Za-z0-9.-].. 2024. 11. 10. [Spring Boot] RestControllerAdvice๋ก Validation Exception ํธ๋ค๋งํ๊ธฐ request ๋ฐ์ดํฐ ๊ฒ์ฆ์ ์ํด Valid, Validation, Spring Boot์์ ์ ๊ณตํ๋ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ๊ฒฝ์ฐ Exception์ด ๋ฐ์ํ๋ค. ํด๋ผ์ด์ธํธ๊ฐ ๋ฐ์ดํฐ๋ฅผ ์์ฒญํ์ผ๋ ์๋ฌด๋ฐ ์๋ด ์์ด ์๋ฌ๊ฐ ๋ฐ์ํ๋ค๋ฉด ์๋ฌ์ ์์ธ์ ์ ์ ์๋ค. Response์ ์๋ฌ์ ์์ธ์ ์ ํด์ง ๊ท๊ฒฉ์ ๋ง๊ฒ ์ ๊ณตํ์ฌ ํด๋ผ์ด์ธํธ ์์ ์ ๋๊ณ , ๋ฐ์ดํฐ๋ฅผ ๊ฒ์ฆํ์ฌ ์ฌ์ฉํ ์ ์๋ค. RestControllerAdviceSpring MVC์์ ์ ์ญ์ ์ผ๋ก ์์ธ ์ฒ๋ฆฌ๋ฅผ ํ๋ ์ ๋ํ ์ด์ @ControllerAdvice์ ๋ค๋ฅธ ์ ์ @ResponseBody๋ฅผ ํฌํจํ๊ณ ์๊ธฐ ๋๋ฌธ์ JSON ํ์์ response๋ฅผ ๋ฐํํจ๊ธ๋ก๋ฒ ์์ธ์ฒ๋ฆฌ, ์ฌ์ฉ์ ์ ์ ํ์์ JSON ๊ตฌ์กฐ ๋ฐํํ๋๋ฐ ์ฌ์ฉbasePackages, basePackage.. 2024. 11. 9. [Spring Boot] Validation์ ๋ฐ์ํ ์ ์๋ ์๋ฌ ์์๋ณด๊ธฐ ์ด์ ๊ธ : 2024.11.07 - [BE/๐ Spring] - [Validation] spring boot validation ์ฌ์ฉ๋ฒ๊ณผ ์ข ๋ฅ :: Spring Boot :: v3.3.5 @Valid์ @ValidatedValid์ Validated ๊ฒ์ฆ ์คํจ์ exception ๋ฐ์ @Valid @Valid๋ jakarta.validation.Valid์ ์ํด ์๊ณ RequestBody๋ก ์ ๋ฌ๋ ์์ฒญ ๊ฐ์ฒด๋ฅผ ๊ฒ์ฆํ๋๋ฐ ์ฌ์ฉ๋จ @Validated @Validated๋ org.springframework.validation.annotation.Validated์ ์ํด ์๊ณ , AOP ๊ธฐ๋ฐ์ผ๋ก ๋์@RequestParam, @PathVariable์์ ์ ๋ฌ๋๋ ๋ฐ์ดํฐ์ ์ ํจ์ฑ์ ๊ฒ์ฆController๊ฐ ์.. 2024. 11. 8. [Validation] spring boot validation ์ฌ์ฉ๋ฒ๊ณผ ์ข ๋ฅ ValidationSpring Boot์์๋ Validation์ ํตํด ํด๋ผ์ด์ธํธ์์ ์์ฒญ์ ์ ์กํ ๋ฐ์ดํฐ์ ์ ํจ์ฑ์ ๊ฒ์ฆํ๊ธฐ ์ํ ๊ธฐ๋ฅ๋ค์ ์ ๊ณตํ๋ค. ์ Validation์ ์ฌ์ฉํ ๊น์ฃผ๋ก Controller์์ ํด๋ผ์ด์ธํธ๋ก ๋ถํฐ ์ ์ก๋ ๋ฐ์ดํฐ์ ์ ํจ์ฑ์ ๊ฒ์ฆํจ์ ํจ์ฑ ๊ฒ์ฆ ์ฝ๋๋ฅผ ์ง์ ๊ตฌํํ ์ ์์ผ๋, request์ ๋ค์ด์ค๋ ๋ชจ๋ ๋ฐ์ดํฐ์ ๋ํ ๊ฒ์ฆ ์ฝ๋๋ก ์ธํด ์ฝ๋์ ์์ด ๋ง์ ์ง ์ ์์ผ๋ฉฐ ์๋น์ค ๋ก์ง์ ๋ฐฉํด๋ ์ ์์์์ฒญ ํญ๋ชฉ์ด ๋ง์์ง ์๋ก ๊ฒ์ฆ ๊ณผ์ ์ด ๊ธธ์ด์ง์ฌ๋ฌ๋ช ์ ๊ฐ๋ฐ์๊ฐ ๊ฒ์ฆ ๋ก์ง์ ๊ฐ๋ฐํ๋ ๊ฒฝ์ฐ ์ผ๊ด์ฑ์ด ์์ด์ง ์ ์์Validation์ ์ฌ์ฉํ๋ฉด ๊ฒ์ฆ ๋ก์ง์ ์ผ๊ด์ฑ ์๊ฒ ๊ตฌํํ ์ ์์Validation์ ์ฌ์ฉํด์ ๊ฒ์ฆ ๋ก์ง์ ๋จ์ํ ์ํฌ ์ ์์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์์กด์ฑ ์ถ๊ฐimplement.. 2024. 11. 7. ์ด์ 1 ๋ค์