Spring
-
[appling] Product Option 추가 (with. unit test code)appling 프로젝트 2024. 9. 12. 15:23
🔴 Product Option 추가상품을 만들때 옵션을 고려하지 않으려고 했는데 옵션을 추가해달라는 요구사항이 들어와서 구조를 변경해보려고 한다.🟠 Product 데이터 정리 및 Option 데이터 추가🟢 Product 데이터 정리@Entity@Table(name = "product")@AllArgsConstructor(access = AccessLevel.PROTECTED)@NoArgsConstructor(access = AccessLevel.PROTECTED)@Builder@Getterpublic class ProductEntity extends CommonEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) priv..
-
[appling] 전역 Log 처리 (with. AOP)appling 프로젝트 2024. 9. 9. 16:02
🔴 log 전역으로 처리하기간단한 로그를 남기려고 하는데 Controller랑 Service마다 로그를 직접 찍지 않고 자동화처리 하고 싶다.해당 부분을 Aspect(AOP)를 사용하여 처리해보자.🟠 설정dependencies { ... implementation("org.springframework:spring-aop:6.0.11")}의존성 주입만 해주면 끝이다.🟠 적용🟢 Controller Log@Component@Aspect@Slf4jpublic class GlobalControllerLog { @Around("execution(* com.simol.appling..*.controller..*.*(..))") public Object around(ProceedingJoi..
-
[appling] Service 예외 처리appling 프로젝트 2024. 9. 9. 14:32
🔴 Service에서 예외 발생 부분 처리하기Controller에서 반환하는 데이터를 처리하면서 Service에서 Exception이 발생하는 경우도 처리해야 된다.🟠 Service에서 Exception 발생하는 경우@Service@RequiredArgsConstructor@Transactional(readOnly = true)public class ProductServiceImpl implements ProductService { private final ProductRepository productRepository; private final ProductCustomRepository productCustomRepository; ... @Transactional @Ove..
-
[appling] Controller 추가하기 (Api Annotation 추가, Swagger 적용)appling 프로젝트 2024. 9. 8. 13:10
🔴 Controller 만들기지금까지 Service만 작성하고 실제로 Controller는 작성하지 않았다. 이제 Controller를 적용해보자.🟠 Controller 적용하기🟢 기존 Controller 쓰기@RestController@RequestMapping("/api/v1")public class ProductController {}RestController를 적용하고 기본 값으로 /api/v1을 붙여주려고 한다. 근데 만드는 Controller마다 붙이는게 너무 귀찮을거 같아 Annotation으로 설정하려고 하다.🟢 @ApiController 만들기@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)@RestController@Re..
-
[appling] Product 수정appling 프로젝트 2024. 9. 4. 12:46
🔴 Product 상품 수정🟠 도메인 정리🟢 Request@Getter@Builder@AllArgsConstructor@NoArgsConstructorpublic class PutProductRequest { @JsonProperty("product_id") @NotNull(message = "상품 번호를 입력해 주세요.") private Long productId; @NotNull(message = "상품명을 입력해 주세요.") @JsonProperty("product_name") private String productName; @NotNull(message = "상품 무게를 입력해 주세요.") @JsonProperty("product_weight") ..
-
[appling] poroduct 등록appling 프로젝트 2024. 9. 4. 12:35
🔴 Product 상품 등록상품은 다음과 같이 domain을 작성하였었다. 이 설계에 맞춰서 상품을 작성해보자.🟠 도메인 정리🟢 Entity@MappedSuperclasspublic class CommonEntity { protected LocalDateTime createdAt; protected LocalDateTime modifiedAt; @PrePersist public void prePersist() { this.createdAt = LocalDateTime.now(); this.modifiedAt = LocalDateTime.now(); }}createdAt, modifiedAt의 경우 모든 Entity가 동일하게 가져갈 구조라 해당 값..
-
[appling] 프로젝트 기초 설계 (Swagger 설정)appling 프로젝트 2024. 8. 30. 00:30
🔴 프로젝트 기초 설계간단한 프로젝트라도 기본 설정을 먼저 한 후에 진행하려고 한다.🟠 SwaggerSpring에서 문서는 Swagger와 Restdoc이 있는데 예전에는 테스트코드가 강제되는 Restdoc을 선호했으나 요즘에는 Swagger를 좀더 선호하는 편이다. 그 이유는 Restdoc은 spring에서만 사용하고 있는 반면 Swagger는 다른 api에서 제공이 되고 있어 api에 접근하는 앱, 프론트 개발자 분들이 따로 익히거나 알 필요성이 없이 바로 적응이 가능하기 때문에 더 선호한다.또한 테스트 코드의 강제는 꼭 restdoc이 아니더라도 jacoco와 같은 설정으로 강제할 수 있기 때문에 큰 문제가 되지 않는다고 생각한다.Restdoc으로 Swagger 파일을 생성하여 굳이 Restdo..
-
동시성 제어 [3] Redis개인 공부/spring 2024. 8. 5. 19:54
🔴 분산 Lock동시성 제어 [1] java 처리동시성 제어 [2] DB Lock에 이어 Redis를 사용한 동시성 제어 방법을 학습해보자.분산된 서비스에서 사용할 수 있는 락 방법으로 DB를 사용하는 방법에 대해 알아봤었다. 하지만 DB의 경우 이미 insert와 select 등 다양한 처리를 진행하고 있기에 lock을 걸었을때 성능의 이슈와 DB 자체가 빠른 시스템이 아니라 처리 속도면에서도 좋은 결과를 보여주진 않는다.그래서 우리가 선택할 수 있는 동시성 제어 방법으로 in-memory의 캐시를 사용하는 Redis를 통해 Lock을 처리할 수 있다.🟠 Redis(lettuce) 설정Redis를 사용하기 위해서는 Redis 서버를 생성해야되기 때문에 설정부터 시작해보자.🟢 docker compo..