TIL

TIL/Trouble Shooting

[TS] 실시간 재고 동시성 문제

예약 구매 시스템 프로젝트를 진행하면서 재고 처리를 구현하던 중 동시성 문제를 해결하기 위해 학습하고 시도한 내용입니다. 동시성 문제 동시성 문제란 동시에 여러 쓰레드가 하나의 자원에 접근하면서, 서로의 작업을 간섭하게는 문제이다. 이로 인해, 예상한 값과 다른 결과가 나올 수 있다. 테스트 시나리오 예약 구매 상품 A가 있으며, 초기 재고 수량은 10개이다. 해당 상품을 구매하려고 10000명의 사용자가 접근한다. 위 상황에서 결제 화면에 진입하면 재고 수량을 감소시키고, 결제 프로세스 진행 중 어떠한 이유로 이탈한다면 재고 수량을 증가 시켜야 한다. 이때, 여러 쓰레드가 동시에 접근하면서 결제 완료된 재고 수량이 10개를 초과하는 문제가 발생하였다. 해결하기 데이터베이스 락 데이터베이스에 직접 Loc..

TIL

[TIL][Spring] javax.xml.bind.DatatypeConverter 에러

🤔문제 OAuth2 로그인 구현 중 아래와 같은 에러 발생 ❗원인 위와 같은 에러메세지가 있었다. 해당 코드는 아래와 같이 생겼다. 즉, 'io.jsonwebtoken.impl.Base64Codec' 클래스에서 'DatatypeConverter' 클래스를 사용해야하는데 해당 클래스룰 찾지 못해 에러가 발생하였다. 💡해결방법 https://medium.com/@jiri.caga/java-lang-classnotfoundexception-javax-xml-bind-datatypeconverter-in-java-17-solved-499d0ea776d0 위 링크를 들어가보면 Java 11 이상에서 JAXB가 JDK에서 제거되었다고 한디. 그러면서 해결방법으로 간단하게 의존성을 추가하라고 되어있어 아래 코드를 추..

TIL

[TIL][SQL] @Modifying 어노테이션

❓@Modifying 어노테이션이란? @Modifying(clearAutomatically = true, flushAutomatically = true) @Transactional @Query("UPDATE Restaurant r SET r.averageRating = :averageRating WHERE r.id = :restaurantId") void updateAverageRating(@Param("restaurantId") Long restaurantId, @Param("averageRating") double averageRating); 수정 쿼리를 수행하는 메서드에 붙인다. JPA에서 SLECT 쿼리가 아닌 UPDATE, DELETE, INSERT 등과 같은 수정 작업을 수행하는 메서드에 대한..

TIL

[TIL][SQL] 연관 데이터 없을 때 조회하기 (Join vs Left Join)

🤔문제 주 테이블의 상세 정보를 가져오는 코드에서 연관 데이터가 없으면 주 테이블의 정보도 반환되지 않는 문제 발생 ❗원인 주 테이블 id로 연관 테이블을 조회할 때 join을 사용 @Query("SELECT r FROM Restaurant r join fetch r.ratingList WHERE r.id = :id") Optional findByIdWithRatingsUsingFetchJoin(@Param("id") Long id); default Restaurant getById(Long id) { return findByIdWithRatingsUsingFetchJoin(id) .orElseThrow(() -> new CustomException(ErrorCode.NOT_FOUND)); } 💡해결방법..

TIL

JPA 에서 복합키 사용하기

id가 겹치고 mediaType이 다른 경우가 있어 id와 mediaType을 모두 primary Key로 사용하려고 하였다. 이를 위해 복합키를 사용하기로 하였다. 복합키 사용방법 1. @IdClass @Data public class ContentKey implements Serializable { private long id; private String mediaType; } @Data @Entity @Table(name = "content") @IdClass(ContentKey.class) public class Content { @Id private long id; @Id private String mediaType; } 2. @Embeddable @Data @Embeddable public c..

TIL

[TIL][ContentProject] h2-console 403 error

위 이미지 처럼 처음에는 그냥 "/h2-console/**" 을 추가해주었는데 계속 403 오류가 발생했다. .requestMatchers(new AntPathRequestMatcher("/h2-console/**")).permitAll() .requestMatchers("/user/signup", "/user/signin").permitAll() 이렇게 따로 new AntPathRequestMatcher() 를 사용해서 주소를 넣어주니 해결되었다.

TIL

[TIL][ContentProject] H2 DB 에서 User Table 사용하기

Caused by: org.h2.jdbc.JdbcSQLSyntaxErrorException: Syntax error in SQL statement "drop table if exists [*]user cascade "; expected "identifier"; SQL statement: 위와 같은 에러가 발생하며 에러가 발생했다. 이유는 H2 DB 는 User 라는 키워드를 예약어로 사용중이기 때문이다. 해결방법은 간단하다. User를 Users로 이름을 변경하거나 application.yml 파일을 아래와 같이 수정해주면 된다. datasource: url: jdbc:h2:mem:test;NON_KEYWORDS=USER

TIL

[TIL][ReservationProject] Jwt 토큰 생성 에러

로그인 시 Jwt 토큰을 생성하려고 했는데 아래와 같은 에러가 계속 발생했다. Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed: io.jsonwebtoken.lang.UnknownClassException: Unable to find an implementation for interface io.jsonwebtoken.io.Serializer using java.util.ServiceLoader. Ensure you include a backing implementation .jar in the classpath, for example jjwt-..

dbssk
'TIL' 카테고리의 글 목록