| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | |||||
| 3 | 4 | 5 | 6 | 7 | 8 | 9 |
| 10 | 11 | 12 | 13 | 14 | 15 | 16 |
| 17 | 18 | 19 | 20 | 21 | 22 | 23 |
| 24 | 25 | 26 | 27 | 28 | 29 | 30 |
| 31 |
- todomate
- spring
- 계수정렬
- 인프런
- assertj
- 투두메이트
- 11651
- 백준
- gradle
- build
- Push
- 2869
- Java
- static
- 람다식
- 정렬
- 스프링
- 알고리즘
- 큐
- 백엔드
- Lock
- 로그인
- 데이터베이스
- 11650
- 클론코딩
- 우선순위
- add
- github
- 자바
- Spring Security
- Today
- Total
목록study/Spring (7)
여러가지 이야기
2026.01.23 - [study/Spring] - 객체 중복 생성 방지를 위한 Redis 분산 Lock 도입 객체 중복 생성 방지를 위한 Redis 분산 Lock 도입최근 진행 중인 프로젝트에서, AI를 활용하여 사용자가 원하는 주제의 요약글과 퀴즈를 생성하는 기능을 개발하는 역할을 맡았다.사용자는 원하는 목표 기간 동안 최대 하루 한 번씩 생성된 요9oongoguma.tistory.com 문제 발생이전 글에서 하루에 최대 하나만 생성되어야 할 요약글 객체가, 해당 생성 API가 여러 번 호출되며 중복되는 문제가 있었다. 이에 따라 Lock 로직을 도입하였다.// DistributedLockFacade.javapublic Optional tryExecuteWithLock(String lockKey,..
최근 진행 중인 프로젝트에서, AI를 활용하여 사용자가 원하는 주제의 요약글과 퀴즈를 생성하는 기능을 개발하는 역할을 맡았다.사용자는 원하는 목표 기간 동안 최대 하루 한 번씩 생성된 요약글과 퀴즈 세트를 확인 후 풀이할 수 있다. 하루 1회 요약글과 퀴즈 세트가 모두 OpenAI 모델을 활용해 생성되게끔 구현하였는데, 사용자가 그날 최초로 홈 화면에 접속 했을 때 해당 객체들이 순차적으로 생기게끔 구현하기로 했다. 하지만 실제 서버 로그와 DB를 확인했을 때는 그렇지 않았다. 그날 최초 홈화면 접속 시 하루 1회만 생성 되어야 할 요약글과 퀴즈 세트가 여러 개 생성되는 것이다. 사용자 입장에서 요약글이나 퀴즈 세트를 조회하면 그날분의 것만 볼 수 있어서 문제가 되지 않았지만, DB 비용을 낭비한다는 점..
Spring Security를 토대로 로그인을 구현하기 앞서, 우선 로그인용 필터를 사용한 로직을 구현하려 했다.SecurityContext 내의 Authentication 객체를 만드는 과정을 구현한 필터를 만드는 것인데, 나는 form 로그인 대신 추후 json으로 로그인하여 JWT를 활용하는 것이 목표였기에 기본적인 로그인 로직만 UsernamePasswordAuthenticationFilter에서 가져와 변형하여 코드를 짰다.username과 password를 입력받을 LoginRequestDTO, Authentication 객체를 생성하는 LoginFilter, Authentication-UsernamePasswordAuthenticationToken 내의 Principal 객체에서 쓰일 유저의..
응답 통일을 위해 DTO, BaseCode, 성공 시 응답 처리 등을 코드로 작성했었다. * 💭 응답 통일을 해야하는 이유더보기내 생각: 데이터가 전달될 때 일정한 형식으로 오고 가야 CRUD 기능 내 메소드가 처리될 수 있고, 프론트단에서도 일정한 형식으로 (json 등) 제대로 정보를 받고 다시 보낼 데이터의 형식도 맞추는 등 쉽게 처리할 수 있다. 꼭 응답 통일 코드 작성을 잊지 말자!응답의 형식을 담을 BaseResponse 코드를 대략 아래와 같이 짰었다.@Getter@AllArgsConstructor@JsonPropertyOrder({"isSuccess", "code", "message", "result"})public class BaseResponse { @JsonProperty("i..
반년간 교환학생을 다녀온 뒤, 개발에 대한 감각이 많이 무뎌진 것 같다고 스스로 느끼곤 했다.앞으로 무얼해야할까 고민하다 혼자서 웹/앱 서비스를 구현해보는 건 어떨지 고민하게 되었다. 처음에는 아예 새로운 서비스를 구현해보고자 하는 마음에 우선 내 아이디어에서 시작해보았다. 내가 좋아하고, 만들고 싶었던 걸 떠올리다 나온 것은 '내가 좋아하는 다이어리 꾸미기(다꾸)를 웹이나 앱으로 만들어보자!'었다. 매일 쓴 일기에 그 주변을 꾸미고, 월간 캘린더, 거기다 내가 구현해보고팠던 채팅 기능까지(웹소켓을 공부해보고 싶었기 때문...) 넣으면 어떨지 생각해보았다. 그런데 자꾸만 어쩐지 겹쳐지는 투두 메이트의 잔상... 사실 난 투두 메이트를 굉장히 애용하는 사람이다. 그만큼 내가 투두를 이용하면서 느낀 아쉬운 ..
assertThat()를 쓰려고 assertj를 불러오려했으나 import 자체가 안됐다. 인터넷의 어떤 방법을 써도 assertj가 안 불러와지길래, 라이브러리 자체가 build.gradle의 depenencies에서 호출되지 않았으리라 추측했다. 그렇다면 assertj는 어떤 의존성에 속하는 라이브러리일까?스프링 공식 사이트의 스프링부트 의존성 관련 페이지(🔗https://docs.spring.io/spring-boot/reference/testing/test-scope-dependencies.html#page-title)를 보면, spring-boot-starter-test depencies에 AssertJ가 속해있는 것을 알 수 있다.그래서 'spring-boot-starter-test를 dep..
동아리 프로젝트에서 회원가입, 로그인 기능을 구현하는 걸 맡았었다. Spring Security를 공부하면서, 인가 인증을 구현하며 다양한 문제를 마주했었다. 이번 글은 '멤버와 관련된 CRUD 기능을 권한에 따라 가능하게 혹은 불가능하게 만들고 싶은데 코드를 어떻게 짜야하지?'에서 시작되었다. 🚨 이슈멤버가 자기 자신만의 정보를 수정(Update)하거나 자신이 가입한 계정을 탈퇴(Delete)하려 한다.당연하게도 한 회원이 타 회원의 정보를 수정할 수 있으면 안된다. 또한 당연한 말이지만... 한 회원이 다른 회원 계정을 삭제 시켜버리는 것 역시 안된다. 하지만 내가 처음 짠 코드는 이 두 가지가 모두 가능했었다. (허허) 이와 같은 불상사를 막으려면 즉, 멤버가 본인의 정보만을 수정 or 본인의..