SY 개발일지
article thumbnail
[Restagram] 리팩토링
프로젝트 2024. 6. 11. 01:50

오늘까지 작성한 코드를 쭉 리뷰를 해보았습니다. 시작 깃허브 기록은 다음과 같습니다.https://github.com/soyeonnnb/restagram-api/tree/0593db7bf7f0ab782011318d47932a1467da6bc4 GitHub - soyeonnnb/restagram-apiContribute to soyeonnnb/restagram-api development by creating an account on GitHub.github.com 다음과 같은 리스트가 나왔습니다. 오늘부터 차근히 하나씩 리팩토링해보도록 하겠습니다. 22/261. ✅ jwt filer 익명필터 넣기 -> 검색해보기 .permitall() 되는지 (24.06.10)jwt filter 내 비로그인 시 shou..

article thumbnail
[Spring] 오프셋 기반 vs 커서 기반 페이지네이션
프로젝트 2024. 6. 6. 05:21

현재 진행중인 Restagram 프로젝트는 프론트엔드에서 무한스크롤을 통해 사용자에게 피드 리스트를 보여줍니다.이러한 리스트는 한번에 모든 데이터들을 가져오지 않고 페이지를 분리해서 가져오게 됩니다. 오프셋 기반 페이지네이션현재는 오프셋 기반으로 데이터를 보여주고 있습니다. @Override @Transactional(readOnly = true) public List getFeeds(Long userId, Pageable pageable) { User user = userRepository.findById(userId).orElseThrow(() -> new RestApiException(UserErrorCode.USER_NOT_FOUND)); // 팔로우 리스..

article thumbnail
[Spring] 쿠폰 발급 동시성 문제 - 비관적 락 사용 테스트
프로젝트 2024. 6. 6. 01:46

사용자가 쿠폰을 발급하는 과정에서 동시성 테스트를 해보았습니다. 동시성 문제 발생현재 로직은 다음과 같습니다.사용자가 쿠폰을 발급할 수 있는 상태를 확인하여 발급합니다.@Override@Transactionalpublic void issueCoupon(Long customerId, Long couponId) { Coupon coupon = couponRepository.findById(couponId).orElseThrow(() -> new RestApiException(CommonErrorCode.ENTITY_NOT_FOUND)); Customer customer = customerRepository.findById(customerId).orElseThrow(() -> new RestApiE..

article thumbnail
[Spring/OAuth] 카카오 캘린더 API 사용하기 - 캘린더 생성 및 일정 추가
프로젝트 2024. 6. 5. 21:21

스프링과 OAuth 를 이용한 프로젝트를 진행중입니다. 구매자는 예약을 할 수 있는데, 이러한 예약 내역에 대해 카카오 캘린더로 일정을 추가해주려고 합니다.이 로직을 작성해주기 위해 다음 카카오 톡캘린더 docs를 참고하여 로직을 작성해주었습니다.https://developers.kakao.com/docs/latest/ko/talkcalendar/rest-api Kakao Developers카카오 API를 활용하여 다양한 어플리케이션을 개발해보세요. 카카오 로그인, 메시지 보내기, 친구 API, 인공지능 API 등을 제공합니다.developers.kakao.com 전체적인 로직은 다음과 같습니다. 보기에는 어려울 수 있으니 하나씩 천천히 해보도록 하겠습니다.  액세스 토큰 저장 (스킵 가능)카카오 API..

article thumbnail
[Spring/Jmeter] 스프링 @Async 테스트 - Jmeter 사용
프로젝트 2024. 5. 31. 22:47

피드 작성을 하면서 S3에 요청할 일이 많았습니다. 하지만, 반복문을 통해 S3에 요청을 보내면서 시간이 너무 많이 걸린다는 것을 API 요청만으로도 느낄 수 있었습니다. 그래서, 이 작업에 대해 비동기 처리를 하게 되었고, 그에 대한 테스트 결과입니다. 사용자는 20건의 요청을 한번에 보내게 되고, 한번의 테스트 당 10개의 이미지(최대 10개로 잡았습니다.)를 보내도록 하였습니다. 1. 단순 반복문 사용기존 반복문을 사용하였을 때의 결과입니다.다음과 같이 for문을 이용하여 데이터를 저장해주었습니다.최소 787ms, 최대 1266ms, 평균 911ms라는 시간이 걸렸습니다. 2. S3 요청 비동기 처리이미지 처리를 다른 서비스로 넘기면서, Async 처리를 해주었습니다.또한 초기 쓰레드의 수를 최대 ..

[JPA] Column 'chatroom_id' cannot be null 문제 해결하기
프로젝트 2024. 5. 31. 18:44

프로젝트를 하며, id를 AI로 두고 객체를 생성하는 경우가 많았습니다. 그런데 이번에 객체 생성 중 id가 null이라는, 처음보는 에러를 발견하게 되었습니다. 제 에러로그는 다음과 같습니다.더보기더보기Hibernate:      insert      into         chat_member         (chatroom_id, user_id)      values         (?, ?) 2024-05-31T18:33:49.735+09:00  WARN 22400 --- [nio-8080-exec-7] o.h.engine.jdbc.spi.SqlExceptionHelper   : SQL Error: 1048, SQLState: 23000 2024-05-31T18:33:49.735+09:00 ERR..

article thumbnail
[Spring] entity 변경해도 update 쿼리 안날라가는 이슈
프로젝트 2024. 5. 28. 20:17

문제프로젝트 리팩토링 과정 중에서 entity를 더 상세히 적고 싶어서 다음과 같이 @Column 어노테이션을 추가하여 null 이 들어오지 않도록 하였습니다.그리고, 스프링을 재시작하였는데, 업데이트 쿼리가 실행되지 않아 데이터베이스 스키마가 그대로 남아있는 것을 확인하였습니다.또한 저의 application.yml의 설정은 다음과 같습니다. 해결방안spring.jpa.hibernate.ddl-auto: update 의 경우, 제약조건(Null 등)이 변경되어도 이를 반영해주지 않는다.따라서 직접 db를 변경해주는 수밖에 없다고 한다.

article thumbnail
[AWS/S3] Spring에서 S3에 데이터 저장하기
프로젝트 2024. 5. 19. 00:02

프로젝트를 진행하면 이미지를 서버에 저장해야 하는 경우가 많은데, 이럴 때 많은 사람들이 AWS의 S3를 이용하여 데이터를 저장하고, 이 링크를 DB에 저장하여 사용하는 경우가 많습니다.왜냐하면 프로젝트 서버 내에 직접 파일을 적재하면 용량이 많이 필요하기 때문입니다.  그래서 이번 포스팅에서는 AWS S3 버킷을 생성한 후, Spring을 이용해 데이터를 저장해보도록 하겠습니다. s3 버킷 생성1. AWS > S3 > 버킷 > 버킷 만들기 클릭또는 다음 주소에 접속합니다.https://ap-northeast-2.console.aws.amazon.com/s3/bucket/create?region=ap-northeast-2 2. 버킷 생성버킷을 생성하기 위해 이름을 입력합니다. 액세스 차단 설정의 경우에는..

article thumbnail
[Spring Security] 인가 실패 시 카카오 로그인 화면 리턴 오류
프로젝트 2024. 5. 17. 20:16

스프링 시큐리티를 이용하여 인증/인가 로직을 작성하며 인증은 성공했지만, 인가는 실패한 경우 카카오 로그인 화면이 리턴되는 오류가 발생하였습니다. 다음은 제 SecurityConfig.java 파일입니다.// Spring Security 설정@Configuration@EnableWebSecurity@RequiredArgsConstructorpublic class SecurityConfig { @Bean public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { http ... .authorizeHttpRequests( ..