스프링부트 7

[스프링부트] OCP 원칙을 지키도록 수정해보기

혼자서 풀스택으로 제작한 축구 퀴즈앱.. 다시한번 앱을 오픈하고 싶지만 현재 서버비가 부담되어 플레이스토어에서 내렸다..(눈물) 그중 OCP 원칙을 지키지 않아 개선한 부분을 말해보겠다.. OCP원칙을 지켜야겠다는 생각을 가진 원인   앱 배포가 거절되어서 기능을 추가해야했는데 기존 코드를 건드리는 경험을 했기때문이다. (OCP 위반)   친절한 구글 ..내 앱 테스트하면서 댓글도 작성해줬다.. 영어로 유저 report 기능 게시글 report 기능 abusive users 에 대한 block remove 기능을 넣으라고한다.. 드디어 배포하는 줄 알았는데 그때 당시 살짝 당황했다. 구글 정책을 확인하지 않았던 내가 미웠지만 코드개선할 기회가 생겼고 배포까진 무조건해야하는 목표를 생각해서 오히려 좋아 마..

스프링부트 2024.11.26

[스프링 부트] keycloak 사용 SSO(OIDC) 인증 서버 간단하게 구축해보기

아키텍처그림은 프로파게이션의 모델 그림이고 나는 서비스 1개만 구성되어있다. 흐름 설명1. 사용자 인증  사용자가 인증이 필요한 시스템에 접근했을경우 Spring Boot는 사용자를 Keycloak 로그인 페이지로 보냅니다.  사용자는 로그인 화면에서 아이디와 비밀번호를 입력하게 됩니다. 2. JWT 토큰 발급   사용자가 로그인에 성공하면 Keycloak은 사용자에게 JWT 토큰을 발급합니다.   이 토큰은 사용자 정보를 담고 있으며, 나중에 인증된 요청임을 증명하는 데 사용됩니다. 3. 서비스 요청   사용자는 로그인 후 받은 JWT 토큰을 가지고, Spring Boot 애플리케이션에 요청을 보냅니다. 이 토큰은 요청의          Authorization 헤더에 포함됩니다.    Spring B..

스프링부트 2024.11.25

스프링 부트 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

[스프링] 프로젝트 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