κΈμ νμ°½ μ΄μ¬ν νκ³ μλ μλ ν
μ΄μλ, κΈμ ν맀νκ³ κ΅¬λ§€νλ μλΉμ€λ₯Ό μ 곡νκΈ°λ‘ κ²°μ νμ΅λλ€!
μλ ν
μ΄μλ μ±μ ν΅ν΄ ꡬ맀, ν맀 μ£Όλ¬Έμ κ΄λ¦¬νλ €κ³ ν©λλ€!
λν λ―Έλμ μλΉμ€κ° νμ₯λ κ²μ κ³ λ €νμ¬, μΈμ¦μ λ΄λΉνλ μλ²λ₯Ό λ³λλ‘ κ΅¬μΆνκΈ°λ‘ κ²°μ ν©λλ€.
- RESTful APIλ₯Ό νμ©νμ¬ κ΅¬λ§€, ν맀 μ£Όλ¬Έ CRUDλ₯Ό μννλ μλ² A ꡬν
- μλ² Aμ gRPCλ₯Ό ν΅ν΄ μν΅νλ©°, μΈμ¦λ§μ λ΄λΉνλ μλ² B ꡬν
- πββοΈ Quick Start
- π¦ ERD
- π λλ ν°λ¦¬ ꡬ쑰
- π ꡬν λ΄μ©
- π API λͺ μΈ
- β‘ νΈλ¬λΈ μν
- π€ κ³ λ―Ό νμ
- .env νμΌ
- μμ μλ²
DB_URL=
DB_USERNAME=
DB_PASSWORD=
- μΈμ¦ μλ²
DB_URL=
DB_USERNAME=
DB_PASSWORD=
JWT_SECRET_KEY="Key μ€μ "
ACCESS_TOKEN_EXPIRATION=μ‘μΈμ€ ν ν° λ§λ£ μκ°
REFRESH_TOKEN_EXPIRATION=리νλ μ ν ν° λ§λ£ μκ°
- gradle build
- μ€ν
β Java λ²μ μΆ©λλ‘ μ€λ₯κ° λ°μνλ κ²½μ°
gradle.properties
νμΌμ μμ±ν΄ μλμ κ°μ΄ λ€μ΄λ‘λ λ°μ νμΌμ κ²½λ‘λ₯Ό μ€μ ν΄μ£ΌμΈμ.org.gradle.java.home=C:/corretto-17.0.12
βοΈ User ν μ΄λΈκ³Ό Order ν μ΄λΈμ΄ 1:N κ΄κ³λ‘ μ°κ²°λμμ§λ§ μ€μ λ‘λ μλ²λ₯Ό λΆλ¦¬νκΈ° λλ¬Έμ μ°κ²°λμ΄μμ§ μλ€.
μμ μλ² λλ ν°λ¦¬ ꡬ쑰
src
ββmain
β ββjava
β β ββcom
β β ββwanted
β β ββgold
β β β GoldApplication.java
β β β
β β ββclient
β β β β AuthGrpcClient.java
β β β β
β β β ββdto
β β β UserResponseDto.java
β β β
β β ββconfig
β β β SwaggerConfig.java
β β β
β β ββexception
β β β β BadRequestException.java
β β β β BaseException.java
β β β β ConflictException.java
β β β β ErrorCode.java
β β β β ErrorResponse.java
β β β β ForbiddenException.java
β β β β NotFoundException.java
β β β β UnauthorizedException.java
β β β β
β β β ββhandler
β β β GlobalExceptionHandler.java
β β β
β β ββorder
β β β ββcontroller
β β β β DeliveryController.java
β β β β OrderController.java
β β β β PaymentController.java
β β β β
β β β ββdomain
β β β β Delivery.java
β β β β DeliveryStatus.java
β β β β Order.java
β β β β OrderStatus.java
β β β β OrderType.java
β β β β Payment.java
β β β β PaymentStatus.java
β β β β
β β β ββdto
β β β β CreateOrderRequestDto.java
β β β β DeliveryResponseDto.java
β β β β ModifyDeliveryRequestDto.java
β β β β ModifyPaymentRequestDto.java
β β β β OrderDetailResponseDto.java
β β β β OrderListPaginationResponseDto.java
β β β β OrderListResponseDto.java
β β β β PaymentResponseDto.java
β β β β
β β β ββrepository
β β β β DeliveryRepository.java
β β β β OrderRepository.java
β β β β PaymentRepository.java
β β β β
β β β ββservice
β β β DeliveryService.java
β β β OrderService.java
β β β OrderValidator.java
β β β PaymentService.java
β β β
β β ββproduct
β β ββcontroller
β β β PriceController.java
β β β
β β ββdomain
β β β GoldType.java
β β β Price.java
β β β PriceType.java
β β β Product.java
β β β
β β ββdto
β β β CreatePriceRequestDto.java
β β β
β β ββrepository
β β β PriceRepository.java
β β β ProductRepository.java
β β β
β β ββservice
β β PriceService.java
β β
β ββproto
β β auth.proto
β β
β ββresources
β application.yml
β
ββtest
ββjava
ββcom
ββwanted
ββgold
GoldApplicationTests.java
μΈμ¦ μλ² λλ ν°λ¦¬ ꡬ쑰
src
ββmain
β ββjava
β β ββcom
β β ββwanted
β β ββgold
β β β GoldApplication.java
β β β
β β ββconfig
β β β SwaggerConfig.java
β β β
β β ββexception
β β β β BadRequestException.java
β β β β BaseException.java
β β β β ConflictException.java
β β β β ErrorCode.java
β β β β ErrorResponse.java
β β β β NotFoundException.java
β β β β UnauthorizedException.java
β β β β
β β β ββhandler
β β β GlobalExceptionHandler.java
β β β
β β ββserver
β β β AuthServer.java
β β β
β β ββuser
β β ββconfig
β β β SecurityConfig.java
β β β TokenAuthenticationFilter.java
β β β TokenProvider.java
β β β
β β ββcontroller
β β β TokenController.java
β β β UserController.java
β β β
β β ββdomain
β β β Role.java
β β β Token.java
β β β User.java
β β β UserDetail.java
β β β
β β ββdto
β β β SignUpRequestDto.java
β β β SignUpResponseDto.java
β β β TokenRequestDto.java
β β β TokenResponseDto.java
β β β UserLoginRequestDto.java
β β β UserLoginResponseDto.java
β β β
β β ββrepository
β β β TokenRepository.java
β β β UserRepository.java
β β β
β β ββservice
β β AuthServiceGrpcImpl.java
β β TokenService.java
β β UserDetailService.java
β β UserService.java
β β UserValidator.java
β β
β ββproto
β β auth.proto
β β
β ββresources
β application.yml
β
ββtest
ββjava
ββcom
ββwanted
ββgold
GoldApplicationTests.java
- κ³μ λͺ κ³Ό λΉλ°λ²νΈ μ ν¨μ± κ²μ¬
- μ€λ³΅ κ³μ λͺ λ°©μ§ κΈ°λ₯
- λ‘κ·ΈμΈ μ μ‘μΈμ€ ν ν°κ³Ό 리νλ μ ν ν° λ°κΈ
- λͺ¨λ μ£Όλ¬Έ μλΉμ€μ λ‘κ·ΈμΈ ν νμλ§ μ κ·Ό κ°λ₯ν κΈ°λ₯
- μ‘μΈμ€ ν ν° λ§λ£ μ 리νλ μ ν ν°μ΄ μ ν¨ν κ²½μ° μ‘μΈμ€ ν ν° μ¬λ°κΈ
- μ£Όλ¬Έ μμ±μ νμν μ λ³΄λ€ μ λ ₯ μ μ£Όλ¬Έ μμ±
- μ£Όλ¬Ένλ μλ μ λ ₯ μ μμ λμ§Έμ리κΉμ§λ§ νμ©νκΈ° μν μ ν¨μ± κ²μ¬
- μ¬κ³ μ ν¨μ¨μ μΈ κ΄λ¦¬λ₯Ό μν΄ κ΅¬λ§€ μ£Όλ¬Έ μ μ£Όλ¬Έ μλμ΄ μ¬κ³ λ³΄λ€ λ§μ κ²½μ° μ£Όλ¬Έ λΆκ° λ° μ£Όλ¬Έμ΄ κ°λ₯ν κ²½μ° μν μ¬κ³ μ°¨κ°
- λ³ΈμΈμ μ£Όλ¬Έ λͺ©λ‘λ§ μ‘°ν κ°λ₯
- κ΄λ¦¬μμ κ²½μ° λͺ¨λ μ£Όλ¬Έ λͺ©λ‘ μ‘°ν κ°λ₯
- μ‘°ν μ λ°μ΄ν°λ₯Ό νμ΄μ§λ€μ΄μ μΌλ‘ μλ΅
- μ£Όλ¬Έ μμΈ μ‘°ν μ μ£Όλ¬Έ μ 보 λΏλ§ μλλΌ μ£Όλ¬Έμ ν΄λΉνλ λ°°μ‘ μ 보μ κ²°μ μ 보λ ν¨κ» μλ΅
- μΌλ° νμμ κ²½μ° λ€λ₯Έ νμμ μ£Όλ¬Έ μ 보 μ‘°ν λΆκ°
- λ³ΈμΈμ μ£Όλ¬Έλ§ μμ κ°λ₯
- κ²°μ κ° μ§νλ κ²½μ° μμ λΆκ°
- κ΄λ¦¬μλ§ μ κ·Ό κ°λ₯
- κ° νλͺ© λ³λ‘ μ£Όλ¬Έ μ νλ³λ‘ κ°κ²© λ±λ‘ κ°λ₯
- λ³ΈμΈμ κ²°μ μ λ³΄λ§ μμ κ°λ₯
- νμμκ²μ μ 보 μ λ ₯λ°μ μμ νλ κΈ°λ₯
- μμ ν μ 보λ₯Ό νλλ μ λ ₯νμ§ μμ κ²½μ° μμ λΆκ°
- μ΄λ―Έ κ²°μ κ° μλ£λ μνμμλ μμ λΆκ°
- λ³ΈμΈμ λ°°μ‘ μ λ³΄λ§ μμ κ°λ₯
- νμμκ²μ μ 보 μ λ ₯λ°μ μμ νλ κΈ°λ₯
- μμ ν μ 보λ₯Ό νλλ μ λ ₯νμ§ μμ κ²½μ° μμ λΆκ°
- μ΄λ―Έ λ°°μ‘μ΄ μλ£λλ μνμμλ μμ λΆκ°
- κ΄λ¦¬μλ§ μ κ·Ό κ°λ₯
- κ²°μ κ° μλ£λλ©΄ κ΄λ¦¬μκ° νμΈ ν κ²°μ μνλ₯Ό μλ£λ‘ μ λ°μ΄νΈνλ κΈ°λ₯
- κ΄λ¦¬μλ§ μ κ·Ό κ°λ₯
- λ°°μ‘μ΄ μλ£λλ©΄ κ΄λ¦¬μκ° νμΈ ν λ°°μ‘ μνλ₯Ό μλ£λ‘ μ λ°μ΄νΈνλ κΈ°λ₯
- μμ μλ²μ RESTful API ν¬νΈλ 9999λ², grpc ν¬νΈλ 50052λ²
- μΈμ¦ μλ²μ RESTful API ν¬νΈλ 8888λ², grpc ν¬νΈλ 50051λ²
- λ μλ²λ₯Ό κ°κ° λΆλ¦¬ν΄ gRPC μ°κ²° ν μμ μλ²μμ νμ μΈμ¦μ΄ νμν μ μΈμ¦ μλ²μ μΈμ¦ μμ²μ 보λ΄λ κΈ°λ₯
β‘ λΉλ μ Java λ²μ μ΄ λ€λ₯Έ λ¬Έμ
gRPC μ¬μ©μ μν΄μλ .proto
νμΌμ μ»΄νμΌν΄μΌνλ€. κ·Έλ°λ° λΉλ μλλ₯Ό νλ μ€λ₯κ° λ°μνλ€. νμ¬ νλ‘μ νΈλ₯Ό μν΄μ Javaμ gradle λͺ¨λ 17 λ²μ μ μ¬μ©νκ³ μκ³ μ€μ λ κ·Έμ λ§κ² ν΄μ€¬μ§λ§ λΉλλ₯Ό μλνλ©΄ κ³μ μλ° 11 λ²μ μ κ°μ Έμ μΆ©λνλ λ¬Έμ μλ€.
κ·Έλμ root κ²½λ‘μ gradle.properties
νμΌμ μμ±ν΄ μλ° μ€μΉ κ²½λ‘λ₯Ό μλμ κ°μ΄ λͺ
μν΄μ€¬λ€.
org.gradle.java.home=C:/corretto-17.0.12
β‘ JPA @ColumnDefault
μ λν μ€ν΄
μ£Όλ¬Έμ΄λ κ²°μ , λ°°μ‘ κ°μ²΄ μμ± μ μ£Όλ¬Έ νμ
, μ£Όλ¬Έ μν λ±μ μ΄κΈ°κ°μ μλμΌλ‘ λ£κ³ μΆμλ€.
κ·Έλμ @ColumnDefault
μ΄λ
Έν
μ΄μ
μΌλ‘ νλμ μ΄κΈ°κ°μ μλμ κ°μ΄ μ€μ ν΄μ€¬λ€.
@ColumnDefault("'PENDING'")
private DeliveryStatus deliveryStatus;
μ΄λ κ² μ§μ ν΄μ£Όλ©΄ κ°μ²΄κ° μμ±λ λ ν΄λΉ νλμ κ°μ΄ μλμΌλ‘ μ΄λ
Έν
μ΄μ
μμ κ°μΌλ‘ λ°λλ μ€ μμλ€. (μλ₯Ό λ€λ©΄ deliveryStatus
μ κ°μ PENDING
μ΄λΌλ κ°μ΄ μλμΌλ‘ μμ±)
κ·Έλ¬λ μμ± μμ²μ λ³΄λΈ κ²°κ³Ό ν΄λΉ νλμ κ°μ null
κ°μ΄μλ€.
μ μ€μ ν΄μ€ κ°μ΄ μλμΌλ‘ λ€μ΄κ°μ§ μμκΉ κΆκΈν΄μ μ°Ύμλ³Έ κ²°κ³Ό, @ColumnDefault
μ λν΄μ μμ ν μ€ν΄νκ³ μμλ€.
@ColumnDefault
λ ν
μ΄λΈμ μ²μ μμ±ν λ, defaultκ°μ μμ±ν΄ μ£Όλ μν μ νλ μ΄λ
Έν
μ΄μ
μ΄μλ€. λ°λΌμ ν΄λΉ μ΄λ
Έν
μ΄μ
μ΄ λΆμ 컬λΌμ λ€λ₯Έ κ°μ λ£μΌλ €κ³ νλ©΄ μ€λ₯κ° μκΈ°λ κ²μ΄λ€.
κ°μ²΄ μμ± μ μν°ν° μλ¨μ @Builder
λ₯Ό μ¬μ©νκΈ° λλ¬Έμ κ°μ μ§μ νμ§ μμ νλλ null
κ°μ΄ λ€μ΄κ°κ² λλ―λ‘, @ColumnDefault
λ‘ μ€μ ν κ°μ΄ λ€μ΄κ°μ§ μκ² λ κ²μ΄λ€.
μ΄λ₯Ό ν΄κ²°νκΈ° μν΄ λͺ
μμ μΌλ‘ ν΄λΉ νλμ κΈ°λ³Έκ°μ λ£μ΄μ€¬λ€.
π ERDλ μ΄λ»κ² μ€κ³νλ κ²μ΄ μ’μκΉ?
μꡬμ¬νμ λΆμνλ©° λͺ¨λΈλ§μ μ§ννλ©΄μ μ΄λ»κ² μ£Όλ¬Έ λ‘μ§μ μ§λ κ²μ΄ μ’μμ§ κ³ λ―Όμ΄ λλ€.
ν΄λΉ μλΉμ€λ μλΉμ€ μ£ΌμΈμ΄ νμμκ² κΈ κ΅¬λ§€μ ν맀 μ£Όλ¬Έμ μ 곡νλ μλΉμ€λ‘, ꡬ맀 μ£Όλ¬Έκ³Ό ν맀 μ£Όλ¬Έμ μ£Όλ¬Έ κ³Όμ μ΄ μμ΄νκΈ° λλ¬Έμ λ°°μ‘κ³Ό μ£Όλ¬Έ ν
μ΄λΈμ ꡬ맀 μ£Όλ¬Έκ³Ό ν맀 μ£Όλ¬Έ λ°λ‘ λλλ κ²μ΄ μ’μμ§ κ³ λ―Όνλ€.
κ·Έλ¬λ μ£Όλ¬Έμ μΈλΆ λ‘μ§μ λ€λ₯΄μ§λ§ μ£Όλ¬Έ β κ²°μ β λ°°μ‘μ κ³Όμ μ κ±°μΉλ κ²μ λμΌνκΈ° λλ¬Έμ ν
μ΄λΈμ κ°μ΄ μ°λ κ²μ΄ ν¨μ¨μ μ΄λΌκ³ μκ°νλ€.
λ°λΌμ ꡬ맀 μ£Όλ¬Έκ³Ό ν맀 μ£Όλ¬Έ λ λ€ κ°μ μ£Όλ¬Έ, κ²°μ , λ°°μ‘ ν
μ΄λΈμ μ°λ λμ μ£Όλ¬Έ νμ
μ μλ³νκΈ° μν΄ κ°κ° μλ³ν μ μλ Enum
ν΄λμ€λ₯Ό μ¬μ©νκΈ°λ‘ νλ€.
(μ£Όλ¬Έμ κ²½μ° μ£Όλ¬Έ νμ
, κ²°μ μ κ²½μ° κ²°μ μν, λ°°μ‘μ κ²½μ° λ°°μ‘ μν)
κ·Έλ¦¬κ³ κ²°μ μνμ λ°°μ‘ μνμ κ²½μ° μλΉμ€ κ΄λ¦¬μκ° λ³κ²½ν μ μλλ‘ νλ κ²μ΄ 보μμ± μΈ‘λ©΄μμ μ’λ€κ³ μκ°ν΄ κ΄λ¦¬μλ§ λ³κ²½ν μ μκ² μ€μ νκΈ°λ‘ νλ€.
π Grpc Serverμ Grpc Clientλ₯Ό κ°κ° μ΄λ€ μλ²λ‘ μ€μ ν κΉ?
gRPCλ ꡬκΈμ΄ μ΅μ΄λ‘ κ°λ°ν μ€ν μμ€ μ격 νλ‘μμ νΈμΆ μμ€ν
μ΄λ€. gRPCλ₯Ό μ¬μ©νλ©΄ μλ‘ λ€λ₯Έ μμΉμ μ‘΄μ¬νλ 곡κ°μμ λμΌν κ°μ²΄λ₯Ό κ°μ Έλ€ μμ μ¬μ©ν μ μλ€.
μ΄ gRPCλ₯Ό μ¬μ©ν΄ ꡬ맀, ν맀 μ£Όλ¬Έμ λ΄λΉνλ μλ²μ μΈμ¦λ§μ λ΄λΉνλ μλ²λ₯Ό μν΅νκ² νλ €κ³ νλ€. μ΄λ Grpc Serverμ Grpc Clientλ₯Ό κ°κ° μ΄λ€ μλ²λ‘ μ€μ ν΄μΌν μ§ κ³ λ―Όμ΄ λλ€.
μꡬμ¬νμ λ€μ μ½μ΄λ³΄λ μ μ μ κΆν νμΈμ΄ νμν κ²½μ°, grpcλ₯Ό ν΅ν΄ μΈμ¦μ λ΄λΉνλ μλ² Bμ JWT ν ν°μ 보λ΄μ΄ μΈμ¦ μ¬λΆλ₯Ό νμΈν΄μΌ ν©λλ€. λΌλ λΆλΆμ΄ μμλ€.
ꡬ맀, ν맀 μ£Όλ¬Έ μλ²μμμ λͺ¨λ μμ²μ κΆν νμΈμ΄ νμνλ€. λ€μ λ§ν΄ ꡬ맀, ν맀 μ£Όλ¬Έ μλ²μμ μΈμ¦ μλ²λ‘ κΆν μμ²μ νλ κ³Όμ μ΄ νμνλ€.
λ°λΌμ ꡬ맀, ν맀 μ£Όλ¬Έ μλ²λ₯Ό Grpc Clientλ‘, μΈμ¦ μλ²λ₯Ό Grpc Serverλ‘ μ€μ νκ³ κ΅¬λ§€, ν맀 μ£Όλ¬Έ μλ²μμ λͺ¨λ μμ²μ μΈμ¦ μλ²μ μμ²μ ν΄ κΆν μΈμ¦ ν μ§ννκΈ°λ‘ νλ€.