ResponseDto 개선하기
·
develop
새로운 프로젝트를 시작할 때 개발 속도를 올리기 위해서 boiler-plate 프로젝트를 시작했다.나아가 더 나은 구조 설계를 위해 boiler-plate의 각 기능 별 업데이트를 주기적으로 해주려고 한다.첫번째 boiler-plate의 기능은 공용으로 사용할 ResponseDto를 제작하는 것이다. 기존 사용하던 ResponseDto@Getterpublic class ResponseDto { private final boolean success; private final String statusName; private final String message; private final T response; @Builder private ResponseDto(boolean ..
WebRTC - EC2 Coturn 서버 구축
·
develop
Spring boot(Signaling 서버)와 kurento(Media Server)로 로컬에서 음성 스트리밍 개발을 진행하였습니다.배포 환경에서 음성 스트리밍을 진행하기 위해 Conturn 서버를 구축하게되었습니다.클라이언트 → Spring Boot (Signaling 서버) → Kurento (Media Server) → Coturn (STUN/TURN) → 클라이언트클라이언트 → Spring Boot (call 요청)Spring Boot → Kurento (SDP Offer 전달)Spring Boot → 클라이언트 (SDP Answer 전달)클라이언트 → Coturn (ICE Candidate 요청)클라이언트 → Spring Boot (ICE Candidate 전달)Kurento → Coturn ..
네이버 로그인 검수 승인받는 법
·
develop
최근 프로젝트에 소셜 로그인을 담당하였습니다.네이버, 카카오, 구글 소셜 로그인을 구현하였는데, 네이버 로그인의 경우에는 검수를 받아야합니다.물론 개발용으로는 검수 없이 사용이 가능합니다.구글링을 통해 확인한 결과 네이버 로그인 검수에 어려움을 느끼는 개발자 분들이 많았습니다.따라서, 검수에 어떤 내용이 들어갔는지 공유하고자 합니다.사용된 서비스의 모든 이미지는 디자이너분께서 공유해주신 와이어프레임 기반으로 진행하였습니다.  📍검수 요청처음 네이버 검수 요청 페이지에서 네이버는 동의화면, 로그인 및 회원가입 절차를 요구합니다.2가지의 첨부 자료는 아래와 같습니다.사용자 동의 화면에 이름, 이메일 등 체크 박스가 확인되도록 캡쳐합니다.  전체적인 회원가입 및 로그인 플로우를 보여줍니다.  📍검수 요청 ..
Spring Security 권한 여러 개 (학생/강사 테이블 분리된 인증 서비스 구현)
·
develop
✅ 상황현재 진행 중인 프로젝트의 요구사항을 보니 학생, 강사로 테이블이 분리되어 있는 상황이다.평소에 User 테이블로 ROLE_USER 의 권한 구현이 전부 였지만, 처음으로 2개의 권한을 구현하게 되었다.ROLE_STUDENT와 ROLE_INSTRUCTOR의 권한에 맞게 구현해야한다 ! 🧠 계획 및 생각 정리일반적으로 CustomUserDetailsService를 구현하게 되면 loadUserByUsername메서드에서 UserRepository로 loginId를 통해 해당 사용자를 찾아 UserDetails 객체를 만든다.하지만 현재 구현 해야하는 서비스는 StudentRepository와 InstructorRepository에서 loginId를 통해 해당 사용자를 찾아 UserDetails 객..
새로운 팀원들 / 코드 리뷰, 테스트 코드를 경험하다.
·
develop
작업 내용 요약새로운 팀원들과 다른 사람이 만든 프로젝트를 리팩토링하는 프로젝트를 진행하게 되었다. 실제 X대학교에 운영 중인 프로젝트를 리팩토링 하는 것으로 진행하였는데, 전체적인 도메인을 이해한 뒤 각자 파트를 나누어 작업 하기로 했다. 목표는 적극적인 코드리뷰와 테스트 코드작성이며, 저는 보안 성능 개선을 진행 한 뒤 User에 대한 리팩토링 작업 및 테스트 코드를 작성하게 되었다. 해당 도메인은 JWT 기반 인증 시스템을 사용하고 있었으며, 인증이 완료되면 body 값을 통해 accessToken과 refreshToken을 응답하는 방식이었다. 이렇게 전달된 토큰을 기반으로 프론트엔드 측 localStorage에 인증 상태를 관리하고 있었으며, 또한 서버 측의 재발급 절차에서 refreshToke..
Spring Batch 정리
·
develop
Batch?배치는 일정 시간 동안 대량의 데이터를 한번에 처리하는 방식을 의미한다.Spring Batch?spring Batch는 대량의 데이터를 처리하기 위한 프레임워크이다.Batch Processing 즉 반복 일괄 처리 작업을 효율적으로 처리할 수 있는 기능을 제공한다.대량의 데이터를 한번에 처리 하는 중간에 프로그램이 멈출 수 있는 상황이 존재한다.상황을 대비하여 안전 장치를 마련해야하기 때문에 프레임워크를 사용하게 된다.예를 들어 50만개의 데이터를 복잡한 JOIN 연산을 걸어 DB간 이동 시키는 도중 프로그램이 멈춰버리면 어떻게 될까 ?처음부터 다시 시도한다면 시간 낭비, 자원 낭비이다.따라서 처음부터 다시 시작할 수 없기 때문에 작업 지점을 기록해야한다.이런 다양한 상황들을 대비할 수 있게 ..
교차 출처 리소스 공유 CORS 정리
·
develop
최근 React를 사용 해야될 일이 생겼다. Spring boot로 서버를 구축하고 API를 호출해야 되기 때문에 CORS에 대해서 생각이 났다. 백엔드 개발자의 입장에서의 교차출처오류를 해결하기 위해 Controller 혹은 CorsConfig 등록, Spring Security 환경의 filter에서의 해결 방법 등 여러 시나리오를 생각하며 CORS 정책에 대한 배경을 정리하고자 한다.CORS의 등장브라우저는 SOP 정책을 따르고 있다. 간단하게 정리하자면 “같은 출처에서만 리소스를 공유할 수 있다”라는 규칙을 가지고 있다. 보안적으로 SOP는 중요한 부분이지만 다른 출처 간의 통신을 해야하는 경우가 존재한다. 예외 케이스를 준비하여 해당 예외 케이스는 출처가 다르더라도 허용 할 수 있게 만들었다. ..
언제 RDB 대신 MongoDB를 사용할까
·
develop
MongoDB 특징도큐먼트 지향MongoDB는 도큐먼트 지향적인 데이터베이스입니다.JSON 형태로 데이터를 관리하는 구조입니다.스키마lessMongoDB는 스키마나 테이블과 같은 정형적인 구조에 데이터를 저장하는 것이 아니라 비정형 데이터를 저장할때 주로 사용합니다. 여기서 테이블과 같은 역할을 하는 컬렉션이 존재하는데 컬렉션에도 저장 규칙이 따로 존재하지 않습니다.비관계형 DBMongoDB에는 관계의 개념이 없습니다. 따라서, 조인 연산을 지원하지 않습니다.트랜잭션 지원 하지 않습니다.따라서 Commit이나 Rollback의 개념이 존재하지 않습니다.관계형 DB와 다르게 트랜잭션을 지원하지 않습니다.RDB 대신 MongoDB를 선택하는 경우1. 유연성MongoDB를 선택할 이유는 특징 중 도큐먼트 지향..
CQS (Command Query Separation)
·
develop
CQS (Command Query Separation)제안자: Bertrand Meyer개념CQS는 명령(Command)과 쿼리(Query)를 분리하여 대규모 시스템에서 불필요한 사이드 이펙트를 줄이기 위한 원칙입니다. 특히 모듈 간 상호작용을 완전히 제어할 수 있을 때 유용합니다.핵심 포인트:Command (명령): 시스템의 상태를 변경하지만 결과를 반환하지 않음. 상황에 따라 modifier 또는 mutator라고도 불립니다.Query (질의): 시스템의 상태를 변경하지 않고 정보를 반환함. 부작용이 없음.사이드 이펙트 정의“사이트이펙트” 의 정의는 맥락에 따라 다를 수 있지만, CQS에서 부작용이란 내부에 변경이 발생하는지 여부를 의미합니다. 내부 변경이 없으면 사이드이펙트가 없는 것으로 간주합니다..
@Setter 지양
·
develop
Setter 메소드를 사용하면 안 되는 이유값 변경의 의도를 파악하기 어렵다Setter 메소드를 사용하면 객체의 값을 변경한 의도를 명확하게 알기 어렵습니다.객체의 일관성을 유지하기 어렵다Setter는 public으로 선언되어, 외부에서 언제든지 객체의 상태를 변경할 수 있어 객체의 일관성을 유지하기 어렵습니다.1. 값 변경의 의도를 파악하기 어렵다public Book updateBook(long id) { final Book book = findById(id); book.setTitle("New Title"); book.setAuthor("New Author"); book.setPublishedYear(2023); book.setGenre("Science Fiction"); ..