신규 프로젝트를 진행하며 Swagger를 적용하였다.프로젝트 세팅은 다른 개발자분이 진행해주셨다.서버를 올리고 swagger 화면으로 접속하니 아래와 같은 응답이 출력됐다.http://localhost:8080/v3/api-docs 경로로 접속하니 아래와 같은
로그인한 사용자가 메시지를 보내거나, 매치가 성사되면 상대방에게 알람을 전송한다. 기존에는 사용자 메시지 작성, 이벤트 발생 시 로직 내에서 알람 처리도 진행했다.그런데 로그인한 사용자 입장에서는 알람전송은 사용자의 관심사항이 아니다. 구현상으로도 사용자를 매치시키고
1. 서비스의 핵심 알람기능 서비스의 핵심 기능은 바로 매치와 메시지다. 두 기능 모두 로그인한 "나"의 행동으로도 이벤트가 발생하지만, 상대방에 의해서도 이벤트가 발생한다. ex) 상대방 -> 나 메시지 전송, 상대방 -> 나 좋아요를 통한 매치 성사 나(클라이언트)
As of my last knowledge update in September 2021, OpenCSV did not natively support Java record types with its CsvToBeanBuilder. Java records were intr
프로젝트의 패키지 구조를 크게 match, member, message로 구분하였다. 그리고 각각의 패키지에는 주요 관심사와 관련된 entity와 각 entity에 대한 repository, sevice를 구현하였다.그런데 개발을 하다보니 강하게 결합되는 서비스들이 있
세션 기반의 인증 프로세스는 로그아웃 시 해당 세션을 만료시키면 된다. 스프링 시큐리티의 경우 기본적으로 등록된 Logoutfilter가 해당 기능을 수행한다. 그러나 이번 프로젝트에서는 JWT토큰을 사용하기로 하였고, JWT 기본 구현은 서버에 정보를 저장하지 않기
회원 정보 기반의 서비스이므로 무조건 로그인이 필요했다. 아직 디자인이나 기획이 진행되지는 않은 상태였지만, 소셜로그인은 도입하기로 합의가 되었다.그래서 우선은 스프링 시큐리티 OAuth를 이용해 로그인을 진행하고자 하였다.기존에 Spring Security OAuth
그동안 개인 프로젝트만 진행해오다. 백엔드 개발자 혼자서는 사용자들에게 제공가능한 서비스를 만드는 게 어렵다는 생각이 들어서 비사이드의 포텐데이에 참가하게 되었다.다행히 초반에 기획자, 디자이너, 프론트엔드, 나까지 해서 팀을 꾸릴 수 있게 되었다.팀원 중 한 분의 아
@RequiredArgsConstructor를 사용하는 클래스 필드에 특정 빈을 주입해야 하는 상황이었다. 직접 생성자를 작성해도 되지만 설정으로 바꿀 수 있다고 하여 적용해 보았다.관련글src/main/java/lombok.config에 아래 내용을 적으면 된다.
진행하던 프로젝트에서 Spring디버깅하면서 본 아이디어를 적용해보고자 하였다. 특정 인터페이스의 구현체들을 List에 담고 list를 순회하며 구현체의 응답값이 있을 경우 바로 return하는 구조이다.여기서 ExternalAddressApi 구현체는 KakaoAdd
Intellij에서 웹 애플리케이션을 껐다 끄는데도 자꾸 session이 유지되어 있었다. 서버를 껐다 키면 메모리에 저장된 값이 모두 날아갈 텐데 어떻게 로그인정보가 저장된는지 궁금했다.원인은 여기에 있었다Spring Security의 필터는 마지막에 Security
중복 로그인을 방지하고자 sessionManagement()설정을 해주었다.위 설정에 따라 등록된 필터 리스트는 아래와 같다.DisableEncodeUrlFilterWebAsyncManagerIntegrationFilterSecurityContextPersistence
위 코드에 대해 ObjectMapper가 자꾸 isAccountNonExpired, isAccountNonLocked, isCredentailNonExpired, isEnables 필드를 생성했다.알고보니 Java beans 프로퍼티에 대한 정의에 Boolean Get
프로젝트 진행 도중 단일 필드 및 생성자를 가진 객체에 대한 @RequestBody가 정상적으로 작동하지 않았다.단일 필드 및 생성자 객체의 경우 필드가 여러개인 객체와 다른 방식으로 작동한다. 단일 생성자 방식의 경우 @AllArgsConstructor를 설정할 거면
JPA remove를 사용할 때는반드시 영속 상태의 entity를 대상으로 해야 한다.\-> 따라서 entity를 찾지 않은 상태에서 delete만 하고 싶은 경우라면 entity를 찾아와야 하는 비효율이 발생한다.실제로 SimpleJpaRepository에서도 아래와
1. 프로젝트 구조 2. application.yaml 2.1 테스트용 yaml 3. docker-compose.yml 4. Dockerfile 5. build.gradle
0 = {RequestMappingHandlerMapping@10593} 1 = {WelcomePageHandlerMapping@10594} 2 = {BeanNameUrlHandlerMapping@10595} 3 = {RouterFunctionMapping@10596}
1) depreacated되었다. 큰 의미는 없다.2) docker-compose의 root element이다. key로는 serevice name을 가지고 각 value로는 service에 대한 정의가 담긴다. (서비스 시작 시점에 적용될 설정들)\* 3) 각 서비스
Dockerfile은 도커가 이미지를 생성하기 위한 명령어를 모은 파일이다.FROM : 이미지의 base 이미지를 설정RUN : 새로운 layer에서 명령어를 실행하고 commit한다. commit된 이미지는 Dockerfile의 나머지 단계에서 사용된다.CMD : D