반응형 Spring9 주문조회 페이징 처리 API 설계하면서 고민했던 점 및 트러블 슈팅 JPA에서 페이징 처리를 공부하면서 적용해봤습니다. 배경을 설명해드리자면, 주문 조회 시 시작 날짜와 종료 날짜를 입력받아 페이징 처리하여 보여주는 기능을 구현했습니다. package assignment.shop.order.repository; import assignment.shop.order.Order; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import java.tim.. 2022. 9. 24. [Spring + JPA] 동시성 문제를 해결해보자! 서버에서 여러 트랜잭션에서 동시에 같은 데이터를 변경하려고 시도할 경우 데이터 요청이 일부 유실될 수 있습니다. 이것은 큰 장애로 커질 수 있는데요. 예를 들어 상품이 100개인 상품이 있다고 가정해봅니다. 서로 다른 5명이 동시에 100개를 동시에 주문할 경우 한 명의 주문만 성공해야 합니다. 5명의 주문이 성공할 경우 큰 장애로 이어집니다. 이런 이슈를 JPA의 락 기능을 통해서 동시성 문제를 해결해보려고 합니다. 이슈 동시에 여러 트랜잭션을 통해 주문이 들어올 경우 주문이 모두 성공하는 이슈가 있었습니다. 해당 상품으로 테스트를 진행해보겠습니다. 상품 테이블에 맥북의 재고가 100개가 저장되어있습니다. 아래 테스트 코드를 보면서 문제점을 확인해봅니다. package assignment.shop.co.. 2022. 9. 9. spring-data-envers로 데이터 변경 이력(히스토리)을 관리해보자! Spring Boot + JPA로 상품 주문 프로세스 주제로 사이드 프로젝트를 하고 있었습니다. 이때 상품 주문에 대한 히스토리를 어떻게 관리해야 할지 고민을 했었습니다. 첫 번째 방법으로 직접 주문 히스토리 테이블을 설계하여 상품 주문, 취소 등등... 데이터가 변경될 때 하나하나 직접 테이블에 넣어주는 방식으로 설계하다 보니 정확한 시점에 못 넣는 일이 발생하고 사람이 코드로 직접 넣는 거다 보니 데이터에 적합성도 떨어졌습니다. 또한, 똑같은 코드가 반복해서 들어가는 보일러 플레이트 코드가 생산되는 단점이 있었습니다. 찾아보다가 spring-data-envers라는 데이터 변경을 쉽게 관리할수있도록 도와주는 것이 있다고 하여 학습하여 적용시켰습니다. https://github.com/hygl/spri.. 2022. 9. 4. Reflection(리플렉션) 활용 앞서 프록시를 사용해서 기존 코드를 변경하지 않고 부가적인 기능들을 추가할 수 있는 방법을 배웠습니다. 앞 게시글에서 보았듯이 프록시만 적용한다면 해당 클래스 수만큼 부가적인 기능을 위한 프록시 클래스를 만들어야 한다는 단점이 있습니다. 이러한 단점을 보안하기 위해 자바에서 기본적으로 제공하는 JDK 동적 프록시 기술이나 CGLIB(개발자는 굳이 사용할 일이 없지만 그래도 알아놓자!) 같은 프록시 생성 오픈소스 기술을 사용하면 객체를 동적으로 만들 수 있습니다. 간단하게 리플렉션을 설명하자면 클래스나 메서드의 메타정보를 사용해서 동적으로 호출하는 메서드를 유연하게 끼워 넣을 수 있습니다. https://applepick.tistory.com/160 2022. 5. 22. Bean의 생명주기 콜백 🌱 스프링 빈의 생명주기 [객체 생성 -> 의존관계 주입] 대부분 스프링 빈은 위와 같이 라이프사이클을 가집니다. 스프링 빈은 객체를 생성하고, 의존관계 주입이 다 끝난 다음에야 필요한 데이터를 사용할 수 있는 준비가 완료됩니다. 따라서 초기화 작업은 의존관계 주입이 모두 완료되고 난 다음에 호출해야 합니다. 스프링은 의존관계 주입이 완료되면 스프링 빈에게 콜백 메서드를 통해서 초기화 시점을 알려주는 다양한 기능을 제공합니다. 싱글톤을 사용 시스프링은 스프링 컨테이너가 종료되기 직전에 소멸 콜백을 줍니다. 따라서 안전하게 종료 작업을 진행할 수 있습니다. 스프링 빈의 이벤트 라이프 사이클은?? 스프링 컨테이너 생성 ➡ 스프링 빈 생성 ➡ 의존관계 주입 ➡ 초기화 콜백 ➡ 빈 사용 ➡ 소멸전 콜백 ➡ 스프링 .. 2022. 1. 25. Bean 자동 주입 VS 수동 주입 어떤 걸 사용해야할까? 🌱 기본적으로 자동 주입을 사용하자! 결론적으로 스프링이 출시한 후 점점 자동 주입을 선호하는 추세입니다. 스프링은 @Component 뿐만 아니라 @Controller , @Service , @Repository 처럼 계층에 맞추어 일반적인 애플리케이션 로직을 자동으로 스캔할 수 있도록 지원해줍니다. 설정 정보를 기반으로 애플케이션을 구성하는 부분과 실제 동작하는 부분을 명확하게 나누는 것이 이상적이지만, 개발자 입장에서 스프링 빈을 하나를 등록해봅시다. @Component 만 넣어주면 끝(자동 주입) @Configuration 설정 정보에 가서 @Bean을 적고 -> 객체를 생성하고 -> 주입할 대상을 일일이 적어주는 과정은 상당히 번거롭습니다.(수동 주입) 또한, 관리할 빈이 많아서 설정 정보가 커지면.. 2022. 1. 20. UnsatisfiedDependencyException 오류 해결! 😂 인프런 강의를 듣는 도 중 테스트 코드를 작성하고 테스트를 돌리자마자 이러한 에러를 발생했습니다. ㅠㅠ 한 시간 동안 삽질을 해보면서 깨달음을 얻었습니다. 저 상황은 빈을 생성할 시 해당 빈이 충돌 난 것입니다. 예를 들어, class ratediscount(퍼센트 할인)와 class fixdiscount(고정 할인)이 discount(interface)를 implements하고 있습니다. 여기서 spring bean 의존관계 주입 시 discount 인터페이스만 의존하게 구현한다면, 서비스는 discount가 실질적으로 ratediscount인지, fixdiscount인지 알 수 없습니다. 이 상황에서 ratediscount과 fixdiscount 둘 다 @bean을 적용시킨다면, 스프링은 bean 생.. 2022. 1. 19. 의존관계 주입시 생성자 주입을 사용하자! 😲 스프링에서 의존관계를 주입 시 4가지의 방법으로 나누어집니다. 생성자 주입 수정자 주입(setter 주입) 필드 주입 일반 메서드 주입 생성자 주입 말그대로 생성자를 통해서 의존성을 주입하는 것입니다. 생성자 주입의 특징으로는 생성자 호출 시점에 딱 한 번만 실행한다는 점입니다. 불변성과 필수 의존관계에 사용됩니다. 생성자 주입 시 메서드에 생성자가 한개만 있을 경우 @Autowired를 생략해도 됩니다. (물론, 스프링 빈에만 해당) 수정자 주입(setter 주입) 흔히 알고 있는 setter에 의존성을 주입하는 것입니다. 특징으로는 선택, 변경 가능성 있는의존관계에 사용합니다. 자바 빈 프로퍼티 규약의 수정자 메서드 방식을 사용하는 방법입니다. 이 방법은 추천하지 않습니다. 그 이유는 메서드에 set.. 2022. 1. 17. 스프링에서 싱글톤 적용 시 주의 할 점! ⚠️ 스프링 컨테이너는 기본적으로 싱글톤을 제공합니다. 위의 사진을 보자면 스프링 DI 컨테이너에 memberSerivce의 bean이 등록되어있다고 가정하면 각 각 사용자의 요청마다 객체를 생성하는 것이 아닌 객체 인스턴스를 하나만 생성하여 공유합니다. 메모리 낭비도 없고 효율적으로 재활용할 수 있습니다. 이때 주의해야 할 점이 있습니다. 스프링 컨테이너에 등록된 bean은 무상태(stateless)를 유지 해야합니다. 이 부분이 정말 정말 중요합니다. 말 그대로 객체는 상태를 가지고 있으면 안 됩니다. public class menuService { private String menuName; public void order(String menuName){ System.out.println("주문한 메뉴 .. 2022. 1. 15. 이전 1 다음 반응형