패키지 구조 상속 구조 ConcurCouponException 예외 클래스는 비즈니스 로직을 작성하다 발생하는 예외를 모아둘 최상위 클래스이다. ConcurCouponException을 상속받은 구조로 비즈니스 로직 관련 예외를 만든다.예를 들어 조회 대상이 없는 경우에 대한 예외를 정의하는 NotFoundException 등을 만든다. ErrorCodepublic enum ErrorCode { //400: BAD_REQUEST INVALID_REQUEST_ARGUMENT("잘못된 요청입니다."), COUPON_OVER_AMOUNT("발급 가능한 쿠폰 수량을 초과했습니다."), COUPON_OVER_AMOUNT_PER_MEMBER("한사람당 발급 가능한 쿠폰 수량을 초과했습니다.")..
Backend/Spring | Spring Boot
들어가기 전에 spring-security-jwt프로젝트를 진행하면서 Filter를 구현할 때, Filter가 아닌 OncePerRequestFilter를 상속하는 이유를 알아보자 클라이언트에 요청이 올때 가장 먼저 Filter를 호출하고 응답을 줄때는 가장 마지막으로 호출한다. Filter javax.servlet-api나 tomcat-embed-core를 사용하면 제공되는 Servlet Filter Interface이다. DispatcherServlet가 요청을 받기 전 앞단에 Filter에서 먼저 request를 받는다. package jakarta.servlet; import java.io.IOException; public interface Filter { public default void i..
왜 사용하는가? 먼저 스프링 빈의 이벤트 사이클을 알아보자 스프링 빈의 이벤트 사이클 스프링 컨테이너 생성 -> 빈 생성 -> 의존관계 주입 -> 초기화 콜백 -> 사용 -> 소멸 전 콜백 -> 스프링 종료 초기화 콜백: 빈이 생성되고 빈의 의존 관계 주입이 완료된 후 호출됩니다. 소멸전 콜백: 빈이 소멸되기 직전에 호출됩니다. -> 스프링 빈 생명주기 콜백 사용 방법 중에 하나가 @PostConstruct 와 @PreDestroy이다. @PostConstruct 객체의 초기화 부분 객체가 생성된 후 별도의 초기화 작업을 위해 실행하는 메소드에 적용 WAS가 띄워질때 bean이 생성된 다음 딱 한번만 실행 @PostConstruct public void init() { System.out.println(..
상황 update쿼리를 날리는 함수인 updateState에서 TransactionRequiredException :Executing an update/delete query 에러가 발생 @Override public Long updateState( LocalDate date, UserChallengeStateType beforeState, UserChallengeStateType afterState ) { final Predicate[] predicates = new Predicate[]{ qUserChallenge.state.eq(beforeState), qUserChallenge.startDate.eq(date) }; long resultCount = update(qUserChallenge) .se..
들어가기 전에) Transactional의 @Transactional의 readonly 옵션을 true로 사용하면 성능이 좋다고 한다. 왜일까? “읽기 전용 쿼리의 성능 최적화”로 엔티티가 영속성 컨텍스트에 관리되면 1차 캐시부터 변경 감지까지 얻을 수 있는 혜택이 많다 하지만 영속성 컨텍스트는 변경 감지를 위해서 스냅샷 인스턴스를 보관하므로 더 많은 메모리를 사용하는 단점이 있다. 만약 조회만 하는 경우에는 읽기전용(@Transactional(readonly=true))를 사용하여 엔티티를 조회하면 메모리 사용량을 최적화할 수 있다. 결론: 조회를 하는 경우에는 @Transactional(readonly=true)을 사용하자! 영속성 컨텍스트에서 변경감지와 스냅샷 저장을 하지 않기 때문에 성능을 최적화..
Lombok이란? 프로젝트가 객체 중심으로 개발하던 데이터 중심으로 개발하던 개발자들은 VO/DTO/Domain 객체를 생성해 getter/setter 그리고 toString 메서드를 만듭니다. 처음에 개발 초기에는 깔끔하게 하지만 잦은 수정과 필드명 변경 추가에 따라 관리가 쉽지 않습니다. 그래서 롬복(Lombok)은 자바 클래스를 만들때 자주 사용되는 getter/setter나 toString 등의 코드를 애너테이션으로 대체해서 선언하고 java 코드를 컴파일 할 때 그에 맞는 코드를 생성해주는 것이다. Lombok 의존성 추가 (build.gradle) implementation 'org.projectlombok:lombok' 하지만 의존성을 추가해주고도 에러가 생겼다. 상황 : @Getter을 선..