스프링부트 6

스프링 부트 Redis 분산 락 활용 동시성 제어

나의 미간지 프로젝트 프로젝트를 또 개선하고 싶어서 프로젝트를 뜯어봤다. 문제점멀티스레드 상황에 게시물을 조회했을때 동시성 문제로 인해 조회수가 정상적으로 증가 안하는 문제  시간 순서 | 스레드 1 | 스레드 2-------------------------------------------------------------T1 | findById -> viewCount = 10 |T2 | | findById -> viewCount = 10T3 | viewCount++ -> 11 |T4 | ..

스프링부트 2024.07.04

이미지 업로드 비동기 처리

나의 미간지 프로젝트무엇을 더 업그레이드 할수 있을까를 생각하고 글쓰기 기능을 개선하기로 생각했다. 그 중 이미지 업로드 하는 부분이 오래걸려 리팩토링 하려고 생각이 들었다. 문제점글쓰기 API가 너무 오래걸린다. (이미지 resize 함수 영향) 결론함수 비동기 처리 하여 30s -> 1s 로 성능 개선 완료 개선 전 글쓰기 -> 함수의 모든 동작이 완료 되고 데이터 return ( resize 함수에 종료 시간을 기다려야 해서 시간이 오래걸림 ) 30.31S 개선 후1.372S글쓰기 -> 이미지 resize 함수를 비동기로 처리 , 이미지 resize함수는 비동기 처리 후 완료 데이터 return (만약 이미지 reszie 전 게시물을 본다면 이미지 업로드 중이라는 사진을 보게 됨) 이미지 resiz..

스프링부트 2024.06.19

[스프링 부트] 비트 마스킹 사용해서 데이터 처리하기

내가 진행했던 테오의 스프린트 15기 (23.06.21 - 23.06.26) 우리는 멋진 길거리 사진을 소개하는 프로젝트를 만들었다.   게시글 내용은 이런식으로 보이고 태그기능을 사용하여 게시물을 검색할 수 있었다. 하지만 개발 기간은 스프린트 형식으로 진행되기 때문에 2일.. 짧은 기간동안 태그 기능을 간단히 구현하고 싶었다. 또한 백앤드는 한명..(본인) 그래서 비트마스킹으로 구현해보면 어떨까 라는 생각에 의견을 제시했고 결국 프론트분들을 설득시켜 성공하였다..  1234567891011121314export const tagList: Tag[] = [  { id: 0, name: "편안한" } as Tag,  { id: 1, name: "조용한" } as Tag,  { id: 2, name: "친..

스프링부트 2023.10.30

[스프링] 프로젝트 N+1 해결하기 (fetch join

나의 팀 프로젝트 미간지! https://miganzi.vercel.app/ 미간지 나만 알고 있는 우리 동네의 미지의 공간을 특별한 큐레이팅을 통해 소개 miganzi.vercel.app 사이트는 이렇게 되어있고 메인에 들어가면 2개의 요청이 날아간다 reissue는 토큰이 종료되었을때 날아감 posts는 게시물 (무한스크롤) popular-post는 말그대로 인기 포스트이다 (페이지 맨위에 나오는 게시물) 하지만 posts 쿼리의 상태가?? 맛있게 N+1 나가는 모습!! 1 2 3 4 5 6 7 @Operation(summary = "전체 게시물 조회 API") @GetMapping("/posts") public Slice getBoardList( @PageableDefault (size = 6,so..

스프링부트 2023.09.01

[스프링부트] 개인 프로젝트 버그 고치기

링크 구글, 원스토어 나의 축구 지식테스트 앱이다... 일단 내 앱은 배포하고 돌아간 상태였고 DB를 확인해보니 똑같은 닉네임이 저장되고 있었다... 왜그럴까 확인해보았다... 내 앱은 이렇게 처음에 닉네임을 설정(체크) 하고 회원가입되는 순서로 진행된다. 동작순서는 프론트에서 닉네임을 입력후 설정하기 버튼을 누르면 API 순으로 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 @Operation(summary = "프론트유저 닉네임 조건설정 API") @PostMapping("/front-user/check") @ResponseBody public String CheckNickName(String nickName) { boolean matches = nickName.ma..

스프링부트 2023.08.27

[Spring boot] 스프링 부트 에러페이지 커스터마이징하기

참고 페이지 https://www.baeldung.com/spring-boot-custom-error-page 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 @Controller public class MyErrorController implements ErrorController { @GetMapping("/error") public String handleError(HttpServletRequest request) { Object status = request.getAttribute(RequestDispatcher.ERROR_STATUS_CODE); if (status != null) { int statusCode = Integer.valueOf(st..

스프링부트 2022.04.06