분류 전체보기
Transactional Outbox Pattern을 통한 웹툰 생성로직 분리
예전에 했던 `J-Toon`팀 프로젝트에서 다른 사람이 작성했던 웹툰 이미지 업로드 부분을 비동기 처리하면서 Transactional Outbox Pattern을 도입하며 리팩토링했던 부분에 대해 공유하고자 작성했습니다. 목표 웹툰 생성과 이미지 업로드 요청에 대한 응답 시간을 빠르게 하는 것이 목표 기존 @Transactional public void createWebtoon(Long memberId, MultipartFile thumbnailImage, CreateWebtoonReq request) { Member member = memberService.findById(memberId); validateDuplicateTitle(request.title()); UploadImageDto upload..
모니터링 시스템 구축 (Grafana + Prometheus + Spring)
서비스를 안정적으로 운영하기 위해서는 서버나 서비스에 대한 모니터링이 필수가 됩니다. 이러한 모니터링 도입과정에 대해 작성해보겠습니다. 목표 단일 Spring 서비스 환경에서 서비스 메트리과 시스템 메트릭을 모니터링 하는 환경을 구축하는 것이 현재 목표입니다. 최종적인 목표는 MS 환경을 생각하여 k8s와 각 파드에 대한 메트릭을 가져오고 이를 모니터링하고 얼럿까지 하는 것이었습니다. (k8s를 사용해본 적이 없었고 테스트 용도로 구성해서 시도해보기에는 비용적을 부담하기에는 별로라는 생각에 local환경에서 단일 노드를 구성하여 진행해볼 생각이었습니다. 하지만 k8s의 숙련도가 낮아 먼저 단일 서비스 환경에서의 모니터링 시스템을 구축 후 점진적으로 확장하면서 해당 내용을 공유해보겠습니다.) 모니터링 구조..
동시성 문제 해결하기
0. 작성 이유 기능 개발 중 동시성 문제를 해결해야 하는 문제가 발생하여 이를 해결하기 위해 학습했던 방법을 공유하고 싶어 이렇게 작성합니다. 0-1. 도메인 예시에서 사용할 코드 중 도메인에 대한 이해가 필요한 부분이 있어서 미리 명시합니다. Tyle이라는 도메인이 존재하고, Team과 Persoanl로 분류할 수 있는데 Team의 경우 방의 개념에 가깝고 개인 Tyle의 경우 프로필과 유사합니다. 1. 기능 요구 사항 Team Tyle에 참여한다. 이미 참여하고 있거나 Tyle이 없다면 throw 팀의 최대 참여 인원 수보다 많은 사람들이 참여하려 한다면 throw 기능 코드 @Transactional public void enterTeamTyle(AuthMember authMember, Long ..
2차 팀 프로젝트 회고
2023년 9월 1일부터 2023년 9월 말까지 팀원분들과 세미 프로젝트를 진행하게 되었습니다. 네이버 웹툰을 기반으로 한 JTOON 서비스를 기획하면서 겪었던 전반적인 스토리에 대해 다뤄볼 생각입니다. 먼저, 프로젝트 링크입니다. prgrms-be-devcourse/BE-04-JTOON (with 조셉팀) GitHub - prgrms-be-devcourse/BE-04-JTOON: [조셉팀] - 네이버 웹툰 클론 코딩 [조셉팀] - 네이버 웹툰 클론 코딩. Contribute to prgrms-be-devcourse/BE-04-JTOON development by creating an account on GitHub. github.com 프로젝트 2차 팀 프로젝트는 한 마디로 표현하면 장점과 단점이 한눈..
OAS - Swagger & Restdocs
프런트와 소통을 위해 API Spec을 제공해줘야 했습니다. 이 과정에서 제공을 위해 고려했던 과정을 공유하고자 합니다. 순서는 가장 많이 사용하는 swagger와 spring rest docs에 대해서 설명하고 그 후 제가 선택했던 방법 순으로 이야기할 예정입니다. OAS란? openAPI Specification의 약자로 Rest API에 대한 문서화를 위한 규격입니다. OAS와 관련하여 자세한 내용은 OpenAPI Specification v3.1.0에서 보면 될 거 같습니다. Swagger는 이런 OAS 스펙을 구현한 프레임워크라고 생각하면 될 거 같습니다. 사실 OAS는 v3이전에는 swagger1, swagger2로 불렸었는데 SmartBear Software라는 회사가 개발하여 가지고 있었습..
OAuth2가 뭐고 어떻게 구현해야할까? (with. Google)
OAuth2란? '내가 서비스 중인 어플리케이션에 다른 서비스를 운영하는 사람이 접근하려면 어떻게 해야할까?' 예를 들어, 파일을 인쇄해 주는 서비스를 하고 있는데 그 사진을 관리하는 서비스에서 사진들을 가져와야 한다면 서로 어떻게 사용자를 인식하고 정상적으로 운영할 수 있을까요? 이러한 상황에서 사용하는 프로토콜이 OAuth 프로토콜입니다. OAuth2가 어떤 프로토콜이길래 가능한 거지? OAuth는 내 서비스를 사용하고자 하는 서비스에게 접근 권한을 제공하여 이 접근 권한만 있으면 언제든 접근할 수 있도록 사용자와 내 서비스 간 인증 및 인가 프로토콜이라 생각할 수 있습니다. OAuth2의 구성 앞으로 설명할 내용에서 꼭 알고 가야 할 `역할`이라는 개념이 있습니다. OAuth를 구성한 각각의 서버나..
회원인증 - JWT
웹 사이트에서 Http프로토콜은 Stateless하다 보니 사이트가 넘어가거나 새로고침을 하게 되면 동일한 회원인지 알 수가 없습니다. 따라서 인증을 위해 여러 방식을 도입하여 사용하는데 이에 대해 알아보겠습니다. 회원 인증 방식 쿠키 Stateless한 환경을 해결하기 위해 지속적으로 값을 가져갈 수 있도록 쿠키를 사용하게 됩니다. 쿠키는 `Name`과 `Value`로 이루어져 있고, 추가적인 정보를 더 설정할 수 있습니다. 그렇다면 쿠키로는 어떻게 로그인을 유지할까? 쿠키는 지속적으로 값을 가지고 있을 수 있고 Name과 Value가 있으므로 넣어주면 되겠지만, 한 가지 생각해야 하는 것은 '그럼 각각의 사용자를 어떻게 판단할 것인가' 입니다. 이에 대한 답 중 하나는 사용자의 고유 ID를 넣어주면 ..
Java로 메일 보내기
이메일 인증기능을 구현하기 위해 알아봤던 내용에 대해 공유합니다. 이메일 프로토콜 이메일을 송수신하기 위한 프로토콜은 따로 존재합니다. `SMTP`, `IMAP`, `POP3` 프로토콜들입니다. java에서 메일을 다루기 전에 각 프로토콜이 무엇이고 어떻게 구성되어 있는지 한번 알아보겠습니다 메일 netwrok 구성 각 프로토콜에 대해 설명드리기 전에 눈으로 파악하기 쉽게 먼저 어떻게 구성되어 있는지에 대해 보여드리겠습니다. MUA ( Mail User Agent ) : 사용자의 이메일 클라이언트, 메일을 보내거나 받을 수 있는 역할을 가지고 있습니다. Ex) Server, Email Client MTA ( Mail Transfer Agent ) : 메시지를 수신하고 전달하는 서버, SMTP 프로토콜을 ..
회원에서의 개인정보처리
회원 파트를 구현하면서 생각해 보고 찾아보았던 내용에 대해 공유하고자 작성합니다. 모든 내용의 기준은 2023.09.27을 기준으로 작성되었습니다. 틀린 부분이 있을 수도 있습니다. 1. 회원의 개인정보 처리 동의 웹 사이트에서 회원가입을 하게 되면, 회원 정보에 대한 수집에 동의를 구하는데 어떤 기준인지 알아보았고, `개인정보 처리 동의 안내서 - 개인정보 보호위원회`를 기반으로 작성하였습니다. 동의받을 때 준수할 사항 필요한 최소한의 개인정보만을 수집하여야 한다. 정보 수집을 할 때는 수행하려는 업무 목적 등을 고려하여 합리적인 범위 내에서 필요한 최소한의 개인정보를 수집해야 합니다. 최소한 개인 정보에도 각 정보별 `용도와 선택의 자유`를 제공해 줘야 합니다. Ex) 수집 목적, 이용 내용, 수집 ..
Java - 시간을 다루기 및 테스트
사전 지식 LocalDateTIme에 대해 더보기 자바에서는 시간을 다루는 여러 방법이 있습니다. 이번에는 자바 8로 넘어오면서 사용하는 LocalDateTime에 대해 알아보겠습니다. Date 기존 제공하던 클래스로 `java.util.Date`에 존재합니다. 문제는 기준이 1900년으로 값을 넣어줄 때, 1900년을 기준으로 현재 날짜를 넣어줘야 한다는 단점이 있습니다. 따라서 @Test void utilDateTest() { // given // 기준 시간이 1900년대 Date date = new Date(122,8,21); // when System.out.println(date); // then // Wed Sep 21 00:00:00 KST 2022 } 1900을 기준으로 하며, 각 값이 불..